Bluesky Scraper - Posts, Profiles, Followers avatar

Bluesky Scraper - Posts, Profiles, Followers

Pricing

$0.70 / 1,000 results

Go to Apify Store
Bluesky Scraper - Posts, Profiles, Followers

Bluesky Scraper - Posts, Profiles, Followers

Export Bluesky posts, profiles, followers and following lists from any public account: post text, likes, reposts, replies, quotes, images, video, link cards, hashtags, mentions, follower counts and verification. Find accounts by keyword. No login needed.

Pricing

$0.70 / 1,000 results

Rating

0.0

(0)

Developer

Crikit

Crikit

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

What is Bluesky Scraper?

Bluesky Scraper lets you export posts, profiles, followers and following lists from any public Bluesky account, helping you track what accounts are posting, measure how their audience reacts, and build lists of the people around them. No login, no app password, no session cookie.

  • ๐Ÿ” Track any account's timeline: pull a full post history newest first, with likes, reposts, replies, quotes and bookmarks on every row, plus the permalink to the post itself.
  • ๐Ÿ“ˆ Measure real engagement, not vanity counts: every row carries the author's follower count and an engagement-per-follower figure, so a 40-like post from a 500-follower account stops looking smaller than a 40-like post from a 500,000-follower account.
  • ๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘ Export a social graph: get the full followers or following list of an account, one row per person, with handle, display name, bio and avatar.
  • ๐Ÿ”Ž Find accounts you do not know yet: search Bluesky by keyword and get matching accounts back with their follower, following and post counts already filled in.
  • ๐Ÿ–ผ Keep the media: image URLs with alt text, video playlist URLs, link-card titles and descriptions, quoted posts, mentions, hashtags and outbound links, all as ordinary columns.
  • ๐Ÿ—“ Narrow before you pay: cap the run, cap it per account, restrict to a date range, drop reposts, or take only posts that carry media.

Bluesky's own app shows you one profile at a time and gives you nothing to export. Bluesky Scraper runs many accounts in parallel, follows the cursor to the end of the list instead of stopping at the first page, and hands you a clean table or CSV. It is priced at $0.70 per 1,000 results with no per-run start fee, which is the cheapest Bluesky scraper on the Apify Store.

What data does Bluesky Scraper extract?

Every row, whatever its type:

  • ๐Ÿ†” Account DID and handle (did, handle)
  • ๐Ÿท Display name and bio (displayName, description)
  • ๐Ÿ‘ฅ Follower count, following count and post count (followersCount, followsCount, postsCount)
  • โœ… Verification status (isVerified, verifiedStatus)
  • ๐Ÿ–ผ Avatar and banner image URLs
  • ๐Ÿ“… Account creation date (accountCreatedAt)
  • ๐Ÿ“‹ Lists, custom feeds and starter packs the account publishes
  • ๐Ÿ”— Profile URL, ready to click
  • ๐Ÿšฉ Moderation labels on the account (accountLabels)
  • โฑ scrapedAt timestamp on every row

For each post:

  • ๐Ÿ“ Full post text and its length
  • ๐Ÿ”— Post permalink and the AT-URI (postUrl, postUri, postCid, postRkey)
  • โค๏ธ Likes, ๐Ÿ” reposts, ๐Ÿ’ฌ replies, ๐Ÿ’ญ quotes and ๐Ÿ”– bookmarks
  • ๐Ÿ“Š Total engagement and engagement per follower (totalEngagement, engagementRate)
  • ๐Ÿ• Publish time and index time (postedAt, postIndexedAt)
  • ๐Ÿ” Repost flag and who reposted it (isRepost, repostedByHandle)
  • ๐Ÿ’ฌ Reply flag, the parent post and the thread root (isReply, replyToPostUrl, threadRootUri)
  • ๐Ÿ’ญ Quote flag, the quoted post's link, author and text
  • ๐Ÿ“ธ Image URLs with alt text (images, imageCount)
  • ๐ŸŽฌ Video playlist and thumbnail URLs
  • ๐Ÿƒ Link card URL, title, description and thumbnail
  • #๏ธโƒฃ Hashtags, @mentions as handles and as DIDs, and outbound links
  • ๐ŸŒ Post language codes (languages)

For each follower or following entry:

  • ๐Ÿ‘ค The person's DID, handle, display name, bio and avatar
  • โ†”๏ธ Which account they were pulled from and in which direction (relatedToHandle, relationship)

