Bluesky Scraper: Posts, Search, Replies, Followers avatar

Bluesky Scraper: Posts, Search, Replies, Followers

Pricing

from $0.69 / 1,000 rows

Go to Apify Store
Bluesky Scraper: Posts, Search, Replies, Followers

Bluesky Scraper: Posts, Search, Replies, Followers

Scrape public Bluesky posts by keyword with date, language and author filters, a profile's posts, a post's replies, profiles with follower counts, and follower lists. Likes, reposts, replies, quotes, links, images. No login or app password. Pay per row.

Pricing

from $0.69 / 1,000 rows

Rating

0.0

(0)

Developer

The Mine Works

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

9 days ago

Last modified

Share

1,500 Bluesky posts in 6.4 seconds

From The Mine Works, makers of Threads Scraper and B2B Leads Finder, with over 140,000 runs across 170+ public actors.

Why choose this actor?

  • Six jobs in one actor, all without a login. Search posts by keyword, read a profile's posts, pull a post with every reply under it, get profiles with follower counts, and list followers or followed accounts. Our proof run read 1,500 posts for 3 searches in 6.4 seconds, 500 each for "artificial intelligence", "climate" and #booksky. No Bluesky account, no app password, no cookies.
  • Real counts and the full post, not a snippet. Every post row carries likes, reposts, replies, quotes and bookmarks as Bluesky counts them, the whole text, languages, hashtags, mentions, links, the link card, full size images with their alt text, the video playlist, the quoted post, and the reply chain. 2,141 posts in our proof runs filled like_count, reply_count, repost_count, quote_count and embed_type on every row.
  • You pay only for rows you receive. One charge per post, profile or account row saved to your dataset, plus a flat start fee per run. Handles and posts that do not exist (our proof runs had one of each, reported as not found), refused requests, the same post found by two of your searches, reposts you switch off and results an earlier run already gave you (when you switch that on) are never charged.

Run it on Apify

Part of The Mine Works Social media and video family: Threads Scraper, Reddit Scraper, Threads Search Scraper, Instagram Profile Scraper, Instagram Followers & Following, Reddit Search Scraper.

Try it in one minute

Paste this input and press Start. It returns the 20 newest posts that mention "artificial intelligence", in about 3 seconds:

{
"mode": "search",
"searchTerms": ["artificial intelligence"],
"maxResults": 20
}

