Bluesky Posts Scraper: Accounts, Threads, Feeds & Alerts avatar

Bluesky Posts Scraper: Accounts, Threads, Feeds & Alerts

Pricing

$0.50 / 1,000 posts

Go to Apify Store
Bluesky Posts Scraper: Accounts, Threads, Feeds & Alerts

Bluesky Posts Scraper: Accounts, Threads, Feeds & Alerts

Public Bluesky posts without a login: the latest posts of any accounts, whole reply threads, and third-party custom feeds. Text, likes, reposts, replies, quotes, links, images, hashtags and mentions. Schedule it with "Only new posts" for alerts. USD 0.50 per 1,000 posts.

Pricing

$0.50 / 1,000 posts

Rating

0.0

(0)

Developer

JT Palms

JT Palms

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 hours ago

Last modified

Share

Get public Bluesky posts as clean JSON, CSV or Excel, without a login and without a Bluesky account. Give it accounts to get their latest posts, post links to get the whole reply thread with each reply's depth, or custom feed links to get a topic feed's top posts. Every post comes with its text, author, like, repost, reply and quote counts, links, link card, images with alt text, video, hashtags and mentions. Turn on Only new posts and schedule it to get an alert whenever something new appears.

It reads Bluesky's public AppView API, the same logged-out API that serves public Bluesky pages. No login, no credentials, no browser.

USD 0.50 per 1,000 posts. Sources that fail are reported free, and monitor runs with nothing new cost nothing.

What people use it for

  • Brand, competitor and news monitoring. Watch the accounts of competitors, journalists, agencies or your own brand. Turn on Only new posts, schedule it every hour, and connect the task to Slack, email, Google Sheets or a webhook so each new post lands there.
  • Topic alerts from custom feeds. Bluesky has thousands of third-party topic feeds (science, tech, climate, a sport, a language). Add a feed, narrow it with Must contain (any of) such as CRISPR or startup*, and get only the new matching posts.
  • Reply and feedback analysis. Give the link of a launch announcement, a support post or a viral post and get every reply as a row with its depth, likes and parent, ready for sentiment analysis, FAQ mining or a report.
  • Research datasets. An account's posts for a date range with engagement counts, languages, hashtags and shared links, for trend or media analysis.
  • AI agents and LLM pipelines. Plain text plus image alt text and link card titles make posts easy to summarise, classify or load into RAG. Agents can call it through the Apify API or MCP server.
  • Link tracking. See which articles and domains a set of accounts shares, with the link card title and description.

Sample output

Real rows, trimmed. A post from an account, with an image and its alt text:

{
"uri": "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/3mmwmla3xph26",
"url": "https://bsky.app/profile/bsky.app/post/3mmwmla3xph26",
"text": "v1.122 is rolling out today, featuring a better way to discover and share articles, blog posts and newsletters across the Atmosphere via new, dynamic Standard.site link cards.",
"createdAt": "2026-05-28T18:09:50.000Z",
"langs": ["en"],
"authorHandle": "bsky.app",
"authorDisplayName": "Bluesky",
"likeCount": 3154,
"repostCount": 535,
"replyCount": 524,
"quoteCount": 298,
"isReply": false,
"isRepost": false,
"links": [],
"linkCard": null,
"images": [
{
"url": "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:z72i7hdynmk6r22z27h6tvur/bafkreicnrpnkalwhwp2td7sxgpbxbt6ii3tjth2n5hdcdok5mxfro6np3u",
"alt": "The Bluesky and Standard.site logos sharing an emoji handshake above examples of the new, dynamic link cards."
}
],
"video": null,
"hashtags": [],
"sourceType": "account",
"source": "bsky.app"
}

A post with a link card:

{
"url": "https://bsky.app/profile/theverge.com/post/3mwelcstrxs2u",
"text": "Read the review from the only reviewer brave enough to see this:",
"createdAt": "2026-09-25T20:11:15.460Z",
"authorHandle": "theverge.com",
"authorDisplayName": "The Verge",
"likeCount": 73,
"repostCount": 5,
"replyCount": 2,
"quoteCount": 4,
"links": ["https://www.theverge.com/entertainment/996499/ai-odyssey-movie-review"],
"linkCard": {
"url": "https://www.theverge.com/entertainment/996499/ai-odyssey-movie-review",
"title": "The 2.5-hour AI-generated Odyssey movie is 2.5 hours too long",
"description": "Going up against Christopher Nolan with AI slop was ill-advised."
},
"sourceType": "account",
"source": "theverge.com"
}

