Bluesky Comments Scraper – Export Replies & Threads · Apify
Bluesky Comments Scraper – Export Replies & Threads avatar

Bluesky Comments Scraper – Export Replies & Threads

Pricing

from $0.72 / 1,000 comment extracteds

Go to Apify Store
Bluesky Comments Scraper – Export Replies & Threads

Bluesky Comments Scraper – Export Replies & Threads

Export public Bluesky replies, nested conversation context, author details, timestamps, and engagement metrics from post URLs or AT URIs.

Pricing

from $0.72 / 1,000 comment extracteds

Rating

0.0

(0)

Developer

Fetch Cat

Fetch Cat

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

18 days ago

Last modified

Features

Limited permissions

Share

Export public replies from Bluesky post threads as structured JSON, CSV, Excel, or API-ready records. Monitor customer feedback, community response, campaign engagement, and public conversations without a Bluesky login.

Provide one or more public post URLs or AT URIs. The Actor follows the conversation tree, saves nested replies, preserves source-post context, and returns clean records ready for analysis.

Quick start

Paste a public post URL and start with a small limit:

{
"postUrls": ["https://bsky.app/profile/petebuttigieg.bsky.social/post/3lhtdtw23m22m"],
"maxCommentsPerPost": 20,
"maxDepth": 100
}

The Actor exports text replies, not the source post itself. Available replies depend on the public thread at collection time. Media-only replies are not saved.

Prefer a video guide? This short Apify walkthrough shows you how to set up and run an Actor. It uses a different Actor, but the setup steps are the same.

Ready-to-run examples

Choose a public example to see its settings before starting a run:

What you get

Each comment includes:

  • Stable post identifiers (id, uri, and cid)
  • Canonical comment and source-post URLs
  • Author handle, DID, display name, and avatar
  • Comment text and language tags
  • Creation and indexing timestamps
  • Reply, repost, like, and quote counts
  • Parent and root reply references
  • Conversation depth and source-post author

Illustrative output shape (synthetic values, not a collected record). Optional author, language, and timestamp fields can be absent.

{
"kind": "comment",
"id": "3mk66abcxyz2q",
"uri": "at://did:plc:example/app.bsky.feed.post/3mk66abcxyz2q",
"cid": "bafyreiexample",
"url": "https://bsky.app/profile/reply-user.bsky.social/post/3mk66abcxyz2q",
"authorHandle": "reply-user.bsky.social",
"authorDid": "did:plc:example",
"authorName": "Reply User",
"authorAvatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:example/example@jpeg",
"text": "This is a useful write-up.",
"createdAt": "2026-04-23T14:02:11.000Z",
"indexedAt": "2026-04-23T14:02:12.000Z",
"languages": ["en"],
"replyCount": 1,
"repostCount": 0,
"likeCount": 7,
"quoteCount": 0,
"replyParentUri": "at://did:plc:2q2hs5o42jhbd23pp6lkiauh/app.bsky.feed.post/3lhtdtw23m22m",
"replyRootUri": "at://did:plc:2q2hs5o42jhbd23pp6lkiauh/app.bsky.feed.post/3lhtdtw23m22m",
"commentDepth": 1,
"sourcePostUri": "at://did:plc:2q2hs5o42jhbd23pp6lkiauh/app.bsky.feed.post/3lhtdtw23m22m",
"sourcePostUrl": "https://bsky.app/profile/source-user.bsky.social/post/3lhtdtw23m22m",
"sourcePostAuthorHandle": "source-user.bsky.social"
}

Who is it for?

  • Social media teams tracking public reactions to posts and announcements
  • Marketing analysts comparing engagement across campaigns
  • Community managers finding recurring questions and feedback themes
  • Researchers studying public conversation structures and reply networks
  • Developers and data teams feeding Bluesky comments into dashboards, warehouses, or AI pipelines

How you can use the data

  • Review questions about an announcement. Supply the public post URL and collect a small reply sample. Keep text, createdAt, url and sourcePostUri together, then have your team or a separate analysis tool group recurring questions.
  • Compare feedback across source posts. Group exported rows by sourcePostUri in your own spreadsheet. Keep the per-post limit with the comparison so a capped sample is not mistaken for every reply or total engagement.
  • Study conversation structure. Use replyParentUri, replyRootUri and commentDepth to relate returned replies to their parents. This is a sample of available text replies, not a complete conversation archive. Media-only or unavailable branches can be omitted.
  • Refresh your own dashboard. Run the Actor through your separate automation, then deduplicate repeated exports by uri or id before sending rows to a spreadsheet, CRM or warehouse. Theme, sentiment and time-order analysis happen downstream.

Input settings

Export several posts

{
"postUrls": [
"https://bsky.app/profile/petebuttigieg.bsky.social/post/3lhtdtw23m22m",
"https://bsky.app/profile/bsky.app/post/3l6oveex3ii2l"
],
"maxCommentsPerPost": 100,
"maxDepth": 20,
"maxRunSeconds": 120
}

More input settings

