Bluesky Scraper — Profiles, Posts & Followers avatar

Bluesky Scraper — Profiles, Posts & Followers

Pricing

from $2.00 / 1,000 row scrapeds

Go to Apify Store
Bluesky Scraper — Profiles, Posts & Followers

Bluesky Scraper — Profiles, Posts & Followers

Scrape Bluesky via the official AT Protocol API: profiles with follower counts, full post histories with engagement, follower and following lists, flattened reply threads, and custom feeds.

Pricing

from $2.00 / 1,000 row scrapeds

Rating

0.0

(0)

Developer

Pixflor

Pixflor

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

3 days ago

Last modified

Share

Bluesky as clean rows: profiles with follower counts, complete post histories with engagement numbers, follower and following lists, flattened reply threads, and custom feeds.

No API key. No login. Paste a handle, press start, export CSV or JSON.


What this does that other Bluesky scrapers don't

It doesn't stop after the first page

This is the trap, and it's a nasty one because the mistake is the sensible heuristic everywhere else.

Ask Bluesky for 100 followers and it returns 84. Ask again, 83. Then 87. On almost any other API, receiving fewer rows than you asked for means you've reached the end — so a scraper stops there and hands you 84 followers out of hundreds of thousands.

Every one of those short pages still carries a cursor, and the data keeps going. On the AT Protocol, only a missing cursor means the end. This Actor pages on the cursor and reports how many short pages it walked through, so you can see it happening.

It extracts the links that aren't in the post text

Bluesky stores URLs, hashtags and mentions in a facets structure, not in the post body. Read record.text and you get the words with no URL attached. This Actor pulls links, tags and mentions out of the facets and gives you them as fields.

It tells you the truth about post search

There is no keyword post search here, and that's deliberate.

app.bsky.feed.searchPosts returns 403 on Bluesky's public host. On the alternate host it serves exactly one request, then answers "403 Forbidden — Request forbidden by administrative rules" to everything after, with no rate-limit headers and no recovery. That's an administrative block, not a rate limit.

Getting around it would mean building bot-detection evasion, which is both a losing arms race and the sort of thing that gets an Actor pulled. So this Actor doesn't offer post search rather than shipping a feature that breaks. Everything it does offer runs on Bluesky's official public host and was measured stable under repeated rapid calls.

If you need posts on a topic, search for accounts in that niche and pull their feeds — which this Actor does well, and which is what most people actually want anyway.


What you get

Poststext, url, authorHandle, authorName, authorDid, createdAt, likeCount, repostCount, replyCount, quoteCount, plus a combined engagement figure, isReply, isRepost, hasEmbed, embedType, langs, links, tags, mentions, labels.

Profileshandle, did, displayName, description, followers, following, posts, createdAt, isVerified, avatarUrl, bannerUrl, url.

Threads — every reply flattened into rows with threadDepth, so you get a table instead of nested JSON.


Modes

ModeWhat it returns
Posts by an accountFull post history, paged on the cursor
ProfilesBulk profile lookup, 25 accounts per request
Followers of an accountComplete follower list
Accounts someone followsTheir following list
Search for accountsFind people by name, keyword or topic
A post and all its repliesWhole thread, flattened with depth
Who liked a postThe accounts behind the likes
A custom feedAny feed generator, e.g. What's Hot

Typical uses

  • Audience research. Who follows a competitor, filtered to accounts above a follower threshold — that's a shortlist of people worth talking to.
  • Influencer discovery. Search accounts by topic, sort by followers, check their real posting cadence and engagement rather than trusting a bio.
  • Community mapping. Follower and following graphs around a niche.
  • Brand and sentiment monitoring. Pull the feeds of the accounts that matter in your space and watch what they post.
  • Content analysis. Engagement by post type, language, or whether it carried a link.
  • Feeding an LLM or agent. One row per item, consistent field names, links already extracted.

Example input

An account's posts, originals only, ranked by engagement:

{
"mode": "authorFeed",
"actors": ["bsky.app"],
"excludeReposts": true,
"excludeReplies": true,
"minLikes": 10,
"sortBy": "engagement",
"maxItems": 200
}

Followers of an account, filtered to ones with real reach:

{
"mode": "followers",
"actors": ["bsky.app"],
"minFollowers": 500,
"sortBy": "followers",
"maxItems": 1000
}

One thread, flattened into rows:

{ "mode": "thread", "postUrl": "https://bsky.app/profile/bsky.app/post/3l6oveex3ii2l" }

Settings that matter

  • actors — handles (bsky.app) or DIDs both work. Handles are easier to read; DIDs survive a rename, so prefer them for anything you schedule.
  • postFilterposts_no_replies is usually what you want for "what did this account actually publish", as opposed to everything it typed.
  • minLikes / minReposts / minFollowers — applied before rows are produced, so they cut the bill as well as the noise. The fastest way to skip a long tail of zero-engagement posts.
  • excludeReposts — on a repost-heavy account this is the difference between their writing and their reading.
  • maxItems — your cost ceiling. Follower lists in particular can run very long.

Reliability

Official AT Protocol public API. No HTML parsing and no bot-detection workarounds anywhere in this Actor.

A 62-assertion live test suite runs before every release, including assertions that short pages still carry cursors, that facet extraction still finds links, and that post search is still blocked — so if Bluesky ever opens it up, the test says so.


Pricing

Pay per event. You are charged for the run start and for each row returned — nothing else, and platform compute is included free. Profiles are fetched 25 per request rather than one at a time, so bulk lookups are cheap.


Questions or a bug?

Open an issue on the Issues tab of this Actor. Include your input JSON and the run ID — that's usually enough to reproduce it immediately.