Bluesky Scraper: Posts, Search, Profiles, Followers
Pricing
from $1.00 / 1,000 post or profiles
Bluesky Scraper: Posts, Search, Profiles, Followers
Scrape Bluesky without a login: posts from any profile, keyword and hashtag search, single posts with their reply threads, and profiles with follower, following and post counts. Each post has text, likes, reposts, replies, quotes, hashtags, mentions, links, full-size images and quoted posts.
Pricing
from $1.00 / 1,000 post or profiles
Rating
0.0
(0)
Developer
Plainsource
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
This Bluesky scraper collects posts from any Bluesky profile, keyword or hashtag search results, single posts with their reply threads, and profiles with follower, following and post counts. It reads Bluesky's public AT Protocol API, so it needs no Bluesky account, app password or cookie.
- Profiles: paste handles (
bsky.app,@jay.bsky.team), DIDs orbsky.app/profile/...links. Posts come newest first, with reposts and replies on or off. - Search: keywords, phrases, hashtags like
#python, and Bluesky's own search operators such asfrom:bsky.appordomain:github.com. Thousands of results per query, newest first. - Threads: paste post URLs, or turn on replies for every post collected, to get the conversation underneath.
- Profiles mode: one row per account with bio, avatar, follower, following and post counts, blue check status and join date. Followers and Following modes list who follows an account, or who it follows.
What data you get
Posts mode returns one item per post:
| Field | What it holds |
|---|---|
text, createdAt, url, uri | The post, when it was written, its bsky.app link and AT URI |
authorHandle, authorDisplayName, authorDid, authorAvatar | Who wrote it |
likeCount, repostCount, replyCount, quoteCount, bookmarkCount | Engagement counts |
langs, hashtags, mentions, links | Languages, hashtags, mentioned accounts (handle and DID) and every link in the post |
images | Full-size image URL, thumbnail, alt text, width and height for each picture |
video, external | Video playlist and thumbnail, link card with title and description |
quotedPost, isQuote | The quoted post with its author, text and counts |
isReply, replyParentUri, replyRootUri | Whether it is a reply and what it replies to |
isRepost, repostedByHandle, repostedAt | For reposts collected from a profile |
sourceType, source, threadRootUri, replyDepth | Where the item came from (profile, search, post or reply) |
Profiles, Followers and Following modes return one item per account: handle, displayName, did, url, description (bio), avatar, banner, followersCount, followsCount, postsCount, createdAt, verified, verifiedBy, pinnedPostUri, relation and relatedTo.
How to use it
- Pick What to scrape: Posts, Profiles, Followers of each profile, or Accounts each profile follows.
- Add profiles, search queries or post URLs.
- Set Max posts per profile or search query, and optionally Only posts newer than (
2026-10-01or7 days). - Run it and download JSON, CSV or Excel, or call it from the API, Make, Zapier, n8n or an AI agent through the Apify MCP server.
Example input
{"mode": "posts","profiles": ["bsky.app"],"searchQueries": ["#python"],"postUrls": ["https://bsky.app/profile/bsky.app/post/3myx7vphq3s2j"],"maxPostsPerSource": 20,"onlyPostsNewerThan": "30 days","includeReposts": false,"includeThreadReplies": false}
Example output (one post from a real run, image list shortened)
{"uri": "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/3myx7vphq3s2j","url": "https://bsky.app/profile/bsky.app/post/3myx7vphq3s2j","authorHandle": "bsky.app","authorDisplayName": "Bluesky","authorDid": "did:plc:z72i7hdynmk6r22z27h6tvur","text": "getting our Halloween decorations set up","createdAt": "2026-10-28T16:58:02.827Z","likeCount": 3571,"repostCount": 378,"replyCount": 223,"quoteCount": 125,"bookmarkCount": 202,"langs": ["en"],"hashtags": [],"mentions": [],"links": [],"embedType": "images","images": [{"url": "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:z72i7hdynmk6r22z27h6tvur/bafkreienhu3nspbm2f2v5q74arjtlvltdlgruzjvo6ndlggksp6l6zlf5a","thumb": "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:z72i7hdynmk6r22z27h6tvur/bafkreienhu3nspbm2f2v5q74arjtlvltdlgruzjvo6ndlggksp6l6zlf5a","alt": "Gravestone reading:\n\nHere lies StumbleUpon\n2001 - 2018\n\"Remember websites?\"","width": 570,"height": 494}],"quotedPost": null,"isQuote": false,"isReply": false,"isRepost": false,"source": "bsky.app","sourceType": "profile","scrapedAt": "2026-10-30T02:26:39.856Z"}
Example output in Profiles mode (real run, shortened)
{"did": "did:plc:oky5czdrnfjpqslsw2a5iclo","handle": "jay.bsky.team","displayName": "Jay 🦋","url": "https://bsky.app/profile/jay.bsky.team","followersCount": 594399,"followsCount": 3994,"postsCount": 4185,"createdAt": "2022-11-17T06:31:40.296Z","verified": true,"verifiedBy": ["bsky.app"],"relation": "profile"}
How much does it cost?
You pay per item saved: $0.001 per post, reply or profile, plus $0.0005 once per run. 1,000 posts cost $1.00 plus the start fee. Apify's free plan credit of $5 a month covers about 5,000 items.
Inputs that fail (a handle that does not exist, a deleted post, a link that is not Bluesky) cost nothing. They are listed with the reason in the SUMMARY record of the run's key-value store, next to the item count for every input.
Use cases
- Brand and topic monitoring: schedule a search for your brand, product or hashtag with Only posts newer than set to
1 day. - Audience research: read the replies under a viral post, or list the followers of a competitor with their follower counts and bios.
- Creator and lead lists: look up a list of handles in Profiles mode to get follower counts, bios and verification in one table.
- Datasets for analysis or AI: collect posts with language codes, hashtags and links for sentiment analysis, topic modelling or RAG.
FAQ
Does search work without a login?
Yes. Bluesky refuses search on its public API host, so the Actor sends search to api.bsky.app, which answers without a login. Without a login Bluesky only serves the first page of results, so for Latest order the Actor moves the time window back to the oldest post it has and asks again. That is how one query returns thousands of posts. Top order cannot be paged this way and returns at most 100 posts per query.
Why do hashtag searches look different in the log?
Bluesky rejects a date filter combined with a #hashtag query, so the Actor sends #python as the word python plus a hashtag filter. Bluesky returns the same posts either way.
Can it get likes or the list of people who reposted? Not in this version. It gets the counts (likes, reposts, quotes, replies, bookmarks), not the accounts behind them.
How many followers can it list? Set Max followers or follows per profile. Each page holds 100 accounts, plus one lookup per 25 accounts for counts and bios when Add counts and bio is on. Accounts with millions of followers take a long time to list in full.
What about deleted posts or accounts?
Bluesky posts are public. A post URL that points to a deleted post, or a handle that no longer exists, is skipped, costs nothing and is listed in SUMMARY with the reason.
What about rate limits? Bluesky limits requests per IP. The Actor answers HTTP 429 by waiting until the limit resets and retrying, up to six times per request. Turn on Apify Proxy only if you see repeated retries in the log.
Is this legal? It reads public data through Bluesky's documented public API. You are responsible for how you use it, especially personal data, under laws like GDPR.
Other Actors by this developer
- Telegram Channel Scraper: posts, views and reactions from public Telegram channels, no login.
- Substack Scraper: posts, likes, comments and full text from any Substack newsletter.
- Google News Scraper: headlines by keyword, topic or country with the real publisher URL.
- Google Trends Scraper: interest over time, by region and related searches.
- Website Change Monitor: get told when a web page changes.