The request
data is a full transcript document.
Respond with any 2xx within 10 seconds. Ack fast and process async — a
slow response counts as a failed attempt.
Verifying the signature
Reject any delivery whose signature you can’t verify — without this check, anyone who discovers your endpoint URL can feed you fabricated transcripts.v1 is hmac_sha256(secret, "<t>.<raw body>") in hex, computed over the
raw request body bytes (don’t re-serialize the JSON):
Delivery semantics
- At-least-once. Rarely, a delivery may arrive twice (for example your
2xx was sent but not observed). Dedupe on
data.id— the capture id is the stable key;delivery_ididentifies the delivery attempt chain. - Retries. A failed attempt (non-2xx, timeout, connection error) retries after 1m, then 5m, 15m, 1h, 6h, 24h before giving up — about 31 hours of tolerance for an outage on your side.
- Recovery. Anything that exhausts retries is still in the pull stream — resume your cursor loop to catch up; nothing is ever lost.
- Snapshot payloads. The document is rendered at send time. Later fixes
(for example a speaker rename) don’t re-push; re-fetch
GET /api/v1/captures/:idfor current state. - Ordering is not guaranteed across in-flight deliveries; use
started_at/ended_atfor display ordering, as with the pull API.