Skip to content
scrapeatlas.Dashboard

Get a Bluesky user’s posts

Try in Playground

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.

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
7
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

filterenumquery

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

limitstringquery

Optional posts per page, 1 to 100; default 30.

sincenumber | stringquery

Earliest publication time to include, ISO 8601 or Unix seconds.

untilnumber | stringquery

Publication time to stop before, ISO 8601 or Unix seconds; later than since.

Response fields
33
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 was returned without known omissions. order is newest_first by feed time; window echoes since/until.

coverage.sourcestring

Always included.

coverage.completeboolean

Always included.

coverage.warningsstring[]

Always included.

coverage.orderenum

Always included.

one of: newest_first, oldest_first, ranked, relevance, source_order

Optional.

coverage.window.sincestringoptional

Optional.

coverage.window.untilstringoptional

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

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.