Bluesky Scraper
Pricing
from $2.50 / 1,000 results
Bluesky Scraper
Scrapes public Bluesky profiles, posts, post threads, and search results into a clean dataset.
Pricing
from $2.50 / 1,000 results
Rating
0.0
(0)
Developer
Anyx Solutions
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share

Bluesky Scraper
Pull Bluesky profiles, posts, threads, and keyword search results into a clean dataset — no login required.
Scrapes public Bluesky profiles, posts, post threads, and search results into a clean dataset. Point it at a profile to get the account's stats and latest posts, at a single post to capture it with its replies, or at a search to collect every post matching a keyword. Built for social-listening teams, researchers, marketers, and anyone tracking conversations on Bluesky without wiring up the AT Protocol themselves.
⚡ Quick start
{"startUrls": [{ "url": "https://bsky.app/profile/bsky.app" },{ "url": "https://bsky.app/profile/bsky.app/post/3l6oveex3ii2l" }],"searchQueries": ["nvidia"],"maxItems": 5}
🧩 Input
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
startUrls | array | no | — | Public bsky.app URLs to scrape. Supported: a profile (https://bsky.app/profile/bsky.app) returns the profile plus its latest posts; a post (https://bsky.app/profile/bsky.app/post/3l6oveex3ii2l) returns the post and its replies; a search page (https://bsky.app/search?q=nvidia) returns matching posts. |
searchQueries | array | no | — | Free-text searches to run in addition to Start URLs, one per line. Each query is scraped like a https://bsky.app/search?q=... page, e.g. "nvidia" or "climate change". |
maxItems | integer | no | 5 | Maximum number of dataset items to return per start URL or search query. For a profile URL the profile row itself counts as one item. |
proxyConfiguration | object | no | { "useApifyProxy": true } | Apify proxy settings used for the run. Profiles and threads work from any IP, but Bluesky search rejects cloud IPs, so datacenter Apify Proxy is on by default. |
📤 Output
Every row carries an itemType of either profile or post. A profile start URL pushes one profile row followed by the account's most recent posts (newest first, reposts flagged). A post start URL pushes the post itself first, then its replies in the order they appear on the site. Search pages push matching posts, newest first.
Fields
| Field | Type | Description |
|---|---|---|
itemType | string | profile or post. |
did | string | Profile rows: the account's permanent decentralised identifier. |
handle | string | Profile rows: the account handle, e.g. bsky.app. |
displayName | string | Profile rows: display name, or null. |
description | string | Profile rows: bio text, or null. |
avatar | string | Profile rows: avatar image URL, or null. |
banner | string | Profile rows: banner image URL, or null. |
followersCount | integer | Profile rows: number of followers. |
followsCount | integer | Profile rows: number of accounts followed. |
postsCount | integer | Profile rows: total posts by the account. |
createdAt | string | ISO timestamp — account creation for profiles, post time for posts. |
url | string | Public bsky.app URL of the profile or post. |
uri | string | Post rows: the post's at:// URI. |
cid | string | Post rows: content identifier of the post record. |
text | string | Post rows: post text, or null. |
author | object | Post rows: { did, handle, displayName, avatar } of the poster. |
replyCount | integer | Post rows: number of replies. |
repostCount | integer | Post rows: number of reposts. |
likeCount | integer | Post rows: number of likes. |
quoteCount | integer | Post rows: number of quote posts. |
langs | array | Post rows: language tags declared on the post, e.g. ["en"]. |
images | array | Post rows: attached images as { url, alt } (full-size URLs). |
externalLink | object | Post rows: link card as { uri, title, description }, or null. |
isReply | boolean | Post rows: true when the post replies to another post. |
replyRootUri | string | Post rows: at:// URI of the thread root when isReply is true, else null. |
isRepost | boolean | Post rows: true when the row appears in a profile feed because the account reposted it. |
indexedAt | string | Post rows: ISO timestamp when the network indexed the post. |
💡 Use cases
- Social listening — track every post mentioning your brand, product, or campaign keyword.
- Influencer and account research — pull follower counts, bios, and recent posts for a list of handles.
- Thread archiving — capture a viral post together with its replies for analysis or moderation review.
- Content and sentiment analysis — feed post text, languages, and engagement counts into your own pipeline.
❓ FAQ
- Do I need a proxy? Profile and post URLs work without one. Search does not — Bluesky's search service refuses requests from cloud IPs — so the default keeps inexpensive datacenter Apify Proxy on. Switch it off if you only scrape profiles and threads.
- How many results can I get?
maxItemscaps results per start URL or search query. Add more start URLs or queries to widen coverage. - Does a profile URL include reposts? Yes — reposted posts appear in the feed with
isRepost: true, and the original author is kept inauthor. - Can I use a handle instead of a URL? Use the profile URL form
https://bsky.app/profile/<handle>; custom-domain handles anddid:plc:identifiers both work in place of<handle>. - Why did a run return fewer items than expected? Private or deleted accounts return nothing, and search only covers posts the network has indexed. If a public account returns zero posts, open an issue and we will update the Actor.
🔗 More scrapers by Anyx
- X (Twitter) Scraper
- Threads Scraper
- Reddit Scraper
- YouTube Channel Scraper
- TikTok Trending Hashtags Scraper
🤝 Anyx Solutions
We build custom scrapers and data-extraction pipelines.
- Email: tantosthor@gmail.com