Incidents

Poll incident changes with cursor paging and conditional transport

Changed on

Public sampled timestamp poll over the reachable SQLite incident corpus. Provide since or a prior next_cursor. since is inclusive; change-time ties can replay, so upsert by hashId. Walk pages in ascending order with next_cursor until has_more is false. next_since is a polling watermark only on a terminal ascending page with corpus_truncated=false; it is null for nonterminal pages, descending order, and truncated corpora. The upstream fetch is capped at 40 pages of 500 incidents (20,000 rows), read six at a time; corpus_truncated=true marks an incomplete reachable corpus. A truncated corpus is not resumable to completeness through this feed or the similarly capped export. This poll has no delete tombstones or mutation journal and can miss late backdated changes; periodically reconcile against a verified full corpus from the data owner. Responses can be revalidated with If-None-Match. The Worker returns the 200 body as identity JSON; Cloudflare's edge compresses it once per client (gzip or br) when the request's Accept-Encoding allows, so a client that sends no Accept-Encoding receives plain JSON. The examples below are synthetic, derived from the B2003 source test fixture, and are not served readbacks.

Synthetic request sequence (the ETag is calculated from the first synthetic response payload):

GET /data/incidents/delta?since=2026-01-01T00%3A00%3A00Z&limit=2
GET /data/incidents/delta?cursor=MjAyNi0xMC0wMVQwMDowMDowMFp8Yg&limit=2
GET /data/incidents/delta?since=2026-01-01T00%3A00%3A00Z&limit=2
If-None-Match: W/"delta-35f6a8a4ec997f6bab79200855e3cb05e23d75832d4de7dd4d69151f9cc2c1dd"
Accept-Encoding: gzip
get/data/incidents/delta

Request

  • Base URL
    https://api.voidly.ai
  • URL
    https://api.voidly.ai/data/incidents/delta
  • Auth
    none required

Query parameters

sincestring date-time

ISO 8601 change-time lower bound, inclusive. Required when cursor is absent. Omit it on cursor pages: if supplied, the handler still applies both the since lower bound and the cursor test. On a new poll, use the prior terminal next_since and upsert replayed boundary rows.

cursorstring

Opaque page token from next_cursor. Pass it back verbatim with the same order and limit; do not use it as a polling timestamp. Omit since on cursor pages.

limitinteger

Page size; default 100, clamped by the handler to 1–1000. For a large backfill, prefer 1000 because uncached pages consume a per-IP cold-build allowance.

order'asc' | 'desc'

asc is the default and is required to obtain next_since on a terminal complete page. desc is a browse order and never produces next_since.

Headers

If-None-Matchstring

A prior weak ETag. Matching validators return bodyless 304 after a successful cached response or cold build; a failed cold build does not return 304.

Accept-Encodingstring

Optional. Compression is negotiated by Cloudflare's edge, not by this route: the Worker always returns identity JSON and the edge may gzip or brotli-encode it for a client that accepts it. Without an accepted encoding the body is plain JSON. A 304 has neither a body nor Content-Encoding.

Response

Reachable SQLite corpus sampled successfully. A 200 may still have corpus_truncated=true; inspect the body before treating the poll as complete.

sincestring date-time nullable required
cursorstring nullable required
limitinteger required
order'change_time_asc' | 'change_time_desc' required
countinteger required
has_moreboolean required
next_cursorstring nullable required
next_sincestring date-time nullable required

Polling timestamp only on a terminal ascending page when the upstream corpus was not truncated; null otherwise. Resume with inclusive since and upsert by hashId.

remaining_after_this_pageinteger required
corpus_truncatedboolean required

True when the 40-page, 20,000-row upstream fetch cap leaves corpus rows unreachable.

corpus_upstream_totalinteger nullable required
corpus_reachableinteger required
sync_notestring required
generated_at_utcstring date-time required

Changes

    • info

      added the new optional header request parameter Accept-Encoding

    • info

      added the new optional header request parameter If-None-Match

    • info

      added the new optional query request parameter cursor

    • info

      added the new optional query request parameter limit

    • info

      added the new optional query request parameter order

    • info

      the query request parameter since became optional

    • info

      added the media type application/json for the response with the status

    • info

      added the non-success response with the status

    • info

      added the non-success response with the status

    • info

      added the non-success response with the status

    • info

      added the non-success response with the status

    • info

      endpoint added