Bluesky Scraper
Pricing
from $2.99 / 1,000 results
Bluesky Scraper
Bluesky Scraper is a Python tool designed to extract public posts, user profiles, feeds, engagement metrics, and follower graphs via the AT Protocol API. It exports structured social data into clean CSV or JSON formats for sentiment analysis, social listening, and trend research.
Pricing
from $2.99 / 1,000 results
Rating
0.0
(0)
Developer
ZeroBreak
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Bluesky Scraper: Export Posts, Profiles, Followers and Search Results
Overview
The Bluesky Scraper collects publicly available posts, profiles, followers, following lists, threads, likes, reposts, and search results. No Bluesky account, app password, or login is required.
Each run produces a dataset that you can export as JSON, CSV, or Excel.
Features
- Search public posts and users by keyword.
- Collect posts from specified user profiles.
- Look up profiles by handle, DID, or profile URL.
- Retrieve followers and following lists.
- Collect post threads and replies.
- Identify users who liked or reposted a post.
- Enrich profile records with follower and post counts.
- Extract available email addresses from profile bios.
- Preserve post text, timestamps, engagement counts, hashtags, mentions, links, images, and other metadata.
- Export results as JSON, CSV, or Excel.
- Save errors for individual inputs without stopping the entire run.
- Handle rate limits, retries, and request timeouts.
Use Cases
- Social listening: Monitor public discussions about brands, products, or keywords.
- Lead discovery: Find relevant accounts and inspect public profile information.
- Research datasets: Collect posts and threads, including non-English text and emoji.
- Competitor monitoring: Track public posts from selected accounts.
- Community analysis: Examine followers, following relationships, likes, and reposts.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search_posts | Collection mode: search_posts, search_users, author_posts, profiles, followers, follows, post_thread, post_likes, or post_reposts. |
searchQueries | array | — | Keywords or phrases for post and user searches. |
searchSort | string | latest | Search order: latest or top. |
handles | array | — | Account handles, DIDs, or profile URLs. |
postUrls | array | — | Post URLs or at:// URIs. |
feedFilter | string | posts_no_replies | Filter for author feeds. Reposts may still appear. |
includeReposts | boolean | false | Include reposts in author feeds. |
enrichProfiles | boolean | false | Add follower and post counts to profile rows, using batches of 25 profiles. |
threadDepth | integer | 6 | Number of reply levels to collect. 0 collects only the root post. |
dateFrom | string | — | Collect posts after a specified date where supported for author feeds and latest-sorted searches. |
maxItems | integer | 100 | Overall result limit, capped at 5,000. |
maxItemsPerInput | integer | 100 | Result limit per query, handle, or post. |
maxConcurrency | integer | 5 | Maximum number of concurrent inputs. Cannot exceed 5. |
timeoutSecs | integer | 300 | Maximum run duration in seconds. |
requestTimeoutSecs | integer | 30 | Timeout for an individual request. |
Example Inputs
1. Search Posts
Search public posts for a keyword and collect the latest results.
{"mode": "search_posts","searchQueries": ["web scraping"],"searchSort": "latest","maxItems": 100}
2. Collect Posts from a Profile
Collect posts from a selected account while excluding reposts where possible.
{"mode": "author_posts","handles": ["bsky.app"],"feedFilter": "posts_no_replies","includeReposts": false,"maxItemsPerInput": 50}
Some accounts repost frequently. Keep includeReposts disabled if you primarily want posts written by the account itself.
3. Collect Profiles
Look up profiles using handles, profile URLs, or decentralized identifiers.
{"mode": "profiles","handles": ["bsky.app","OPEN_PROFILE_URL","did:plc:z72i7hdynmk6r22z27h6tvur"]}
4. Search Users
Find accounts matching a keyword and enrich their profile records.
{"mode": "search_users","searchQueries": ["apify"],"enrichProfiles": true,"maxItems": 25}
5. Collect Followers
Retrieve an account's followers and enrich the resulting profile records.
{"mode": "followers","handles": ["apify.com"],"enrichProfiles": true,"maxItemsPerInput": 100}
Use mode: "follows" to collect accounts that a selected user follows. Relationship records include fields such as relation and subjectHandle.
6. Collect a Post Thread
Retrieve a post and its replies up to the specified depth.
{"mode": "post_thread","postUrls": ["SOURCE_POST_URL"],"threadDepth": 2,"maxItems": 100}
Use post_likes or post_reposts to collect users who liked or reposted a specified post. Like records can include likedAt and postUri; repost records identify the relationship using reposter.
Output Data
The dataset includes three table views:
- Posts: Post content, metadata, engagement metrics, and thread information.
- Profiles: Public profile details and available account statistics.
- Errors: Failed inputs and their associated error details.
Profile Fields
| Field | Description |
|---|---|
did | Decentralized identifier of the account. |
handle | Account handle. |
displayName | Public display name. |
description | Profile description or bio. |
profileBio | Profile bio text used in the dataset view. |
followersCount | Number of followers, when available. |
followsCount | Number of accounts followed, when available. |
postsCount | Number of posts, when available. |
createdAt | Account creation timestamp, when available. |
url | Profile URL. |
emailsInBio | Email addresses detected in the public bio. |
verifiedStatus | Available verification status. |
The description and profileBio fields contain the same profile text.
Post Fields
Post records can include:
uri,cid,url, andtextcreatedAtandindexedAtlangsand author detailsreplyCount,repostCount,likeCount,quoteCount, andbookmarkCountisRepostandrepostedByisReplyand reply URIsembedTypeand image information, including URLs and alt text- External link metadata, including URI, title, and description
quotedPostUri, hashtags, mentions, links, and labelsdepthfor thread recordssearchQueryandsourceInputto identify the input associated with a resultscrapedAtto record when the item was collected
The fields available in each record depend on the source data and collection mode.
Error Records
A missing or invalid handle does not necessarily stop the run. The dataset can record an error row containing:
errorMessagehttpStatussourceInput
Other inputs continue processing when possible.
Limits and Performance
- Public data only: Private or inaccessible content is not collected.
- Maximum results: The free collection limit is 5,000 results per run.
- Search coverage: Results depend on what the platform has indexed and made available.
- Large accounts: Accounts with millions of followers can produce large datasets. Set
maxItemsandmaxItemsPerInputcarefully. - Feed ordering: Author feeds are collected newest first. Reposts may appear even with the
posts_no_repliesfilter. - Date filtering:
dateFromis supported for author feeds and latest-sorted searches. It is not applied to top-sorted search results because that ordering is not chronological. - Concurrency: The maximum concurrency is five.
- Rate limiting: Requests are spaced out, and HTTP 429 or 5xx responses trigger backoff. When available, server-provided retry timing is respected.
- Profile enrichment: Follower and post counts are retrieved in batches of 25 profiles.
FAQ
Do I need a Bluesky account?
No. The scraper collects publicly available information without requiring a login or app password.
How is this different from the firehose?
The firehose is a live stream of network events. This scraper retrieves selected searches, accounts, and posts, then stops when the configured limits are reached. It is designed for targeted data collection rather than continuous monitoring of every event.
Can user search results include follower counts?
Yes. Enable enrichProfiles to retrieve follower and post counts for matching profiles. Without enrichment, those counts may not be included in the original search results.
What happens if a handle does not exist?
The scraper can record the returned error, including the message and HTTP status, while continuing with other inputs.
Can I export the results?
Yes. Download the dataset as JSON, CSV, or Excel after the run.
Can I automate collection?
You can schedule recurring runs using your preferred workflow platform and use the exported dataset for analysis or reporting.
Trademark Notice
Bluesky and related names, logos, and trademarks belong to their respective owners. Their use in this documentation is solely to identify the source of the data and does not imply affiliation, sponsorship, endorsement, or partnership.
Disclaimer
This is an independent data collection tool. It is not affiliated with, endorsed by, sponsored by, or officially associated with Bluesky.
Is Web Scraping Legal?
Collecting information that is already public is generally legal. Scraping is not the same thing as hacking, and there is no single law that bans it. The limits are the usual ones: do not break into accounts, do not take private or confidential data, and be careful with personal data and copyrighted works. A site's terms can also restrict how you access it. Facts such as a public name, price, or rating are not the same thing as republishing someone's article or photo.
This actor collects information from public pages. It does not log in and it does not bypass access controls. This is not legal advice. For the longer explanation, see Apify's article Is web scraping legal?.