Bluesky Scraper: Posts, Profiles, Followers & Search avatar

Bluesky Scraper: Posts, Profiles, Followers & Search

Pricing

$1.00 / 1,000 result items

Go to Apify Store
Bluesky Scraper: Posts, Profiles, Followers & Search

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

Perconey

Maintained by Community

Actor 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 + getProfile gives 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 - getAuthorFeed with since=YYYY-MM-DD to monitor specific accounts; getPostThread to 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 searchPosts endpoint 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

  1. Pick an action from the What do you want to scrape? dropdown (e.g. Get a user's posts).
  2. Fill Queries / Handles / URLs / URIs with one entry per line. The placeholder in the field tells you exactly what format the action expects.
  3. Set Max items per query (default 100). Use 0 for unlimited.
  4. Optional: add date / language / engagement filters.
  5. For searchPosts: add your Bluesky handle + App Password (generated at https://bsky.app/settings/app-passwords).
  6. 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

FieldRequiredWhat it does
actionyesWhich Bluesky API to call. 10 supported actions.
queriesyesOne or more keywords / handles / Bluesky URLs / AT-URIs. The exact format depends on the action - the form shows hints.
maxItemsnoMax results per query (0 = unlimited).
since / untilnoISO date range for searchPosts / getAuthorFeed.
langnoISO 639-1 language filter (en, pl, ja, ...).
sortOrdernolatest or top for searchPosts.
minLikes / minReposts / minRepliesnoEngagement floors - useful for finding viral posts.
fromAuthor / mentionsActor / tag / domainnoExtra filters for searchPosts.
includeReplies / includeRepostsnoFor getAuthorFeed.
authHandle / authAppPasswordnoOnly 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

FieldTypeDescription
_typestringpost, repost, profile, or error
_actionstringThe action that produced this row
_querystringWhich input query produced this row
uri / cidstringAT-URI and content ID of the post
urlstringWeb link on bsky.app
did / handle / displayName / avatarstringAuthor identity
text / langsstring / arrayPost content + language tags
createdAt / indexedAtISO 8601Authoring vs server time
likeCount / repostCount / replyCount / quoteCountintEngagement
tags / mentions / externalLinksarrayExtracted from rich-text facets
embedobjectQuoted post, image set, or external link card
replyParent / replyRootAT-URIReply context
repostedByobjectPresent when the row is a repost surfaced through a feed
followersCount / followsCount / postsCountintProfile rows only
description / bannerstringProfile rows only
threadDepthintgetPostThread only - 0 = root, 1 = direct reply, ...
likedAtISO 8601getLikes 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 caseItemsApprox. cost
Fetch one profile1a few hundredths of a cent
Monitor a hashtag (latest 500 posts)500a fraction of a dollar
Pull a user's 10 000 most recent posts10 000a few dollars
Audit a 100k-follower account100 000depends 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 searchPosts to 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. Set maxItems carefully - a popular hashtag has millions of posts.
  • Use since / until. When monitoring a query on a schedule, set since to 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, lang filters apply after results return, so they reduce dataset items but don't reduce upstream calls. To skip silent items entirely, lean on sortOrder=top and a small maxItems.
  • 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> to getFeed to 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.