Bluesky Scraper (profile posts)
Extract Bluesky profile posts as clean JSON via the network open AppView - post text, timestamps, engagement counts, images, links.
Extract Bluesky profile posts as clean JSON via the network open AppView - post text, timestamps, engagement counts, images, links. Multiple handles per run, no login, no bot-wall fights. Hourly monitoring, pay per result. Built for social listening and AI pipelines.
$3.00 / 1,000 · 100.0% success over 26 public runs in the last 30 days.
Run it on Apify → Free to try - runs bill per result on your own account.
What you give it
Every field is optional unless marked; sensible defaults do the rest.
| Field | Type | What it does | Default |
|---|---|---|---|
authorHandles |
string | One or more Bluesky handles whose posts to scrape, comma-separated, e.g. "bsky.app" or "nasa.gov, bbc.com". The @ is optional. | bsky.app |
includeReplies |
boolean | Also include the profiles' replies, not only their own posts. | False |
postedAfter |
string | Only include posts created on or after this date. Feeds are newest-first, so the run stops walking a profile once it reaches older posts. Format: YYYY-MM-DD (for example 2026-09-08) or a full ISO timestamp such as 2026-09-08T14:30:00Z. Slash dates like 08/09/2026 are refused on purpose: they are read as September in Europe and August in the United States, and this actor will not guess which you meant. |
- |
postedBefore |
string | Only include posts created on or before this date. Format: YYYY-MM-DD (for example 2026-09-08) or a full ISO timestamp such as 2026-09-08T14:30:00Z. Slash dates like 08/09/2026 are refused on purpose: they are read as September in Europe and August in the United States, and this actor will not guess which you meant. |
- |
maxItems |
integer | Stop after this many posts. Free-plan runs are capped at 5 items. The form starts at 25 for a cheap first run - that is the form's prefill, not a cap on your plan; clear it to use the default of 500. | 500 |
reportFailures |
boolean | When a run fails, send the developer the actor name and build, an error category, the error message (truncated) and a one-way hash of your input - so a bug can be fixed without anyone asking you to reproduce it. Your input itself, your results and your identity are never sent, and successful runs send nothing at all. Switch this off and the actor behaves exactly the same. | True |
What you get back
One JSON object per result, with exactly these fields - no seller identities, no contact data, ever.
A real result row from a recent run:
{
"authorDisplayName": "Bluesky",
"authorHandle": "bsky.app",
"createdAt": "2026-10-14T21:06:12.577Z",
"imageUrls": [],
"indexedAt": "2026-10-14T21:06:12.858Z",
"isReply": false,
"langs": [
"en"
],
"likeCount": 2263,
"linkTitle": null,
"linkUrl": null,
"postUri": "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/3mxuhaky3rc23",
"quoteCount": 26,
"replyCount": 49,
"repostCount": 278,
"text": "Happy 100th birthday, Winnie-the-Pooh! \n\nDid you know that Winnie was based on a real Canadian-British bear—and that his full name was WINNI...",
"url": "https://bsky.app/profile/bsky.app/post/3mxuhaky3rc23"
}
| Field | Type | Meaning |
|---|---|---|
postUri |
string | The post's AT-protocol URI - its stable identifier. |
url |
string | Direct link to the post on bsky.app. |
text |
string | Post text as published. |
authorHandle |
string | The author's public handle - the byline of the post. |
authorDisplayName |
['string', 'null'] | The author's public display name. |
createdAt |
['string', 'null'] | When the post was created (ISO timestamp). |
indexedAt |
['string', 'null'] | When the network indexed the post (ISO timestamp). |
langs |
array | Languages the author declared for the post. |
isReply |
boolean | True when the post is a reply. |
likeCount |
integer | Likes at scrape time. |
repostCount |
integer | Reposts at scrape time. |
replyCount |
integer | Replies at scrape time. |
quoteCount |
integer | Quote posts at scrape time. |
imageUrls |
array | Full-size image URLs attached to the post (up to 4). |
linkUrl |
['string', 'null'] | External link attached to the post, when present. |
linkTitle |
['string', 'null'] | Title of the attached external link. |
Health
100.0% success over 26 public runs in the last 30 days. Live record, failures included: status page.
Full documentation, examples and the AI-assistant prompt live on the store page.