Bluesky hub

Bluesky Post API

Resolve a public Bluesky post URL to structured JSON — text, author card, engagement counts, embed, and a sample of top-level replies — in the shared Social Fetch envelope.

GET /v1/bluesky/posts

1 credit per successful request.

About this endpoint

Monitoring and enrichment jobs often already have a bsky.app permalink from an alert, a CRM note, or a paste in Slack. The next step is stable JSON: post text, who wrote it, like/repost/reply/quote counts, link or media embeds, and a few top-level replies. You can hit AT Protocol yourself for a Bluesky-only product. When Bluesky is one row next to TikTok and X in the same pipeline, a hosted GET that matches the shared envelope is usually enough.

`GET /v1/bluesky/posts` takes a required `url` query param (a public Bluesky post link) and returns `{ data, meta }`. Branch on `data.lookupStatus` before you write — `found` or `not_found`. On `found`, `data.post` holds the AT URI `id`, `cid`, canonical `url`, `text`, `createdAt`, and `indexedAt`. `data.author` is a public card (handle, DID as `platformUserId`, display name, avatar, verified). `data.metrics` covers likes, reposts, replies, and quotes. `data.embed` normalizes external link cards, images, video, or a quoted record when present. `data.replies` is an array of top-level reply rows when the lookup includes them.

This route is one post by URL. To page a handle's feed, use `GET /v1/bluesky/profiles/{handle}/posts`. Profile identity alone is `GET /v1/bluesky/profiles/{handle}`. Pricing is on the credit badge for this operation; bill from `meta.creditsCharged` on every response.

Bluesky Post API FAQ

How do I fetch a single Bluesky post by URL?

Call GET /v1/bluesky/posts with your Social Fetch API key in the x-api-key header and a required url query param pointing at a public bsky.app post. Read data.lookupStatus, then data.post, data.author, data.metrics, data.embed, and data.replies when the post is available. Full parameters and examples are in the API docs linked from this page.

How many credits does a Bluesky post lookup cost?

Pricing is documented on the operation in the API registry (shown on this page). Confirm on every response with meta.creditsCharged — that field is the billing source of truth.

What does the Bluesky post response include?

On a found lookup, data.post includes the AT URI id, cid, public url, text, createdAt, and indexedAt. data.author is a profile card (handle, DID, display name, avatar, verified). data.metrics has likes, reposts, replies, and quotes. data.embed may hold an external link card, images, video, or a quoted record. data.replies lists top-level replies when available. Exact nullability lives in the OpenAPI schema for this route.

What happens if the Bluesky post is deleted or unavailable?

Branch on data.lookupStatus. not_found means Social Fetch could not return a public post for that url — post, author, metrics, and embed are null, and replies is an empty array. Do not invent text or counts. Keep meta.requestId if you need support on a failed lookup.

Post by URL vs profile posts list?

Use GET /v1/bluesky/posts when you already have a post permalink. Use GET /v1/bluesky/profiles/{handle}/posts to page recent posts for a handle. Use GET /v1/bluesky/profiles/{handle} for the identity card only. They are separate marketplace operations with their own credit notes.

Do I need a Bluesky App Password or PDS client for this endpoint?

No. Authenticate with your Social Fetch API key only. This route reads publicly visible post data; it does not log in as a Bluesky user or require an App Password.

Does the response include replies and embeds?

Yes when the lookup returns them. data.embed is a normalized object (kind plus external, images, video, or record fields). data.replies is an array of listed reply posts with their own author and metrics when available. Treat empty replies as "none returned," not proof that the thread has zero replies on Bluesky.