How to use Bluesky Scraper

  1. Click Try for free and open the input form.
  2. Paste one or more accounts into Bluesky profiles. A handle (nytimes.com), an @handle, a DID, or a profile link all work. No list of handles yet? Type a keyword into Keywords to find accounts instead.
  3. Choose What to scrape: posts, profiles, followers or following.
  4. Set Max results. You are charged per row, so this is your budget control.
  5. Click Start and export the results as CSV, Excel, JSON or XML, or pull them from the Apify API.

Input

{
"profiles": ["nytimes.com", "@bsky.app", "https://bsky.app/profile/pfrazee.com"],
"resultsType": "posts",
"maxItems": 1000,
"maxItemsPerProfile": 200,
"postFilter": "posts_with_replies",
"includeReposts": true,
"fromDate": "2026-01-01",
"proxyConfiguration": { "useApifyProxy": true }
}

Keyword discovery instead of a handle list:

{
"searchTerms": ["climate scientist", "urban planning"],
"resultsType": "profiles",
"maxProfilesPerKeyword": 50,
"maxItems": 100
}
FieldWhat it does
profilesAccounts to scrape. Handle, @handle, DID or profile URL. A post URL resolves to its author.
searchTermsKeywords. Bluesky matches them against handles, display names and bios.
resultsTypeposts, profiles, followers or following.
maxItemsTotal row cap across every account. 0 means no limit.
maxItemsPerProfilePer-account cap, so one busy account cannot use the whole budget.
postFilterposts_with_replies, posts_no_replies, posts_with_media or posts_and_author_threads.
includeRepostsOff drops reposts, so you only pay for original content.
fromDate, toDateDate window on the post's publish time, YYYY-MM-DD.
maxProfilesPerKeywordHow many accounts each keyword may contribute. Defaults to 20.

Output

One row per result. Trimmed to the interesting fields:

{
"type": "post",
"handle": "nytimes.com",
"displayName": "The New York Times",
"followersCount": 1344713,
"postsCount": 42326,
"isVerified": true,
"postUrl": "https://bsky.app/profile/nytimes.com/post/3mumkqrekwj2e",
"text": "Breaking News: The Trump administration released new rules that could revoke tax-exempt status from schools ...",
"postedAt": "2026-09-03T13:32:04.498Z",
"likeCount": 9,
"repostCount": 3,
"replyCount": 0,
"quoteCount": 1,
"bookmarkCount": 0,
"totalEngagement": 13,
"engagementRate": 0.00001,
"isRepost": false,
"isReply": false,
"isQuote": false,
"embedType": "link",
"externalUrl": "https://nyti.ms/4zUnBas",
"externalTitle": "Trump Administration Renews Push to Strip Schools of Tax-Exempt Status",
"links": [],
"mentionHandles": ["theathleticfc.bsky.social"],
"hashtags": [],
"profileUrl": "https://bsky.app/profile/nytimes.com",
"scrapedAt": "2026-09-03T13:32:11.004Z",
"...": "and 45 more columns"
}

The dataset ships with three ready-made table views, so you are not handed a wall of JSON:

  • Overview: handle, name, followers, publish time, post text, likes, reposts, replies, link.
  • Profiles: handle, name, followers, following, posts, verified, bio, join date, profile link.
  • Engagement: handle, followers, likes, reposts, replies, quotes, total engagement, engagement per follower, media type, link.

How much does it cost to scrape Bluesky?

$0.0007 per result, which is $0.70 per 1,000 rows. There is no start fee and no monthly minimum, so a run that returns 12 rows costs less than a cent.

ResultsCost
100$0.07
1,000$0.70
10,000$7.00
100,000$70.00

Every other Bluesky scraper on the Apify Store charges between $1.00 and $8.00 per 1,000 results, and most add a per-run start fee of $0.005 to $0.09 on top. This one is a single flat per-row price, and Apify's own volume discounts apply to it automatically on paid plans.

Measured coverage

From the QA runs behind version 0.1: 516 post rows, 373 follower and following rows and 11 profile rows locally, plus 2,451 rows across five runs on the Apify platform itself, covering news accounts, personal accounts, keyword searches, accounts with zero posts and handles that do not exist. Every platform row carried all 69 columns, no duplicates and no missing timestamps.

FieldPost rowsNotes
postUrl, postUri, postedAt100%Every row is addressable and timestamped.
Likes, reposts, replies, quotes, bookmarks100%Numbers, including a real 0, never null.
handle, displayName, avatarUrl100%
followersCount, postsCount100%Includes reposts of other people's posts, whose authors are resolved in a second lookup.
engagementRate100%
isVerified100%A true or false, never null.
text99%The 1% are image-only or video-only posts with no caption.
languages39%Bluesky's clients only tag some posts.
links24%Present when the post body contains a link.
mentionHandles14%Present when the post mentions somebody.
FieldFollower and following rows
did, handle, relatedToHandle100%
avatarUrl98%
displayName64% (many accounts never set one)
description57% (many accounts have no bio)

