Skip to content

Errors

Last updated 

Error responses are JSON:

json
{"error": "human-readable text", "kind": "machine_readable_kind"}

kind is present where the status alone is ambiguous. Match on the status and kind; the error text is for humans and is not part of the contract.

Kinds

KindStatusMeaningRetry
invalid_lease400The lease token is malformed — a bug or tampering.Never.
dedup_disabled400The send carries a dedup key but the queue has no dedup window.No — set dedupWindowSeconds or drop the key.
unknown_header400A Spooler-* request header the operation does not define — likely meant for another endpoint.No — fix the request.
retention_limit403The requested retention exceeds the plan's limit.No.
queue_not_found404The queue does not exist. A verdict, not lag.No.
spool_not_found404Can be lag right after the spool was created.Yes.
queue_deleting409The queue refuses the operation while its deletion completes.No.
queue_busy409A concurrent settings change lost a race.Yes.
dedup_in_flight409A send with the same dedup key has not settled yet.Yes, after it settles.
stale_lease410The token verified but no longer settles anything: expired, already settled, or predates a primary change.Receive or peek again.
payload_too_large413The message exceeds the size limit (see limits).No.
rate_limited429The per-account request rate cap is exceeded.After the Retry-After seconds.
operation_unconfirmed500The write was accepted but its durability is unknown.A send: only on a queue with a dedup window, carrying the same key (see deduplication).
spool_full507The spool holds its plan's maximum stored messages or payload bytes (see limits).After making room.

Statuses without a kind mean what HTTP says: 401 bad credentials, 402 the account is suspended, 403 without a kind is the plan's queue limit, 411 a send without Content-Length, 503 the spool is momentarily unavailable — retry.