
Bluesky Scraper
hipersoft/bluesky-scraper
Scrape Bluesky posts, profiles and social graph: a user's posts (text, likes, reposts, replies), profile stats, followers and following. Search users by keyword.
Total users
1Monthly users
1Total runs
111Per item scraped
$0.0013Last rebuilt
Oct 28, 2026Overview
Scrape Bluesky posts, profiles, followers and following as structured data. Feed it handles, DIDs or profile URLs — or discover users by keyword — pick a data type, and export engagement counts, post text, media, link cards and profile stats to clean JSON, CSV, Excel or XML. No account and no API key — fast and reliable.

What does Bluesky Scraper do?
Bluesky Scraper is a crawler that extracts public data from the Bluesky social network. Give it one or more accounts (or a keyword to discover accounts) and choose whether to collect posts, profile info, followers or following. It returns tidy records with full engagement metrics, media, link previews and timeline context, ready to export or pull through the API.
What data can you scrape from Bluesky?
| Data point | Description |
|---|---|
| Post text & URI | Post body, at:// URI and public link |
| Author | Handle, display name and DID |
| Timestamp & language | When posted and detected languages |
| Engagement | Likes, reposts, replies, quotes, bookmarks |
| Timeline context | Reply and repost flags |
| Media | Post images and embed type |
| Link cards | External URL, title and description |
What you get

