Bluesky Scraper: Posts, Profiles, Followers, Threads, Likes avatar

Bluesky Scraper: Posts, Profiles, Followers, Threads, Likes

Pricing

from $0.70 / 1,000 results

Go to Apify Store
Bluesky Scraper: Posts, Profiles, Followers, Threads, Likes

Bluesky Scraper: Posts, Profiles, Followers, Threads, Likes

Scrape Bluesky without login or API keys: author feeds, post threads and replies, profiles, followers and following, likes, reposts and quotes. Accepts bsky.app URLs, handles and DIDs. Clean flat rows with engagement counts, links, mentions, hashtags and images.

Pricing

from $0.70 / 1,000 results

Rating

0.0

(0)

Developer

Ctrio Lab

Ctrio Lab

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

21 days ago

Last modified

Share

Scrape Bluesky without a login, cookies or API keys. This Actor reads the public AT Protocol AppView API that the Bluesky web app itself uses for logged-out visitors, and returns clean, flat rows that are ready for Excel, Google Sheets, BI tools or an AI agent.

What you can get

ModeInputOne row per
Author feedshandles, DIDs or profile URLspost (optionally reposts)
Post threadspost URLs or at:// URIspost and each reply (with depth)
Profileshandles, DIDs or profile URLsprofile with follower, following and post counts
Followers / Followinghandles, DIDs or profile URLsprofile
Likes / Reposts of a postpost URLsprofile (likes include likedAt)
Quotes of a postpost URLsquoting post

Why this Actor

  • No Bluesky account needed, nothing to configure. Paste bsky.app links, @handles or did:plc: DIDs in any mix.
  • Clean fields: text, created time, author, reply / repost / like / quote counts, languages, links, mentions (DID and handle), hashtags, images with alt text, video, link card, quoted post, reply parent and root.
  • Caps per input and per run, so you never pay for more than you asked for.
  • Polite and stable: one connection, automatic retries with exponential backoff on HTTP 429 and 5xx, and it waits as long as Bluesky asks (Retry-After, RateLimit-* headers).
  • Respects users: accounts and posts that ask not to be shown to logged-out people are skipped (see "Data source and terms").
  • Fails fast on bad input with a clear message, before any request or charge.

How to use it

  1. Fill in one or more sections: Author feeds, Profiles, Followers of, Following of, Post threads, Likes / Reposts / Quotes of posts. You can combine them in one run.
  2. Set Max results per input and Max results in total.
  3. Click Start, then download the dataset as JSON, CSV, Excel or use the API.

Input examples

Last 200 posts (with replies and reposts) from three accounts:

{
"authorFeeds": ["bsky.app", "@jay.bsky.team", "https://bsky.app/profile/pfrazee.com"],
"authorFeedFilter": "posts_with_replies",
"includeReposts": true,
"maxItemsPerInput": 200
}

A post and its replies, plus who liked and reposted it:

{
"postUrls": ["https://bsky.app/profile/bsky.app/post/3mwolmfws5k2r"],
"threadDepth": 10,
"likesOf": ["https://bsky.app/profile/bsky.app/post/3mwolmfws5k2r"],
"repostsOf": ["https://bsky.app/profile/bsky.app/post/3mwolmfws5k2r"],
"maxItemsPerInput": 500
}

First 1,000 followers of an account, with their own follower counts:

{
"followersOf": ["bsky.app"],
"enrichProfiles": true,
"maxItemsPerInput": 1000
}

Profiles from a mixed list:

{
"profiles": ["bsky.app", "did:plc:ragtjsm2j2vknwkz3zp4oxrd", "https://bsky.app/profile/atproto.com"]
}

Accepted identifiers

  • Handles: bsky.app, @name.bsky.social, custom domains like nytimes.com. A bare name like jay is read as jay.bsky.social.
  • DIDs: did:plc:..., did:web:...
  • Profile URLs: https://bsky.app/profile/<handle or DID>
  • Post URLs: https://bsky.app/profile/<handle or DID>/post/<id> or at://<did>/app.bsky.feed.post/<id>

Output

Every row has type (post or profile), source (author_feed, thread, profile, followers, following, likes, reposts, quotes), the input it came from and scrapedAt.

Post row example:

