Get a Bluesky user’s posts
Retrieve a page of public posts, replies and reposts, newest first, with original records, media metadata and engagement counts. Provide exactly one of handle or user_id, and pass cursor to retrieve the next page.
/v1/bluesky/user/postsx-api-keyHeaders
Get your API keyYour ScrapeAtlas customer key. Create one on /account/ and set SCRAPEATLAS_API_KEY.
One Bluesky handle; mutually exclusive with user_id.
min 3 chars · max 253 chars
example.testOne did:plc or did:web account identifier, mutually exclusive with handle.
max 2048 chars
Opaque next-page cursor. Absence means the source provided no continuation; do not invent a cursor.
min 1 chars · max 2048 chars
Optional: posts_with_replies (default), posts_no_replies, posts_with_media, posts_with_video or posts_and_author_threads.
one of: posts_with_replies, posts_no_replies, posts_with_media, posts_with_video, posts_and_author_threads
Optional posts per page, 1 to 100; default 30.
Earliest publication time to include, ISO 8601 or Unix seconds.
Publication time to stop before, ISO 8601 or Unix seconds; later than since.
Request correlation identifier.
Source request count, decoded response bytes and elapsed milliseconds.
Always included.
≥ 0
Always included.
≥ 0
Always included.
≥ 0
True when usable data is returned; inspect status and coverage for omissions.
success, partial, failed, or challenged. HTTP 200 can be partial.
one of: success, partial
Canonical profile or post URL.
absolute HTTPS URL
UTC retrieval time.
Complete means this bounded page was returned without known omissions. order is newest_first by feed time; window echoes since/until.
Always included.
Always included.
Always included.
Always included.
one of: newest_first, oldest_first, ranked, relevance, source_order
Optional.
Optional.
Optional.
Post views newest first: uri, cid, author, record text and facets, embeds, counts, labels and timestamps. A repost carries reason with the reposter and repost time (indexedAt).
up to 100 items
Always included.
Always included.
min 1 chars
Always included.
Always included.
max 2048 chars
Always included.
min 1 chars
Always included.
Always included.
Always included.
Always included.
Always included.
≥ 0
Always included.
≥ 0
Always included.
≥ 0
Always included.
≥ 0
Always included.
Opaque next-page cursor. Absence means the source provided no continuation; do not invent a cursor.
No fields match.
HTTP 200 returns the success variant. Check status: partial means usable data with warnings, and failed or challenged requests carry a failure object described in Errors & responses.
| HTTP | failure.code | Meaning |
|---|---|---|
| 200 | partial | Usable data with restricted_posts_omitted, unavailable_replies_omitted, replies_incomplete, or reply_limit warnings. Batch omissions use unavailable_records or restricted_records_omitted warnings. |
| 400 | invalid_request | Missing, duplicate, ambiguous, unsafe or unsupported parameters. |
| 401 | unauthorized | Missing or invalid worker API key. |
| 403 | restricted_page | The primary account or post is restricted or unavailable. |
| 404 | not_found | The source reports a missing profile or post. |
| 404 | unavailable_records | No requested batch record is available from the public source; no empty success is returned. |
| 429 | upstream_rate_limited | Source throttling; no automatic retry. |
| 502 | upstream_challenged | Source rejected the unauthenticated request. |
| 502 | unsupported_page | Malformed, missing or mismatched source data. |
| 502 | response_too_large payload_too_complex | Response exceeded byte or parsing limits. |
| 502 | unsafe_redirect request_limit upstream_error | Bounded source retrieval could not complete. |
| 503 | busy | All worker slots are occupied. |
| 504 | timeout | Total request deadline expired. |