POST. Events are thin: they carry ids, a status and your reference, and you fetch the full record (a run’s output, a review task) with the API when you need it.
Event types
Run and review events cover the runs your documents start, including reruns and retries, which name the run they came from in
sourceRunId. Runs a workflow starts on its own (the child runs of a Split, Loop or Classify step, and a reusable section it calls), runs restarted from a single step, dry runs and node test runs send no events, and neither do the review tasks inside them. run.failed carries only the failure category, never the error text: get the run for the message.
Envelope
Every event has the same envelope; onlydata differs by type.
Delivery
Each delivery is aPOST with a JSON body and these headers:
Answer with any
2xx status within 10 seconds to acknowledge the event. Any other status, a timeout or a connection error counts as a failure and is retried. Redirects are not followed, so a 3xx is a failure too. Acknowledge first and do slow work afterward, so a long job does not time out and trigger a retry.
At least once, in no particular order
- Delivery is at least once. A retry, a replay or a lost acknowledgment can deliver the same event twice. Store the
idof each event you process and skip one you have already seen. - Order is not guaranteed, within a type or across types:
run.completedcan arrive before thedocument.receivedfor the same document. Order bycreatedOnwhen it matters, and treat a fetch as the source of truth: when an event arrives, get the run or the review task for its current state.
Retries
A failed delivery is retried with exponential backoff: the first retry comes 30 seconds after the failure, each wait is three times the previous one, no wait is longer than 6 hours, and retries stop 72 hours after the first attempt. Every attempt is signed again with a fresh timestamp. The first time a delivery runs out of retries since the subscription’s last successful delivery, your organization’s admins get an in-app notification and an email. A successful delivery resets this, so a long outage sends one notification, not one per event.Responding with 410 Gone
Answer410 Gone to stop receiving events: Ingestly stops retrying and disables the subscription at once. Re-enable it when your endpoint is ready again.
Automatic disabling
A subscription that keeps failing is disabled automatically after 20 consecutive failed attempts with no successful delivery in the last 72 hours. A subscription created or re-enabled within the last 72 hours is not disabled. Your organization’s admins get an in-app notification and an email when it happens, and the subscription shows the reason in Settings → Event Subscriptions.Replay and re-enable
Events and their delivery history are kept for 7 days. Within that window you can, from the subscription:- Replay a single delivery, or every delivery since a point in time. A replay since a time sends again the deliveries that failed or were skipped (a delivery is skipped when its subscription is disabled before its next attempt) and the events the subscription never received (for example while it was disabled), oldest first, with their original
id. Only an active subscription can be replayed. - Re-enable a disabled subscription. Re-enabling resets its failure count and offers to replay from its earliest failed or skipped delivery, or from when it was disabled if that is earlier.
Test events
Send test event on a subscription delivers aping event right away, signed like any other, and shows your endpoint’s response. A ping has a fresh id every time and its data holds only the eventSubscriptionId:
ping is sent once and never retried, never counts toward automatic disabling, and is never listed in GET /events.
Reading events with the API
GET /events returns the last 7 days of events in the shape a subscription delivers them, oldest first by id. It needs the events:read scope and lists only the events of your key’s environment. Use it to catch up after an outage, or instead of a subscription when your system cannot receive requests.
Event ids reflect when an event was created, not when it became visible, so an event can appear after you have read one with a higher id. To poll without missing events:
- Pass
afterset to anidyou saw a few minutes before your newest one, not the newestiditself. - Read from
page=1and follow the pages until the last one. - Skip events whose
idyou have already processed.