{
"type": "post",
"postType": "reply",
"uri": "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/3mv462yda4k2l",
"id": "3mv462yda4k2l",
"url": "https://bsky.app/profile/bsky.app/post/3mv462yda4k2l",
"text": "Thank you for coming to today's Apple event! You can find these and more Apple products at your nearest grocery store, farmers' market, or orchard.",
"createdAt": "2026-09-09T18:27:44.595Z",
"authorHandle": "bsky.app",
"authorDisplayName": "Bluesky",
"authorDid": "did:plc:z72i7hdynmk6r22z27h6tvur",
"replyCount": 4,
"repostCount": 4,
"likeCount": 220,
"quoteCount": 3,
"bookmarkCount": 8,
"langs": ["en"],
"links": ["https://go.bsky.app/AjuvkDc"],
"mentions": [],
"hashtags": [],
"images": [],
"imageCount": 0,
"video": null,
"externalLink": { "uri": "https://go.bsky.app/AjuvkDc", "title": "Apple Experts", "description": "Join the conversation", "thumb": "https://cdn.bsky.app/img/feed_thumbnail/plain/..." },
"quotedPost": null,
"replyParentUri": "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/3mv45zmynys2l",
"replyRootUri": "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/3mv3zcjaijk22",
"labels": [],
"source": "author_feed",
"input": "bsky.app",
"scrapedAt": "2026-10-03T09:28:27.541Z"
}

Images come as images: [{ url, thumb, alt, width, height }], videos as video: { playlist, thumbnail, alt }, quoted posts as quotedPost: { uri, url, text, authorHandle }. Other post fields: cid, indexedAt, authorAvatar, authorUrl, replyParentUrl, replyRootUrl, threadRootUri and threadDepth (threads, 0 = the post you entered), repostedByHandle, repostedByDid, repostedAt (reposts in author feeds), subjectPostUri, subjectPostUrl (quotes).

Profile row example:

{
"type": "profile",
"did": "did:plc:z72i7hdynmk6r22z27h6tvur",
"handle": "bsky.app",
"url": "https://bsky.app/profile/bsky.app",
"displayName": "Bluesky",
"description": "official Bluesky account (check username) ...",
"followersCount": 35128563,
"followsCount": 15,
"postsCount": 865,
"createdAt": "2023-04-12T04:53:57.057Z",
"verified": false,
"labels": [],
"source": "profile",
"input": "bsky.app"
}

Follower, following, liker and reposter rows also have relation, subjectHandle, subjectDid, subjectPostUri, subjectPostUrl and likedAt where relevant. Their counts are null unless Add counts and bio to follower / like lists is on.

A run summary (items per input, skipped inputs with reasons, HTTP statistics) is saved in the key-value store as RUN_SUMMARY.

Pricing

Pay per result: $1.00 per 1,000 results plus a tiny Actor start fee. One row in the dataset = one result. Duplicates within an input, skipped hidden content and failed inputs are not charged. Invalid input stops the run before anything is charged.

Limits you should know

  • No keyword search. Bluesky currently switches post search off for logged-out clients. This Actor does not log in or use another host to get around that, so keyword search is not offered. To follow a topic, track the accounts that post about it with author feeds.
  • Threads contain the replies Bluesky shows on the post page; very large threads are trimmed by Bluesky.
  • Deleted posts and accounts, blocked replies and hidden content are not returned.

Data source and terms

  • Data comes only from Bluesky's public AppView API (public.api.bsky.app, as listed in the Bluesky developer docs "API Hosts and Auth"). These endpoints are documented for unauthenticated use. The Actor never logs in, never uses accounts, cookies or proxies, and never writes anything to Bluesky (no likes, follows or posts).
  • Bluesky's Terms of Service do not prohibit reading public data through the API. The Bluesky Developer Guidelines forbid spam and automated interactions; this Actor is read-only.
  • Rate limits are respected: requests are sent one at a time with a pause, Retry-After and RateLimit-* headers are honoured, and blocked requests (HTTP 403) are never retried or disguised.
  • Accounts and posts labelled !no-unauthenticated (users who asked Bluesky not to show their content to logged-out people), !hide or !takedown are skipped, including replies under them.
  • Results are a snapshot at scrapedAt. If a user deletes a post or account later, you should delete it from your copy too; re-run the Actor to refresh.
  • You are responsible for using the data lawfully (for example GDPR / CCPA for personal data) and for respecting user preferences. Bluesky has proposed "User Intents" signals for AI training and bulk datasets; check them if you build such datasets.

FAQ

Do I need a Bluesky account or app password? No.

Can I search posts by keyword? Not at the moment. Bluesky switched post search off for logged-out clients and we do not work around it. Use author feeds, threads, quotes and likes instead.

How fast is it? Around 1,000 posts or profiles in 5 to 10 seconds for feeds and follower lists (100 per request).

Why are some accounts skipped? The account was not found (deleted, deactivated, mistyped) or its owner asked Bluesky to hide it from logged-out visitors. The reason is in the log and in RUN_SUMMARY.

Can I monitor new posts? Yes. Schedule the Actor with author feeds and a small maxItemsPerInput.

Can I use it from an AI agent (MCP)? Yes, call it through the Apify MCP server or the Apify API like any other Actor.

Something is wrong or missing? Open an issue on the Actor page with the run link and we will look at it.