Bluesky Scraper — Posts, Profiles, Followers & Search
Pricing
from $0.50 / 1,000 post scrapeds
Bluesky Scraper — Posts, Profiles, Followers & Search
Scrape Bluesky posts, profiles, followers/following, full threads, and keyword search into clean flat JSON/CSV. Profiles and feeds need no login; keyword search uses your free app password.
Pricing
from $0.50 / 1,000 post scrapeds
Rating
0.0
(0)
Developer
Ethan Teague
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Scrape Bluesky posts, profiles, followers, full reply threads, and keyword search results into clean, flat JSON — ready for CSV/Excel export, dashboards, lead lists, research datasets, or AI agents.
Built on Bluesky's official AT Protocol API. Profiles, user feeds, followers, and threads need no login at all. Keyword post search uses your free Bluesky app password (Bluesky blocks anonymous search platform-wide — any tool that claims otherwise is proxying your requests through someone else's account).
What you can scrape
| Mode | What you get | Login needed? |
|---|---|---|
| User posts | Latest posts from any user's feed (reposts optional, reply filtering) | No |
| Profiles | Bio, display name, follower/following/post counts, avatar, dates | No |
| Followers / Following | Full follower and following lists as profile records | No |
| Threads | A post plus its entire reply tree from any post URL | No |
| Keyword search | Posts matching any query, sorted by latest or top, with date/language filters | Free app password |
Why this scraper
- Flat output, no nesting headaches — every item exports to CSV in one click. Author fields, like counts, image URLs, links, and quoted posts are all top-level columns.
- Honest engineering — official AT Protocol endpoints, polite rate limiting with automatic backoff and retries. No fragile HTML parsing that breaks every redesign.
- Transparent pay-per-event pricing — you pay per post/profile scraped, nothing else. 1,000 posts ≈ $0.50.
- Built for AI agents — clean input schema, predictable output, works out of the box through the Apify API and MCP.
- Failures don't eat your money — you're only charged for items actually delivered to the dataset.
Quick start
- Enter one or more user handles (
bsky.app,@someone.bsky.social, or a profile URL) — or paste post URLs to scrape threads. - Choose how many posts you want and whether to include profiles, followers, or reposts.
- Click Start and export the dataset as JSON, CSV, Excel, or feed it to the API.
Unlocking keyword search (2 minutes, free)
Bluesky requires authentication for keyword search. In the Bluesky app or website: Settings → Privacy and security → App passwords → Add app password. Copy the generated password into this actor's Bluesky app password field and put your handle in Bluesky identifier. Never use your main account password — app passwords can be revoked anytime and can't manage your account. Your credentials are encrypted by Apify, used only to call Bluesky's search endpoint, and never logged.
Example input
{"userHandles": ["bsky.app", "https://bsky.app/profile/atproto.com"],"maxPostsPerUser": 200,"includeProfiles": true,"includeFollowers": true,"maxFollowersPerUser": 500,"postThreadUrls": ["https://bsky.app/profile/someone.bsky.social/post/3mqc36slinc2m"],"searchQueries": ["ai agents"],"maxPostsPerQuery": 300,"searchSort": "latest"}
Example output
A post item (trimmed):
{"type": "post","uri": "at://did:plc:ewvi7nxzyoun6zhxrhs64oiz/app.bsky.feed.post/3mp2n77vwzc2d","url": "https://bsky.app/profile/atproto.com/post/3mp2n77vwzc2d","authorHandle": "atproto.com","authorDisplayName": "AT Protocol Developers","authorDid": "did:plc:ewvi7nxzyoun6zhxrhs64oiz","text": "We're very pumped to announce that the reference PDS now has an account management page!","createdAt": "2026-06-24T19:22:03.650Z","replyCount": 4,"repostCount": 87,"likeCount": 312,"quoteCount": 9,"isReply": false,"images": [{ "url": "https://cdn.bsky.app/img/feed_fullsize/...", "alt": "Screenshot" }],"externalLink": { "uri": "https://atproto.com/blog/...", "title": "PDS account management" },"source": "author_feed","sourceHandle": "atproto.com"}
A profile item:
{"type": "profile","did": "did:plc:z72i7hdynmk6r22z27h6tvur","handle": "bsky.app","displayName": "Bluesky","description": "official Bluesky account","followersCount": 1274531,"followsCount": 12,"postsCount": 918,"createdAt": "2023-04-12T04:53:57.057Z","profileUrl": "https://bsky.app/profile/bsky.app","source": "input"}
Every post also carries indexedAt, langs, labels, parentUri (for replies), videoThumbnail, and quoted-post fields when present. Reposts (when enabled) are marked isRepost: true with the original author.
Pricing
Pay only for what lands in your dataset:
| Event | Price |
|---|---|
| Actor start | $0.001 per run |
| Post scraped | $0.0005 (= $0.50 per 1,000 posts) |
| Profile scraped (incl. follower/following records) | $0.001 (= $1.00 per 1,000 profiles) |
Examples: a competitor's last 500 posts + profile ≈ $0.25. Followers of five accounts, 1,000 each ≈ $5.00. Set a Maximum total charge on any run to hard-cap spend — the actor stops gracefully at the limit.
Use it via API
curl -X POST "https://api.apify.com/v2/acts/USERNAME~bluesky-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"userHandles": ["bsky.app"], "maxPostsPerUser": 50}'
Works with the Apify JavaScript and Python clients, scheduled runs, webhooks, and integrations (Google Sheets, Make, Zapier, LangChain).
AI agents & MCP
This actor is agent-friendly: strict input schema, flat deterministic output, and it's callable as a tool through the Apify MCP server — point your agent at it and ask for "the last 100 posts from @handle as a table."
Rate limits, freshness & fair use
Data comes live from Bluesky's API at request time — nothing cached, nothing stale. The actor paginates politely (automatic backoff on rate limits) and typically sustains thousands of items per minute. Only public data is collected: public posts, public profiles, public graphs. Keyword search runs under your own account credentials against the official endpoint.
FAQ
Is scraping Bluesky allowed? This actor reads public data through Bluesky's official, documented AT Protocol API — the same endpoints any Bluesky client uses — at polite request rates. Keyword search additionally runs under your own credentials. You're responsible for complying with applicable laws and Bluesky's terms for your use case.
Why do some profiles show handle.invalid? That's Bluesky's marker for accounts with broken handle verification; the actor automatically falls back to DID-based profile URLs so the records stay usable.
Can I use search operators? Yes — operators that work in the Bluesky app's search box (like from:handle) work in searchQueries too.
My account is on a self-hosted PDS. Set PDS service URL in the Advanced section; everything else works the same.
Something broke or you need another mode? Open an issue on this actor's Issues tab — I typically respond within a day. Planned next: lists, feed generators, starter packs, and post likers/quoters.