Every non-2xx response is JSON with a stable, snake_case error code. Branch on the HTTP status first and the code second.
{ "error": "invalid_cursor" }
Error responses carry Cache-Control: no-store, max-age=0. Do not cache them.
These can come back from any endpoint. The order of precedence is on the Authentication page.
| Status |
error |
When |
401 |
missing_authorization |
No Authorization: Bearer … header. |
401 |
invalid_token |
Unknown prefix, unknown key, or a revoked key. |
403 |
cross_tenant |
The key belongs to a different business than {slug}. |
404 |
business_not_found |
No business with that {slug}, or a closed business queried with anything but its own key. |
410 |
business_closed |
The business’s account is closed. Permanent: stop serving and drop your caches. |
500 |
lookup_failed |
A temporary problem reading the business or the key. Retry with backoff. |
| Status |
error |
Endpoints |
When |
400 |
invalid_cursor |
List jobs, Build-time feed |
cursor is malformed or over 512 characters (see Pagination). Restart from the first page. |
400 |
invalid_limit |
List jobs, Build-time feed |
limit is not an integer in the endpoint’s range (1–100 for /jobs, 1–200 for /feed/jobs). |
400 |
invalid_updated_since |
List jobs |
updated_since is not a parseable timestamp. |
| Status |
error |
Endpoints |
When |
404 |
job_not_found |
Get a job |
No published job with that {job_slug}. Drafts and hidden jobs return the same 404; the API never reveals that an unpublished job exists. |
500 |
lookup_failed |
List jobs, Get a job, Build-time feed |
A temporary problem reading jobs. Retry with backoff. |
| Status |
error |
When |
429 |
rate_limited |
Reserved. There is no rate limiting today, so this code is never returned. |
401 and 403: a configuration problem on your side. Do not retry automatically; check the key and the slug.
404 job_not_found after a job.unpublished webhook: expected. Remove the page.
410 business_closed: permanent. Stop fetching and serve your own not-found page for the job URLs.
500 lookup_failed: transient. Retry with exponential backoff. Keep serving your last good copy in the meantime.