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
| Endpoint | Credits | What it returns | Key parameters |
|---|---|---|---|
GET /v1/bluesky/profile | 1 | Display name, description, avatar, follower, following and post counts, join date, verified status | handle |
GET /v1/bluesky/user/posts | 1 | The account's feed, one fixed window | handle or user_id |
GET /v1/bluesky/post | 1 | One post plus its reply thread, in the same call | url |
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.
| Endpoint | Path | Credit Tier |
|---|---|---|
| Get a Bluesky post | /v1/bluesky/post | standard (1cr) |
| Get a Bluesky profile | /v1/bluesky/profile | standard (1cr) |
| List a Bluesky user's posts | /v1/bluesky/user/posts | standard (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
Pagination
Cursor and page walks, and what has_more actually means.
Credits
What each tier costs and when a call is refunded.
API reference
Every parameter and response field, endpoint by endpoint.
Threads
The other text network, same canonical Post object.
Universal search
Keyword discovery across sources, where Bluesky has none of its own.