Embed types seen across those 516 posts: 290 link cards, 135 with no embed, 63 image posts, 18 videos, 10 quote posts including quote-plus-media combinations. All of them parsed into columns.

Speed, measured on the Apify platform rather than on a laptop: 100 posts in 6 seconds end to end, 300 posts across 3 accounts in 5 seconds, 2,000 followers in 35 seconds. A run that lands on a slow proxy exit can take several times longer for the same rows, which is why the cap is on results and not on time.

Limits

Worth knowing before you buy:

  • Keyword search covers accounts, not posts. Bluesky's public API stopped serving post search to unauthenticated callers, and this Actor does not ask you for a password or a session token, so it does not offer keyword post search. Any scraper that promises it is either logging in as somebody or is broken. What you can do is find accounts by keyword and then export their posts, which this Actor does in a single run.
  • Followers and following are returned newest first and Bluesky offers no way to sort or filter them, so a 1.3 million-follower account has to be walked in order.
  • Hashtags are parsed but rare. None of the 516 QA rows carried one, because hashtag use on Bluesky is uncommon. The column is tested against the protocol's own facet shape.
  • Display names and bios are genuinely missing on roughly a third of follower rows. That is the account's own choice, not a gap in extraction.
  • Deactivated and deleted accounts return no data. The run still ends successfully and writes one row explaining which account and why, so a scheduled job can tell "nothing there" apart from "something broke".
  • Private data is not available at all. Bluesky has no private posts, no private follower lists and no direct-message API on the public AppView. Nothing here is scraped from behind a login.

FAQ

Bluesky Scraper reads only public data, through Bluesky's own public AT Protocol AppView, the same interface the bsky.app website uses when you are not logged in. It sends no credentials and it accesses nothing that requires a login. Scraping public data is generally lawful in the US and the EU, but posts are written by people, so if you collect, store or publish them you are responsible for your own compliance with the GDPR, the CCPA and Bluesky's terms. If you are unsure, talk to a lawyer, and read Apify's ethical web scraping guide.

Can I use Bluesky Scraper as an API?

Yes. Every Actor on Apify is an API endpoint. Start a run, poll it, and read the dataset with the Apify API, or use the JavaScript, Python or CLI clients.

Can I use this in Python?

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cirkit/bluesky-scraper").call(run_input={
"profiles": ["nytimes.com"],
"resultsType": "posts",
"maxItems": 500,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["postedAt"], item["likeCount"], item["text"])

How do I schedule Bluesky Scraper to run automatically?

Open the Actor, go to Schedules, and add a cron schedule: hourly, daily, weekly, whatever the account's posting rhythm needs. Every run writes to its own dataset, and a fromDate keeps each run to the window you care about.

Can I integrate Bluesky Scraper with other apps?

Yes. Apify connects to Zapier, Make, n8n, Slack, Google Sheets, Google Drive, GitHub and Airtable, and can push finished runs to any HTTP endpoint through webhooks.

Why did I get fewer results than expected?

The usual reasons, in order of likelihood: Max results capped the run, Max results per account capped a single account, the date range excluded most of the history, Which posts was set to a narrow filter such as media-only, or the account simply has fewer posts than you thought. The run log names which of these applied.

What happens when a handle does not exist?

The run finishes successfully and writes one row with isNoResults: true and a noResultsReason that says what happened. Handles on Bluesky change whenever somebody moves their account to a new domain, so this is common and it should not break your pipeline. Give one good account and one bad one and you get the good one's data plus a warning in the log.

Can I scrape the replies to a post, or who liked it?

Not in this version. Bluesky's public API does expose both, so if you need them, ask through the Issues tab and say which one matters. Version 0.1 covers posts, profiles, followers and following.

Can I get a field that is not listed?

Probably. The AT Protocol exposes more per record than any dataset needs, so open an issue on the Actor's Issues tab describing the field and it can usually be added.

Do I need a Bluesky account or an app password?

No. That is the point. Nothing here asks for credentials, so there is no account of yours to rate limit, suspend or lock out.

You might also like

Changelog

0.1 (2026-09-03) First release. Posts, profiles, followers and following. Keyword account discovery with follower counts filled in. Five embed types parsed, reposted authors resolved so no engagement column is null, and cursor pagination that ends on a missing cursor rather than on a short page.