Bluesky Scraper - Search, Profiles & Posts avatar

Bluesky Scraper - Search, Profiles & Posts

Pricing

from $1.10 / 1,000 record scrapeds

Go to Apify Store
Bluesky Scraper - Search, Profiles & Posts

Bluesky Scraper - Search, Profiles & Posts

Scrape Bluesky data: keyword post search, author feeds, profiles, followers, and follows. Filter by date, language, author, domain, hashtag, and engagement. Export JSON, CSV, Excel.

Pricing

from $1.10 / 1,000 record scrapeds

Rating

0.0

(0)

Developer

ParseBird

ParseBird

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Bluesky Scraper - Search, Profiles & Posts

Bluesky Scraper pulls structured data from Bluesky: keyword post search, author feeds, profiles, followers, and follows β€” with date, language, author, domain, hashtag, and engagement filters, plus optional reply-thread collection.

Search Bluesky posts or pull any account's feed, profile, followers, or follows β€” filter by date, language, author, mention, domain, or hashtag, then optionally collect reply threads and tag records with sentiment and topic labels.

Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

parsebird/bluesky-scraper on Apify. Call: ApifyClient("TOKEN").actor("parsebird/bluesky-scraper").call(run_input={"actionToPerform":"searchPosts","queries":["open source intelligence"],"maxItems":40}), then client.dataset(run["defaultDatasetId"]).list_items().items for results. Key inputs: actionToPerform (string, one of searchPosts|getAuthorFeed|getFollowers|getFollows|getProfile, default "searchPosts"), queries (array of keywords for searchPosts or Bluesky handles for the other actions), startUrls (array of {"url":...} objects β€” Bluesky search/post/profile/followers/follows pages), maxItems (integer cap on primary records), sortOrder (latest|top, searchPosts only), dateFrom/dateTo (YYYY-MM-DD), language/fromAuthor/mentionsAuthor/hashtags/domain/exactUrl (search query filters), minLikes/minReposts/minReplies (local engagement filters), includeReplies/includeReposts (booleans, default true), scrapeComments (boolean, adds reply records), maxComments (integer per source post), sentiment_analysis/content_analysis (booleans, add lexicon-based tags). Output rows have a "kind" field: post, comment, profile, follower, or follow. Full actor spec: GET https://api.apify.com/v2/acts/parsebird~bluesky-scraper (Bearer TOKEN). Get token: https://console.apify.com/account/integrations

What is Bluesky Scraper?

Bluesky Scraper is an Apify Actor for extracting structured data from Bluesky, the decentralized AT Protocol social network. It searches posts, and pulls author feeds, profiles, followers, and follows lists β€” for any public Bluesky account or keyword.

Use it as a Bluesky API alternative, a Bluesky data scraper, or a repeatable pipeline for social listening, brand monitoring, and audience research. Results download as JSON, CSV, Excel, XML, or HTML, or you can fetch them programmatically through the Apify API.

What can Bluesky Scraper do?

  • πŸ”Ž Search posts by keyword, with latest or top sort order
  • πŸ“° Pull any account's author feed, including reposts and replies
  • πŸ‘€ Look up a profile β€” bio, avatar, banner, follower/follow/post counts
  • πŸ‘₯ Collect followers and follows lists for audience mapping
  • 🎯 Filter search by date range, language, author, mentions, domain, hashtag, or exact URL
  • πŸ“Š Apply local engagement filters (minimum likes, reposts, replies) and exclude replies or reposts
  • πŸ’¬ Optionally collect reply threads for any post as separate comment records
  • 🏷️ Optionally tag records with lightweight sentiment and content-category labels
  • πŸ”— Scrape direct Bluesky URLs β€” search, post, profile, followers, and follows pages
  • βš™οΈ Run on demand, schedule recurring runs, or connect results to Apify integrations like Google Sheets, Zapier, Make, and webhooks
  • πŸ“€ Export data in JSON, CSV, Excel, XML, RSS, or HTML from the Apify dataset

What data can you extract from Bluesky?

FieldRecord kindDescription
text, createdAt, facets, embedpost, commentPost content, rich-text facets, and link/image/video embeds
likeCount, repostCount, replyCountpost, commentEngagement counters
reasonpostPresent when a feed record is a repost, with the reposting account
sourcePostUri, commentDepthcommentLinks a reply back to its source post and thread depth
followersCount, followsCount, postsCountprofileAccount-level stats
associated, joinedViaStarterPackprofile, follower, followBluesky account metadata (lists, labeler status, starter pack)
sentiment_score, sentiment_labelpost, commentLexicon-based sentiment tag (when sentiment_analysis is on)
content_category_label, content_category_pathpostKeyword-based topic tag (when content_analysis is on)

Input parameters

