Errors
What each response code means, and what your sender should do about it.
| Code | Meaning | What to do |
|---|---|---|
202 | Accepted and durably stored | Consider it delivered |
400 | Malformed body, bad timestamp, or too large | Do not retry |
401 | Bad or missing signature | Do not retry — fix the signing |
429 | Rate limited | Back off; we send Retry-After |
5xx | Our fault | Retry with backoff |
Why 202 and not 200
We respond as soon as the event is durably stored, before processing
it. So 202 means "we have it and will not lose it" — not "the
load is in our system".
That is intentional. It keeps your delivery fast, and it decouples your retry behaviour from our processing. If a bug on our side fails to process an event, that is ours to replay, and you should never be redelivering because of it.
What we reject at the door
Before we parse anything, we reject with 400:
- a body over 16 KB
- a
Content-Typethat is notapplication/json - an
occurredAtwith no zone designator - a timestamp outside the five-minute signature window
A misconfigured sender should fail loudly and immediately rather than somewhere deeper in, where the cause is harder to see.
Unrecognised events are accepted, not rejected
An eventType we do not know, or an apiVersion higher than we
support, gets 202. We store it, log it, and ignore it.
A 400 there would teach your sender to give up on events we may well
want — so it is safe for you to ship a new event type before we support
it.
What a 401 costs, and why we still ask you not to retry
We should be straight about this, because the rule has a cost and it mostly lands on us.
A 401 caused by our misconfiguration — a secret mishandled during
rotation, say — becomes a permanently lost event under the no-retry
rule. We accept that, because retrying a genuinely bad signature
forever is the worse failure.
What we owe you in exchange:
- we alert on any
401spike and treat it as an incident on our side - the catch-up path is how anything lost in that window gets recovered
If you see sustained 401s, that is our bug, not yours. Tell us and
stop sending rather than working around it.