A reply from a thread, with its depth and mentions:

{
"url": "https://bsky.app/profile/bsky.app/post/3mv3zcjbomc22",
"text": "Thank you to our Apple experts: @adapples.bsky.social, @kwiaht.org, @orchardnotes.com, @willrea.bsky.social, and @chuckwendig.bsky.social ...",
"createdAt": "2026-09-09T17:02:28.503Z",
"langs": ["en"],
"authorHandle": "bsky.app",
"likeCount": 228,
"replyCount": 5,
"isReply": true,
"replyToUri": "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/3mv3zcjaijk22",
"mentions": ["adapples.bsky.social", "kwiaht.org", "orchardnotes.com", "willrea.bsky.social", "chuckwendig.bsky.social"],
"threadDepth": 1,
"sourceType": "thread",
"source": "https://bsky.app/profile/bsky.app/post/3mv3zcjaijk22"
}

Every post row has the same fields, so CSV and Excel exports line up:

FieldWhat it is
uri, urlThe post's AT Protocol URI (what Only new posts remembers) and its bsky.app link.
textThe post text as written.
createdAt, indexedAtWhen the author posted it and when Bluesky indexed it, ISO 8601 in UTC.
langsLanguage codes the author's app tagged, such as en or pt-BR. Can be empty.
authorHandle, authorDisplayName, authorDidWho posted it: handle, display name and permanent account ID.
likeCount, repostCount, replyCount, quoteCountEngagement at the time of the run.
isReply, replyToUri, threadRootUriWhether it is a reply, the post it answers, and the first post of its thread.
isRepost, repostedBy, repostedAtFor accounts with Include reposts: the account that reposted it and when.
quotedPostUri, quotedPostUrlThe post it quotes, if any.
linksEvery link in the text and the link card, in full.
linkCardurl, title and description of the link preview.
imagesEach image's url and alt text.
videoplaylistUrl, thumbnailUrl and alt of an attached video.
hashtags, mentionsHashtags without #, and mentioned handles without @ (or the account ID when the text does not show a handle).
labelsModeration labels on the post, such as nudity or graphic-media.
threadDepthFor threads: 0 is the post you gave, 1 a direct reply, and so on.
sourceType, sourceaccount, thread or feed, and which input produced the row.

Sources that fail and inputs that cannot be used get a free row with source, error and scrapedAt. Each run also writes a SUMMARY record with counts per source to the default key-value store.

How to use it

Accounts

  1. Add accounts under Accounts, one per line: a handle (nytimes.com, @jay.bsky.social, or just jay for jay.bsky.social), a DID, or a profile link like https://bsky.app/profile/bsky.app.
  2. Choose Which account posts: posts without replies (default), posts and replies, posts and the author's own threads, only posts with images or video, or only video.
  3. Optional: Include reposts to also get the posts they reposted.
  4. Set Max posts per account, thread or feed (default 100, newest first) and click Start. Export as JSON, CSV or Excel, or read the dataset through the Apify API.

Threads

Add post links under Posts (whole threads), like https://bsky.app/profile/bsky.app/post/3mv3zcjaijk22. You get the post and the replies under it, in the order Bluesky shows them, each with threadDepth. Thread depth 1 gives only direct replies. When the maximum is lower than the thread, the post and top-level replies come first. Replies that the thread's author hid, deleted replies and blocked replies are left out.

Custom feeds

Add feed links under Custom feeds, like https://bsky.app/profile/did:plc:jfhpnnst6flqway4eaeqzj2a/feed/for-science. You get the feed's top posts in the feed's own order, up to the maximum. Find feeds in the Bluesky app under Feeds; topic and keyword feeds made with tools like SkyFeed work well for monitoring.

Any line is routed by its shape, so a post link pasted under Accounts still works as a thread.

Filters

These apply to every source: Posted after and Posted before (a date like 2026-09-01 or a relative value like 7 days), Languages (en also matches en-US), Must contain (any of) and Minimum likes. Keywords match whole words, not case-sensitive, in the text, link card, links, hashtags and image alt text; end a word with * for any ending, or write /pattern/ for a regular expression. You pay only for posts that pass the filters.

