Errors
Every error is JSON. There are no HTML stack pages.
| status | meaning | what to do |
|---|---|---|
| 400 | malformed request or invalid JSON | fix the request; the body says what was wrong |
| 401 | missing or invalid API key | check Authorization: Bearer … |
| 403 | your key lacks the scope | ask us — sandbox keys carry the developer scopes |
| 404 | it does not exist, or it is not yours | see below |
| 413 | body too large (32 kb) | real payloads are ~1 kb; something is wrong |
| 429 | rate limited | back off using retry-after |
| 500 | our fault | quote the x-request-id |
| 503 | not ready (dependency unhealthy) | retry shortly |
404 is deliberately ambiguous
Asking for another developer's agent, a deleted one, and a malformed id all return a byte-identical 404. A 403 would confirm the thing exists, which is a disclosure in itself. You cannot use error codes to discover what other accounts own.
A denial is not an error
VeytoDeniedError means a guardrail stopped the payment and no money moved. It is an
answer, not a failure — see Blocked.
Always log the request id
const res = await fetch(url, { headers });
console.log(res.headers.get("x-request-id"));It is on every response, and it is what lets us find your exact request.