Bluesky Scraper: Posts, Profiles, Followers
Pricing
from $0.30 / 1,000 results
Bluesky Scraper: Posts, Profiles, Followers
Scrape Bluesky without a login or API key. Search posts, get an account's posts, profiles, followers, follows, threads and replies, likes and reposts. Text, images, links, counts and dates. $0.40 per 1,000 results.
Pricing
from $0.30 / 1,000 results
Rating
0.0
(0)
Developer
Sanira Botheju
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
What does Bluesky Scraper do?
Bluesky Scraper reads Bluesky through its public API, the one anyone can use without logging in, and turns it into a table. Search for posts by keyword, hashtag, language, author, mentioned account, website or period. Read an account's posts, its profile, its followers and the accounts it follows. Read a single post with its replies, the conversation above it, and the people who liked or reposted it. Export to Excel, CSV or JSON, or send it on to another app.
There is nothing to set up. No Bluesky account, no app password, no token and no API key: the tool only sends plain read requests to Bluesky's public API (public.api.bsky.app and api.bsky.app), which answers without a login, and it never writes anything (no posting, liking, following or messages).
- Search posts by words,
"exact phrases"and#hashtags, newest or top first, with a period, a language, an author, a mentioned account, a website or a link as filters - An account's posts, replies and reposts, newest first, as far back as you ask, with a date range, with or without reposts, or only the posts with pictures or video
- Profiles: handle, DID, name, description, followers, follows and posts counts, created date, picture, banner, labels, check mark
- Followers and follows of any account
- A post's thread: the post, the replies below it (up to 10 levels), the posts above it, and the accounts that liked or reposted it
- Every post with its text, date, like, repost, reply and quote counts, language, hashtags, mentions, links, pictures with their descriptions, video, link card, quoted post, and the post it replies to
- Handles with or without
@,bsky.applinks,at://addresses and DIDs, all in one list - Public posts and profiles only: e-mail addresses and phone numbers in profile descriptions and names are replaced with
[removed], so you do not get contact details
What data do you get?
Each post is one row (type: "post"):
| Field | Example |
|---|---|
| Post | https://bsky.app/profile/bsky.app/post/3myi2ihquwk26 and its at:// address |
| Author | handle, DID and display name |
| Text | the post as written, with line breaks |
| Created | 2026-10-22T16:11:13.754Z (ISO 8601, UTC) |
| Counts | likes, reposts, replies, quotes, bookmarks |
| Languages | ["en"], as the author marked them |
| Hashtags, mentions, links | the tags, the mentioned accounts (handle and DID) and the real web addresses behind links |
| Pictures | address, thumbnail, the description (alt text) the author wrote, and size |
| Video | address of its playlist, thumbnail, size |
| Link card | address, title, description, thumbnail |
| Quoted post | the post it quotes: link, author, text, date and counts |
| Reply to | the post it answers and the first post of the thread |
| Labels | for example spam, bot or graphic-media |
| Reposted by | in an account's posts: who reposted it and when |
| Thread depth | in a thread: 0 is the post you asked for, 1 its replies, -1 the post it answers |
A profile is one row too (type: "profile"): handle, DID, display name, description, avatar, banner, followers, follows and posts counts, created date, labels, check mark, pronouns and website where the account lists them, and the pinned post. People in lists have the same fields without the counts: follower and following rows (with of, the account whose list it is), liker rows (with likedAt) and reposter rows.
How to scrape Bluesky
- Under Search terms, add words or hashtags, one search per line. Or under Accounts, add handles such as
bsky.appor profile links. Or under Posts, add post links. - Choose what to get for each account (profile, posts, followers, following) and each post (the post, replies, posts above, who liked it, who reposted it), and set the maximums.
- Press Start.
- Export the results as Excel or CSV, or connect them to Google Sheets, Slack, Make or Zapier.
How much does it cost to scrape Bluesky?
You pay for results, not for time: $0.40 per 1,000 results. Apify subscribers on the Silver plan pay $0.35 and on the Gold plan $0.30 per 1,000 results. A result is one row: a post, a profile, a follower, a follow, a liker, a reposter or an error. Each run also has a start fee of $0.00005.
| Results | Cost |
|---|---|
| 100 | $0.04 |
| 1,000 | $0.40 |
| 10,000 | $4.00 |
| 100,000 | $40.00 |
Apify's free plan includes $5 of credit each month, which covers about 12,000 results. A post found by two searches, or listed twice, is returned and charged once. Posts left out by your filters, by Skip adult content, or because their author asked not to be shown to logged-out visitors are not returned and not charged. A row that reports a problem (an account that does not exist, an entry that is not a Bluesky link) counts like any other result. Set a maximum cost for the run in Apify Console and the tool stops there and keeps what it has read.
Input
All three lists are optional, but give at least one of them.
- Search terms and Maximum posts per search. Each line is one search. Use
*to search by the filters alone, for example every post that links to one website (without a period: Bluesky refuses*together with one). Bluesky shows a search without a login only its first page, up to 100 posts (see the FAQ). - Sort search results by, Posted from and Posted until, Language, Only posts by, Only posts mentioning, Only posts linking to this domain and to this address: the search filters. A date, or a period such as
7 daysor24 hours, works in Posted from; a plain end date includes the whole day. Posted from and Posted until also limit the posts read from accounts. - Accounts: handles,
@handles, profile links or DIDs. What to get for each account chooses profile, posts, followers and following. Maximum posts per account, Which posts of an account, Include reposts, and Maximum followers and follows per account. - Posts: links to posts, or
at://addresses. What to get for each post chooses the post, replies, the posts above it, who liked it and who reposted it. How deep to read replies (1 to 10), Maximum replies per post and Maximum likes and reposts per post. - Skip adult content (on by default) and, under More options, Time limit per request and User-Agent.
Output example
{"type": "post","source": "search","input": "bluesky","uri": "at://did:plc:osgbq7gwpy2jhi6urpjcnlw7/app.bsky.feed.post/3myk2ht5l6y2h","url": "https://bsky.app/profile/example.bsky.social/post/3myk2ht5l6y2h","cid": "bafyreie7ziwaqt42camdsqeasqqotwbnx56raasyoqetrtjxyrizloh5bm","authorHandle": "example.bsky.social","authorDid": "did:plc:osgbq7gwpy2jhi6urpjcnlw7","authorDisplayName": "Example","text": "New photos from the trip! https://example.com/trip #travel","createdAt": "2026-10-23T11:16:11.415Z","indexedAt": "2026-10-23T11:16:11.838Z","likeCount": 12,"repostCount": 2,"replyCount": 1,"quoteCount": 0,"bookmarkCount": 1,"languages": ["en"],"hashtags": ["travel"],"mentions": [],"links": ["https://example.com/trip"],"images": [{ "url": "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:osgbq7gwpy2jhi6urpjcnlw7/bafkreiexample", "thumbnail": "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:osgbq7gwpy2jhi6urpjcnlw7/bafkreiexample", "alt": "A beach at sunset", "width": 1200, "height": 900 }],"video": null,"externalLink": null,"quotedPost": null,"replyTo": null,"labels": [],"repostedBy": null,"pinned": false,"threadDepth": null}
An input that cannot be read gives one row with an error: ACCOUNT_NOT_FOUND, POST_NOT_FOUND, INVALID_INPUT (for example a handle without a dot, or a post link under Accounts), ACCOUNT_OPTED_OUT, ACCOUNT_SKIPPED_ADULT, SEARCH_LIMITED (see the FAQ), RATE_LIMITED, ACCESS_DENIED, ROBOTS_DISALLOWED or a network error. If a page fails in the middle of a list, the rows read so far are kept and the error row says how many. The Run summary (key-value store) lists every search, account and post with the rows saved, the pages read, and how many rows were left out.
What can you use it for?
- Monitor a brand, a product, a topic or a hashtag on Bluesky and send new posts to Slack, e-mail or your own app on a schedule
- Collect posts for sentiment analysis, research and AI tools
- Track what an account posts, how its followers and posts counts grow, and which posts get the most reactions
- Find who follows, likes or reposts an account's posts, for community research
- Check what people share from a website: search by domain
- Archive a thread with all its replies
Schedule the run in Apify Console, for example every hour with Posted from set to 1 hour, to get only the new posts each time.
Use it from the API
curl -X POST "https://api.apify.com/v2/acts/cyber1nj3ct0r~bluesky-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"searchTerms": ["climate"], "maxPostsPerSearch": 100, "postedFrom": "24 hours", "accounts": ["bsky.app"], "accountData": ["profile", "posts"], "maxPostsPerAccount": 50}'
The same works from Python, JavaScript, Make, Zapier and n8n through Apify's integrations.
FAQ
Do I need a Bluesky account or an API key?
No. The tool reads what Bluesky shows to visitors who are not logged in. It uses no login, app password, token, cookie or proxy, identifies itself in its User-Agent, follows the robots.txt of the API (which allows this), asks for at most about four pages a second, and waits when Bluesky asks it to slow down.
Why does a search return at most 100 posts?
Bluesky answers a search without a login with its first page, up to 100 posts. In our tests it refused every later page (HTTP 403). The tool still asks for the next page once, in case Bluesky allows it, but when Bluesky refuses it stops, saves a row with the code SEARCH_LIMITED that says how many posts matched, and does not try to get round the refusal. To read more of a busy search, run it for shorter periods with Posted from and Posted until, one period after the other: each period gives its newest 100 posts. A search for * or for a single hashtag cannot be combined with a period (Bluesky answers "Invalid request"); add a word to the search or leave the period out.
Why are some posts or accounts missing?
Two kinds are left out on purpose. Accounts that asked apps not to show them to people who are not logged in (10 to 25 percent of the posts in the searches we tried) are never returned, whatever the settings. Posts and accounts that Bluesky or their authors label as adult (porn, sexual, nudity) are left out while Skip adult content is on; untick it to get them. You are not charged for rows that are left out.
How many replies does it get?
The replies Bluesky gives for a post: it ranks them and returns the top part. In a test, a post with 8,678 replies returned 165 direct replies and 84 answers to them. Replies that are deleted, or hidden by a block, are not included. The list of who reposted a post can be shorter than the repost count, because Bluesky lists only some of them.
Does it return e-mail addresses or phone numbers?
No. The tool returns public posts and profiles, not contact details. E-mail addresses and phone numbers in profile descriptions and display names are replaced with [removed]. Text that people write in a post is returned as written. There is no tool here to look up a person by e-mail or phone number, and nothing that sends messages, follows or likes.
What is the handle handle.invalid?
An account whose handle (its domain name) no longer checks out. The profile link then uses the DID, which never changes. Use the DID to identify accounts over time: people can change their handle.
Which dates and numbers does it give?
Dates are ISO 8601 in UTC. Counts are the ones Bluesky shows when the tool reads, and change over time. Hashtags are the tags that authors marked in their post, as Bluesky's own apps show them. Mentions are listed with the DID, and with the handle where the text shows it.
Do the picture and video links last?
They are Bluesky's own CDN addresses (cdn.bsky.app and video.bsky.app) and stay valid as long as the post exists. Videos come as an HLS playlist (.m3u8) that video players and tools like ffmpeg can open.
Is it allowed to scrape Bluesky?
The tool reads only what Bluesky's public API shows without a login, and it follows the API's robots.txt. Posts and profiles can still contain personal data and are copyrighted by their authors: you are responsible for how you store, use and share them, under the laws that apply to you and Bluesky's terms.
Something does not work
Open an issue on the Issues tab with the search, account or post you tried. Bluesky changes its API from time to time, and every report is read and answered.