Each post is one clean JSON record:
{
"type": "post",
"uri": "at://did:plc:abc123/app.bsky.feed.post/3kxyz",
"handle": "nytimes.com",
"displayName": "The New York Times",
"authorDid": "did:plc:abc123",
"text": "Breaking: ...",
"createdAt": "2026-07-20T14:03:00.000Z",
"langs": ["en"],
"likeCount": 812,
"repostCount": 145,
"replyCount": 63,
"quoteCount": 21,
"bookmarkCount": 9,
"isReply": false,
"isRepost": false,
"embedType": "app.bsky.embed.images#view",
"images": ["https://cdn.bsky.app/img/feed_fullsize/plain/..."],
"externalUrl": null,
"externalTitle": null,
"externalDescription": null,
"url": "https://bsky.app/profile/nytimes.com/post/3kxyz"
}
Output schema
| Field | Type | Description |
|---|---|---|
type |
string | Record type, e.g. post, profile, follower. |
uri |
string | The at:// URI identifying the post. |
handle |
string | Author's Bluesky handle. |
displayName |
string | Author's display name. |
authorDid |
string | Author's decentralized identifier (DID). |
text |
string | Full text of the post. |
createdAt |
string (ISO date) | Timestamp when the post was created. |
langs |
array | Detected language codes for the post. |
likeCount |
integer | Number of likes. |
repostCount |
integer | Number of reposts. |
replyCount |
integer | Number of replies. |
quoteCount |
integer | Number of quote posts. |
bookmarkCount |
integer | Number of bookmarks. |
isReply |
boolean | True if the post is a reply. |
isRepost |
boolean | True if the record is a repost. |
embedType |
string | Type of embedded media on the post. |
images |
array | URLs of images attached to the post. |
externalUrl |
string | URL from an embedded link card, if any. |
externalTitle |
string | Title from an embedded link card. |
externalDescription |
string | Description from an embedded link card. |
url |
string (URL) | Direct link to the post on bsky.app. |
Use cases
- Track engagement on a brand or competitor's Bluesky posts over time.
- Build follower/following graphs for network and influencer analysis.
- Discover accounts in a topic niche via keyword search, then pull their feeds.
- Monitor news outlets and public figures for social listening dashboards.
- Assemble datasets for research on discourse, sentiment and trends.
- Enrich CRM and outreach lists with public profile signals.
How to scrape Bluesky data
- Add Bluesky Scraper to your Apify account and open the input.
- Enter one or more
actors(handles, DIDs or profile URLs), or addsearchTermsto discover accounts by keyword. - Choose the
dataType: posts, profile, followers or following. - Set
maxItemsPerActor(andmaxSearchActors) to control volume, then click Run. - Export the results as JSON, CSV, Excel or XML, or pull them through the Apify API.
Input
{
"actors": ["jay.bsky.team", "https://bsky.app/profile/nytimes.com"],
"searchTerms": ["climate news"],
"dataType": "posts",
"maxItemsPerActor": 100,
"maxSearchActors": 25
}
| Field | Description |
|---|---|
actors |
Handles, DIDs, or profile URLs to scrape. |
searchTerms |
Keywords; matching users are found and scraped too. |
dataType |
posts, profile, followers, or following. |
maxItemsPerActor |
Max posts/followers/following per user (up to 20000). |
maxSearchActors |
How many users to take from each search term. |
Need more social data?
FAQ
How many posts or followers can I scrape?
Up to 20,000 items per account — set maxItemsPerActor to control volume.
Do I need a Bluesky account or API key? No. There's no setup and no login — just add accounts or keywords and run.
Can I discover accounts I don't know yet?
Yes. Add searchTerms and the scraper finds matching accounts and scrapes them alongside your list.
What export formats are supported? JSON, CSV, Excel and XML, plus programmatic access via the Apify API.
How fresh is the data? Every run reads live public data, so results reflect the current state of each account.
Can Bluesky Scraper connect to my other tools? The Bluesky Scraper can be connected with almost any cloud service or web app thanks to integrations on the Apify platform. It works with Make, Zapier, Slack, Airbyte, GitHub, Google Drive and many more, plus the Apify API, JavaScript/Python clients and MCP. Or use webhooks to trigger an action whenever a run finishes.
Is scraping Bluesky legal? The scraper reads only public, unauthenticated data. You are responsible for complying with Bluesky's terms and applicable laws.
Notes
Original clean-room implementation. Returns only public data; you are responsible for compliance with Bluesky's terms. Not affiliated with Bluesky.
Input
| Field | Type | Description |
|---|---|---|
actorsHandles / profile URLs | array | Bluesky handles (e.g. bsky.app), DIDs, or profile URLs. The selected data type is scraped for each. |
searchTermsSearch users by keyword | array | Optional. Find users matching these keywords (via actor search) and include them alongside the handles above. |
dataTypeData type | string · posts, profile, followers, following | What to scrape for each user. Default: "posts" |
maxItemsPerActorMax items per user | integer | Maximum posts / followers / following to collect per user (ignored for profile info). Default: 100 |
maxSearchActorsMax users per search term | integer | How many users to take from each search term. Default: 25 |
API
curl -X POST "https://api.apify.com/v2/acts/hipersoft~bluesky-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"actors": [
"bsky.app"
],
"searchTerms": [
"climate news"
]
}'from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("hipersoft/bluesky-scraper").call(run_input={
"actors": [
"bsky.app"
],
"searchTerms": [
"climate news"
]
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('hipersoft/bluesky-scraper').call({
"actors": [
"bsky.app"
],
"searchTerms": [
"climate news"
]
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);Pricing
| Event | Price | Paid plans from |
|---|---|---|
| Item scraped One Bluesky post, profile or follower record | $0.0013 | $0.0006 |
| Search request One Bluesky search/API request | $0.001 | $0.001 |
You pay only for what the run returns. Set a maximum cost per run and it stops cleanly at that limit.
Related scrapers
Dribbble Shots Scraper
Scrape public design shots from Dribbble: title, high-res image, tags, likes, views and designer credit. Filter by category or sort, export JSON, CSV or Excel.
359 runs · 5 users · $0.003 / shot scrapedComputrabajo Scraper
Scrape Computrabajo job listings across Latin America (Mexico, Colombia, Argentina, Chile, Peru and more): title, company, location, salary, posted date and apply URL. Filter by country and keyword. No setup.
206 runs · 4 users · $0.002 / listing scrapedKraken Market Data Scraper
Fetch Kraken spot market data in bulk: ticker stats (ask, bid, last, 24h high/low/volume/vwap), OHLC candles for any interval, order book depth (top bids/asks), and tradable pair metadata. Fast, clean and cheap.
165 runs · 4 users · $0.001 / pair scrapedBayt Scraper
Scrape Bayt.com job listings across the Middle East (UAE, Saudi Arabia, Egypt, Qatar and more): title, company, location, posted date and apply URL. Filter by country and keyword.
134 runs · 4 users · $0.003 / job scrapedGitHub Scraper
Search GitHub and scrape repositories (stars, forks, language, topics, license, dates) or user profiles (name, company, location, bio, followers, public email, repos). Uses the GitHub REST API; optional token for higher rate limits. For developer lead generation, OSS research and recruiting.
131 runs · 7 users · $0.0008 / item scrapedHacker News Scraper
Scrape Hacker News stories, comments, Ask HN, Show HN, jobs and polls by keyword, points, comments and date range. Sort by relevance or newest. Title, URL, author, points, comment count, text and HN link. Fast clean HTTP via the HN Algolia API, no setup.
130 runs · 2 users · $0.004 / item scrapedSend the site and the fields. We build it and you get it first.