Bluesky Scraper: Posts, Profiles, Followers & Search
Pricing
$1.00 / 1,000 result items
Bluesky Scraper: Posts, Profiles, Followers & Search
Scrape Bluesky (AT Protocol) posts, profiles, followers, follows, likes, threads, search results, and feeds - no browser, no proxies, no cookies. Pay only for results you receive.
Pricing
$1.00 / 1,000 result items
Rating
0.0
(0)
Developer
Perconey
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Share
Bluesky Scraper - Posts, Profiles, Followers, Threads & Search
Scrape Bluesky (AT Protocol) at the source - posts, user profiles, follower / follows lists, full post threads, search results and custom feeds. No browser, no proxies, no cookies. The actor calls the official Bluesky AppView API directly, so the data you get is the same data the Bluesky client gets, with full fidelity. Try it from the Input tab on this page - most actions work without a Bluesky account.
If you've used Twitter / X scrapers and want the same workflow on Bluesky, this is the drop-in replacement.
Use cases
- Brand monitoring - track posts mentioning your brand, watch hashtags, alert on viral mentions via webhook.
- Influencer / KOL research -
searchActors+getProfilegives follower counts, post volume, bio keywords across the whole network. - Lead generation - pull followers of competitor accounts, enrich with profile data, push to your CRM.
- Newsroom / OSINT -
getAuthorFeedwithsince=YYYY-MM-DDto monitor specific accounts;getPostThreadto capture full discussion threads. - Research datasets - combine
searchPosts+ date range filters to build longitudinal text corpora for NLP / sentiment analysis. - Cross-platform analytics - export Bluesky data side-by-side with X/Twitter, Instagram, LinkedIn data (each available as a separate Apify actor).
Why use this Bluesky scraper?
- 10 actions in one Actor - search posts, get profiles, fetch follower lists, follow lists, threads with replies, likes, reposts, user search, custom feeds.
- Bring-your-own-auth for search - Bluesky's
searchPostsendpoint requires login. Use an App Password (not your real password) so your account stays safe. - No login needed for everything else - profiles, feeds, followers, threads, likes etc. work fully anonymously through the public AppView.
- Pay-per-result pricing - you only pay for items you actually receive. Stop a run at any time and the meter stops.
- Built-in filters - date range, language, minimum likes / reposts / replies, hashtag, domain, author, mention, sort order.
- Clean structured output - heavily nested AT Protocol records get flattened into 30+ table columns ready for CSV / Excel export.
- API + scheduler + integrations - run from the Apify API, schedule on a cron, pipe into Make, Zapier, Google Sheets, Slack or your own database.
How to use the Bluesky scraper
- Pick an action from the What do you want to scrape? dropdown (e.g. Get a user's posts).
- Fill Queries / Handles / URLs / URIs with one entry per line. The placeholder in the field tells you exactly what format the action expects.
- Set Max items per query (default 100). Use 0 for unlimited.
- Optional: add date / language / engagement filters.
- For
searchPosts: add your Bluesky handle + App Password (generated at https://bsky.app/settings/app-passwords). - Click Save & Start. Results stream into the Dataset tab in real time. Export as JSON, CSV, Excel, HTML or XML, or read them through the Apify API.
Input
| Field | Required | What it does |
|---|---|---|
action | yes | Which Bluesky API to call. 10 supported actions. |
queries | yes | One or more keywords / handles / Bluesky URLs / AT-URIs. The exact format depends on the action - the form shows hints. |
maxItems | no | Max results per query (0 = unlimited). |
since / until | no | ISO date range for searchPosts / getAuthorFeed. |
lang | no | ISO 639-1 language filter (en, pl, ja, ...). |
sortOrder | no | latest or top for searchPosts. |
minLikes / minReposts / minReplies | no | Engagement floors - useful for finding viral posts. |
fromAuthor / mentionsActor / tag / domain | no | Extra filters for searchPosts. |
includeReplies / includeReposts | no | For getAuthorFeed. |
authHandle / authAppPassword | no | Only used for searchPosts (mandatory there) and for accessing follower-only feeds. |
Output
Every run produces one Dataset with one item per result. Items share a common shape and add fields per type.
Real example - getProfiles on 6 famous accounts:
[{ "_type": "profile", "_action": "getProfiles", "_query": "bsky.app","did": "did:plc:z72i7hdynmk6r22z27h6tvur", "handle": "bsky.app","displayName": "Bluesky", "followersCount": 33234907, "followsCount": 5, "postsCount": 749,"url": "https://bsky.app/profile/bsky.app", "createdAt": "2023-04-12T04:53:57.057Z" },{ "_type": "profile", "_action": "getProfiles", "_query": "nytimes.com","handle": "nytimes.com", "displayName": "The New York Times","followersCount": 1317515, "postsCount": 35936 },{ "_type": "profile", "_action": "getProfiles", "_query": "techcrunch.com","handle": "techcrunch.com", "followersCount": 225348, "postsCount": 17823 },{ "_type": "profile", "_action": "getProfiles", "_query": "github.com","handle": "github.com", "followersCount": 59115, "postsCount": 395 }]
Real example - getAuthorFeed on bsky.app (5 most recent posts):
[{ "_type": "post", "_action": "getAuthorFeed", "_query": "bsky.app","uri": "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/3ml7bvrr4yk2l","url": "https://bsky.app/profile/bsky.app/post/3ml7bvrr4yk2l","handle": "bsky.app", "displayName": "Bluesky","text": "v1.121 is live! We've increased the quality of photos in posts by doubling the ...","createdAt": "2026-05-09T16:14:22.000Z","langs": ["en"], "likeCount": 7190, "repostCount": 412, "replyCount": 187, "quoteCount": 38 }]
Real example - searchActors for "web scraping" (top 5):
[{ "_type": "profile", "handle": "osintsupport.bsky.social", "displayName": "OsintSupport","description": "Open Source Intelligence | Web Scraping | Reverse Engineering" },{ "_type": "profile", "handle": "otsch.codes", "displayName": "otsch (Christian Olear)","description": "Web Developer, PHP enthusiast." }]
You can download the dataset in various formats such as JSON, JSON-Lines, CSV, Excel, HTML or XML, or fetch it programmatically through the Apify Dataset API.
Data fields
| Field | Type | Description |
|---|---|---|
_type | string | post, repost, profile, or error |
_action | string | The action that produced this row |
_query | string | Which input query produced this row |
uri / cid | string | AT-URI and content ID of the post |
url | string | Web link on bsky.app |
did / handle / displayName / avatar | string | Author identity |
text / langs | string / array | Post content + language tags |
createdAt / indexedAt | ISO 8601 | Authoring vs server time |
likeCount / repostCount / replyCount / quoteCount | int | Engagement |
tags / mentions / externalLinks | array | Extracted from rich-text facets |
embed | object | Quoted post, image set, or external link card |
replyParent / replyRoot | AT-URI | Reply context |
repostedBy | object | Present when the row is a repost surfaced through a feed |
followersCount / followsCount / postsCount | int | Profile rows only |
description / banner | string | Profile rows only |
threadDepth | int | getPostThread only - 0 = root, 1 = direct reply, ... |
likedAt | ISO 8601 | getLikes only - when the user liked the post |
Pricing - what does scraping Bluesky cost?
Pricing is pay-per-result - you pay only for items you receive. A budget cap on each run means you'll never spend more than you set in the run options.
Sample budgets at the published per-item price:
| Use case | Items | Approx. cost |
|---|---|---|
| Fetch one profile | 1 | a few hundredths of a cent |
| Monitor a hashtag (latest 500 posts) | 500 | a fraction of a dollar |
| Pull a user's 10 000 most recent posts | 10 000 | a few dollars |
| Audit a 100k-follower account | 100 000 | depends on the published rate × volume |
See the Pricing section on this page for the exact per-item rate. Apify also offers a free starter credit that covers thousands of items.
Tips & advanced options
- Search needs login. Bluesky restricts
searchPoststo authenticated calls. Always use an App Password, never your real account password - it's revocable, scoped, and audit-logged. - Pagination is automatic. The actor walks AT Protocol cursors transparently up to
maxItems. SetmaxItemscarefully - a popular hashtag has millions of posts. - Use
since/until. When monitoring a query on a schedule, setsinceto the last run time so you only collect new posts. This keeps cost flat regardless of post history. - Filtering happens post-fetch.
minLikes,minReposts,minReplies,langfilters apply after results return, so they reduce dataset items but don't reduce upstream calls. To skip silent items entirely, lean onsortOrder=topand a smallmaxItems. - DIDs are stable. Handles can change; DIDs cannot. Store DIDs if you build longitudinal datasets.
- Custom feeds. Pass a feed URL like
https://bsky.app/profile/<owner>/feed/<rkey>togetFeedto scrape any community-curated algorithm.
Integrations
The actor is available through the standard Apify surface area:
- REST API -
POST /v2/acts/perconey~bluesky-scraper-pro/runs - Scheduler - cron-style schedules in the Apify console
- Webhooks - Slack, Discord, email, custom endpoints on
RUN_SUCCEEDED - Sheets / Notion / Airtable / Google Drive via the Apify Integrations catalog
- Make / Zapier / n8n via the same catalog
FAQ
Do I need a Bluesky account?
Only for the searchPosts action. Every other action works anonymously.
Is this allowed by Bluesky's terms of service? The actor uses the public AT Protocol AppView API exactly the way a browser or the Bluesky mobile app does. The AT Protocol was designed as an open federated network - public data is intentionally open. We still strongly recommend using results responsibly: respect privacy, attribute creators, and don't redistribute private/limited content. You are responsible for your use.
Why is the data so much richer than what bsky.app shows?
We surface the raw fields the AppView API returns - including cid, label states, embed records, facets, and indexed-vs-created timestamps. That's the same data the protocol exposes; the official client just doesn't render most of it.
Can I get historical posts older than a year?
Yes - Bluesky retains posts indefinitely on the network. Use since / until to bound a range. Note that searchPosts only indexes the past ~year of content; for older posts use getAuthorFeed with a date range.
What about rate limits?
The AppView allows reasonable per-IP traffic. The actor paces calls (~8 req/s), retries on 429 with Retry-After honour, and backs off on 5xx. Heavy parallel runs may still hit limits - start with one run.
Support & feedback
Found a bug, want a new action, or need a custom version? Open an issue from the Issues tab on the Apify page, or message @perconey.bsky.social on Bluesky.
We can also build private / on-premises versions of this scraper or related AT Protocol tools.
Disclaimer: this scraper reads public Bluesky data only. Don't use it to harass users, dox accounts, or violate the Bluesky Community Guidelines.