ParameterTypeRequiredDefaultDescription
actionToPerformstringNosearchPostsOne of searchPosts, getAuthorFeed, getFollowers, getFollows, getProfile
queriesarray of stringsDepends*β€”Keywords for searchPosts, or Bluesky handles for the other actions
startUrlsarray of URLsDepends*β€”Bluesky search, post, profile, followers, or follows/following page URLs
maxItemsintegerNoβ€”Maximum primary records to collect across all queries
sortOrderstringNolatestlatest or top β€” applies only to searchPosts
dateFrom / dateTostringNoβ€”YYYY-MM-DD UTC posting-date window
languagestringNoβ€”Language code appended as lang:<code> to search queries
fromAuthorstringNoβ€”Handle/DID appended as from:<handle> to search queries
mentionsAuthorstringNoβ€”Handle/DID appended as mentions:<handle> to search queries
hashtagsarray of stringsNoβ€”Hashtags appended to search queries
domainstringNoβ€”Linked domain appended as domain:<domain>
exactUrlstringNoβ€”Exact shared URL appended as url:<url>
minLikes / minReposts / minRepliesintegerNoβ€”Local engagement filters
includeRepliesbooleanNotrueOff skips saved records that are replies
includeRepostsbooleanNotrueOff skips records returned because of a repost
scrapeCommentsbooleanNofalseAlso collects reply/comment records per post
maxCommentsintegerNo50000Max replies collected per source post
sentiment_analysisbooleanNofalseAdds sentiment_score/sentiment_label
content_analysisbooleanNofalseAdds content_category_* fields

*queries or startUrls β€” at least one is required.

Example (keyword search with replies and enrichments):

{
"actionToPerform": "searchPosts",
"queries": ["open source intelligence", "threat intel"],
"maxItems": 40,
"sortOrder": "latest",
"scrapeComments": true,
"maxComments": 25,
"sentiment_analysis": true,
"content_analysis": true
}

Example (language- and date-filtered market research):

{
"actionToPerform": "searchPosts",
"queries": ["science"],
"language": "en",
"dateFrom": "2026-04-01",
"dateTo": "2026-04-24",
"minLikes": 1,
"includeReplies": false,
"includeReposts": false,
"maxItems": 15
}

Example (direct Bluesky URLs):

{
"startUrls": [
{ "url": "https://bsky.app/search?q=open%20source%20intelligence" },
{ "url": "https://bsky.app/profile/404media.co" },
{ "url": "https://bsky.app/profile/bsky.app/post/3kxyzexample" }
],
"maxItems": 25,
"scrapeComments": true,
"maxComments": 10
}

Output example

post:

{
"kind": "post",
"query": "404media.co",
"id": "3mk65zjpcpk25",
"uri": "at://did:plc:pt47oe625rv5cnrkgvntwbiq/app.bsky.feed.post/3mk65zjpcpk25",
"authorHandle": "samleecole.bsky.social",
"authorDid": "did:plc:pt47oe625rv5cnrkgvntwbiq",
"authorName": "Sam Cole",
"text": "super interesting series of experiments here, where researchers cosplayed as a vulnerable user in various scenarios...",
"createdAt": "2026-04-23T13:55:07.278Z",
"languages": ["en"],
"reason": {
"type": "repost",
"by": { "did": "did:plc:vcepp6trx4vpe5ourxso4tjl", "handle": "404media.co", "displayName": "404 Media" }
},
"embed": {
"type": "external",
"uri": "https://www.404media.co/delusion-using-chatgpt-gemini-claude-grok-safety-ai-psychosis-study/",
"title": "Researchers Simulated a Delusional User to Test Chatbot Safety"
},
"replyCount": 3,
"repostCount": 57,
"likeCount": 189,
"url": "https://bsky.app/profile/did:plc:pt47oe625rv5cnrkgvntwbiq/post/3mk65zjpcpk25",
"content_category_label": "Artificial Intelligence",
"content_category_path": ["Technology & Computing", "Artificial Intelligence"],
"sentiment_score": 5,
"sentiment_label": "positive"
}

comment (from scrapeComments):

{
"kind": "comment",
"query": "404media.co",
"id": "3mk66abcxyz2q",
"authorHandle": "reply-user.bsky.social",
"text": "This is a useful write-up. The thread adds a lot of context to the reporting.",
"createdAt": "2026-04-23T14:02:11.000Z",
"replyParentUri": "at://did:plc:pt47oe625rv5cnrkgvntwbiq/app.bsky.feed.post/3mk65zjpcpk25",
"replyCount": 0,
"repostCount": 1,
"likeCount": 7,
"url": "https://bsky.app/profile/did:plc:replyexample123/post/3mk66abcxyz2q",
"sourcePostId": "3mk65zjpcpk25",
"sourcePostAuthorHandle": "samleecole.bsky.social",
"commentDepth": 1,
"sentiment_score": 3,
"sentiment_label": "positive"
}

profile:

{
"kind": "profile",
"query": "404media.co",
"id": "did:plc:vcepp6trx4vpe5ourxso4tjl",
"authorHandle": "404media.co",
"authorName": "404 Media",
"text": "Independent journalism covering technology, media, and online culture.",
"followersCount": 240914,
"followsCount": 128,
"postsCount": 5421,
"createdAt": "2023-04-12T09:22:51.000Z",
"url": "https://bsky.app/profile/404media.co"
}

follower:

