Source

Query Bluesky with SQL

Source-native Bluesky posts from the public firehose, archived and continuously observed — queryable with read-only SQL by author, time, and text.

Surface

  • Records413.7M+ posts
  • Canonicalbluesky.posts
  • FreshnessLive
  • Extentcreated_at_source 2022-01-01 to 2026-08-27
  • Cadencelive: new posts land within a minute from the public Jetstream tail
  • MethodPublic AT Protocol firehose (app.bsky.feed.post records); archived capture plus live tail.
  • StatsLast stats snapshot: 2026-08-27T12:11:07Z

Query surfaces

  • bluesky.posts
  • embeddings.bluesky_posts

Public AT Protocol firehose (app.bsky.feed.post records); archived capture plus live tail.

Best for

token search over the whole public Bluesky record, newest first
an account’s full public posting history by author_did
reply trees via reply_parent_uri / reply_root_uri

Fields

  • at_uri
  • source
  • external_type
  • kind
  • uri
  • cid
  • rev
  • author_did
  • author_handle
  • author_display_name
  • created_at_source
  • indexed_at
  • reply_parent_uri
  • reply_root_uri
  • payload
  • blake3_hash
  • word_count
  • record
  • metadata
  • entity_id
  • is_deleted
  • created_at
  • updated_at

Read live from the schema registry for bluesky.posts — 23 columns. Every relation's full contract is served by /v1/scry/schema.

Indexed predicates

  • PruneshasToken(lower(payload), '<lowercase-token>')
  • PruneshasAllTokens(lower(payload), ['<t1>','<t2>'])

Queries

Newest posts mentioning a token

The lowercase token index over payload prunes; is_deleted keeps withdrawn posts out.

SELECT at_uri, author_did, created_at_source, payload
FROM bluesky.posts
WHERE hasToken(lower(payload), 'clickhouse')
  AND is_deleted = 0
ORDER BY created_at_source DESC
LIMIT 20;

Gaps

  • Hole2026-06-14 to 2026-06-15: firehose capture outage: the archive landed almost nothing on these days
  • Hole2026-06-20 to 2026-06-20: firehose capture outage: the archive landed almost nothing this day
  • Hole2026-06-23 to 2026-07-25: coverage seam: the archived firehose capture ends 2026-06-23 and the Jetstream tail begins at its 2026-07-25 activation; historical backfill for the interval is declared out of scope
  • Noteauthor_handle resolves on only a minority of rows and none after 2026-02 — key on author_did
  • Noteno date index: the table orders by at_uri, so scope with a token or author_did before a time window
  • Notedeclared holes (a June 2026 capture outage and the seam between the archived capture and the live tail) are published on the schema entry as known_holes