Setting / API fieldTypeDescription
Post URLs or AT URIs (postUrls)string arrayRequired: one or more public Bluesky post identifiers.
Maximum comments per post (maxCommentsPerPost)integerAt most 1–1,000 replies per source post. Form default 20.
Maximum reply depth (maxDepth)integerRequested nested depth, 1–1,000. Default 100.
Run budget (maxRunSeconds)integer35–300 seconds. Default 300.

Use low limits while validating a new workflow. Set maxCommentsPerPost explicitly in API calls: the form default is 20, while the runtime uses 100 when the key is absent. The run budget includes a 30-second reserve for saving progress. Collection uses public access without a Bluesky login or a configurable proxy option.

Output data

GroupFields
Record identitykind, id, uri, cid, url
AuthorauthorHandle, authorDid, authorName, authorAvatar
Contenttext, languages, createdAt, indexedAt
EngagementreplyCount, repostCount, likeCount, quoteCount
Thread contextreplyParentUri, replyRootUri, commentDepth
Source contextsourcePostUri, sourcePostUrl, sourcePostAuthorHandle

Records can be downloaded from the Dataset tab as JSON, CSV, Excel, XML, or RSS, or consumed through the API.

Download your results

Open your run's dataset, choose Export and select JSON, CSV or Excel. JSON keeps nested fields together. CSV and Excel are useful when you want to review the records in a spreadsheet.

See Apify's download and export guide for the available formats and field options.

Pricing

The start event is a one-time run-start charge. The comment event is charged for each public reply saved. There are no separate status or error dataset rows, and a reply-free post does not incur comment events.

Set maxCommentsPerPost to control the maximum output and cost per source post. Subscription tiers receive volume rates. See the live Pricing tab for current prices before starting a large run.

Tips for best results

  • Start with 20 comments per post. Verify the selected post and available fields before collecting a larger thread sample.
  • Copy canonical public Bluesky post URLs. Use AT URIs when another Bluesky integration already supplies them.
  • Deduplicate by uri or id. Keep repeated observations separate from counts of unique replies in your downstream analysis.
  • Use your own automation for repeat snapshots. The Actor does not continuously monitor posts.
  • Set limits for the threads you need. Check per-post and depth caps before interpreting the returned sample.

Limits and caveats

  • Only publicly available Bluesky threads can be exported.
  • Deleted, blocked, moderated, or otherwise unavailable replies cannot be returned.
  • Deeply nested threads are limited by maxDepth, maxCommentsPerPost, and source availability. Only replies with nonempty text and a creation timestamp are saved. Unavailable or media-only branches can be omitted.
  • Replies follow the returned conversation-tree order. There is no newest-first, most-liked, date, keyword, or language filter. Apply sorting and analysis downstream.
  • A public post with no usable replies completes successfully with an empty dataset. When available, RUN_SUMMARY in key-value storage describes saved records and source outcomes.
  • Invalid identifiers fail validation before collection. Individual source failures are recorded in RUN_SUMMARY. Useful records from other posts are retained. If every source fails, the run fails.
  • A time-limited run can return partial records and, when storage is available, save PENDING_WORK for unfinished inputs. Thread traversal is not a guarantee of exhaustive conversation coverage.
  • Counts reflect the values available when each reply is collected and may change later.

Automation and integrations

Save your settings for next time

Once you have an input that works for you, save it as an Apify task. This keeps your settings together so you can use them again without filling in the form from scratch.

Run on a schedule

Need fresh results regularly? You can schedule the Actor or a saved task to run at a time that suits you.

Each scheduled run collects the data again. If you want to compare results or highlight changes, add that step in your own workflow.

Send results to your other tools

Use n8n, Make or Zapier to connect this scraper to the rest of your workflow. For example, you could pass its results to an AI assistant or add records to a spreadsheet. Follow the Apify integration guides for your chosen tool.

For a custom connection, an Apify webhook can notify your app when a run finishes or fails. Your app can then fetch the results or handle the failure.

API usage

Want to collect this data from your own app or automation? The examples below send input to the scraper and show how to collect its results.

The Node.js and Python examples wait for the run to finish before reading its results. The cURL example starts the run and returns its details. Wait for that run to finish, then use its defaultDatasetId to fetch the results.

For setup instructions, see Apify's JavaScript client guide, Python client guide and Actor runs API reference.

cURL

curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~all-in-one-bluesky-scraper/runs' \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H 'Content-Type: application/json' \
--data @- <<'JSON'
{
"postUrls": [
"https://bsky.app/profile/petebuttigieg.bsky.social/post/3lhtdtw23m22m"
],
"maxCommentsPerPost": 20,
"maxDepth": 100
}
JSON

Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/all-in-one-bluesky-scraper').call({
"postUrls": [
"https://bsky.app/profile/petebuttigieg.bsky.social/post/3lhtdtw23m22m"
],
"maxCommentsPerPost": 20,
"maxDepth": 100
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('fetch_cat/all-in-one-bluesky-scraper').call(run_input={'postUrls': ['https://bsky.app/profile/petebuttigieg.bsky.social/post/3lhtdtw23m22m'], 'maxCommentsPerPost': 20, 'maxDepth': 100})
print(client.dataset(run['defaultDatasetId']).list_items().items)

