Skip to content

Read and export

Deleted records never come back on any read path: the change feed, export parts and point reads are all produced from live data.

GET /v1/changes?cursor=head&limit=100&wait=30

Events: chunks.published, deletion.accepted, epoch.rolled, erasure.completed. The answer carries next_cursor. The cursor is opaque; limit is at most 1,000, wait at most 30 seconds, and events are kept for 30 days. An expired cursor answers 410 cursor_expired; start an export and continue from its as_of_cursor.

POST /v1/exports
{"partitions": ["orders"], "from_day": "2026-09-01", "to_day": "2026-09-30"}
  • The answer is 201 (ready) or 202 (waiting for approval).
  • Parts stream as NDJSON from GET /v1/exports/{id}/parts/{n}, checked by the Reindeer-Records and Reindeer-SHA256 trailers.
  • One export part spans eight chunks; exports expire after seven days.

These exports wait for a second person: full exports that name no partition and no day, exports above 5,000,000 records for one principal or 10,000,000 across principals within 24 hours, and exports of more than half the live corpus.

GET /v1/records/{record}?day=2026-09-20&partition=tr

Returns the newest live version of the record. Point reads enter the access log, with the record id written as its pseudonym.

GET /v1/partitions lists the published partitions with their day ranges, record and chunk counts and sizes.