Pick the job with mode, then fill the one field that mode reads:

  • search reads searchTerms: plain words, "exact phrases", #hashtags, or Bluesky's own operators such as from:bsky.app or lang:en, one search per line.
  • profile_posts, profiles, followers and following read handles: a handle (bsky.app, jay.bsky.team), an @handle, a DID (did:plc:z72i7hdynmk6r22z27h6tvur) or a profile link (https://bsky.app/profile/nytimes.com). A bare name without a dot, such as stephenking, is read as stephenking.bsky.social.
  • thread_replies reads postUrls: a post link (https://bsky.app/profile/bsky.app/post/3mv3zcjaijk22) or an at:// post URI.

Apify's free plan includes $5 of credit every month, which covers about 3,700 results at this actor's price.

Copy to your AI assistant

themineworks/bluesky-scraper on Apify. Reads public Bluesky data without a login: posts matching a search (with date, language, author and linked domain filters), a profile's posts, a post and all its replies, profiles with follower and post counts, and the followers or follows of an account; one row per post or account with likes, reposts, replies, quotes, text, links, images, video, quoted post and reply chain. Call ApifyClient("TOKEN").actor("themineworks/bluesky-scraper").call(run_input={"mode": "search", "searchTerms": ["artificial intelligence"], "maxResults": 50}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: mode (search, profile_posts, thread_replies, profiles, followers or following). Optional: searchTerms (search), handles (profile_posts, profiles, followers, following), postUrls (thread_replies), maxResults (default 50, 10 to 100000), sort (latest or top), since, until, language, author, domain, feedFilter (default posts_no_replies), includeReposts (default false), includeNestedReplies (default true), followerDetails (default false), onlyNewResults (default false). Skip rows that have "_type": "status". Full spec: GET https://api.apify.com/v2/acts/themineworks~bluesky-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral

Key features

  • Six modes: search, profile_posts, thread_replies, profiles, followers and following, each with its own row shape, in one actor and one price.
  • Up to 100,000 rows per search term, account or post. Bluesky hands out up to 100 posts or accounts per request. In our tests one "latest" search read 2,000 posts going back six months in 43 seconds, and a follower list read 200 accounts with their counts in 10 seconds.
  • Search filters that matter for monitoring: newest first or Bluesky's top ranking, since and until (a date, a time, or a window such as 7 days), language, only posts by one author, and only posts that link to a domain such as nytimes.com.
  • About 50 fields per post: author handle, name, DID, avatar and verification; text, creation and index times; likes, reposts, replies, quotes, bookmarks; languages, hashtags, mentions, links; images with alt text, gallery carousels, video playlist and poster, link card, quoted post with its text; reply parent and root; repost flag and time; moderation labels.
  • Whole threads: thread_replies returns the post itself, then every reply Bluesky shows under it, direct replies first, with thread_depth and the parent of each reply, up to 1,000 levels deep.
  • Only new results on repeat runs: switch on onlyNewResults for a schedule and each run returns, and charges, only posts, replies or accounts no earlier run of yours delivered. In our test the second run delivered 0 posts and stopped after one request.

How to use it

Basic: the latest posts about a topic

{
"mode": "search",
"searchTerms": ["climate"],
"maxResults": 200,
"language": "en"
}

Newest first. Each request reads up to 100 posts, and the actor keeps going back in time until it has 200 or the search runs out.

Several searches at once, inside a date window

{
"mode": "search",
"searchTerms": ["artificial intelligence", "\"open source\"", "#booksky"],
"maxResults": 500,
"since": "2026-10-01",
"until": "2026-10-05"
}

Up to 500 searches per run, read four at a time. A post that matches two of your searches is delivered once, under the first one, and charged once.

A profile's posts, with reposts

{
"mode": "profile_posts",
"handles": ["bsky.app", "https://bsky.app/profile/nytimes.com"],
"maxResults": 100,
"feedFilter": "posts_no_replies",
"includeReposts": true
}

feedFilter picks the same tabs the profile page shows: posts_no_replies, posts_with_replies, posts_with_media or posts_and_author_threads. Reposts come with is_repost, reposted_by_handle and reposted_at; the author fields then name the original author.

Every reply under a post

{
"mode": "thread_replies",
"postUrls": ["https://bsky.app/profile/bsky.app/post/3mv3zcjaijk22"],
"maxResults": 500
}

The post itself comes first (thread_depth 0), then direct replies (1), then replies to replies (2) and so on. Set includeNestedReplies to false for direct replies only.

Profiles with follower, following and post counts

{
"mode": "profiles",
"handles": ["bsky.app", "nytimes.com", "theonion.com", "did:plc:ewvi7nxzyoun6zhxrhs64oiz"]
}

One row per account, 25 accounts per request. Accounts that do not exist get a free status row that says so, and a handle and a DID of the same account give one row, charged once.

Followers or followed accounts

{
"mode": "followers",
"handles": ["atproto.com"],
"maxResults": 1000,
"followerDetails": true
}

Use following instead of followers for the accounts a handle follows. Newest followers come first. followerDetails adds followers_count, follows_count and posts_count to every row, at one extra request per 25 accounts and no extra price.

Brand and keyword monitoring every morning

{
"mode": "search",
"searchTerms": ["yourbrand", "\"your product name\"", "#yourhashtag"],
"maxResults": 1000,
"onlyNewResults": true
}

Schedule it daily in Apify Console (Schedules, then Add schedule). Each run returns, and charges, only posts no earlier run delivered for the same search, and it stops as soon as it reaches posts it has already seen, so a quiet day costs little more than the start fee.

{
"mode": "search",
"searchTerms": ["election"],
"domain": "nytimes.com",
"since": "7 days",
"maxResults": 1000
}

domain keeps posts that link to that site. In our test, all 50 posts returned for "election" with domain: nytimes.com carried a nytimes.com link. Run one search per topic you care about, with your own site in domain.

Audience research on a competitor

Run followers with followerDetails on a competitor's handle, then sort by followers_count to find the accounts with reach in that audience. Run profiles weekly on a list of accounts to chart follower growth over time.

Input parameters

ParameterTypeDefaultWhat it does
modestringsearchsearch, profile_posts, thread_replies, profiles, followers or following. Required.
searchTermsarray of strings["artificial intelligence"]search mode: one search per line, words, phrases in quotes, hashtags or Bluesky operators. Up to 500 per run.
handlesarray of strings["bsky.app"]profile_posts, profiles, followers and following: handles, @handles, DIDs or profile links. Up to 500 per run.
postUrlsarray of strings["https://bsky.app/profile/bsky.app/post/3mv3zcjaijk22"]thread_replies: post links or at:// post URIs. Up to 500 per run.
maxResultsinteger50Rows per search term, account or post, 10 to 100,000. Ignored in profiles mode.
sortstringlatestsearch mode: latest (newest first, reads back in time up to your max) or top (Bluesky's ranking, about 100 posts per term).
sincestringnonePosts on or after this date, time or window (2026-10-01, 2026-10-01T09:00:00Z, 7 days). search and profile_posts.
untilstringnonePosts before this date, time or window. search and profile_posts.
languagestringnonesearch mode: a language code such as en, de or ja.
authorstringnonesearch mode: only posts by this handle or DID.
domainstringnonesearch mode: only posts that link to this site, for example nytimes.com.
feedFilterstringposts_no_repliesprofile_posts: posts_no_replies, posts_with_replies, posts_with_media or posts_and_author_threads.
includeRepostsbooleanfalseprofile_posts: also return posts the account reposted. Skipped reposts are not charged.
includeNestedRepliesbooleantruethread_replies: also return replies to replies. Untick for direct replies only.
followerDetailsbooleanfalsefollowers and following: add follower, following and post counts to every account row.
onlyNewResultsbooleanfalseSkip results an earlier run of yours delivered for the same term, account or post. Not used in profiles mode.

There is no proxy setting: the actor always reads through Apify's datacenter proxy, which is included in the price.

What data do you get?

One row per post (record_type post), per profile (profile) or per account in a follower list (follower or following). Every row says which source_mode and source_input produced it and its position.

Post rows: post_url, post_uri, post_cid; the author's author_handle, author_display_name, author_did, author_profile_url, author_avatar_url, author_verified; text, created_at, indexed_at; like_count, repost_count, reply_count, quote_count, bookmark_count; langs, hashtags, mentions, links; embed_type with image_urls, image_alts, video_playlist_url, video_thumbnail_url, external_url, external_title, external_description, quoted_post_url, quoted_post_uri, quoted_author_handle, quoted_text; the reply chain is_reply, reply_parent_url, reply_parent_uri, reply_root_url, reply_root_uri; reposts is_repost, reposted_by_handle, reposted_at; moderation labels; and search_term (search) or thread_depth and thread_post_url (thread_replies).

Profile rows: handle, display_name, did, profile_url, description, avatar_url, banner_url, followers_count, follows_count, posts_count, lists_count, feeds_count, starter_packs_count, is_labeler, verified, trusted_verifier, pinned_post_url, created_at, indexed_at, labels.

Follower and following rows: handle, display_name, did, profile_url, description, avatar_url, verified, created_at, indexed_at, labels, the account they belong to (target_handle, target_did), and with followerDetails also followers_count, follows_count and posts_count.

All times are UTC in ISO 8601. In our proof runs, of 2,141 posts: 857 had a link card, 418 images, 13 a photo gallery, 49 a video, 188 quoted another post and 616 were text only.

Stable fields for automations

These fields were present in every one of the 2,141 post rows of the proof runs:

FieldWhat it holds
record_typepost, profile, follower or following
source_modeThe mode that produced the row
source_inputYour search term, handle or post link
post_urlLink to the post on bsky.app
post_uriPermanent at:// id of the post
author_handleAuthor handle
author_didAuthor's permanent account id
textFull post text (empty for image only posts)
created_atWhen the post was written, UTC
like_countLikes
repost_countReposts
reply_countReplies
quote_countQuote posts
embed_typenone, images, gallery, video, external, quote or quote with media
is_replyThe post answers another post

These names will not change. New fields may be added; existing ones keep their name and meaning.

Output examples

Four real rows from the proof runs, with avatar links and a few run fields left out.

{
"record_type": "post",
"source_mode": "search",
"source_input": "artificial intelligence",
"position": 123,
"post_url": "https://bsky.app/profile/thebulwark.com/post/3mx5gzcyoke2p",
"post_uri": "at://did:plc:aunpu65mdrhwfie7ynymlzeh/app.bsky.feed.post/3mx5gzcyoke2p",
"author_handle": "thebulwark.com",
"author_display_name": "The Bulwark",
"author_did": "did:plc:aunpu65mdrhwfie7ynymlzeh",
"author_verified": true,
"text": "AI excels at gathering, digesting, and applying information, including scientific data. And this makes it useful for debunking charlatans, cranks, and conspiracy theorists. Like those peddling unfounded claims about the dangers of vaccines.",
"created_at": "2026-10-05T17:30:54.951Z",
"like_count": 81,
"repost_count": 23,
"reply_count": 4,
"quote_count": 0,
"bookmark_count": 2,
"langs": ["en"],
"links": ["https://lnk.thebulwark.com/4y4VFyy"],
"embed_type": "external",
"external_url": "https://lnk.thebulwark.com/4y4VFyy",
"external_title": "RFK Jr. Wants to AI-ify Health Care. Claude Says He's Full of Sh*t.",
"is_reply": false,
"is_repost": false,
"search_term": "artificial intelligence"
}

The post at the top of a thread, quoting another post (Bluesky)

{
"record_type": "post",
"source_mode": "thread_replies",
"position": 1,
"post_url": "https://bsky.app/profile/bsky.app/post/3mx5e63uvns2d",
"author_handle": "bsky.app",
"author_display_name": "Bluesky",
"text": "Congratulations to Nobel Prize winner @deisseroth.bsky.social! Follow along with the prize announcements all week via @nobelprize.org",
"created_at": "2026-10-05T16:39:54.426Z",
"like_count": 1233,
"repost_count": 95,
"reply_count": 17,
"quote_count": 6,
"bookmark_count": 12,
"mentions": ["deisseroth.bsky.social", "nobelprize.org"],
"embed_type": "quote",
"quoted_post_url": "https://bsky.app/profile/nobelprize.org/post/3mx4smdh4el2k",
"quoted_author_handle": "nobelprize.org",
"quoted_text": "Congratulations to our first Nobel Prize laureate of 2026 ๐ŸŽ‰\n\nEarly this morning Karl Deisseroth found out he was awarded this year's Nobel Prize in Physiology or Medicine.",
"thread_depth": 0,
"thread_post_url": "https://bsky.app/profile/bsky.app/post/3mx5e63uvns2d"
}

The 20 rows after it in the same run are the replies, each with thread_depth, reply_parent_url and reply_root_url.

Profile with counts (Bluesky)

{
"record_type": "profile",
"source_mode": "profiles",
"source_input": "bsky.app",
"handle": "bsky.app",
"display_name": "Bluesky",
"did": "did:plc:z72i7hdynmk6r22z27h6tvur",
"profile_url": "https://bsky.app/profile/bsky.app",
"description": "official Bluesky account (check username๐Ÿ‘†)\n\nBugs, feature requests, feedback: support@bsky.app",
"followers_count": 35158674,
"follows_count": 15,
"posts_count": 866,
"lists_count": 18,
"feeds_count": 7,
"starter_packs_count": 15,
"verified": false,
"trusted_verifier": true,
"pinned_post_url": "https://bsky.app/profile/bsky.app/post/3l6oveex3ii2l",
"created_at": "2023-04-12T04:53:57.057Z"
}

Follower with details (a follower of atproto.com)

{
"record_type": "follower",
"source_mode": "followers",
"source_input": "atproto.com",
"position": 24,
"handle": "freenext.app",
"did": "did:plc:35u2kotouldl5zh3wu674i5b",
"profile_url": "https://bsky.app/profile/freenext.app",
"created_at": "2026-10-05T01:19:10.861Z",
"target_handle": "atproto.com",
"target_did": "did:plc:ewvi7nxzyoun6zhxrhs64oiz",
"followers_count": 3,
"follows_count": 5,
"posts_count": 4
}

Pricing

Pay per event: you pay for each row delivered to your dataset (a post, a profile or an account), plus a flat $0.005 per run, whatever memory you choose. Nothing else is billed: no proxy add-on, no charge per search term or per request.

EventFree planBronze (Starter)Silver (Scale)Gold (Business) and above
Row delivered, per 1,000 rows$1.29$1.09$0.89$0.69
Run start, once per run$0.005$0.005$0.005$0.005

Never charged: handles and posts that do not exist or that Bluesky hides from logged out visitors, lines that are not handles or post links, requests Bluesky refuses, the same post found by two of your searches, reposts when includeReposts is off, results an earlier run already delivered when onlyNewResults is on, the extra profile requests that followerDetails makes, and the status rows that explain a target with no results. A run that delivers nothing costs only the start fee.

To cap a run's cost, set Maximum cost per run in the run options; the actor stops delivering, and charging, when that budget is used.

FAQ

What does this actor read?

Bluesky's public AppView, the same xrpc service Bluesky's own app calls: searchPosts for search, getAuthorFeed for a profile's posts, getPostThread for replies, getProfiles for profiles, and getFollowers and getFollows for follower lists. It reads public data only, exactly as Bluesky serves it to anyone without an account.

Does Bluesky search need a login now?

Partly. The CDN host public.api.bsky.app refuses anonymous search outright, so this actor sends search to api.bsky.app, which answers a logged out search one page at a time, up to 100 posts, and refuses to follow its own next page link. A "latest" search therefore reads further back by asking again with the until filter set to the oldest post it already has, which is how our proof run reached 500 posts per search and a test run reached 2,000 posts going back six months. A "top" search has no time order to walk, so it returns its first page, about 100 posts. Profiles, feeds, threads and follower lists need no login at all.

How many results can I get?

Up to 100,000 rows per search term, account or post, and up to 500 search terms, accounts or posts per run. Feeds and follower lists page through to the end. Threads return every reply Bluesky shows under the post, which for very large threads can be fewer than the reply count on the post.

How fresh is the data?

Live. Every run reads Bluesky at that moment, and counts are as of the run. In our proof run the newest "artificial intelligence" post was 40 seconds old when it was read. created_at is the time the author's app wrote on the post, which is occasionally off (one "climate" post claimed a time two hours in the future); indexed_at is when Bluesky received it.

Do I need a Bluesky account, an app password or cookies?

No. The actor never logs in and never asks for your handle, password, app password or cookies. Nothing it does can affect an account of yours.

Do I need my own proxy?

No. Requests go through Apify's datacenter proxy, which is included in the price. In our proof runs Bluesky answered all 39 requests on the first try: 37 with data and 2 with its not found reply for the handle and the post that do not exist. If Bluesky refuses a request, the actor retries it up to 4 times on a new IP before it reports the target as blocked, uncharged.

Why do some searches with hashtags look slightly different past the first page?

Bluesky refuses a search made only of hashtags (for example #booksky) once a date filter is added. The actor then searches for the hashtag as a quoted phrase ("#booksky"), which Bluesky accepts. In our test, 94 of the first 100 posts were the same either way. Searches that mix words and hashtags are sent unchanged.

What happens with a handle or post that does not exist?

It gets a free status row (_type: status) that says not found, nothing is charged for it, and the other targets still run. A line that is not a handle, DID, profile link or post link is skipped with a warning and its own status row. Deactivated or taken down accounts are reported as unavailable, also free.

Can I monitor keywords or accounts on a schedule?

Yes. Schedule the actor in Apify Console (Schedules, then Add schedule) with onlyNewResults on, and each run returns and charges only posts, replies or followers that no earlier run of yours delivered for the same search, account or post. The run stops reading a target as soon as a page brings nothing new.

In what formats can I export the data?

From the dataset: JSON, CSV, Excel, XML, HTML table or RSS, from Console or the API. In CSV and Excel the list fields (links, hashtags, mentions, image_urls, langs) are flattened into columns. The Results view in Console shows type, author, text, counts and links side by side.

Can I use it from Claude, ChatGPT or another AI assistant?

Yes, through Apify's MCP server.

  • Connector URL: https://mcp.apify.com/?tools=themineworks/bluesky-scraper
  • Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
  • ChatGPT: turn on developer mode, add an MCP connector with the URL, sign in with Apify.
  • Cursor or VS Code: add it as an HTTP MCP server with that URL.
  • Claude Code: claude mcp add -t http bluesky-scraper "https://mcp.apify.com/?tools=themineworks/bluesky-scraper"

The actor collects only public posts and profiles that Bluesky serves to anyone without logging in, through Bluesky's own public API, and it does not log in or bypass any login. You are responsible for how you use the data: check Bluesky's terms for your use case and the data protection laws that apply to you, such as GDPR and CCPA, especially when you store or analyse posts and profiles of private people.

Integrations

  • Google Sheets: send each run's dataset to a sheet with Apify's Google Sheets integration, one row per post or account.
  • Make, Zapier and n8n: start a run and read its dataset with the Apify apps and nodes, for example to post new brand mentions to Slack.
  • Webhooks: have Apify call your URL when a run finishes, then fetch the dataset.
  • API: start runs and read results from any language with the Apify API or the Python and JavaScript clients (see "Copy to your AI assistant" above).
  • MCP clients: Claude, ChatGPT, Cursor, VS Code and Claude Code, through the connector URL in the FAQ.

For Meta's Threads, use our Threads Scraper, which reads posts, profiles, hashtags and search the same way: no login, pay per post.

More from The Mine Works

Social media and video

Leads and business directories

Marketing, SEO and reviews

LinkedIn

Real estate

Science, health and government data

Jobs and hiring

Company and business data

E-commerce and marketplaces

Food and local services

Developer and AI tools

More tools

Support

Found a search, profile or thread that does not come back right, or a field you need? Open an issue in the Issues tab and include the run link. For new sources or a custom build, email dmineworks@gmail.com.

Bluesky posts, searches, replies, profiles and follower lists through Bluesky's public API, with likes, reposts, replies, quotes, links and media on every post, no login, charged only for rows you receive.