Bluesky Posts Scraper — Feed, Search & Engagement
Pricing
from $0.80 / 1,000 results
Bluesky Posts Scraper — Feed, Search & Engagement
Scrape Bluesky posts by account or full-text search via the official AT Protocol public API: text, engagement counts, links, images. No login, no app password.
Pricing
from $0.80 / 1,000 results
Rating
0.0
(0)
Developer
Axery
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Bluesky Posts Scraper (Account Feed + Search)
Scrapes Bluesky posts via the official AT Protocol public API — no login, no app password, no API key. The AT Protocol is built around public, portable data, so these read endpoints need no authentication by design.
Two modes
- Account feed — every post by one account, newest first, optionally including its replies
- Full-text search — posts matching a query across the whole network, sortable by latest or top, filterable by language
What makes this different
Outbound links are actually recovered. Bluesky does not put links inline in post text — it stores them as byte-range annotations (rich-text facets) alongside it. A scraper that only reads record.text silently loses every URL in every post. This Actor walks the facets and returns them in a links field.
Both identifiers, not just one. AT Protocol identifies a post by an at:// URI, which is stable and precise but not openable in a browser. This Actor keeps that URI and derives a clickable bsky.app URL from it, so rows are both machine-stable and human-usable.
Host routing that isn't obvious. public.api.bsky.app serves account feeds and profiles fine, but returns HTTP 403 for searchPosts — while api.bsky.app serves search with 200. Picking either host alone would silently lose half the functionality, so the client routes per-method.
Two timestamps, kept separate. created_at is when the author says they posted; indexed_at is when the network saw it. These differ on federated or backfilled posts, so collapsing them into one would quietly misrepresent post timing.
Input
| Field | Type | Notes |
|---|---|---|
mode | enum | author or search. |
targets | array | Handles/DIDs in author mode, queries in search mode. |
includeReplies | boolean | Author mode only. |
sort, lang | enum / string | Search mode only. |
maxItems | integer | Per target. 0 = everything reachable. |
incremental | boolean | Only posts not seen in previous runs. |
proxyConfiguration | object | Not normally needed. |
Local development
pip install -r requirements.txtpython test_local.py --mode author bsky.app --max 20 --out sample_output.jsonpython test_local.py --mode search "python" --max 20 --lang en
sample_output.json is real output from a live account-feed run.