{
"kind": "follower",
"query": "404media.co",
"id": "did:plc:followerexample123",
"authorHandle": "analyst.bsky.social",
"authorName": "Industry Analyst",
"text": "Researching online communities, media systems, and platform behavior.",
"createdAt": "2024-01-10T12:00:00.000Z",
"url": "https://bsky.app/profile/analyst.bsky.social"
}

getFollows returns the same shape with "kind": "follow". Download in JSON, HTML, CSV, or Excel from the dataset page, or fetch rows programmatically through the API.

How to scrape Bluesky data

  1. Open Bluesky Scraper on Apify and click Try for free.
  2. Pick an actionToPerform (search posts, author feed, followers, follows, or profile).
  3. Enter queries (keywords or handles) or startUrls (direct Bluesky links), and set maxItems.
  4. Add optional filters β€” date range, language, author, hashtag, or minimum engagement.
  5. Start the run and download results as JSON, CSV, Excel, HTML, XML, or RSS.
  6. Automate it with Apify scheduling, integrations, or the Apify API.

How to use the Bluesky API in Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("parsebird/bluesky-scraper").call(run_input={
"actionToPerform": "searchPosts",
"queries": ["open source intelligence"],
"maxItems": 40,
"sortOrder": "latest",
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items[:2])

How to use the Bluesky API in JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('parsebird/bluesky-scraper').call({
actionToPerform: 'getAuthorFeed',
queries: ['404media.co'],
maxItems: 30,
scrapeComments: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Use cases

  • Social listening β€” Track keyword or hashtag mentions with sentiment and topic tags
  • Brand monitoring β€” Filter search by fromAuthor/mentionsAuthor to watch a brand's own posts and mentions
  • Audience research β€” Pull an account's followers or follows for audience-overlap analysis
  • Thread analysis β€” Collect reply threads under high-engagement posts
  • Content research β€” Filter search results by date, language, or minimum engagement to find top posts

How it works

  1. Resolves each queries entry or startUrls link to an action (search, author feed, followers, follows, profile, or a direct post)
  2. Builds Bluesky's advanced search query syntax (lang:, from:, mentions:, domain:, url:, since:, hashtags) for searchPosts
  3. Calls Bluesky's public AT Protocol AppView endpoints and paginates results with cursors
  4. Applies local filters β€” date window, minimum engagement, reply/repost exclusion β€” since not every filter has a server-side equivalent
  5. Optionally walks each post's reply thread to collect comment records, and applies sentiment/content-category tagging
  6. Pushes normalized rows to the dataset and stops once maxItems or your spending limit is reached

How much does it cost to scrape Bluesky?

Bluesky Scraper uses pay-per-event pricing β€” you pay per row returned (posts, comments, profiles, followers, or follows), not per API call made internally.

EventPrice per eventPrice per 1,000
record-scraped$0.0014 (Free) / $0.0013 (Bronze) / $0.0012 (Silver) / $0.0011 (Gold)$1.40 / $1.30 / $1.20 / $1.10

A 40-result keyword search costs a few cents. Comment collection adds one extra event per reply pulled. Apify's free trial credits cover typical test runs.

Bluesky Scraper extracts data from Bluesky's public AT Protocol AppView endpoints β€” the same read-only API Bluesky's own web and mobile clients use to render public posts, profiles, and follower lists. Scraping publicly accessible data is generally lawful, but you're responsible for how you use the results β€” always review Bluesky's Terms of Service and Apify's guide on the legality of web scraping before running large or automated workloads.

ActorBest for
Congress Stock Trades & Financial DisclosuresU.S. congressional stock trade disclosures
Superinvestor Portfolio ScraperDataroma superinvestor holdings and allocations
DexScreener Crypto ScraperReal-time DEX token prices, liquidity, and volume

FAQ

Do I need a Bluesky account or API key? No. This actor uses Bluesky's public, unauthenticated AT Protocol AppView endpoints β€” the same ones bsky.app's own frontend calls for public data.

Why does includeReplies: false still let me collect comments? includeReplies only filters saved post/feed records that are themselves replies. scrapeComments is a separate switch that walks a post's own reply thread and saves those as comment records β€” the two features are independent.

Does dateTo restrict results server-side? dateFrom is sent to Bluesky as a since: search operator. dateTo is applied locally after fetching, since Bluesky's public search does not reliably support an upper-bound date operator.

Why did my run return fewer posts than expected from searchPosts? Bluesky's public search endpoint applies its own bursty rate limiting independent of this actor. The actor automatically retries with backoff when that happens; a run that hits sustained rate limiting mid-query will log a warning and return what it collected before the limit cleared. Re-running usually succeeds.

Are sentiment and content-category tags AI-generated? No β€” both are lightweight, deterministic lexicon/keyword heuristics computed in the actor, not calls to a trained ML or LLM model. They're useful for rough grouping and triage, not as ground truth.

Can I schedule recurring runs? Yes. Use Apify scheduling to run daily, hourly, or at any interval, then connect the dataset to integrations or webhooks.

How do I report a problem or request a field? Open an issue from the Actor page in Apify Console and include the run ID, input, and action used.