Error codes
The API returns standard HTTP status codes plus a JSON body explaining the error.
Format
{
"error": {
"code": "rate_limited",
"message": "Too many requests. Try again in 30 seconds.",
"details": { "retryAfter": 30 }
}
}Common codes
| HTTP | Code | Meaning |
|---|---|---|
| 400 | invalid_request | Malformed JSON or missing required field. |
| 401 | unauthorized | API key missing or invalid. |
| 403 | forbidden | Key lacks the required scope. |
| 404 | not_found | Resource does not exist. |
| 409 | conflict | Resource already exists (e.g. duplicate QR shortId). |
| 410 | gone | Resource expired or was deleted. |
| 422 | validation_failed | Field-level validation errors. See details. |
| 429 | rate_limited | Hit a rate limit. See details.retryAfter. |
| 500 | internal_error | Server-side error. Retry with exponential backoff. |
| 503 | unavailable | Service temporarily unavailable. |