POST with a JSON body for every delivery attempt.
Request headers
Use the event ID, not the delivery ID, for business idempotency. The same event can produce distinct delivery IDs when more than one endpoint subscribes.
Common envelope
sequence is globally assigned, so values visible to one team contain gaps. Concurrent transactions can also become visible in a different order from their allocated sequence. Do not use sequence gaps to infer lost events. Use it only to avoid applying an older snapshot over a newer one for the same resource.
Document payload
Alldocument.* and approval.* events include data.document:
The payload does not contain
document_data. Fetch the current document with:
Document update payload
document.updated adds data.update:
trigger is user_edit or rollback. updated_by can be null, and its name can also be null.
Approval payload
approval.* events add data.approval:
An
approval.skipped payload can contain approver: null, note: null, and a non-null reason.
Run payload
run.* events contain data.run instead of a document:
document_ids contains every document associated with the API run and can be empty. On run.failed, inspect error; documents produced before the failure still appear in the list.
Correlate runs and documents
Storerun_id from POST /api/v1/agents/{agent_id}/run with your source record. Every document created by that API run carries the same ID in data.document.run_id, and the terminal run event lists its document IDs.
Do not correlate on extracted values such as supplier, invoice number, or purchase-order number. Those values can change during extraction or review and are not guaranteed unique.