Erros
O formato de erro da API, com exemplos reais e o significado de cada código HTTP.
Quando algo dá errado, a API responde com um código HTTP (4xx para erro seu, 5xx para erro da plataforma) e um corpo JSON com a descrição. O código HTTP é o que decide o seu fluxo (repetir, corrigir, parar); a mensagem serve para o log e para a pessoa que vai investigar.
O formato do erro
{ "error": "order not found" }O campo error é a mensagem curta (ou um código em snake_case, como account_locked). Dependendo da rota, vêm campos extras:
| Campo extra | Quando | Exemplo |
|---|---|---|
detail | Explicação adicional. Pode vir em português. | {"error":"invalid request body","detail":"invalid character 'b' looking for beginning of object key string"} |
code | Código estável para tratar no programa. | {"error":"this token is not valid for this route","code":"token_scope"} |
required | Privilégio que faltou. | {"error":"insufficient privileges","required":"manage_orders"} |
fields | Erro por campo, numa validação. | {"error":"validation_failed","fields":{"category_id":"category_required","name":"name_required"}} |
message | Texto legível, em erros de loja e de conta. | {"error":"tenant_suspended","message":"this storefront is temporarily unavailable"} |
Códigos HTTP
| Status | Significado | O que fazer |
|---|---|---|
| 200, 201 | Deu certo. 201 indica que algo foi criado. | Siga em frente. |
| 400 | Requisição inválida: JSON quebrado, campo obrigatório ausente, valor fora do permitido, regra de negócio violada. | Corrija a requisição. Repetir igual falha de novo. |
| 401 | Sem credencial, credencial inválida ou token vencido ou revogado. | Renove o token ou faça login. Confira o token. |
| 403 | A credencial é válida, mas não tem permissão: privilégio ausente, token de outra loja, conta bloqueada por política. | Ajuste permissões. Não adianta repetir. |
| 404 | O registro não existe (ou o id está malformado), ou a loja não foi encontrada. | Confira o id e a loja. |
| 409 | Conflito: conta ambígua no login (multiple_accounts_cpf), operação em andamento (in_progress). | Resolva o conflito ou espere e consulte. |
| 422 | Uma regra da loja recusou a operação. A mensagem é a da loja, com detail: "refused_by_store". | Mostre a mensagem; corrija os dados. |
| 429 | Limite de requisições ou de tentativas de login. Vem com Retry-After. | Espere e tente de novo (Limites). |
| 500 | Erro interno, ou uma validação que a rota não trata. | Pode repetir com espera crescente; se persistir, abra um chamado com o X-Request-Id. |
| 503 | Loja suspensa, em manutenção, ou a rota estourou o tempo (handler_timeout). | Espere e repita. |
Exemplos reais
Falta a credencial (401)
{ "error": "missing authorization header" }Sem permissão (403)
{ "error": "insufficient privileges", "required": "manage_orders" }Registro inexistente (404)
{ "error": "order not found" }Validação (400)
{ "error": "validation_failed", "fields": { "category_id": "category_required", "name": "name_required" } }{ "error": "at least one item is required" }Conflito de dados (500 em alguns casos)
Algumas regras de unicidade ainda respondem 500 em vez de 409. Um exemplo é o CPF de um cliente que já pertence a outra conta:
{ "error": "failed to create user", "detail": "CPF already registered by another user" }Leia o detail quando um 500 vier de uma escrita; ele costuma dizer o que há de errado nos seus dados.
Limite de requisições (429)
{ "error": "rate limit exceeded", "detail": "too many requests, please try again later" }Tempo esgotado (503)
{ "error": "request timeout", "code": "handler_timeout" }Erros que acontecem antes da sua rota
Três verificações rodam antes do código da operação, e por isso os erros delas se parecem em toda a API:
- A loja (Endereço e ambientes):
404 tenant not found,503 tenant_suspended. - O limite de requisições (
429 rate limit exceeded). - A autenticação (Autenticação):
401e403com as mensagens da tabela daquela página.
Mensagens em português
Alguns textos de detail e de regras da loja vêm em português, porque nascem de validações escritas em português (por exemplo, o aviso de uma data inválida em um filtro). Eles são devolvidos como o servidor os escreve e podem mudar. Não faça comparação de texto com eles.
Como tratar erros no seu código
- Olhe o código HTTP primeiro
2xxsegue em frente.401tenta renovar o token uma vez.429,503e5xxentram em repetição com espera. O resto é erro seu. - Leia o corpo para o log e para o usuário
Registre o corpo inteiro e o
X-Request-Id. Useerrore, em validações,fields. - Repita só o que é seguro repetir
Nunca repita um
400,403ou404sem mudar algo. Para criações (pedido), use oidempotency_keypara que uma repetição não duplique o registro (Limites e boas práticas).
Erros comuns
- Ignorar os campos extras.
fields,codeerequireddizem exatamente o que corrigir. - Repetir um
400em loop. Ele nunca passa sem mudança. - Fazer
if mensagem == "...". Use o código HTTP e, quando existir, o campocode. - Ignorar o
500comdetail. Em escritas, ele costuma apontar um dado duplicado ou inválido.