Bluesky Scraper
Pricing
Pay per usage
Bluesky Scraper
Scrape Bluesky posts, profiles, threads, and search results without a login. Pull a user's posts by handle, a post plus its reply thread, or keyword search results. Walks pagination up to your chosen limit.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Goutam Soni
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Share
Scrape Bluesky posts, profiles, threads, and keyword search results with no login and no API key. Give it handles, post links, or search terms and it returns clean structured rows with full engagement metrics, author details, media, and timestamps.
The Bluesky Scraper extracts public data from Bluesky at scale. Pull a user's recent posts by handle, fetch a single post with its full reply thread, or run keyword searches across the network. Pagination is walked automatically up to the limit you set, so you can collect hundreds or thousands of posts per source in one run.
What it does
- User posts by handle. Collect a user's recent posts, with optional replies and a profile header row (display name, bio, follower and post counts).
- Post threads from a URL. Fetch any post plus its nested reply tree, flattened into rows.
- Keyword search. Search public posts by term, sorted by latest or top.
- Full engagement metrics. Likes, reposts, replies, and quotes on every post.
- Media and links. Photo URLs, video stream and poster image, link-card previews, and richtext links.
- Rich post detail. Author identity, post text, language, hashtags, mentions, reply flags, repost flags, and timestamps.
- Automatic pagination and deduplication. Walks multiple pages per source and drops duplicate rows so every result is unique.
- No login, no password, no API key. Runs against public read-only endpoints.
Use cases
- Brand and topic monitoring. Track keyword searches to see who is talking about your product, niche, or industry on Bluesky.
- Lead generation and outreach. Pull posters around a topic and capture their handle, display name, and bio for prospecting.
- Market and competitor research. Analyze a competitor's posting cadence, engagement, and audience by scraping their handle (use a public placeholder like
example.bsky.social). - Sentiment and trend analysis. Collect large post samples for a query and feed text plus engagement counts into your own analysis.
- Thread archiving. Save a post and its full reply thread for research, support, or compliance records.
Input
| Field | Type | Description |
|---|---|---|
handles | array | Handles to pull posts from. With or without @, or a full profile link (e.g. example.bsky.social). |
postUrls | array | Post links to fetch with their reply thread. |
searchQueries | array | Keyword searches to run across public posts. |
maxItemsPerSource | integer | Cap on items returned per handle, post, or query. Default 100. |
includeReplies | boolean | Include a handle's replies, not just top-level posts. Default false. |
includeProfile | boolean | Emit one profile row per handle before its posts. Default true. |
searchSort | string | Search order: latest or top. |
concurrency | integer | Number of sources processed in parallel. Default 5. |
proxyConfig | object | Optional proxy. The public endpoints do not require one. |
Example input
{"handles": ["example.bsky.social"],"searchQueries": ["open source"],"maxItemsPerSource": 200,"includeReplies": false,"includeProfile": true,"searchSort": "latest"}
Output
Each post is one row:
{"type": "post","uri": "at://did:plc:example/app.bsky.feed.post/abc123","url": "https://bsky.app/profile/example.bsky.social/post/abc123","authorHandle": "example.bsky.social","authorDisplayName": "Example User","authorDid": "did:plc:example","likeCount": 42,"repostCount": 7,"replyCount": 3,"quoteCount": 1,"text": "An example post about open source.","lang": "en","tags": ["opensource"],"mentions": [],"links": ["https://example.com"],"thumbnail": "https://example.com/preview.jpg","images": [],"video": null,"isReply": false,"replyToUri": null,"isRepost": false,"cid": "bafyexamplecid","createdAt": "2026-06-01T12:00:00.000Z","indexedAt": "2026-06-01T12:00:05.000Z"}
Key fields:
urlis the public permalink to the post.likeCount,repostCount,replyCount,quoteCountare the engagement counts at scrape time.thumbnailis the best single preview image for the post (attached photo, video poster frame, or link-card preview), so the media column is filled even for link posts.isReply/replyToUriflag reply posts;isRepostflags posts that appeared in a feed via a repost.
When includeProfile is on, each handle also emits one profile row with handle, url, displayName, did, followersCount, followsCount, postsCount, description, avatar, banner, and createdAt.
FAQ
Do I need a Bluesky login or API key? No. The scraper reads public data through public endpoints. No account, password, or key is required.
Is it free? The actor itself is pay-per-result, so you only pay for the rows you collect. Apify platform usage applies as normal. There is no per-run start fee.
How many results can I get?
Set maxItemsPerSource to your target. The scraper walks pagination across multiple pages until it reaches your cap or the source runs out of posts. You can collect hundreds or thousands of posts per handle or query.
How fast is it?
Sources run in parallel (set with concurrency). A few hundred posts per source typically complete in seconds to a couple of minutes depending on how many sources and pages are involved.
Can I scrape a private account? No. Only public posts, profiles, and threads are available.
What input formats does it accept for handles and posts?
Handles can be plain (example.bsky.social), prefixed (@example.bsky.social), or a full profile URL. Post inputs accept the standard bsky.app post link.