Bluesky Scraper — Export Posts, Profiles & Followers
Pricing
from $1.00 / 1,000 posts
Bluesky Scraper — Export Posts, Profiles & Followers
Scrape Bluesky posts, profiles, followers and keyword search without an API key. Export to JSON, CSV or Excel. Free AT Protocol data, no OAuth setup.
Pricing
from $1.00 / 1,000 posts
Rating
0.0
(0)
Developer
Night space
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Bluesky Scraper — Export Posts, Profiles, Followers & Keyword Search
Scrape Bluesky without an API key. Export Bluesky posts, profiles, followers, following lists and keyword search results to JSON, CSV or Excel in one run. No developer account, no OAuth setup, no monthly API fee.
Built on the AT Protocol, the open standard behind Bluesky — so this scraper reads public data the way Bluesky intends it to be read.
What you can do with it
Monitor your brand on Bluesky
Search every public post on Bluesky for your brand, product or competitor names and export the results with engagement counts. Track mentions daily, spot complaints early, and measure share of voice as Bluesky grows past 30 million users.
Build lead and creator lists
Find accounts by keyword — "SaaS founder", "python developer", "travel blogger" — and export handles, bios, follower counts and profile links straight to a spreadsheet.
Export your Bluesky followers to CSV
Pull the complete follower or following list for any public account, with bios and follower counts included. Useful for audience analysis, influencer research and audits.
Research and dataset building
Collect Bluesky posts with timestamps, languages, hashtags, links and engagement metrics for academic research, sentiment analysis or training data.
Track competitors
Watch what competitor accounts post, how often, and which posts actually land.
Sample output
Each row is one flat record, ready for a spreadsheet or a database.
Post
{"type": "post","queriedHandle": "bsky.app","uri": "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/3kb2xyz","url": "https://bsky.app/profile/bsky.app/post/3kb2xyz","authorHandle": "bsky.app","authorDisplayName": "Bluesky","text": "We just shipped a new feature.","lang": "en","createdAt": "2026-07-14T09:12:44.000Z","replyCount": 128,"repostCount": 640,"likeCount": 3204,"quoteCount": 51,"isReply": false,"hashtags": ["buildinpublic"],"mentions": [],"links": ["https://bsky.social/about/blog"],"images": ["https://cdn.bsky.app/img/feed_fullsize/..."]}
Profile
{"type": "profile","did": "did:plc:z72i7hdynmk6r22z27h6tvur","handle": "bsky.app","displayName": "Bluesky","description": "Official Bluesky account.","followersCount": 1420331,"followsCount": 42,"postsCount": 1893,"createdAt": "2023-04-12T04:53:57.000Z","url": "https://bsky.app/profile/bsky.app"}
Followers and following rows use the same profile shape, tagged with the handle you queried.
Quick start
- Click Try for free.
- Leave everything as-is and press Start — the defaults scrape a real profile and its posts, so you can see the output shape immediately.
- Replace the handle with the accounts you care about.
- Download from the Storage tab as JSON, CSV, Excel, XML or HTML.
Handles are flexible. All three of these work:
alice.bsky.social@alice.bsky.socialhttps://bsky.app/profile/alice.bsky.social
Input
| Field | Type | Default | What it does |
|---|---|---|---|
handles | array | ["bsky.app"] | Accounts to scrape. Handle, @handle or profile URL. |
scrapeProfiles | boolean | true | Return the profile record for each handle. |
scrapePosts | boolean | true | Return posts from each handle's feed. |
maxPostsPerHandle | integer | 100 | Cap on posts per handle. 0 skips posts. |
scrapeFollowers | boolean | false | Return each handle's followers. |
maxFollowersPerHandle | integer | 500 | Cap on followers per handle. |
scrapeFollowing | boolean | false | Return accounts each handle follows. |
maxFollowingPerHandle | integer | 500 | Cap on following per handle. |
searchTerms | array | [] | Keyword post search across all of Bluesky. Requires login. |
maxPostsPerSearch | integer | 100 | Cap on results per search term. |
searchPeopleTerms | array | [] | Find accounts by keyword. No login needed. |
maxPeoplePerSearch | integer | 50 | Cap on accounts per people-search term. |
blueskyIdentifier | string | — | Your Bluesky handle. Only for keyword post search. |
blueskyAppPassword | string | — | A Bluesky app password. Only for keyword post search. |
Example input
Brand monitoring plus a competitor's audience:
{"handles": ["competitor.bsky.social"],"scrapeProfiles": true,"scrapePosts": true,"maxPostsPerHandle": 200,"scrapeFollowers": true,"maxFollowersPerHandle": 2000,"searchTerms": ["your brand name", "yourproduct"],"maxPostsPerSearch": 500,"blueskyIdentifier": "you.bsky.social","blueskyAppPassword": "xxxx-xxxx-xxxx-xxxx"}
Why keyword search needs a login
Bluesky serves profiles, posts, followers and people search anonymously. Post search is the one endpoint that requires an authenticated session — that is Bluesky's rule, not this scraper's.
If you want keyword search, create an app password:
Bluesky → Settings → Privacy and Security → App Passwords → Add App Password
Use that, never your real password. An app password cannot change your account email or password, and you can revoke it at any time. It is stored as a secret input and never written to the dataset or logs.
Everything else works with no credentials at all.
FAQ
Do I need a Bluesky API key? No. The AT Protocol serves public data without authentication. Only keyword post search needs a login, and that uses a revocable app password.
Is scraping Bluesky legal? This scraper reads only public data through Bluesky's own public API, which is an open protocol explicitly designed for third-party clients and interoperability. It does not bypass logins, solve CAPTCHAs, or touch private data. As always, how you use exported data — especially personal data under GDPR or India's DPDP Act — is your responsibility.
How is this different from scraping Twitter/X or Reddit? Both now charge for API access and actively block scrapers. Bluesky's public API is free and open by design, which makes Bluesky data cheaper and more reliable to collect.
How many posts can I get per account? Up to 10,000 per handle per run. For more, split by handle across runs.
Can I get posts from a private account? No. Only public data is available.
What formats can I export? JSON, CSV, Excel, XML, HTML, or straight from the Apify API into your own app.
Can I run this on a schedule? Yes — use Apify Schedules to run it daily or hourly and build a growing dataset. Combine with webhooks to push new mentions into Slack, Google Sheets or your database.
Does it handle rate limits?
Yes. Requests are throttled well below Bluesky's limit, and 429 responses are retried with exponential backoff, honouring the ratelimit-reset header.
Will it break when Bluesky changes? It reads versioned AT Protocol endpoints rather than parsing HTML, which is far more stable than page scraping. Report an issue and it gets fixed.
Output fields
Posts: uri, cid, url, authorDid, authorHandle, authorDisplayName, text, lang, createdAt, indexedAt, replyCount, repostCount, likeCount, quoteCount, isReply, hashtags, mentions, links, embedType, images
Profiles, followers, following: did, handle, displayName, description, avatar, banner, followersCount, followsCount, postsCount, createdAt, indexedAt, url
Integrations
Send Bluesky data anywhere with Apify integrations: Google Sheets, Airtable, Slack, Zapier, Make, Google Drive, Amazon S3, or any webhook. Or call it from code with the Apify API, or the JavaScript and Python clients.
Support
Found a bug or need a field that isn't here? Open an issue on the Actor's Issues tab. Issues are usually answered within a few hours.