Skip to main content
Fluent sends an HTTPS 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

All document.* 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

Store run_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.

Dispatch events safely

Treat the event name as an open string rather than a closed enum. This keeps your receiver compatible when Fluent adds an event type.