SocialCrawl

Bluesky

Bluesky profiles, user feeds, and single posts with their reply threads, from the AT Protocol network

Public Bluesky data on the AT Protocol network: an account snapshot, its feed, and any single post together with the replies underneath it. Three endpoints, all 1 credit, no OAuth and no app password.

Base URL: /v1/bluesky/...

There is no search endpoint on this platform, and no separate comments endpoint. /v1/bluesky/post returns a post together with its reply thread, or not at all. Start from a handle you already hold.

Quickstart

1. Fetch a profile

curl "https://www.socialcrawl.dev/v1/bluesky/profile?handle=espn.com" \
  -H "x-api-key: YOUR_API_KEY"

2. Fetch their content

curl "https://www.socialcrawl.dev/v1/bluesky/user/posts?handle=espn.com" \
  -H "x-api-key: YOUR_API_KEY"

3. Read computed fields

When an endpoint supports a computed field and the required source inputs are present, the unified response includes that optional field. Depending on the endpoint, optional fields can include engagement_rate, language, content_category, and estimated_reach. See Computed fields for formulas, clamping rules, and null semantics.

Accounts and posts

EndpointCreditsWhat it returnsKey parameters
GET /v1/bluesky/profile1Display name, description, avatar, follower, following and post counts, join date, verified statushandle
GET /v1/bluesky/user/posts1The account's feed, one fixed windowhandle or user_id
GET /v1/bluesky/post1One post plus its reply thread, in the same callurl

Each feed post carries its text, author, attachments, and the four engagement counts Bluesky publishes: replies, reposts, likes, and quotes. Quote counts are their own number here rather than being folded into reposts, which is a distinction most platforms do not make.

user/posts accepts either handle or user_id. One of the two is required, and sending neither is a 400 before billing.

curl "https://www.socialcrawl.dev/v1/bluesky/post?url=https://bsky.app/profile/espn.com/post/3lqdfq7fkvm2g" \
  -H "x-api-key: YOUR_API_KEY"

Two identifiers, one of them permanent

Bluesky identifies accounts two ways. The handle is the readable one and is usually a domain such as espn.com or bsky.app, because Bluesky lets you verify a domain as your handle. The did is the permanent identifier, in the form did:plc:x7d6j54pm22ufehkes6jo4jf.

A handle can change; a did cannot. Store the did if you are tracking an account over time, and pass it as user_id when you read the feed back.

All endpoints

3 endpoints available.

EndpointPathCredit Tier
Get a Bluesky post/v1/bluesky/poststandard (1cr)
Get a Bluesky profile/v1/bluesky/profilestandard (1cr)
List a Bluesky user's posts/v1/bluesky/user/postsstandard (1cr)

Platform notes

There is no search endpoint on this platform. Keyword discovery on Bluesky is not covered here. Start from a handle you already know, or find accounts elsewhere and pivot in.

Handles look like domains and that is correct. Do not strip a .com off a Bluesky handle the way you would strip an @ elsewhere. The domain is the handle.

Reposts and quotes are different numbers. A repost carries no new text; a quote does. Adding them together double-counts the amplification.

Nothing here pages. user/posts returns one fixed window, and a post's replies arrive with the post.

user_id is the AT Protocol did, not a numeric id.

Next steps