---
title: "Bluesky Profile API"
method: GET
path: "/v1/bluesky/profile"
tags: ["Bluesky"]
---

# Bluesky Profile API

`GET /v1/bluesky/profile`

## Request

- Base URL: `https://api.captapi.com`
- URL: `https://api.captapi.com/v1/bluesky/profile`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Bluesky profile — handle, did, bio, counts, banner, verification{}, labels[], and associated{} (1 credit).

Give a Bluesky profile URL, @handle, or handle and get the public AT Protocol profile as clean JSON. Canonical profile core (same keys on every Captapi profile endpoint): platform, id, handle, url, displayName, bio, avatar, banner, followers, following, postCount, verified, createdAt. Bluesky also returns did (same as id), deprecated aliases name/posts for one release, indexedAt (AppView last indexed the profile record — not last activity), pinnedPost{uri,cid,rkey} when the account featured a post, joinedViaStarterPack when present, verified + verification{verifications[{issuer, issuerHandle, issuerDisplayName, uri, isValid, createdAt}], verifiedStatus, trustedVerifierStatus} (issuer DIDs resolved to handle/display name), moderation labels[{src, uri, cid, val, neg, createdAt, expiresAt}], and associated{lists, feedgens, starterPacks, labeler, chat, activitySubscription} so you can tell feed/labeler service accounts from people. Accepts cache / cacheMaxAge like other profile trust-layer endpoints. Flat 1 credit per call.

Docs: https://captapi.com/apis/bluesky-profile

## Query parameters

- `url` string, required
- `cache` boolean
- `cacheMaxAge` '1d' | '3d' | '7d' | '14d' | '30d'

## Response `200`

Success. The data object for this endpoint.

- object
  - `success` unknown, required
  - `data` object, required
    - `platform` string: Platform identifier for this response (matches the endpoint's platform).
    - `handle` string: Bluesky handle (e.g. bsky.app).
    - `url` string: Canonical URL of the item.
    - `did` string: AT Protocol DID. Same as id; kept for Bluesky-native clients.
    - `name` string: Deprecated alias of displayName — prefer displayName. Removed after one release.
    - `bio` string: Profile description / bio text.
    - `followers` integer: Follower count.
    - `following` integer: Following count.
    - `posts` integer: Deprecated alias of postCount — prefer postCount. Removed after one release.
    - `avatar` string: Avatar image URL.
    - `banner` string: Banner image URL.
    - `verified` boolean: Prefer verifiedStatus / verification on Bluesky — this boolean is a coarse summary when present.
    - `verification` object
      - `verifications` object[]: Array of objects with issuer, issuerHandle, issuerDisplayName, uri, isValid, createdAt.
        - `issuer` string
        - `issuerHandle` string
        - `issuerDisplayName` string
        - `uri` string
        - `isValid` boolean
        - `createdAt` string: When the account was created (ISO-8601).
      - `verifiedStatus` string: Bluesky verification status string (e.g. valid, none).
      - `trustedVerifierStatus` string: Whether this account is a trusted verifier (e.g. valid, none).
    - `labels` unknown[]: Moderation labels: [{src, uri, cid, val, neg, createdAt, expiresAt}]. src = labeler DID; val = label value; neg = negation; expiresAt when the label expires.
      - unknown
    - `associated` object
      - `lists` integer: Lists. Example: 0.
      - `feedgens` integer: Number of custom feeds (feed generators) this account publishes.
      - `starterPacks` integer: Number of starter packs this account publishes.
      - `labeler` boolean: Whether this account is a Bluesky labeler (moderation service).
      - `chat` object: Object with allowIncoming, allowGroupInvites.
        - `allowIncoming` string
        - `allowGroupInvites` unknown
      - `activitySubscription` object: Object with allowSubscriptions.
        - `allowSubscriptions` string
    - `createdAt` string: When the account was created (ISO-8601).
    - `indexedAt` string: When the Bluesky AppView last indexed this profile record (ISO-8601). Not last activity — createdAt is account age; use user-posts for recent posts.

## Other responses

- `400`: Bad request: wrong platform URL, unknown endpoint, or an invalid parameter value. Not billed.
- `401`: Missing, invalid or revoked API key. Not billed.
- `402`: Not enough credits for this request. Not billed.
- `404`: The resource does not exist or is not public. Not billed.
- `422`: A required parameter is missing or has the wrong type. Not billed.
- `429`: Rate limit reached. Wait for Retry-After seconds. Not billed.
- `502`: The platform could not be reached or returned nothing usable. Retryable, not billed. 503 and 504 use the same envelope.

---

[API](https://skmtc.dev/captapi/apis/captapi-api.md) · [All operations](https://skmtc.dev/captapi/apis/captapi-api/llms.txt) · [OpenAPI document](https://skmtc.dev/captapi/apis/captapi-api/revisions/c9b9ac5ff1bd?raw)
