Request a tool
All toolsGuidesMCP serverRequest a toolPlatformsCategories
Bluesky Scraper icon

Bluesky Scraper

Scrape Bluesky posts by keyword or handle. Get post text, URLs, likes, reposts, and full profiles as clean JSON. No login or API key needed.

5 from 1 review on Apify 70 runs on Apify $0.002 per post ($2 / 1,000)
Run this in the cloudRun on Apify →

Social Media Scrapers

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust searchQuery, blueskyIdentifier, blueskyAppPassword (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Pricing

$0.002 per post = $2 per 1,000

You are charged forWhenPrice
Post returnedCharged per post returned.$0.002

Pay-per-event pricing: you are billed per result, not per subscription — a run that returns nothing costs nothing beyond the start fee. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-06-12, and they are what you are actually charged.

Inputs

FieldWhat it doesType
searchQueryKeyword(s) to search Bluesky posts for (e.g. "artificial intelligence"). Bluesky stopped serving post search to signed-out clients, so this field needs a Bluesky handle + app password below. Leave empty to scrape specific authors instead (no login needed).string
blueskyIdentifierYour Bluesky handle or email, e.g. yourname.bsky.social. Required ONLY for the Search query mode - Bluesky's API returns 403 for signed-out post search. Author handles, profiles and feeds need no login.string
blueskyAppPasswordAn app password from bsky.app -> Settings -> Privacy and security -> App passwords. Never your account password. Required ONLY for the Search query mode.string
authorHandlesBluesky handles to scrape (e.g. bsky.app, jay.bsky.team). For each handle the actor returns the author's profile plus their recent posts. The leading @ is optional. Leave empty if using a Search query instead.array
maxItemsMaximum number of posts to return per search query or per author handle. Pagination follows the API cursor until this limit is reached.integer
notionConnectorOptional. Write each post as a page into your Notion when the run finishes. Authorize a Notion connector once in Settings → API & Integrations → MCP connectors, then pick it here. Leave empty to skip (default) — results are always saved to the dataset regardless.string
notionParentIdOptional. The Notion data source ID of the database to write into (only used if a Notion connector is set). Leave empty to create the pages privately in your workspace instead.string

What you get

A structured dataset — each result includes fields like:

authorHandlesdetailssearchQueryauthorHandletextlikeCountrepostCountcreatedAtpostUrl

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

5 ready-to-run use cases

Bluesky Brand Monitoring: Track Mentions & Engagement

Social teams can see who's posting about a brand on Bluesky, with each post's author, like count, and repost count for real-time mention tracking.

Scrape Multiple Bluesky Accounts: Posts + Profiles

Feed a list of Bluesky handles and export every account's recent posts and profile into one dataset, ready for a competitor or creator roundup.

Bluesky Dataset by Keyword for Sentiment & NLP

Researchers collect thousands of keyword-matched Bluesky posts as a clean dataset for sentiment analysis, text labeling, and NLP model training.

Scrape Bluesky Posts by Keyword or Hashtag

Search Bluesky for any keyword or hashtag and collect matching posts — text, author handle, likes, reposts and timestamps. Keyless, structured JSON.

Track a Bluesky User's Posts

Collect the latest posts from any Bluesky account by handle — full text, engagement counts and timestamps. No login required, structured JSON output.

Related tools in Social Media Scrapers

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

Mastodon Scraper iconSocial Media Scrapers

Mastodon Scraper

Scrape public Mastodon posts from any instance by hashtag, account, or timeline. Clean text, author, engagement and media as JSON. No login or key.

2 use cases

Lemmy Scraper iconSocial Media Scrapers

Lemmy Scraper

Scrape public Lemmy posts from any instance by feed, community, or keyword. Get title, author, score, comments and more as JSON. No login needed.

2 use cases

Reddit Text Cleaner — TTS-Ready Narration iconSocial Media Scrapers

Reddit Text Cleaner — TTS-Ready Narration

Turn raw Reddit posts into TTS-ready narration. Strips markdown, links and edit stamps, expands AITA/MIL/TIFU, splits into sentences. No AI, instant.

2 use cases

TikTok Comments Scraper iconSocial Media Scrapers

TikTok Comments Scraper

TikTok comments scraper at $0.25 per 1,000 with no run-start fee. Text, likes, reply counts, authors and timestamps including replies. No login or key.

Ready to run — no setup

TikTok Hashtag Scraper iconSocial Media Scrapers

TikTok Hashtag Scraper

Scrape any TikTok hashtag for videos, views, likes, comments, shares and author data. No login or API key. $0.25 per 1,000 videos.

Ready to run — no setup

TikTok Sound Scraper iconSocial Media Scrapers

TikTok Sound Scraper

Scrape every TikTok video using a sound: views, likes, comments, shares, author and music data. $0.25 per 1,000 videos, flat at every volume.

Ready to run — no setup

See all Social Media Scrapers →

Bluesky Scraper

Scrape Bluesky through its public AT Protocol XRPC API. Two modes:

  • Search — pass a searchQuery keyword and get matching public posts. Bluesky has closed post search to signed-out clients (app.bsky.feed.searchPosts answers 403 for every unauthenticated request, from any IP), so this mode needs a Bluesky handle + app password in blueskyIdentifier / blueskyAppPassword.
  • Authors — pass authorHandles (e.g. bsky.app) and get each author's profile (followers, bio, post count) plus their recent posts.

Input

FieldTypeDescription
searchQuerystringKeyword(s) to search posts for. Use this or authorHandles.
authorHandlesarray of stringsHandles to scrape (the leading @ is optional). For each, returns the profile + recent posts. No login needed.
blueskyIdentifierstringOptional. Your Bluesky handle. Required only for searchQuery.
blueskyAppPasswordstringOptional. A Bluesky app password (never your account password). Required only for searchQuery.
maxItemsintegerMax posts per query / per author (default 100). Follows the API cursor until reached.
proxyConfigurationobjectOptional. The Bluesky public API has no anti-bot and needs no proxy, so this is off by default. Only enable it if you hit IP rate limits.

Provide at least one of searchQuery or authorHandles. Each mode is independent: if search is unavailable, the author handles still return rows.

Output

Each post row:

{
  "ok": true,
  "type": "post",
  "uri": "at://did:plc:.../app.bsky.feed.post/3kxyz...",
  "postUrl": "https://bsky.app/profile/bsky.app/post/3kxyz...",
  "authorHandle": "bsky.app",
  "authorName": "Bluesky",
  "authorDid": "did:plc:...",
  "text": "…",
  "createdAt": "2024-01-01T00:00:00.000Z",
  "likeCount": 0,
  "repostCount": 0,
  "replyCount": 0,
  "quoteCount": 0,
  "langs": ["en"]
}

In author mode a profile row (type: "profile") is also emitted per handle, with did, handle, displayName, description, followersCount, followsCount, postsCount, avatar, banner, createdAt, and profileUrl.

Posts are deduplicated by uri. The rkey used in postUrl is the last path segment of the post uri.

Nullable fields. Some fields can be null when the API omits them: on posts, postUrl, authorHandle, authorName, authorDid, and createdAt (counts default to 0, text to "", langs to []); on profiles, handle, displayName, description, avatar, banner, createdAt, and profileUrl (counts default to 0).

Diagnostics

If the run fails or returns nothing, a single ok:false row is pushed with an errorCode (BAD_INPUT, NO_RESULTS, RATE_LIMITED, SERVER_ERROR, NETWORK, …) and a human-readable error message. Diagnostic rows are never charged.

Troubleshooting. If you get a BAD_INPUT row, set searchQuery to a keyword or add at least one handle to authorHandles. A NO_RESULTS row means the API answered but had nothing for that query/author — Bluesky's public index is smaller and sparser than Twitter/X, so broad keywords may return few posts. If you see RATE_LIMITED from many parallel runs, enable the optional proxy or lower the volume.

Billing

$2.00 per 1,000 posts ($0.002 each), with no run-start fee. Flat rate — no volume tiers, no plan gates — and you are charged only for posts actually returned.

Charged per unique post returned (post event). Profile rows and diagnostic rows are not charged.

API

Built on the public host https://api.bsky.app:

  • app.bsky.feed.searchPosts
  • app.bsky.feed.getAuthorFeed
  • app.bsky.actor.getProfile

All are public, cursor-paginated GET/JSON endpoints. We hit api.bsky.app directly rather than the documented public.api.bsky.app alias: the alias is fronted by BunnyCDN, which intermittently returns 403 for searchPosts in some regions, whereas api.bsky.app is the same public AppView served directly and is more reliable.