Bluesky Scraper - Posts, Profiles, Search & Feeds avatar

Bluesky Scraper - Posts, Profiles, Search & Feeds

Pricing

from $5.00 / 1,000 results

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

Bluesky Scraper - Posts, Profiles, Search & Feeds

Bluesky scraper for posts, profiles, keyword search and author feeds via the public AT Protocol API: text, author, likes, reposts, replies, hashtags, links and profile metrics. No login required. Export CSV, JSON, Excel or API.

Pricing

from $5.00 / 1,000 results

Rating

0.0

(0)

Developer

Andres Garcia-Baquero Leon

Andres Garcia-Baquero Leon

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

9 days ago

Last modified

Share

Bluesky Scraper - Posts, Profiles & Search

Turn public Bluesky activity into clean, structured datasets you can actually use. Pull posts, author feeds, profile search results and profile metrics as ready-to-analyse JSON, CSV or Excel - for social listening, market and academic research, and AI/RAG training data.

No Bluesky account, no API key, no proxy setup. Paste a keyword or a handle, hit Start, and get rows.

Why not just scrape bluesky.app HTML?

Scraping Bluesky HTMLThis Actor
Data sourceRendered web pagesOfficial public AT Protocol API (api.bsky.app)
LoginOften needed, risk of account issuesNot needed - fully public endpoints
ProxiesUsually requiredNot required
StabilityBreaks on every UI redesignFollows a documented, versioned API
OutputMessy HTML you must parseFlat, typed JSON records
Engagement metricsHard to extract reliablyLikes, reposts, replies, quotes included
Setup timeHours of selector workRuns with empty input {}

What can it extract?

ModeWhat you get
search_postsPosts matching a keyword or phrase, sorted by latest or top
author_feedThe latest posts from a single account by handle or DID
search_profilesBluesky profiles matching a keyword, for creator and audience discovery
profileOne profile by handle or DID, with follower and post counts

Example output

Post record

{
"type": "post",
"uri": "at://...",
"url": "https://bsky.app/profile/user.bsky.social/post/abc",
"text": "Post text",
"createdAt": "2026-01-01T00:00:00.000Z",
"authorHandle": "user.bsky.social",
"authorDisplayName": "User",
"replyCount": 1,
"repostCount": 2,
"likeCount": 3,
"quoteCount": 0
}
FieldExample value
typepost
urlhttps://bsky.app/profile/user.bsky.social/post/abc
textPost text
createdAt2026-01-01T00:00:00.000Z
authorHandleuser.bsky.social
likeCount3

Profile record

{
"type": "profile",
"did": "did:plc:...",
"handle": "bsky.app",
"displayName": "Bluesky",
"followersCount": 1000000,
"postsCount": 1234,
"url": "https://bsky.app/profile/bsky.app"
}
FieldExample value
typeprofile
handlebsky.app
displayNameBluesky
followersCount1000000
postsCount1234

Output fields

Post

FieldTypeDescription
typestringAlways post for post records
uristringAT Protocol URI of the post
urlstringPublic bsky.app link to the post
textstringFull text of the post
createdAtstringISO 8601 timestamp of when the post was created
authorHandlestringHandle of the account that posted
authorDisplayNamestringDisplay name of the author
replyCountintegerNumber of replies
repostCountintegerNumber of reposts
likeCountintegerNumber of likes
quoteCountintegerNumber of quote posts

Profile

FieldTypeDescription
typestringAlways profile for profile records
didstringDecentralised identifier of the account
handlestringBluesky handle
displayNamestringDisplay name of the account
followersCountintegerNumber of followers
postsCountintegerNumber of posts published
urlstringPublic bsky.app link to the profile

How to use it

  1. Click Try for free / Start on the Actor page. It runs with empty input {} and returns 50 posts, so you can see real data before configuring anything.
  2. Choose a mode: search_posts, author_feed, search_profiles or profile.
  3. Fill in query (for searches) or handle (for a single account), pick sort and maxResults.
  4. Run it, then export the dataset to CSV, JSON, Excel, XML, or pull it straight from the Apify API or a webhook into your own system.

