Docs

Errors and limits

How the Soundwaves API reports errors, and the rate and query limits it enforces.

Errors

Errors follow the GraphQL spec: a response has an errors array, and each error carries a machine-readable extensions.code. Branch on the code, not the message.

{
  "errors": [
    {
      "message": "Insufficient permissions",
      "extensions": { "code": "FORBIDDEN" }
    }
  ],
  "data": null
}
CodeMeaning
UNAUTHENTICATEDNo valid credential was sent, or it has expired.
FORBIDDENThe credential is valid but lacks a permission or add-on the field needs.
STEP_UP_REJECTEDThe action needs you to re-confirm your identity first.
BAD_USER_INPUTAn argument was invalid. The message says which.
VALIDATION_ERRORThe input failed a business rule.
SITE_CONTEXT_REQUIREDA public query couldn’t tell which site it was for.
RATE_LIMITEDToo many requests. Wait extensions.retryAfterSeconds and retry.
SERVICE_UNAVAILABLEA dependency is temporarily unavailable. Retry with backoff.

Internal error details are never returned. If you hit something unexpected, email us the time and operation and we’ll look it up.

Rate limits

Each credential gets its own allowance, on top of a per-IP limit:

Limit
Queries100 per minute per credential
Mutations20 per minute per credential
All requests100 per minute per IP

Rate-limited requests return HTTP 429 with a Retry-After header and a RATE_LIMITED error.

Query limits

To keep the API fast for everyone, very large or deeply nested queries are rejected before they run. Keep queries focused: request the fields you need, page through lists, and avoid repeating the same field under many aliases.

On this page