Bluesky Scraper
Pricing
$0.50 / 1,000 items
Bluesky Scraper
Scrape Bluesky posts by search, profile, feed, or link: text, likes, reposts, replies, images, links, hashtags, and author stats. No login needed.
Pricing
$0.50 / 1,000 items
Rating
0.0
(0)
Developer
Donjuan
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Bluesky Scraper: posts, replies, and author stats from search, profiles, and feeds
Bluesky Scraper collects public Bluesky posts from search queries, profiles, custom feeds, hashtag pages, and single post links. For every post you get the text, publish time, language, likes, reposts, replies, and quotes, the images, video, link card, and quoted post, the hashtags, mentions, and links in the text, and the author's profile with follower and post counts. Turn on replies to get each post's full reply thread, one item per reply, with its parent and depth.
You don't need a Bluesky account, an API key, or any code. Add search terms, profiles, or links, press Start, and download the results as JSON, CSV, Excel, XML, or HTML. Or pull them into your app through the Apify API.
What can you do with Bluesky data?
- Monitor a topic or brand. Search for your product, a hashtag, or a phrase and see who talks about it and how people react.
- Follow accounts. Collect every post from a list of journalists, politicians, companies, or competitors, with likes and reposts for each.
- Analyze conversations. Pull the full reply tree of a post to study how a discussion unfolds and who joins it.
- Find voices worth following. Every post comes with the author's followers and post count, so you can rank accounts by reach.
- Track custom feeds. Bluesky's custom feeds curate posts on a topic. Scrape one to see what it surfaces right now.
- Build datasets for research. Post text, language tags, and timestamps make clean input for topic, sentiment, or language analysis.
What data does Bluesky Scraper extract?
| Group | Fields |
|---|---|
| Post | type (post or reply), AT URI, CID, bsky.app URL, text, publish time (ISO 8601, UTC), language |
| Engagement | likes, reposts, replies, quotes |
| Author | DID, handle, display name, profile URL, avatar, bio, followers, following, post count, join date |
| Media | images (full size, thumbnail, alt text), video (HLS playlist, thumbnail), link card (URL, title, description, thumbnail) |
| Quoted post | URI, URL, text, author handle |
| Text entities | hashtags, mentions (DID and handle), links |
| Threads | the post a reply answers, the thread's first post, and for collected replies the post they came from and their depth |
How to scrape Bluesky
- Open the actor and go to the Input tab.
- Add search queries, profiles, or Bluesky links. You can mix all three.
- Set Posts per source, and turn on Include replies if you want the reply threads.
- Press Start. When the run finishes, open the Output tab to preview the table, or press Export to download the data.
Input
| Field | Type | Description |
|---|---|---|
searchQueries | array of strings | Search terms. Bluesky's search syntax works: #ukraine, from:bsky.app, "exact phrase". |
sort | string | latest or top for search results. |
since, until | string | Limit search to posts created in this window. Use 2026-10-01 or 2026-10-01T00:00:00Z. |
lang | string | Limit search to one language, for example en, de, or uk. |
profiles | array of strings | Handles (bsky.app), @handles, DIDs, or profile links. |
startUrls | array | Links to posts, profiles, custom feeds, search pages, or hashtag pages on bsky.app, or at:// URIs. |
maxItems | integer | The maximum number of posts from each search query, profile, or start URL. |
includeReplies | boolean | Also collect the reply thread of every post that has replies. |
maxRepliesPerPost | integer | The maximum number of replies from each thread. |
includeAuthorStats | boolean | Add each author's bio, followers, following, post count, and join date. On by default. |
blueskyHandle, blueskyAppPassword | string | Optional login, needed only to search past the first 100 posts. Use an app password, never your main password. |
proxyCountryCode | string | A two-letter country code such as US to use Apify residential proxy in that country. None uses Apify datacenter proxy. |
Input example
{"searchQueries": ["#golang", "climate lang:de"],"sort": "latest","since": "2026-10-01","profiles": ["bsky.app", "@jay.bsky.team"],"startUrls": [{ "url": "https://bsky.app/profile/bsky.app/feed/whats-hot" },{ "url": "https://bsky.app/hashtag/ukraine" }],"maxItems": 100,"includeReplies": true,"maxRepliesPerPost": 50,"includeAuthorStats": true,"proxyCountryCode": "None"}
Output
Each post or reply becomes one item in the dataset. The Overview table shows the essentials, Authors lists who wrote each post, and Threads lays replies out with their depth and parent.
Output example
A real post from the official Bluesky account. Long links are shortened.
{"type": "post","uri": "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/3mk3sdiixhs2n","cid": "bafyreigfkidcu5cvf5w72mhhirpoa2r5ulm2yi5dp3oagnup5udhibnmfe","url": "https://bsky.app/profile/bsky.app/post/3mk3sdiixhs2n","text": "Read David Imel's summary of ATmosphereConf, a recent gathering of folks building on the AT Protocol: ...","createdAtISO": "2026-04-22T15:20:37.187Z","lang": "en","likeCount": 1277,"repostCount": 154,"replyCount": 108,"quoteCount": 24,"author": {"did": "did:plc:z72i7hdynmk6r22z27h6tvur","handle": "bsky.app","displayName": "Bluesky","url": "https://bsky.app/profile/bsky.app","avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:z72i7hdynmk6r2...","description": "official Bluesky account (check username👆)\n\nBugs, feature requests, feedback: support@bsky.app","followersCount": 35296124,"followsCount": 22,"postsCount": 880,"createdAtISO": "2023-04-12T04:53:57.057Z"},"externalLink": {"url": "https://davidimel.substack.com/p/bluesky-is-looking-for-its-myspace","title": "Bluesky is doubling down","description": "Let's see if a feed-builder is it.","thumb": "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:z72i7h..."},"hashtags": [],"mentions": [],"links": ["https://davidimel.substack.com/p/bluesky-is-looking-for-its-myspace"],"input": "bsky.app"}
A reply collected with Include replies also has:
{"type": "reply","replyTo": {"parentUri": "at://did:plc:.../app.bsky.feed.post/3my5hclvrs226","rootUri": "at://did:plc:.../app.bsky.feed.post/3my5hclvrs226"},"threadOf": "at://did:plc:.../app.bsky.feed.post/3my5hclvrs226","depth": 1}
Output fields
| Field | Description |
|---|---|
type | post, or reply for a post that answers another one. Replies show up in search and profiles too, not only in threads. |
uri, cid | The post's AT Protocol URI and content hash. Use uri as a unique key. |
url | Link to the post on bsky.app. |
text | The post text. |
createdAtISO | When the post was written, in UTC. |
lang | The first language the author tagged the post with. Some posts have none. |
likeCount, repostCount, replyCount, quoteCount | Engagement counts at the time of the run. |
author | DID, handle, display name, profile URL, and avatar. With includeAuthorStats: bio, followers, following, post count, and join date. |
images, video, externalLink | Media attached to the post. |
quote | The post this post quotes. |
hashtags, mentions, links | Entities in the text. |
replyTo | For replies: the post answered (parentUri) and the thread's first post (rootUri). |
threadOf, depth | For replies collected with includeReplies: the post whose thread they came from and how deep they sit in it. |
input | The search query, profile, or start URL that found the item. |
How many posts can I get?
- Profiles and custom feeds page through without limits we hit in testing: 400 posts from a feed in 4 requests.
- Search returns up to 100 posts per query without a login, because Bluesky only answers logged-out search one page deep. Add more specific queries, use
sinceanduntil, or add a Bluesky handle and app password to go further. - Replies come from Bluesky's thread view, up to 20 levels deep. Bluesky leaves out blocked and deleted replies.
The lang, since, and until filters apply to search results, not to replies collected with Include replies.
How fast is it?
The actor talks to Bluesky's public API without a browser. In our tests, one search, two profiles, a custom feed, and a hashtag page gave 649 posts in 14 seconds, author stats included. It runs in 128 MB of memory.
How much does it cost?
You pay per item in the dataset. Posts and replies count the same. With Include replies on, a run can return many more items than Posts per source, so set Replies per post to cap it.
Export and integrations
The results go into an Apify dataset. From there you can download them as JSON, CSV, Excel, XML, HTML, or RSS, send them to Google Sheets, Slack, Zapier, Make, and other tools through Apify integrations, schedule runs to track a topic over time, or read them through the Apify API.
curl -X POST "https://api.apify.com/v2/acts/<username>~bluesky-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \-H "Content-Type: application/json" \-d '{"profiles": ["bsky.app"], "maxItems": 50}'
FAQ
Do I need a Bluesky account?
No. Everything works logged out. A login helps in one case: search past the first 100 posts per query.
Is my app password safe?
The input field is marked secret, so Apify encrypts it and hides it in the run. The actor uses it only to open a session with Bluesky. Create a separate app password for the actor in Bluesky's settings and revoke it any time.
Why does a search return at most 100 posts?
Bluesky answers logged-out search one page deep. Split the topic into narrower queries or date windows, or add a login.
Why are some fields missing?
Bluesky sends only what a post has. A post without images has no images, and a post without a language tag has no lang. Author stats are missing when an account was deleted or deactivated.
Can I scrape private or blocked content?
No. The actor reads only what Bluesky's public API returns. Blocked and deleted replies don't show up.
Is it legal to scrape Bluesky?
The actor collects public data through Bluesky's public API. Posts and profiles still contain personal data, so make sure you have a legitimate reason to collect them and follow the GDPR and other laws that apply to you. If you're not sure, ask a lawyer.
Disclaimer
This actor is provided as is, without warranty. You're responsible for how you use it and for following Bluesky's terms of service and the laws that apply to you. Bluesky isn't affiliated with this actor.