resellerhq

API error code explainer

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.

Try

Result

402 insufficient_funds explained

The wallet cannot cover this. Nothing was charged.

Documented error

Code
insufficient_funds
Status
402
Message
Wallet balance is too low for this purchase
Meaning
The wallet cannot cover this. Nothing was charged.

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

OperationMethodPath
createNumberOrderPOST/v1/numbers/orders
renewNumberPOST/v1/numbers/{id}/renew
registerDomainPOST/v1/domains
updateDomainPATCH/v1/domains/{id}
renewDomainPOST/v1/domains/{id}/renew
transferDomainPOST/v1/domains/transfers
restoreDomainPOST/v1/domains/{id}/restore
createLicencePOST/v1/licences
updateLicencePATCH/v1/licences/{id}
addLicenceUsersPOST/v1/licences/{id}/users
fundSubResellerPOST/v1/sub-resellers/{id}/fund
withdrawFromSubResellerPOST/v1/sub-resellers/{id}/withdraw
  • This reads only the documented status, message and operations — it cannot tell you whether this error actually happened on a real request, or inspect your own account or request body.

What this is

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.

How to read the result

"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.

Common mistakes

  • Guessing what a code means from its name aloneTwo codes can sound alike and mean very different things — read the documented message and meaning on this page rather than assuming from the identifier itself what went wrong or what to do about it.
  • Treating a bare HTTP status as if it were the errorA single status like 409 is reused across more than a dozen different documented codes here, each with its own fix. Read the code field in the actual response body, not just its three-digit status, before deciding what to change.

Build on the same API this tool is part of: numbers, domains and mailboxes, one key.

Read the API

Questions

What people ask about this tool.

Where do these error codes actually come from?

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.

What happens if I type a code you do not document?

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.

Can I paste the whole JSON error response instead of just the code?

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.

Why does the same three-digit status show up next to several different codes?

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.

API example

Example request
curl -X POST https://163-123-236-68.sslip.io/api/tools/api-error-code-explainer \
  -H "Content-Type: application/json" \
  -d '{"query":"insufficient_funds"}'
Example response
{
  "tool": "api-error-code-explainer",
  "input": {
    "query": "insufficient_funds"
  },
  "result": {
    "verdict": {
      "tone": "neutral",
      "headline": "402 insufficient_funds explained",
      "summary": "The wallet cannot cover this. Nothing was charged."
    },
    "findings": [],
    "parts": [
      {
        "kind": "facts",
        "title": "Documented error",
        "rows": [
          [
            "Code",
            "insufficient_funds"
          ],
          [
            "Status",
            "402"
          ],
          [
            "Message",
            "Wallet balance is too low for this purchase"
          ],
          [
            "Meaning",
            "The wallet cannot cover this. Nothing was charged."
          ]
        ]
      },
      {
        "kind": "text",
        "title": "What to change",
        "body": "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."
      },
      {
        "kind": "table",
        "title": "Operations that document this error",
        "columns": [
          "Operation",
          "Method",
          "Path"
        ],
        "mono": [
          0,
          2
        ],
        "rows": [
          [
            "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"
          ]
        ]
      }
    ],
    "limits": [
      "This reads only the documented status, message and operations — it cannot tell you whether this error actually happened on a real request, or inspect your own account or request body."
    ]
  }
}

Related tools

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.

Runs in your browserOpen tool

Make a UUID v4 for the Idempotency-Key header, with a ready curl line and our own retry rules explained next to it.

Runs in your browserOpen tool
For developers

API request builder

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.

Runs in your browserOpen tool

Company names and logos are trademarks of their owners, shown only to identify each service.