Documentation
Errors
Every error is JSON with the same three fields, plus optional details: per-field messages on validation failures, the limit behind a refusal, and upgrade (the plan that lifts it) where a plan would.
{
"code": "quota_exceeded",
"message": "Your plan holds 100 links. Delete links you no longer need or upgrade for more.",
"request_id": "b9d4d1a2-6a4e-4f1e-9d0a-1d2f3e4c5b6a",
"details": {
"reason": "link_limit",
"limit": 100,
"upgrade": { "kind": "plan", "plan": "pro", "plan_name": "Pro", "href": "/app/billing" }
}
}| Status | Code | What to do |
|---|---|---|
| 400 | validation_failed | Fix the body or query. The details object names each field, or the message says why a destination was refused. |
| 401 | invalid_api_key | The key is missing, malformed or revoked. Create a new one. |
| 402 | insufficient_credits | The QR code call needs more credits than the account has. Upgrade the plan. |
| 403 | forbidden | The plan does not include this (exports, for one). details.upgrade names the plan that does. |
| 404 | not_found | No link by that id or ending in this account. Another account's links look the same as missing ones. |
| 409 | conflict | The ending is taken or reserved. Pick another, or omit it for a random code. |
| 413 | input_too_large | The QR code content is over the plan's size per run. The details carry the size and the limit. |
| 429 | rate_limited | The key sent more than its requests per second. Back off for the seconds in Retry-After, then retry. |
| 429 | quota_exceeded | A plan allowance is used up: links in the account (link_limit) or links made today (daily_limit, with resets_at). Delete links, wait, or upgrade. |
| 502 | upstream_failed | Something the call depends on failed and nothing was charged. Retry shortly. |
| 500 | internal_error | Retry once, then quote the request id if it persists. |