Skip to content
scrapeatlas.Dashboard

Get a Bluesky user’s posts

Try in Playground

Retrieve a page of public posts, replies and reposts with original records, media metadata and engagement counts. Provide exactly one of handle or user_id, and pass cursor to retrieve the next page.

GET/v1/bluesky/user/postsx-api-key
x-api-keystringrequiredheader

Your ScrapeAtlas customer key. Create one on /account/ and set SCRAPEATLAS_API_KEY.

Query parameters
3
handlestringquery

One Bluesky handle; mutually exclusive with user_id.

min 3 chars · max 253 chars

Exampleexample.test
user_idstringquery

One did:plc or did:web account identifier, mutually exclusive with handle.

max 2048 chars

cursorstringquery

Opaque next-page cursor. Absence means the source provided no continuation; do not invent a cursor.

min 1 chars · max 2048 chars

Response fields
29
requestIdstring

Request correlation identifier.

Source request count, decoded response bytes and elapsed milliseconds.

accounting.upstreamRequestsinteger

Always included.

≥ 0

accounting.responseBytesinteger

Always included.

≥ 0

accounting.durationMsnumber

Always included.

≥ 0

successboolean

True when usable data is returned; inspect status and coverage for omissions.

statusenum

success, partial, failed, or challenged. HTTP 200 can be partial.

one of: success, partial

sourceUrlstring

Canonical profile or post URL.

absolute HTTPS URL

fetchedAtstring

UTC retrieval time.

Complete means this bounded page or thread was returned without known omissions. It does not imply all historical posts or replies.

coverage.sourcestring

Always included.

coverage.completeboolean

Always included.

coverage.warningsstring[]

Always included.

Ordered post views: uri, cid, author, record text and facets, embeds, reply/repost/like/quote counts, labels, timestamps and source extensions.

up to 30 items

feed.uristring

Always included.

feed.cidstring

Always included.

min 1 chars

Always included.

feed.author.didstring

Always included.

max 2048 chars

feed.author.handlestring

Always included.

min 1 chars

Always included.

feed.record.$typestring

Always included.

feed.record.textstring

Always included.

feed.record.createdAtstring

Always included.

feed.replyCountinteger

Always included.

≥ 0

feed.repostCountinteger

Always included.

≥ 0

feed.likeCountinteger

Always included.

≥ 0

feed.quoteCountinteger

Always included.

≥ 0

feed.indexedAtstring

Always included.

cursorstringoptional

Opaque next-page cursor. Absence means the source provided no continuation; do not invent a cursor.

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.

Error codes
13
HTTPfailure.codeMeaning
200partialUsable data with restricted_posts_omitted, unavailable_replies_omitted, replies_incomplete, or reply_limit warnings. Batch omissions use unavailable_records or restricted_records_omitted warnings.
400invalid_requestMissing, duplicate, ambiguous, unsafe or unsupported parameters.
401unauthorizedMissing or invalid worker API key.
403restricted_pageThe primary account or post is restricted or unavailable.
404not_foundThe source reports a missing profile or post.
404unavailable_recordsNo requested batch record is available from the public source; no empty success is returned.
429upstream_rate_limitedSource throttling; no automatic retry.
502upstream_challengedSource rejected the unauthenticated request.
502unsupported_pageMalformed, missing or mismatched source data.
502response_too_large payload_too_complexResponse exceeded byte or parsing limits.
502unsafe_redirect request_limit upstream_errorBounded source retrieval could not complete.
503busyAll worker slots are occupied.
504timeoutTotal request deadline expired.