All platforms

Bluesky scraper API

Resolve public Bluesky profiles, page a handle's posts, and fetch a single post by bsky.app URL over REST — same JSON envelope and API key as TikTok and X.

3 endpoints

Why teams use Social Fetch for Bluesky

Bluesky runs on AT Protocol, so the network is unusually open compared with closed social graphs. You can talk to a PDS yourself, resolve handles to DIDs, and even subscribe to the public firehose when you need a full event stream. That DIY path is real — and it is also more ops than most enrichment products want when Bluesky is just one identity row next to TikTok and X.

Social Fetch does not replace the firehose or host a Bluesky client stack. It exposes the three lookups product teams actually schedule: profile by handle, recent posts for a handle, and one post by public URL. Each call returns the shared `{ data, meta }` envelope with `data.lookupStatus`, `meta.requestId`, and `meta.creditsCharged`, so Bluesky columns land in the same warehouse schema as the rest of the marketplace.

Use first-party AT Protocol APIs when you are building a Bluesky-native app, syncing a relay, or writing to the network. Use these routes when you already standardize on a Social Fetch key and need public cards and posts without standing up App Passwords, session refresh, or a firehose consumer.

What Bluesky data can you get?

  • Profile cards by handle — custom domains and `*.bsky.social`, with DID as `platformUserId`.
  • Follower, following, and post counts on the profile metrics object.
  • Paginated public posts for a handle (`nextCursor` / `hasMore`).
  • Single post by bsky.app URL — text, author, likes/reposts/replies/quotes.
  • Normalized embeds (link cards, images, video, quoted records) when present.
  • Top-level reply samples on the post-by-URL route when the lookup includes them.
  • Same API key and envelope as Instagram, X, and the rest of the catalog.

Bluesky API endpoints

Grouped by capability from the live API catalog. Open an endpoint page for parameters and examples — credit notes come from OpenAPI pricing extensions.

How to call the Bluesky API

  1. 1. Create an API key

    Sign up at Social Fetch and copy a key (`sfk_…`). New accounts get 100 free credits — enough to resolve a handle, page one feed, and fetch one post URL against live data.

  2. 2. Resolve the handle first

    Call `GET /v1/bluesky/profiles/{handle}` with `x-api-key`. Pass the handle with or without `@`. Branch on `data.lookupStatus` before you spend credits on posts; store the DID from `data.profile.platformUserId` as your stable Bluesky id.

  3. 3. Pick feed vs URL

    Page recent posts with `GET /v1/bluesky/profiles/{handle}/posts` (pass `cursor` from `data.page.nextCursor`). When you already have a bsky.app permalink, use `GET /v1/bluesky/posts?url=…` instead. Log `meta.requestId` and bill against `meta.creditsCharged`.

How much does the Bluesky API cost?

Documented Bluesky routes charge 1 credit per successful completed lookup. Confirm on each operation page and with `meta.creditsCharged` — that field is the billing source of truth. Credits never expire on pay-as-you-go packs. Free signup credits apply.

See credit packs

Social Fetch vs the official Bluesky API

AT Protocol and Bluesky's own APIs (including AppView, PDS XRPC, and the public firehose / Jetstream) are the native interface for Bluesky clients, relays, and write paths. They expect protocol-aware clients, handle resolution, and often session credentials for authenticated work. Social Fetch wraps public read lookups for teams that already meter multi-network enrichment on one REST key — no Bluesky App Password, no firehose consumer, no creator OAuth.

Bluesky API FAQ

Is there a Bluesky scraper API that works without an App Password?

Yes. Social Fetch Bluesky routes read public profile and post data. You authenticate to Social Fetch with an API key (`x-api-key`). You do not create a Bluesky App Password or open an AT Protocol session as the user whose public data you are fetching.

How is Social Fetch different from the Bluesky firehose or AT Protocol DIY?

The public firehose (and tools like Jetstream) streams network events for indexing and real-time consumers. AT Protocol XRPC is the right stack for Bluesky-native apps and write access. Social Fetch is hosted point lookup: handle or post URL in, structured JSON out, same envelope as TikTok and X. It is not a relay, not a firehose subscription, and not a full PDS client.

What Bluesky data does Social Fetch cover?

Three marketplace operations: `GET /v1/bluesky/profiles/{handle}` (profile card and metrics), `GET /v1/bluesky/profiles/{handle}/posts` (paginated public feed), and `GET /v1/bluesky/posts` (one post by public URL, including embed and reply samples when returned). Exact schemas live under `/docs/api` and on this hub's endpoint list.

Do custom domain Bluesky handles work?

Yes. Pass the handle as used on Bluesky — `*.bsky.social` or a custom domain — with or without a leading `@`. On a found profile, `data.profile.platformUserId` is the DID, which is the stable identifier if the handle later changes.

Profile card vs profile posts vs post-by-URL — which route?

Use the profile route for identity and aggregate counts. Use profile posts to page a handle's recent public feed. Use post-by-URL when you already have a bsky.app permalink from an alert, CRM, or paste. They are separate operations; confirm a handle with the profile GET before treating an empty feed as "no posts."

How much does the Bluesky API cost?

You buy credit packs (or use the 100 free signup credits). Documented Bluesky lookups are 1 credit each on success. Always trust `meta.creditsCharged` on the response. There is no required monthly subscription for pay-as-you-go packs.

Does Social Fetch return Bluesky DIDs, embeds, and reply counts?

On found profile lookups, the DID is `data.profile.platformUserId`, with followers/following/posts under `data.metrics`. On post routes, rows can include AT URI id, cid, text, author card, likes/reposts/replies/quotes, and a normalized `embed` when present. The post-by-URL route may also return top-level `replies`. Treat empty reply arrays as "none returned," not proof the thread has zero replies on Bluesky.

Can I access private or gated Bluesky content?

No. Only publicly visible profiles and posts. Missing or inaccessible targets resolve through `data.lookupStatus` (for example `not_found`) rather than inventing empty public cards.

Is scraping Bluesky data legal?

Social Fetch returns publicly visible data. You are responsible for how you use it under Bluesky's terms, AT Protocol norms, applicable law, and your own compliance review. We do not give legal advice.

Can I use the Bluesky API in production with agents or MCP?

Yes. Routes are synchronous REST with typed lookup outcomes, request IDs, and credit metering. The same operations appear as MCP tools and can be reached via Ask (`POST /v1/ask`) when you want plain-English routing before pinning a typed path. Production cron should call the explicit Bluesky GETs with an API key.

Start with Bluesky data

Create an account, spend the 100 free credits on live Bluesky routes, then buy a pack when the JSON fits your pipeline. Credits do not expire on pay-as-you-go packs.