Set it up as an alert

  1. Turn on Only new posts.
  2. Choose what the first run does: All current posts returns what is there now (up to the maximum); None, just set the starting point returns nothing and only records what exists, so you hear only about posts made after today.
  3. Save it as a task and add a schedule, for example every hour.
  4. In the task's Integrations tab, connect Slack, email, Google Sheets, Zapier, Make or a webhook.

Examples:

  • Competitor watch: three competitor accounts, posts without replies, Only new posts, hourly.
  • Topic alert: a science feed with Must contain CRISPR, Only new posts, every 30 minutes.
  • New replies to your announcement: its post link, Thread depth 1, Only new posts, hourly.

If two schedules watch the same account, thread or feed with different filters, give each a Monitor name (under Monitoring) so they keep separate memories.

Pricing

WhatPrice
Post in the results (from an account, thread or feed)USD 0.0005 (USD 0.50 per 1,000)
A source that fails, an input that cannot be used, a skipped postFree
Monitor run where nothing is newFree

Examples: 10 accounts that post 20 times a day each, monitored hourly, is about 200 posts a day, USD 0.10 a day or about USD 3 a month. A thread with 500 replies costs USD 0.25. 10,000 posts for a research dataset cost USD 5.

Set a maximum cost per run in the run options. The actor stops cleanly when it gets there, and with Only new posts anything it did not save is kept for the next run.

Limits

  • The actor identifies itself. Every request carries the user agent Mozilla/5.0 (compatible; bluesky-posts/1.0; +https://apify.com/JTPalms/bluesky-posts), with plain request headers. It never pretends to be a browser. Some sites block bots; a blocked request is reported as an error, not hidden.
  • No keyword search of all of Bluesky. Bluesky's post search (app.bsky.feed.searchPosts, also used for hashtag search) needs a login: the public API answers HTTP 403 Forbidden to logged-out requests (checked 2026-09-28). This actor never logs in, so keyword search is not offered. To follow a topic, use a custom feed for it plus Must contain (any of).
  • Bluesky's own feeds (Discover, Popular With Friends and others) also need a login. Links to them get a free note instead. Third-party custom feeds work.
  • People who opted out are skipped. Bluesky lets people ask apps not to show their account to logged-out viewers. Their posts are never returned: not from their account, not as replies in a thread, not in feeds, not as reposts, and posts that quote them do not link to them. Giving such an account returns a free note.
  • No follower or following lists, no profiles or bios, no likes lists, no user lists (list links are refused), no private data. Each post carries only the author's handle, display name and account ID.
  • Up to 5,000 posts per account, thread or feed in each run. For accounts, reading stops once posts are older than Posted after.
  • Custom feeds: the feed's server decides what is in it and how far back it goes. With Only new posts, a feed monitor looks at the top posts up to the maximum each run, so set the maximum above what the feed gets between runs.
  • Only new posts remembers up to 5,000 post IDs per account, thread or feed in your bluesky-posts-monitor key-value store. An account monitor re-reads 48 hours before the newest post it has seen, to catch posts Bluesky indexed late.
  • Counts are those at the time of the run. A post deleted since an earlier run is simply not returned again.
  • The actor does not log in, like, repost, follow or post.

FAQ

Do I need a Bluesky account or an app password? No. The actor uses only the public, logged-out API and never asks for credentials.

Is this allowed? It reads Bluesky's public AppView API, which Bluesky provides for logged-out access to public posts, and it honours the logged-out opt-out that people set. The content belongs to its authors: quote and link back. If you keep the data, respect deletions and the privacy laws that apply to you (for example GDPR), because posts contain handles and names.

Why can I not search all of Bluesky by keyword? Bluesky requires a login for search. See Limits for the custom feed approach that works without one.

Why did I get fewer posts than the maximum? Filters, reposts (off by default), and posts from people who opted out of logged-out viewing reduce the count. The run log and the SUMMARY record show how many were skipped and why.

Why did the first alert run return posts? With All current posts the first run returns what is there now. Choose None, just set the starting point to hear only about new posts.

Can I start over? Delete the matching record in the bluesky-posts-monitor key-value store (Storage, Key-value stores), or use a new Monitor name.

I get HTTP 429. Bluesky rate-limits by IP address, and cloud IPs are shared. Try again later, lower Sources in parallel, or turn on a proxy under Advanced.

Something missing or wrong? Open an issue with your input.