Bluesky Scraper – Posts, Profiles, Replies & Followers
Pricing
from $0.50 / 1,000 posts
Bluesky Scraper – Posts, Profiles, Replies & Followers
Scrape Bluesky via the official public API: keyword search, user posts, replies, profiles, followers and following, with likes, reposts, links and bio emails. Date, language and likes filters (filtered posts free), only-new monitoring. No login. $0.50 per 1,000 posts.
Pricing
from $0.50 / 1,000 posts
Rating
0.0
(0)
Developer
Chris Elder
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
Export Bluesky data from the official public API: keyword search results, every post from any account, full reply threads, profiles (followers, bio, emails and links in bio) and follower/following lists. Filter by date, language, likes, keywords, mentions or linked domain, and use only-new mode to monitor topics or accounts on a schedule and pay only for new posts.
✅ Pay per result: $0.50 per 1,000 posts · 👥 $0.30 per 1,000 follower/following accounts · 🆓 Filtered-out posts and missing accounts are never charged · 🔑 No login, app password or API key · ⏱️ Start fee only $0.00005
▶ Try it with one click · 📄 Real example output · 💲 Pricing · 🔌 API & integrations · ❓ FAQ · 🛟 Support
What does Bluesky Scraper do?
- 🔎 Search posts by keyword, hashtag or phrase (Bluesky search syntax works, e.g.
from:,#tag, quotes), sorted by latest or top. - 👤 Account feeds: all posts from any handle, with or without replies, reposts or media only.
- 💬 Reply threads: paste post URLs and get the post plus all replies, flattened with depth and parent.
- 🪪 Profiles: display name, bio, followers, following, post count, created date, avatar, banner, and emails and links found in the bio.
- 👥 Followers and following of any account, plus people search by keyword (find journalists, founders, developers...).
- 📊 Engagement on every post: likes, reposts, replies, quotes, bookmarks and a total
engagementnumber for sorting. - 🔗 Entities pulled out: links, hashtags, mentions, emails, images, video, link card and quoted post.
- 🎯 Filters that save money: date range, language, keywords, exclude keywords, minimum likes/reposts, no replies, no reposts, mentions, linked domain. Skipped posts cost nothing.
- 🔁 Only new posts for monitoring: the Actor remembers what it has already returned, so a daily or hourly schedule charges only for what is new.
Use cases
- Brand and PR monitoring: track mentions of your brand, product or competitors and get only new posts each day.
- Lead generation: search people by keyword, collect profiles with bio emails and links, export followers of a niche account.
- Researchers and journalists: archive topics, accounts or full reply threads with dates and engagement.
- Marketers and creators: find top posts on a topic, compare accounts by followers and engagement.
- AI and RAG builders: feed clean post text, links and metadata into an LLM pipeline or vector store.
How to use it
- Click Try for free. The prefill searches "open data" (20 posts) and reads the official
bsky.appaccount (10 posts + profile) in a few seconds for about $0.016. - Add your own search queries, handles (
bsky.app,@bsky.appor a profile URL), post URLs, or accounts whose followers you want. - Optional: add a date range, language, keywords or a minimum like count.
- Run it, then export the Posts or Profiles & accounts table as JSON, CSV or Excel, or read it by API.
- For monitoring, tick Only new posts and add a schedule.
Input example
{"searchQueries": ["open data", "#opensource"],"searchSort": "latest","maxPostsPerQuery": 100,"handles": ["bsky.app"],"maxPostsPerHandle": 50,"dateFrom": "7 days","language": "en","minLikes": 5,"onlyNew": false}
Other options: authorFeedFilter, includeProfiles, postUrls, maxRepliesPerPost, followersOf, followingOf, userSearchQueries, maxAccountsPerList, dateTo, keywords, excludeKeywords, minReposts, excludeReplies, excludeReposts, mentions, domain.
Output example (from a real run)
Post row (run on 25 Oct 2026; some empty fields left out):
{"type": "post","url": "https://bsky.app/profile/bsky.app/post/3mykozpeyv22w","uri": "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/3mykozpeyv22w","text": "this was the exact use case we had in mind while we were building it","createdAt": "2026-10-23T17:24:06.492Z","langs": ["en"],"authorHandle": "bsky.app","authorDisplayName": "Bluesky","authorUrl": "https://bsky.app/profile/bsky.app","likeCount": 106,"repostCount": 3,"replyCount": 4,"quoteCount": 0,"bookmarkCount": 1,"engagement": 113,"isReply": true,"isRepost": false,"links": [],"hashtags": [],"images": [],"externalLink": null,"quotedPostUrl": null,"source": "handle","sourceValue": "bsky.app"}
Profile row:
{"type": "profile","handle": "bsky.app","displayName": "Bluesky","url": "https://bsky.app/profile/bsky.app","description": "official Bluesky account (check username👆)\n\nBugs, feature requests, feedback: support@bsky.app","emails": ["support@bsky.app"],"links": [],"followersCount": 35373117,"followsCount": 24,"postsCount": 896,"createdAt": "2023-04-12T04:53:57.057Z","verified": false}
| Field | Meaning |
|---|---|
type | post, profile, account (follower/following/people-search row) or error (free) |
url, uri, createdAt | Web link, AT Protocol URI, ISO date (UTC) |
text, langs | Post text and declared languages |
likeCount, repostCount, replyCount, quoteCount, bookmarkCount, engagement | Engagement numbers |
isReply, replyToUri, threadRootUri, isRepost, repostedBy | Post context |
links, hashtags, mentionedDids, emails | Entities found in the post |
images, videoUrl, externalLink, quotedPostUrl | Media, link card and quoted post |
followersCount, followsCount, postsCount, emails, links | Profile numbers and contacts from the bio |
ofHandle, relation | For account rows: whose list and follower/following/search |
source, sourceValue, matchedKeywords | Which input produced the row |
How much does it cost to scrape Bluesky?
| Event | Price | When |
|---|---|---|
| Post | $0.0005 | Each post saved ($0.50 per 1,000) |
| Profile | $0.001 | Each full profile row (handles, if enabled) |
| Account | $0.0003 | Each follower / following / people-search row ($0.30 per 1,000) |
| Actor start | $0.00005 per GB of memory | Once per run (default 256 MB) |
| Filtered out, not found, failed | $0 | Never charged |
Worked examples:
| Job | Arithmetic | Cost |
|---|---|---|
| One-click example (30 posts + 1 profile) | 30 × $0.0005 + 1 × $0.001 | ≈ $0.016 |
| 10,000 posts for a keyword | 10,000 × $0.0005 | $5.00 |
| 5,000 followers of a niche account | 5,000 × $0.0003 | $1.50 |
| Daily brand monitor, ~100 new posts a day, 30 days | 3,000 × $0.0005 + 30 starts | ≈ $1.50 / month |
Set Maximum cost per run in Apify and the Actor stops cleanly at your limit.
Integrations (API, AI agents, Make, Zapier)
Run and get results in one call:
curl -X POST "https://api.apify.com/v2/acts/chris_elder~bluesky-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"searchQueries":["open data"],"maxPostsPerQuery":50,"dateFrom":"24 hours"}'
Python:
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("chris_elder/bluesky-scraper").call(run_input={"handles": ["bsky.app"], "maxPostsPerHandle": 100})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item.get("createdAt"), item.get("likeCount"), item.get("url"))
- AI agents (MCP):
https://mcp.apify.com/?tools=chris_elder/bluesky-scraper - Make, Zapier and n8n: use the Apify "Run Actor" module. Pair Only new posts with an Apify schedule and a webhook to push new posts to Slack, Sheets or a database.
Limits and good to know
- Uses Bluesky's public AppView API. With
searchSort: latestthe Actor pages back in time until your limit or date range is reached;topreturns up to 100 posts per query (Bluesky's own limit for logged-out search). Search is not a complete archive; very old posts may be missing. - Accounts that hide their content from logged-out users, deleted posts and blocked threads are not returned.
- Follower/following rows come from the list endpoint and carry no follower counts; add those handles to
handlesif you need full profiles. - Image and video links point to Bluesky's CDN.
Is it legal?
The Actor reads only public data through Bluesky's own public API, the same data anyone can see on bsky.app without logging in. It does not log in, post, follow or bypass any access control, and respects accounts that opt out of logged-out visibility. Posts and profiles contain personal data (names, handles, emails), so you are responsible for a lawful basis for your use (for example GDPR) and for respecting Bluesky's terms. See Apify's guide: Is web scraping legal?
FAQ
Do I need a Bluesky account or app password? No. Nothing to log in to.
How do I monitor a keyword or brand? Add it to searchQueries with searchSort: latest, tick Only new posts and schedule the Actor hourly or daily. Only new matching posts are returned and charged.
Can I get posts from a date range? Yes. dateFrom and dateTo accept a date (2026-10-01) or relative time (7 days, 24 hours). For search queries the dates are passed to Bluesky's search too.
How do I get a full reply thread? Put the post URL in postUrls. You get the post and replies with depth, up to maxRepliesPerPost.
Why did a handle return an error row? The handle does not exist, was renamed, or the account hides itself from logged-out viewers. Error rows are free.
Can it download the images? It returns image URLs. Pass them to Bulk File Downloader to save the files or a ZIP.
Support, reliability and feature requests
- Missing accounts, filtered posts and failed requests are free.
- Every release is tested on real public accounts; the example input works.
- Issues answered within 2 business days via the Actor Issues tab.
- Breaking input or price changes are announced in this README first.
Built by GPT Shop Ltd with AI-assisted development; every release is reviewed and tested.
More tools from GPT Shop Ltd
Telegram Channel Scraper · Bulk File Downloader · HTTP Request Sender · RSS Feed Reader · all tools