Skip to main content

Errors

With the exception of authentication failures, errors arrive as HTTP 200 with the failing field set to null and an entry in errors:

{"errors":[{"path":["tasks","createTask"],
"extensions":{"errorType":"PERMISSION_DENIED",
"errorMessage":"Permission required: canManageTasks"}}]}

Client code that only checks the status code will read this as success. Inspect errors on every response.

errorType

ValueMeaningRetry?
AUTHENTICATION_ERRORNo credentials, or credentials that are not sufficient for this surfaceNo — fix the key
PERMISSION_DENIEDThe key is valid but lacks the required permission flagNo — the key will never grow the flag on its own
CONDITION_ERRORBad input or bad state: a missing entity, an illegal transition, a validation failureNo — fix the input
EFFECT_ERRORA server-side failure while performing the operationYes, with backoff
VALIDATION_ERROR / PARSING_ERRORThe query text itself is wrong — unknown field, bad argument type, syntax errorNo — fix the query

errorMessage is written to be shown to a person. Surface it rather than replacing it with your own generic text; it usually names the exact permission, field or entity at fault.

HTTP 401

A missing, malformed, expired or revoked key returns HTTP 401 with no GraphQL body worth parsing. The response is deliberately uniform across those cases — it will not tell you which one you hit. See Authentication.