Skip to content
scrapeatlas.Dashboard

Social networks

Bluesky API

Retrieve public Bluesky profiles, paginated account feeds, post conversations, and batches of selected profiles or posts.

5 endpointsx-api-key

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

API availability: Available

Base URL · local workerhttp://localhost:3013Public API: https://api.scrapeatlas.com.
Authenticationx-api-keyCustomer key from your account. See Authentication.

Endpoints

GET/v1/bluesky/profile

Get a Bluesky profile

Retrieve a public Bluesky profile by handle with its DID, display name, bio, images, follower/following/post counts, verification and published profile metadata.

Reference
GET/v1/bluesky/user/posts

Get a Bluesky user’s posts

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.

Reference
GET/v1/bluesky/post

Get a Bluesky post

Retrieve a public Bluesky post, its author, media metadata, engagement counts and nested replies by HTTPS bsky.app URL with a handle or DID.

Reference
POST/v1/bluesky/profiles/batch

Get Bluesky profiles in a batch

Retrieve public profiles for up to 25 handles or DIDs in one request, with full profile metadata and a result for each actor in input order.

Reference
POST/v1/bluesky/posts/batch

Get Bluesky posts in a batch

Retrieve up to 25 selected post views by canonical AT URI in one request, including authors, original records, media metadata and engagement counts, with a result for each URI in input order.

Reference

Quick start

Create an API key on your account page, then call the public API. Values below are placeholders.

Terminal
curl "https://api.scrapeatlas.com/v1/bluesky/profile?handle=example.test" \
  -H "x-api-key: YOUR_API_KEY"

Coverage & limits

  • Independent, stateless worker: four concurrent operations; 15-second total deadline; at most two 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.
  • Source access restrictions, hidden or taken-down labels and blocked or missing embedded content are honoured: a restricted primary object fails explicitly, and affected feed entries or replies are omitted with partial coverage. Ordinary content labels remain metadata.
  • Source optional fields and null values are preserved. Source caching and live counters can affect freshness.
  • Batch profiles/posts: 1–25 unique input identifiers, JSON POST bodies up to 64 KiB, one source batch call with at most one shared transient retry; no per-record enrichment or thread expansion. Results follow input order. Missing/restricted records are null with explicit status; no usable records fails with unavailable_records.
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.