Errors
Every error status, body and fix.
| Status | error | When | What to do |
|---|---|---|---|
| 401 | invalid_api_key | Key missing, malformed, unknown, or revoked | Check the key — all four cases return the same response by design, so they can't be used to probe which keys exist |
| 403 | api_not_included | Account's plan has no API access (Free) | Upgrade at the included upgrade_url |
| 429 | quota_exceeded | Monthly render quota used up | Wait until resets_at (or the Retry-After header), or upgrade |
| 500 | — | Unexpected server error | Retry with backoff |
#400 — validation error
Thrown when the JSON body doesn't match the request schema
{ "message": "Too small: expected array to have >=1 items" }#401 — invalid API key
{ "error": "invalid_api_key" }Returned identically whether the Authorization header is missing, malformed, references a key that was never issued, or references a key that's since been revoked.
#403 — plan doesn't include API access
Returned when a plan (i.e the free plan) does not have API access.
{
"error": "api_not_included",
"message": "API access requires a paid plan",
"upgrade_url": "https://sankeykit.com/account/billing"
}#429 — quota exceeded
Returned when the API limit has been exceed for that period.
{
"error": "quota_exceeded",
"message": "Monthly API token quota exceeded.",
"used": 1000,
"quota": 1000,
"resets_at": "2026-11-01T00:00:00.000Z"
}Also sent with a Retry-After header (seconds until resets_at) and the usual X-RateLimit-* headers. See Limits.
#500 — server error
No guaranteed body shape — treat any 5xx as transient and retry with backoff.