Erros
Um envelope só, sempre — code, message e request_id. Aqui está a lista completa de codes.
Toda resposta de erro da API — em qualquer rota, qualquer status — usa o mesmo formato. Nunca um HTML de erro, nunca um corpo vazio.
{
"error": {
"code": "forbidden_scope",
"message": "Esta chave não tem o escopo contacts.write.",
"request_id": "a1b2c3d4e5f6"
}
}code é estável — pode basear lógica em cima dele (retry, mensagem pro seu usuário). message é pra humano, em português, pode mudar de texto sem aviso.
Reportando um erro pra gente
Toda resposta — erro ou sucesso — já vem com o header x-request-id, e ele também aparece dentro do corpo do erro como request_id (o mesmo valor nos dois lugares). Se algo falhar de um jeito que não faz sentido, esse id é o que a gente precisa pra achar exatamente a chamada nos nossos registros — bem mais rápido que descrever "por volta de tal hora, chamando tal rota".
Codes por status
| Status | code | Quando |
|---|---|---|
| 400 | validation_error | Corpo ou parâmetro fora do formato esperado. |
| 401 | unauthorized | Token ausente, desconhecido, revogado, expirado, ou rotacionado (use o novo). |
| 403 | forbidden_scope | A chave não tem o escopo que a rota exige — a mensagem nomeia qual. |
| 403 | forbidden_ip | A chave tem allowlist de IP e a chamada veio de fora dela. |
| 403 | forbidden_platform | platform.read só funciona pra chave do workspace da Accelera. |
| 404 | not_found | Recurso não existe (ou existe em outro workspace — nunca vaza isso). |
| 409 | conflict | Estado atual do recurso não permite a operação. |
| 409 | idempotency_conflict | Mesma Idempotency-Key, corpo diferente — veja idempotência. |
| 413 | payload_too_large | Corpo da escrita passou de 7,5 KB. |
| 422 | unprocessable | Passou na validação de formato, mas a ação não pôde ser concluída. |
| 429 | rate_limited | Estourou o limite (veja limites de uso) — respeite o Retry-After. |
| 500 | internal_error | Bug nosso. Tente de novo; se persistir, é rastreado automaticamente do nosso lado. |