Erros
Os formatos de erro da API, o significado de cada código de status e as mensagens reais que o servidor devolve.
Quando uma chamada falha, o código de status HTTP diz a categoria do problema e o corpo JSON diz o motivo. A API tem um formato de corpo principal, mas algumas rotas e camadas usam outro. Escreva seu tratamento de erro olhando primeiro o status e só depois o corpo.
Formatos de corpo
Formato simples (o mais comum)
{ "error": "product not found" }Com detalhe adicional, quando há:
{
"error": "invalid request body",
"detail": "invalid character 'b' looking for beginning of object key string"
}error é a mensagem curta; detail explica a causa. Textos vindos do banco de dados são sempre trocados por uma frase genérica, nunca expõem nomes internos.
Validação por campo
Quando o corpo da requisição é rejeitado por regras de formulário, a resposta traz um código por campo:
{
"error": "validation_failed",
"fields": {
"name": "name_required",
"category_id": "category_required"
}
}Cada valor de fields é um código curto e estável (required, name_required...) que você pode mapear para a sua própria mensagem. O status é normalmente 400; algumas rotas usam 422 com o mesmo formato.
Formato com objeto
Algumas rotas devolvem o erro dentro de um objeto:
{
"error": {
"code": "not_found",
"message": "vendor not found",
"details": null
}
}Se error for um objeto, leia error.code e error.message. Se for uma string, é o formato simples. Teste o tipo antes de ler.
Códigos de status
| Status | Significado | Corpo / texto típico |
|---|---|---|
| 400 | Requisição inválida: JSON malformado, campo obrigatório ausente, valor fora do permitido. | invalid request body, validation_failed, customer_id or customer_email is required |
| 401 | Sem credencial ou credencial inválida. | missing authorization header, invalid authorization format, invalid or expired token, token revoked (a mensagem completa segue pedindo novo login, em inglês), invalid_api_key |
| 403 | Credencial válida, mas sem permissão. | insufficient permissions, insufficient privileges, token not valid for this storefront, token_scope, account_pending_approval |
| 404 | Recurso ou rota não existe, ou a loja não foi encontrada. | product not found, tenant not found |
| 405 | Método não permitido nesta rota. O cabeçalho Allow lista os aceitos. | corpo vazio |
| 409 | Conflito com o estado atual. | in_progress (com retry_after_ms), cart_already_ordered, duplicate_order |
| 422 | A requisição é válida, mas uma regra de negócio da loja recusou. | idempotency key reused with a different checkout session, mensagem de regra da loja |
| 429 | Limite de requisições excedido. | rate limit exceeded, com Retry-After: 60 |
| 500 | Erro inesperado no servidor. | an unexpected error occurred, a database error occurred |
| 503 | Loja suspensa, indisponível ou em manutenção; ou um tempo limite interno. | tenant_suspended, tenant_maintenance, request timeout |
Erros de autenticação e permissão, por ordem
Uma chamada protegida é verificada nesta ordem, e o primeiro problema encontrado é o devolvido.
- Loja (404
tenant not found, 503 de loja). Veja Lojas e resolução de host. - Cabeçalho
Authorization(401missing authorization header,invalid authorization format). O formato éBearer <token>. - Token (401
invalid or expired token; 403token_scope; 403token not valid for this storefront; 401token revoked(a mensagem completa segue pedindo novo login, em inglês)). - Tipo de usuário (403
insufficient permissions). - Privilégio (403
insufficient privileges, comprivilege_required_any). - Limite de requisições (429), aplicado antes de tudo, por IP.
Exemplos reais
{ "error": "missing authorization header" }{
"error": "insufficient privileges",
"privilege_required_any": ["view_orders", "manage_orders"]
}{
"error": "validation_failed",
"fields": {
"email": "required",
"first_name": "required",
"password": "required"
}
}{
"error": "rate limit exceeded",
"detail": "too many requests, please try again later"
}Como tratar erros no código
# -i mostra o status e o X-Request-Id; --fail-with-body sai com código != 0 em 4xx/5xx
curl -i --fail-with-body "$BASE_URL/api/v1/admin/orders/$ORDER_ID" \
-H "Authorization: Bearer $TOKEN"Erros comuns
- Tratar 400 e 422 de forma diferente sem necessidade. Ambos significam "corrija a requisição". Leia
fieldsquando existir. - Repetir automaticamente um 4xx. Só 401 (depois de renovar o token), 409
in_progresse 429 merecem nova tentativa. Um 400 repetido falha sempre. - Repetir um 500 em uma criação sem chave de idempotência. Pode duplicar o registro; veja Idempotência.
- Esperar
Content-Type: application/jsonem todo erro. Alguns vêm comotext/plain; faça o parse do mesmo jeito. - Perder o
X-Request-Id. Registre-o em cada erro; é o que o suporte pede (Rastreamento de requisições). - Mensagens em português. Algumas poucas mensagens de regra de negócio e de manutenção vêm em português da própria plataforma (
loja em manutencao); trate-as como texto de exibição, não como código.