Bluesky Scraper: Scrape Account Posts, Likes & Reposts avatar

Bluesky Scraper: Scrape Account Posts, Likes & Reposts

Pricing

$1.00 / 1,000 scraped posts

Go to Apify Store
Bluesky Scraper: Scrape Account Posts, Likes & Reposts

Bluesky Scraper: Scrape Account Posts, Likes & Reposts

Scrapes Bluesky posts from up to 10 account handles per run, no login: text, likes, reposts, replies, quotes. 1,000 posts cost $1 ($0.001/post). Runs with limited permissions, so AI agents can call and pay for it through Apify's x402 agentic payments (experimental).

Pricing

$1.00 / 1,000 scraped posts

Rating

0.0

(0)

Developer

Broke to Built

Broke to Built

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

7 days ago

Last modified

Categories

Features

Limited permissions

Share

Bluesky Posts Scraper: Scrape Bluesky Account Posts, Likes & Reposts

Scrape any public Bluesky account and get one row per post: text, ISO date, likes, reposts, replies, quotes, a combined engagement total, and a clickable bsky.app link.

No login, no app password, no API key. $0.001 per post — an account that returns nothing is recorded and not charged.

Input

{ "handle": "bsky.app", "maxPosts": 100 }

Bulk, including replies:

{
"handles": ["bsky.app", "@pfrazee.com", "https://bsky.app/profile/jay.bsky.team"],
"maxPosts": 250,
"filter": "posts_with_replies"
}
FieldTypeNotes
handlestringA handle, @handle, a DID, or a bsky.app/profile/... URL.
handlesstring[]Up to 10 accounts per run.
maxPostsinteger1–500 per account. You are charged per post returned.
filterenumposts_no_replies, posts_with_replies, posts_with_media.
includeRepostsbooleanSee below. Default false.

Output

{
"ok": true,
"authorHandle": "bsky.app",
"authorFollowers": 34855310,
"url": "https://bsky.app/profile/bsky.app/post/3mv3zcjaijk22",
"text": "Welcome to the ONLY event about Apple happening today…",
"createdAt": "2026-09-09T17:02:28.502Z",
"likeCount": 1712,
"repostCount": 163,
"replyCount": 360,
"quoteCount": 51,
"engagementTotal": 2286,
"languages": ["en"],
"isReply": false,
"isRepost": false,
"hasMedia": true
}

What it gets right

  • ⭐ Reposts are excluded by default. Bluesky's author feed also returns posts the account reposted, written by other people — even under posts_no_replies. Someone buying "this account's posts" does not mean that, and billing per reposted row is worse than useless. Set includeReposts: true if you want them; every row carries an isRepost flag either way.
  • It pages past the API's 100-per-request ceiling, and asks for a full page each time — because filtering reposts shrinks each page's yield, so requesting only the shortfall converges too slowly and quietly returns fewer posts than you asked for.
  • There is a clickable link. The API returns only an at:// URI; the public bsky.app URL is built from its record key. Without that you have no link to open.
  • engagementTotal equals its own parts — likes + reposts + replies + quotes, so you can sort by reach without a spreadsheet formula.
  • Real error messages. The AT Protocol reports "Profile not found" in the body; you get that instead of HTTP 400.
  • It cannot spin. Paging stops when the cursor stops advancing, and is bounded by a page budget.

Example

A real run on 2026-10-31 with the input this page's form is prefilled with:

{
"handle": "bsky.app",
"handles": []
}

It finished in 3 seconds and returned 25 results. It was charged for 25 post-scraped events ($0.025 on the Free plan). Each result has these fields (values are not shown here because they include people's names or contact details):

FieldType
okboolean
handlestring
authorHandlestring
authorDisplayNamestring
authorFollowersnumber
uristring
urlstring
textstring
createdAtstring
indexedAtstring
likeCountnumber
repostCountnumber
replyCountnumber
quoteCountnumber
engagementTotalnumber
languagesarray
isReplyboolean
isRepostboolean
hasMediaboolean
embedTypestring

Pricing

$0.001 per post returned. No start fee. A missing account, or one with no posts under the chosen filter, produces an ok: false record and is not charged.

Limits

  • Public data only — what a logged-out visitor can see. No followers lists, no DMs, no blocked or private content.
  • Search is not offered. searchPosts returns 403 without authentication, so this reads author feeds. Point it at accounts, not keywords.
  • 10 accounts per run, up to 500 posts each.
  • Engagement counts are a snapshot at read time and keep moving.

FAQ

Do I need a Bluesky account or app password? No.

Can I search Bluesky by keyword? Not here — the public search endpoint requires auth.

Why do I see fewer posts than maxPosts? The account may not have that many under the chosen filter, or many of its recent entries were reposts, which are excluded by default.

Changelog

  • 2026-11-01: Page text only: a clearer page heading and an Example section from a real run. Code, output and price are unchanged.
  • 0.1 (2026-09-10) — first release. One row per post, reposts excluded by default, cursor paging past 100, engagement totals, bulk accounts.

Who uses it

  • Social teams measuring likes, reposts and replies on an account over time
  • Researchers archiving public posts from accounts of interest
  • Brands tracking what a competitor posts and what lands
  • Journalists documenting public statements with dates
  • Developers building bots, feeds or analytics on Bluesky data