Poll incident changes with cursor paging and conditional transport
Changed onPublic 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
Request
- Base URLhttps://api.voidly.ai
- URLhttps://api.voidly.ai/data/incidents/delta
- Authnone required
Query parameters
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.
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.
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.
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
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.
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.
Changes
- info
added the new optional
headerrequest parameterAccept-Encoding - info
added the new optional
headerrequest parameterIf-None-Match - info
added the new optional
queryrequest parametercursor - info
added the new optional
queryrequest parameterlimit - info
added the new optional
queryrequest parameterorder - info
the
queryrequest parametersincebecame optional - info
added the media type
application/jsonfor 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
- info
endpoint added
- info