MCP and AI agents notes

For agents, provide postUrls explicitly and start with maxCommentsPerPost: 20. Read returned dataset records after the run. This Actor does not generate summaries or sentiment labels itself. MCP discovery and client availability depend on the platform and your client configuration.

MCP and AI agents

You can ask your AI assistant to collect data with Bluesky Comments Scraper – Export Replies & Threads and help you work with the results. The scraper returns the data, and your assistant can then summarize it, compare records or prepare notes.

Connect your assistant through the Apify MCP server. MCP gives your assistant a way to find this scraper, run it and read the results. Follow the official setup and sign-in guide for your app.

Easier setup with an Apify plugin

If you use a supported coding assistant, the official Apify plugin can set up the connection for you. It connects your assistant to Apify and includes instructions for common tasks. Follow the guide for your particular app.

Use Apify AI in Console

Prefer to keep everything in Apify? Open Apify AI in Console and ask it to find Fetch Cat's Bluesky Comments Scraper – Export Replies & Threads. You can describe the data you want and ask questions about the results.

Apify AI is currently in beta. It asks for confirmation before starting an Actor, and normal run charges apply.

Choose your assistant

Connect just this scraper

To keep your setup focused on this scraper, add this server configuration to a compatible MCP client:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=fetch_cat/all-in-one-bluesky-scraper"
}
}
}

Sign in to Apify when your client asks. If your client uses a Bearer token instead, follow its setup guide and keep the token in its secure configuration. Configuration formats vary by app, so use the linked guide if your client needs a different format.

Use Apify's general server

Already connected to the general Apify MCP server at https://mcp.apify.com? You can use it to find this scraper without adding another server. Ask your assistant to use Bluesky Comments Scraper – Export Replies & Threads by Fetch Cat, or give it the identifier fetch_cat/all-in-one-bluesky-scraper.

Your assistant can check the available settings and retrieve the results from the returned run. If the run is still working, it should follow that run rather than start it again. Both connection options use Apify's hosted service.

Example requests

  • “Use Fetch Cat’s All-in-One Bluesky Scraper to collect up to 20 text replies to this public announcement post. Show questions with their reply links and dates so our team can review them.”
  • “Collect up to 10 replies per post from these two public Bluesky links. Group the returned text by source post and identify recurring feedback themes in a separate analysis, without claiming the samples include every reply.”
  • “Collect at most 10 replies from this public Bluesky thread. Keep parent references and reply depth in a table, then flag which records already appear in the export I provide by comparing reply identifiers.”

Normal Apify charges apply. Check the live Pricing tab before asking your assistant to run a larger batch.

Pay with x402

If your AI agent has a funded wallet, it can pay for Apify usage through x402. This experimental option lets an agent use Apify without a conventional account.

Apify AGI provides a prepaid API token with a spending cap after payment. Your agent can use that token to run this scraper through the Apify API or an authenticated MCP connection.

Some MCP setups also support paying for each request directly. That is a different payment option, so check the official guide for its availability.

Follow the official guide for wallet setup, supported payment options and current terms. Apify handles the payments. Keep wallet keys and payment tokens in your agent's secure configuration.

Other ways for agents to pay

Apify also supports MPP for prepaid access through AGI and Skyfire for eligible Actors. If your agent already uses one of these, see the agentic payment guide to choose the right setup.

FAQ

Does it require a Bluesky account?

No. It exports public thread data without a Bluesky login.

Can I process multiple posts?

Yes. Add multiple values to postUrls. Limits apply to each source post.

Are nested replies included?

Yes, up to maxDepth and maxCommentsPerPost.

Can I use an AT URI instead of a web URL?

Yes. Both public bsky.app post URLs and valid post AT URIs are accepted.

How do I export CSV or Excel?

Open the run Dataset tab and choose the preferred download format, or request a format from the dataset API.

How do I control spend?

Use a low maxCommentsPerPost value first and review the live Pricing tab before scaling.

More Bluesky scrapers

  • Tweet Scraper — Collect public X post text, author details and available engagement from known profile or post URLs.
  • Instagram Comments Scraper — Collect visible public Instagram comment text, author names and displayed counts from known post or Reel URLs.
  • LinkedIn Post Comments Scraper — Collect public LinkedIn post comments and exposed replies as linked flat rows with available author and engagement fields.

Support and feedback

For custom additions or integrations, email hello@fetchcat.dev.

Found an error or have a feature request? Open an issue with the run URL, a non-sensitive input example and what you expected.

Need help sharing it? See Apify’s guide to sharing a run when reporting an issue. Sharing a run can give the developer access to its input, logs and results, so use a run that contains no sensitive data. Please leave out API tokens, passwords, cookies, private documents and personal data. Use a public sample URL or a redacted example instead.

Tried this scraper? We'd love to hear how it worked for you. Leave a review to help others choose the right tool and help us improve it. Your feedback means a lot to us.

Made with care for curious people, AI agents and the possibilities in data. ♥