Bluesky Scraper — Profiles, Posts, Followers (AT Protocol) avatar

Bluesky Scraper — Profiles, Posts, Followers (AT Protocol)

Pricing

from $2.00 / 1,000 profile scrapeds

Go to Apify Store
Bluesky Scraper — Profiles, Posts, Followers (AT Protocol)

Bluesky Scraper — Profiles, Posts, Followers (AT Protocol)

Extract Bluesky profiles, posts, follower/following graphs, starter-pack members, and custom feeds via the public AT Protocol API. No login. One normalized output.

Pricing

from $2.00 / 1,000 profile scrapeds

Rating

0.0

(0)

Developer

Max Miller

Max Miller

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Bluesky Scraper — Profiles, Posts, Followers, Starter Packs & Feeds (AT Protocol)

Scrape Bluesky at scale — no login, no API key, no rate-limit headaches. Pull profiles, posts, follower and following graphs, starter-pack members, and custom-feed contents from Bluesky (bsky.app) through the official public AT Protocol API. Every mode returns one clean, normalized record shape ready for CSV, Excel, JSON, or your database.

Built for growth teams, researchers, and analysts who need Bluesky data now that X's API costs $100+/month. This is the only Bluesky actor that unifies profiles, posts, social graph, starter packs, and custom feeds in a single tool.

Why this Bluesky scraper

  • No authentication. It reads public data through Bluesky's public AppView. Nothing to log in to, no tokens to rotate, no account to get banned.
  • Fast and cheap. Pure REST — no headless browser — so runs finish in seconds and cost pennies.
  • One schema for everything. Profiles, posts, followers, following, starter-pack members, and feed posts all normalize into the same row format. No reshaping downstream.
  • Handles the messy parts. Cursor pagination, deleted/suspended accounts, and rate limits are handled for you. A bad handle never kills a run.

Use cases

Brand & competitor monitoring

Track any account's posts and engagement (likes, reposts, replies, quotes) over time. Watch competitors' follower growth. Pull a brand's latest posts into your dashboard or alerting.

Follower & audience analysis

Export the full follower or following list for any account to find overlap, spot influencers, size an audience, or build lookalike lists. Combine with the profiles mode to enrich each account with bio, follower count, and verification status.

Starter-pack & community research

Extract every member of any Bluesky starter pack — the fastest way to map a niche community or build a targeted outreach list. Great for finding the accounts that matter in a topic.

Trend & feed research

Pull the contents of any custom feed (e.g. "What's Hot") to study what's trending, harvest content ideas, or feed a research pipeline.

Academic & data science

Collect structured social-graph and post data for network analysis, NLP, or social-science research — reproducibly and at low cost.

Input

FieldTypeDescription
modeselectprofiles · posts · followers · following · starterpack · feed
handlesstring[]Handles (bsky.app) or DIDs (did:plc:...). @ and profile URLs accepted.
maxItemsPerHandleintegerCap on records per handle (posts / followers / following / pack members). Default 100.
feedUrisstring[]Custom-feed AT-URIs — only for feed mode. If empty, the actor discovers feeds published by handles.

Example input

{
"mode": "followers",
"handles": ["bsky.app", "jay.bsky.team"],
"maxItemsPerHandle": 1000
}

Get an account's recent posts with engagement:

{ "mode": "posts", "handles": ["bsky.app"], "maxItemsPerHandle": 200 }

Pull every member of an account's starter packs:

{ "mode": "starterpack", "handles": ["pfrazee.com"], "maxItemsPerHandle": 500 }

Scrape a custom feed:

{
"mode": "feed",
"feedUris": ["at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.generator/whats-hot"],
"maxItemsPerHandle": 100
}

Output

Every dataset row has the same top-level shape. recordType tells you which detail object (profile, post, or starterpack) is populated; the others are null.

Profile record (profiles / followers / following / starter-pack members)

{
"recordType": "profile",
"mode": "followers",
"sourceActor": "bsky.app",
"scrapedAt": "2026-08-10T22:14:03.000Z",
"status": "ok",
"error": null,
"profile": {
"did": "did:plc:z72i7hdynmk6r22z27h6tvur",
"handle": "bsky.app",
"displayName": "Bluesky",
"description": "official bluesky account…",
"avatar": "https://cdn.bsky.app/…",
"banner": "https://cdn.bsky.app/…",
"followersCount": 34467337,
"followsCount": 11,
"postsCount": 806,
"createdAt": "2023-04-12T04:53:57.057Z",
"indexedAt": "2025-…",
"labels": [],
"verified": false,
"profileUrl": "https://bsky.app/profile/bsky.app"
},
"post": null,
"starterpack": null
}

Note: followers / following return Bluesky's basic profile view, so followersCount and postsCount are null for those rows. Run profiles mode on the handles to enrich them with full counts.

Post record (posts / feed)

{
"recordType": "post",
"mode": "posts",
"sourceActor": "bsky.app",
"status": "ok",
"post": {
"uri": "at://did:plc:z72…/app.bsky.feed.post/3msqpusnigc2t",
"cid": "bafy…",
"rkey": "3msqpusnigc2t",
"webUrl": "https://bsky.app/profile/bsky.app/post/3msqpusnigc2t",
"text": "We also added thread numbering…",
"createdAt": "2026-08-06T…",
"langs": ["en"],
"author": { "did": "did:plc:z72…", "handle": "bsky.app", "displayName": "Bluesky" },
"replyCount": 52,
"repostCount": 215,
"likeCount": 1489,
"quoteCount": 8,
"bookmarkCount": 3,
"isReply": false,
"isRepost": false,
"hasMedia": true,
"labels": []
}
}

Starter-pack record (starterpack)

{
"recordType": "starterpack",
"mode": "starterpack",
"sourceActor": "pfrazee.com",
"starterpack": {
"uri": "at://…/app.bsky.graph.starterpack/3m4j33zq7sz2m",
"name": "Great people to be moots with",
"creatorHandle": "pfrazee.com",
"listUri": "at://…/app.bsky.graph.list/3m4j33zj5u62u",
"joinedAllTimeCount": 412,
"webUrl": "https://bsky.app/starter-pack/pfrazee.com/3m4j33zq7sz2m"
}
}

A starterpack run emits one starterpack record per pack plus a profile record for each pack member, so you get the summary and the full membership in one dataset.

Errors are data, not failures

If a handle is deleted, suspended, or never existed, you get a row with "status": "not_found" instead of a crashed run:

{ "recordType": "error", "sourceActor": "gone.bsky.social", "status": "not_found", "error": "Profile not found" }

Pricing

Pay-per-result (pay-per-event): you're charged per record returned plus a small per-run start fee. API-only compute keeps costs low. See the pricing tab for current rates.

This actor reads only public data through Bluesky's official public AT Protocol endpoints — the same data any logged-out visitor can see at bsky.app. It performs no login, accesses no private content, and takes no authenticated actions. Respect Bluesky's Terms of Service and applicable data-protection law (GDPR/CCPA) when processing personal data.

FAQ

Do I need a Bluesky account? No. It uses the public API.

Can it scrape private accounts? Bluesky has no private profiles on the public AppView; only public data is available.

How do I get a feed's AT-URI? Open the feed on bsky.app — or leave feedUris empty and pass the creator's handle in handles to auto-discover their feeds.

What's the max? maxItemsPerHandle controls the cap. Pagination handles accounts with millions of followers; set the cap to sample large accounts cheaply.


Keywords: Bluesky scraper, Bluesky API, AT Protocol data, Bluesky analytics, Bluesky followers export, Bluesky posts scraper, social media scraper, bsky.app data extraction.