Bluesky Posts Scraper — Feed, Search & Engagement avatar

Bluesky Posts Scraper — Feed, Search & Engagement

Pricing

from $0.80 / 1,000 results

Go to Apify Store
Bluesky Posts Scraper — Feed, Search & Engagement

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

Axery

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

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

FieldTypeNotes
modeenumauthor or search.
targetsarrayHandles/DIDs in author mode, queries in search mode.
includeRepliesbooleanAuthor mode only.
sort, langenum / stringSearch mode only.
maxItemsintegerPer target. 0 = everything reachable.
incrementalbooleanOnly posts not seen in previous runs.
proxyConfigurationobjectNot normally needed.

Local development

pip install -r requirements.txt
python test_local.py --mode author bsky.app --max 20 --out sample_output.json
python test_local.py --mode search "python" --max 20 --lang en

sample_output.json is real output from a live account-feed run.