Social Dash Scraper
Documentation v0.1OpenAPI

Social networks API

Bluesky

Live private service · production acceptance passed

Retrieve public Bluesky profiles, paginated user posts, and individual posts with nested replies.

Three authenticated endpoints return structured public data with original post records, media metadata, source counts, and explicit coverage.

Base URLhttp://localhost:3013

Local development example. Replace with your service origin.

Get a Bluesky profile

GET/v1/bluesky/profile

Retrieve a public Bluesky profile by handle, including DID, display name, bio, avatar, banner, follower/following/post counts and available source extensions.

Query parameters

FieldTypeDescription
handlestringRequired domain-style Bluesky handle, without @ or a profile URL. Custom domain handles are supported.

Response fields

FieldTypeDescription
didstringStable Bluesky account identifier.
handlestringRequired domain-style Bluesky handle, without @ or a profile URL. Custom domain handles are supported.
displayNamestringPublished display name when present.
descriptionstringPublished bio when present.
avatarstringPublished avatar URL; media is not downloaded.
bannerstringPublished banner URL when present.
followersCountintegerCurrent source follower count.
followsCountintegerCurrent source following count.
postsCountintegerCurrent source post count.
labelsarraySource moderation labels; logged-out access restrictions are honored.
requestIdstringRequest correlation identifier.
accountingobjectTotal HTTP attempts, decoded bytes, and duration across the operation, including handle resolution and the shared retry.
successbooleanTrue when usable data is returned; inspect status and coverage for omissions.
statusstringsuccess, partial, failed, or challenged. HTTP 200 can be partial.
sourceUrlstringCanonical profile or post URL.
fetchedAtstringUTC retrieval time.
coverageobjectComplete means this bounded page or thread was returned without known omissions. It does not imply all historical posts or replies.

Nested fields and every response variant are in the OpenAPI specification.

Get a Bluesky user’s posts

GET/v1/bluesky/user/posts

Retrieve one author-feed page of up to 30 posts and reposts, including replies. Provide exactly one of handle or user_id. Pass the opaque response cursor unchanged to retrieve the next page. Each feed item is the complete source post view; feed wrappers such as repost reasons are not included.

Query parameters

FieldTypeDescription
handlestringOne Bluesky handle; mutually exclusive with user_id.
user_idstringOne did:plc or did:web account identifier, mutually exclusive with handle.
cursorstringOpaque next-page cursor. Absence means the source provided no continuation; do not invent a cursor.

Response fields

FieldTypeDescription
requestIdstringRequest correlation identifier.
accountingobjectTotal HTTP attempts, decoded bytes, and duration across the operation, including handle resolution and the shared retry.
successbooleanTrue when usable data is returned; inspect status and coverage for omissions.
statusstringsuccess, partial, failed, or challenged. HTTP 200 can be partial.
sourceUrlstringCanonical profile or post URL.
fetchedAtstringUTC retrieval time.
coverageobjectComplete means this bounded page or thread was returned without known omissions. It does not imply all historical posts or replies.
feedarrayOrdered post views: uri, cid, author, record text and facets, embeds, reply/repost/like/quote counts, labels, timestamps and source extensions.
cursorstringOpaque next-page cursor. Absence means the source provided no continuation; do not invent a cursor.

Nested fields and every response variant are in the OpenAPI specification.

Get a Bluesky post

GET/v1/bluesky/post

Retrieve a public post and a bounded nested reply tree by HTTPS bsky.app URL. The profile segment accepts a handle or DID. Handles are resolved through the public profile API. Up to six reply levels and 100 visited reply nodes are included; ancestors are not fetched.

Query parameters

FieldTypeDescription
urlstringRequired HTTPS bsky.app/profile/<handle-or-did>/post/<record-key> URL. No credentials, ports or encoded path segments. Tracking query and fragment are discarded.

Response fields

FieldTypeDescription
requestIdstringRequest correlation identifier.
accountingobjectTotal HTTP attempts, decoded bytes, and duration across the operation, including handle resolution and the shared retry.
successbooleanTrue when usable data is returned; inspect status and coverage for omissions.
statusstringsuccess, partial, failed, or challenged. HTTP 200 can be partial.
sourceUrlstringCanonical profile or post URL.
fetchedAtstringUTC retrieval time.
coverageobjectComplete means this bounded page or thread was returned without known omissions. It does not imply all historical posts or replies.
postobjectComplete primary post view, including record, author, embeds and source engagement counts.
repliesarrayNested source thread nodes with post and replies. Missing, blocked or logged-out-restricted reply posts are omitted with a coverage warning.

Nested fields and every response variant are in the OpenAPI specification.

Coverage & limits

  • Independent, stateless worker: four concurrent operations; 15-second total deadline; at most three upstream HTTP attempts with one shared transient retry. No automatic retry for challenges or HTTP 429.
  • Fixed public.api.bsky.app HTTPS origin. No login, cookies, browser, proxy, outbound link visits, media downloads or result storage. The service API key is never forwarded.
  • At most 4 MiB combined decoded JSON, depth 32 and 30,000 nodes per source response. Oversize or malformed responses fail explicitly.
  • User posts: one source page of up to 30 entries; source order and duplicates are preserved. Cursor continuation is caller-driven, without automatic crawling.
  • Single post: six reply levels and at most 100 visited reply nodes. Known unreturned replies produce replies_incomplete or reply_limit warnings. No ancestor enumeration.
  • Logged-out restrictions, hidden/taken-down labels and blocked/not-found embedded content are honored. A restricted primary object fails; affected feed entries or replies are omitted with explicit partial coverage. Ordinary content labels remain metadata.
  • Source optional fields and null values are preserved. Source caching and live counters can affect freshness. Sampled profile and feed data matched ScrapeCreators; the sampled post omits one reply restricted to logged-in viewers, with partial coverage. No credit balances, billing or caching controls are provided.

Errors & partial results

HTTPCode / statusMeaning
200partialUsable data with restricted_posts_omitted, unavailable_replies_omitted, replies_incomplete, or reply_limit warnings.
400invalid_requestMissing, duplicate, ambiguous, unsafe or unsupported parameters.
401unauthorizedMissing or invalid worker API key.
403restricted_pageThe primary account/post requires access or is unavailable to logged-out readers.
404not_foundThe source reports a missing profile or post.
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.