ULID / request id decoder
Split one of our own prefixed ids, or a bare ULID, and read the exact UTC time it was minted — and say plainly when a prefix is not one of ours.
Type one of our documented error codes, a bare status, or paste a whole response body, and get the exact status, message, meaning and what to change in the request.
A documented code like not_found, a bare status like 409, or the whole JSON body — its "error" field is read out for you.
402 insufficient_funds explained
The wallet cannot cover this. Nothing was charged.
Documented error
What to change
The wallet does not hold enough balance to cover this purchase, and nothing was charged. Top up the wallet from the dashboard, or lower what the request costs — fewer numbers, a shorter renewal duration, a cheaper plan — before retrying the exact same request.
Operations that document this error
| Operation | Method | Path |
|---|---|---|
| createNumberOrder | POST | /v1/numbers/orders |
| renewNumber | POST | /v1/numbers/{id}/renew |
| registerDomain | POST | /v1/domains |
| updateDomain | PATCH | /v1/domains/{id} |
| renewDomain | POST | /v1/domains/{id}/renew |
| transferDomain | POST | /v1/domains/transfers |
| restoreDomain | POST | /v1/domains/{id}/restore |
| createLicence | POST | /v1/licences |
| updateLicence | PATCH | /v1/licences/{id} |
| addLicenceUsers | POST | /v1/licences/{id}/users |
| fundSubReseller | POST | /v1/sub-resellers/{id}/fund |
| withdrawFromSubReseller | POST | /v1/sub-resellers/{id}/withdraw |
This api error code explainer reads straight from the 74 error codes our API actually documents: give it a code like not_found, a bare status like 409, or paste the whole JSON response body, and it answers with the exact status, the exact message a caller sees, what that status means, which operations document it, and what in the request to change.
Every code here comes from `ERRORS` and `MEANINGS` in `apps/api/src/openapi.ts`, distilled for the browser into `apps/web/src/tools/api-catalogue.ts`'s `API_ERRORS` — the same document the API's own OpenAPI file publishes. There are 74 of them today, each tied to the specific operations that can return it, and this page explains all 74 rather than a sample.
The "what to change" text under each code is written by hand, one entry per code, and says what in the request to actually change — never a restatement of the message itself, which a caller already sees without this page.
"Documented error" is the fact of the matter: the exact status, the exact message, and the one-line meaning that status carries across every code that shares it. "What to change" is the part worth reading — what to actually do about it, specific to this one code rather than generic advice. The operations table underneath lists every documented operation that can return this exact code, so you know where else to expect it.
A bare status on its own, like 409, is answered differently: every documented code that shares that status is listed in a table, because the status alone never says which of them actually happened — only the code field in the real response body does that.
"Verifying one of our webhooks" shows the shared error shape every response carries plus a small table of codes across the different statuses, copied verbatim from the same source this page reads, with a note to come here for the rest, one per documented code rather than a slice.
Build on the same API this tool is part of: numbers, domains and mailboxes, one key.
Read the APIWhat people ask about this tool.
Every one of them is read from `ERRORS` and `MEANINGS` in `apps/api/src/openapi.ts`, the same source the API's own OpenAPI document is generated from, distilled into `apps/web/src/tools/api-catalogue.ts` for the browser — a code added there and not reflected here fails this page's own drift test.
It is answered as "not one of ours" rather than guessed at, with the closest documented codes offered by how similar their spelling is — never a made-up explanation for a code that does not exist in our API.
Yes — paste the full response body and its "error" field is read straight out of it, so you can copy an error response verbatim from your own logs or terminal without editing it down to the bare code first.
HTTP statuses are broad on purpose — 409 alone covers more than a dozen genuinely different conflicts here, from a duplicate customer to a domain that is already locked — so the status narrows things down, but the code field in the body is what actually says which one happened.
Split one of our own prefixed ids, or a bare ULID, and read the exact UTC time it was minted — and say plainly when a prefix is not one of ours.
Make a UUID v4 for the Idempotency-Key header, with a ready curl line and our own retry rules explained next to it.
Pick one of our documented operations and get a ready curl, Python or Node snippet, with the real base URL and an Idempotency-Key where the operation spends money.
Company names and logos are trademarks of their owners, shown only to identify each service.