Skip to main content
The API reports failure on two surfaces. A request-level error returns a JSON envelope with a stable code and a short message. Event validation returns one result per submitted item, aligned to the order you sent them. Your handler reads the HTTP status first, then branches on code, never on message, because messages change and codes do not.

Request errors

A request-level failure returns the envelope on its own:
Each code maps to one safe action:

Errors inside a batch

A successful HTTP request still carries rejected events, one result per item:
The index locates the item in the array you submitted, and the code decides what happens next:

HTTP status summary

The status alone tells you whether a retry has any chance of a different outcome:

What is safe to retry

Five rules keep a retry from creating duplicate evidence:
  • An unchanged 400, 401, 403, 404, 409, 413, or 422 returns the same answer, so the input changes first.
  • A 503 deserves a retry with exponential backoff and jitter.
  • A retried event reuses its original stable id.
  • Every index-aligned result gets inspected before a partial batch goes back out.
  • The X-Request-ID from the failing response belongs in whatever you report.