Bluesky Scraper: Posts, Profiles, Followers, Threads, Likes
Pricing
from $0.70 / 1,000 results
Bluesky Scraper: Posts, Profiles, Followers, Threads, Likes
Scrape Bluesky without login or API keys: author feeds, post threads and replies, profiles, followers and following, likes, reposts and quotes. Accepts bsky.app URLs, handles and DIDs. Clean flat rows with engagement counts, links, mentions, hashtags and images.
Pricing
from $0.70 / 1,000 results
Rating
0.0
(0)
Developer
Ctrio Lab
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
21 days ago
Last modified
Categories
Share
Scrape Bluesky without a login, cookies or API keys. This Actor reads the public AT Protocol AppView API that the Bluesky web app itself uses for logged-out visitors, and returns clean, flat rows that are ready for Excel, Google Sheets, BI tools or an AI agent.
What you can get
| Mode | Input | One row per |
|---|---|---|
| Author feeds | handles, DIDs or profile URLs | post (optionally reposts) |
| Post threads | post URLs or at:// URIs | post and each reply (with depth) |
| Profiles | handles, DIDs or profile URLs | profile with follower, following and post counts |
| Followers / Following | handles, DIDs or profile URLs | profile |
| Likes / Reposts of a post | post URLs | profile (likes include likedAt) |
| Quotes of a post | post URLs | quoting post |
Why this Actor
- No Bluesky account needed, nothing to configure. Paste
bsky.applinks,@handlesordid:plc:DIDs in any mix. - Clean fields: text, created time, author, reply / repost / like / quote counts, languages, links, mentions (DID and handle), hashtags, images with alt text, video, link card, quoted post, reply parent and root.
- Caps per input and per run, so you never pay for more than you asked for.
- Polite and stable: one connection, automatic retries with exponential backoff on HTTP 429 and 5xx, and it waits as long as Bluesky asks (
Retry-After,RateLimit-*headers). - Respects users: accounts and posts that ask not to be shown to logged-out people are skipped (see "Data source and terms").
- Fails fast on bad input with a clear message, before any request or charge.
How to use it
- Fill in one or more sections: Author feeds, Profiles, Followers of, Following of, Post threads, Likes / Reposts / Quotes of posts. You can combine them in one run.
- Set Max results per input and Max results in total.
- Click Start, then download the dataset as JSON, CSV, Excel or use the API.
Input examples
Last 200 posts (with replies and reposts) from three accounts:
{"authorFeeds": ["bsky.app", "@jay.bsky.team", "https://bsky.app/profile/pfrazee.com"],"authorFeedFilter": "posts_with_replies","includeReposts": true,"maxItemsPerInput": 200}
A post and its replies, plus who liked and reposted it:
{"postUrls": ["https://bsky.app/profile/bsky.app/post/3mwolmfws5k2r"],"threadDepth": 10,"likesOf": ["https://bsky.app/profile/bsky.app/post/3mwolmfws5k2r"],"repostsOf": ["https://bsky.app/profile/bsky.app/post/3mwolmfws5k2r"],"maxItemsPerInput": 500}
First 1,000 followers of an account, with their own follower counts:
{"followersOf": ["bsky.app"],"enrichProfiles": true,"maxItemsPerInput": 1000}
Profiles from a mixed list:
{"profiles": ["bsky.app", "did:plc:ragtjsm2j2vknwkz3zp4oxrd", "https://bsky.app/profile/atproto.com"]}
Accepted identifiers
- Handles:
bsky.app,@name.bsky.social, custom domains likenytimes.com. A bare name likejayis read asjay.bsky.social. - DIDs:
did:plc:...,did:web:... - Profile URLs:
https://bsky.app/profile/<handle or DID> - Post URLs:
https://bsky.app/profile/<handle or DID>/post/<id>orat://<did>/app.bsky.feed.post/<id>
Output
Every row has type (post or profile), source (author_feed, thread, profile, followers, following, likes, reposts, quotes), the input it came from and scrapedAt.
Post row example:
{"type": "post","postType": "reply","uri": "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/3mv462yda4k2l","id": "3mv462yda4k2l","url": "https://bsky.app/profile/bsky.app/post/3mv462yda4k2l","text": "Thank you for coming to today's Apple event! You can find these and more Apple products at your nearest grocery store, farmers' market, or orchard.","createdAt": "2026-09-09T18:27:44.595Z","authorHandle": "bsky.app","authorDisplayName": "Bluesky","authorDid": "did:plc:z72i7hdynmk6r22z27h6tvur","replyCount": 4,"repostCount": 4,"likeCount": 220,"quoteCount": 3,"bookmarkCount": 8,"langs": ["en"],"links": ["https://go.bsky.app/AjuvkDc"],"mentions": [],"hashtags": [],"images": [],"imageCount": 0,"video": null,"externalLink": { "uri": "https://go.bsky.app/AjuvkDc", "title": "Apple Experts", "description": "Join the conversation", "thumb": "https://cdn.bsky.app/img/feed_thumbnail/plain/..." },"quotedPost": null,"replyParentUri": "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/3mv45zmynys2l","replyRootUri": "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/3mv3zcjaijk22","labels": [],"source": "author_feed","input": "bsky.app","scrapedAt": "2026-10-03T09:28:27.541Z"}
Images come as images: [{ url, thumb, alt, width, height }], videos as video: { playlist, thumbnail, alt }, quoted posts as quotedPost: { uri, url, text, authorHandle }. Other post fields: cid, indexedAt, authorAvatar, authorUrl, replyParentUrl, replyRootUrl, threadRootUri and threadDepth (threads, 0 = the post you entered), repostedByHandle, repostedByDid, repostedAt (reposts in author feeds), subjectPostUri, subjectPostUrl (quotes).
Profile row example:
{"type": "profile","did": "did:plc:z72i7hdynmk6r22z27h6tvur","handle": "bsky.app","url": "https://bsky.app/profile/bsky.app","displayName": "Bluesky","description": "official Bluesky account (check username) ...","followersCount": 35128563,"followsCount": 15,"postsCount": 865,"createdAt": "2023-04-12T04:53:57.057Z","verified": false,"labels": [],"source": "profile","input": "bsky.app"}
Follower, following, liker and reposter rows also have relation, subjectHandle, subjectDid, subjectPostUri, subjectPostUrl and likedAt where relevant. Their counts are null unless Add counts and bio to follower / like lists is on.
A run summary (items per input, skipped inputs with reasons, HTTP statistics) is saved in the key-value store as RUN_SUMMARY.
Pricing
Pay per result: $1.00 per 1,000 results plus a tiny Actor start fee. One row in the dataset = one result. Duplicates within an input, skipped hidden content and failed inputs are not charged. Invalid input stops the run before anything is charged.
Limits you should know
- No keyword search. Bluesky currently switches post search off for logged-out clients. This Actor does not log in or use another host to get around that, so keyword search is not offered. To follow a topic, track the accounts that post about it with author feeds.
- Threads contain the replies Bluesky shows on the post page; very large threads are trimmed by Bluesky.
- Deleted posts and accounts, blocked replies and hidden content are not returned.
Data source and terms
- Data comes only from Bluesky's public AppView API (
public.api.bsky.app, as listed in the Bluesky developer docs "API Hosts and Auth"). These endpoints are documented for unauthenticated use. The Actor never logs in, never uses accounts, cookies or proxies, and never writes anything to Bluesky (no likes, follows or posts). - Bluesky's Terms of Service do not prohibit reading public data through the API. The Bluesky Developer Guidelines forbid spam and automated interactions; this Actor is read-only.
- Rate limits are respected: requests are sent one at a time with a pause,
Retry-AfterandRateLimit-*headers are honoured, and blocked requests (HTTP 403) are never retried or disguised. - Accounts and posts labelled
!no-unauthenticated(users who asked Bluesky not to show their content to logged-out people),!hideor!takedownare skipped, including replies under them. - Results are a snapshot at
scrapedAt. If a user deletes a post or account later, you should delete it from your copy too; re-run the Actor to refresh. - You are responsible for using the data lawfully (for example GDPR / CCPA for personal data) and for respecting user preferences. Bluesky has proposed "User Intents" signals for AI training and bulk datasets; check them if you build such datasets.
FAQ
Do I need a Bluesky account or app password? No.
Can I search posts by keyword? Not at the moment. Bluesky switched post search off for logged-out clients and we do not work around it. Use author feeds, threads, quotes and likes instead.
How fast is it? Around 1,000 posts or profiles in 5 to 10 seconds for feeds and follower lists (100 per request).
Why are some accounts skipped? The account was not found (deleted, deactivated, mistyped) or its owner asked Bluesky to hide it from logged-out visitors. The reason is in the log and in RUN_SUMMARY.
Can I monitor new posts? Yes. Schedule the Actor with author feeds and a small maxItemsPerInput.
Can I use it from an AI agent (MCP)? Yes, call it through the Apify MCP server or the Apify API like any other Actor.
Something is wrong or missing? Open an issue on the Actor page with the run link and we will look at it.