Input

{
"mode": "search_posts",
"query": "apify",
"sort": "latest",
"maxResults": 50
}
FieldTypeDefaultDescription
modestringsearch_postssearch_posts, author_feed, search_profiles, profile
querystring-Search query for post/profile search
handlestring-Bluesky handle or DID
sortstringlatestlatest or top for post search
maxResultsinteger50Number of items to return, 1-1000

Input examples

Example 1 - track a keyword across Bluesky

{
"mode": "search_posts",
"query": "apify",
"sort": "latest",
"maxResults": 50
}

Example 2 - pull one account's latest posts

{
"mode": "author_feed",
"handle": "bsky.app",
"maxResults": 50
}

Example 3 - discover profiles by topic

{
"mode": "search_profiles",
"query": "open source",
"maxResults": 20
}

Example 4 - fetch a single profile

{
"mode": "profile",
"handle": "bsky.app"
}

Use cases

  • Social listening - watch mentions of your brand, product or campaign hashtag in near real time.
  • Brand and market research - measure how a topic is discussed, and with what engagement.
  • AI and RAG datasets - build clean, text-plus-metadata corpora from public Bluesky posts.
  • Academic research - collect reproducible public social data without account credentials.
  • Trend analysis - sort by top to see what actually resonates on a keyword.
  • Competitor monitoring - track a rival's author feed, posting cadence and engagement.
  • Creator discovery - find profiles by topic and rank them by follower and post counts.

Integrations

Connect this Actor to the rest of your stack:

  • Zapier, Make and n8n for no-code automations
  • Slack alerts when new matching posts appear
  • Google Sheets for live dashboards and manual review
  • Airbyte for warehouse loading
  • LangChain and other LLM frameworks for RAG pipelines
  • REST API and webhooks for custom backends

You can also schedule runs (hourly, daily, weekly) directly in Apify, so your dataset keeps refreshing without you touching it.

Pricing

Pay Per Event - you only pay for data that is actually returned:

  • $0.005 per post returned
  • $0.010 per profile returned
  • $0.00005 per Actor start

No monthly minimum for the Actor itself, no charge for empty results.

FAQ

Do I need a Bluesky account or API key? No. The Actor uses public AT Protocol endpoints on api.bsky.app, which require no login and no key.

Is this legal? It reads only public data from Bluesky's public API, with no login and no authentication bypass. As always, you are responsible for how you use the data - check Bluesky's terms and applicable privacy law (for example GDPR) for your use case.

How fresh is the data? It is fetched live from the AT Protocol API at run time, so results reflect the state of Bluesky at the moment the run executes. Schedule the Actor to keep a dataset continuously up to date.

Can I get a specific user's posts? Yes. Use mode: "author_feed" with their handle (or DID) to get their latest posts, up to maxResults.

Are there rate limits? The public AT Protocol API applies its own rate limits. Keep maxResults within the supported 1-1000 range and space out very large scheduled runs if you are pulling heavy volumes.

Will it break like HTML scrapers do? It targets a documented, versioned API rather than page markup, so UI redesigns on bsky.app do not affect it.

How much does a typical run cost? A default run returning 50 posts costs 50 x $0.005 plus the $0.00005 start event. You are never charged for posts or profiles that are not returned.

What formats can I export? CSV, JSON, Excel and XML from the Apify console, or straight through the Apify API and webhooks.

Troubleshooting

ProblemFix
Empty dataset on a searchThe query may have no public matches. Try a broader query, or switch sort from top to latest.
Fewer items than maxResultsBluesky simply had fewer matching public items. You are only billed for what is returned.
Error on author_feed or profileCheck the handle is exact (for example bsky.app, not @bsky.app) or use the account DID.
query seems ignoredquery only applies to search_posts and search_profiles. author_feed and profile use handle.
Run is slow on large maxResultsLarge pulls page through the API. Split into several smaller runs or schedule them.
Not sure the Actor worksRun it with empty input {} - it succeeds with no configuration and returns 50 posts.