Skip to content

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" }
  }
}
StatusCodeWhat to do
400validation_failedFix the body or query. The details object names each field, or the message says why a destination was refused.
401invalid_api_keyThe key is missing, malformed or revoked. Create a new one.
402insufficient_creditsThe QR code call needs more credits than the account has. Upgrade the plan.
403forbiddenThe plan does not include this (exports, for one). details.upgrade names the plan that does.
404not_foundNo link by that id or ending in this account. Another account's links look the same as missing ones.
409conflictThe ending is taken or reserved. Pick another, or omit it for a random code.
413input_too_largeThe QR code content is over the plan's size per run. The details carry the size and the limit.
429rate_limitedThe key sent more than its requests per second. Back off for the seconds in Retry-After, then retry.
429quota_exceededA 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.
502upstream_failedSomething the call depends on failed and nothing was charged. Retry shortly.
500internal_errorRetry once, then quote the request id if it persists.

Back to getting started