Registers
Reading registers and the records flows write into them. Records are never written directly over the API; a completed submission writes them, whether it arrived through WhatsApp or through the create endpoint.
List registers
Every register your organisation has — fed by a flow's record action or uploaded as a CSV; `kind` tells them apart. Oldest-updated first, paginated with an opaque cursor: follow `next_cursor` until `has_more` is false. `record_count` is live; `updated_at` moves when the register itself changes, not on ordinary record activity. Requires the `registers:read` scope.
Get a register
One register, exactly as it appears in the list. 404 for a register this key cannot see — one that does not exist, or another organisation's that you have no records in. Both answer identically: no existence oracle. Requires the `registers:read` scope.
List a register's records
The register's current state, one row per record, oldest-updated first. A merge bumps a record's `updated_at`, so an incremental pull with `updated_since` sees updated records again: delivery is at-least-once, deduplicate by `id` and keep the highest `version`. `?format=csv` (or `Accept: text/csv`) streams every matching record as CSV instead — unpaginated by contract, so `limit`/`after` together with it are a 400. A `csv` register answers with an empty page: its rows are not records yet. 404 for a register this key cannot see. Requires the `registers:read` scope.
Get a record
One record, exactly as it appears in the list — the lookup for a `record_id` found on a submission. 404 for a register this key cannot see, and for a record that does not belong to `register_id`, on the same terms: no existence oracle. Requires the `registers:read` scope.