Pular para o conteúdo principal

Erros & Status HTTP


Tabela de codigos de erro

CodigoSignificadoCausas comuns
400Bad RequestCampos obrigatorios ausentes, tipos invalidos
401UnauthorizedToken ausente, invalido ou expirado
403ForbiddenRole insuficiente para o endpoint
404Not FoundRecurso nao existe ou nao pertence ao usuario
422Unprocessable EntityTransicao de status invalida, saldo insuficiente
502Bad GatewayServico externo falhou (ASAAS ou OpenRouteService)

Formato padrao de resposta de erro

Todos os erros seguem o schema:

{
"detail": "Mensagem descritiva do erro"
}

Para erros de validacao (400), o FastAPI retorna o formato Pydantic:

{
"detail": [
{
"type": "missing",
"loc": ["body", "origin_address"],
"msg": "Field required",
"input": {}
}
]
}

Exemplos de erro por codigo

401 — Token expirado

{"detail": "Token expirado ou invalido"}

Solucao: Refaca o login ou use o refresh_token para obter um novo access_token. Ver Autenticacao.

403 — Role insuficiente

{"detail": "Acesso negado: role insuficiente"}

Solucao: Verifique se esta usando credenciais com a role correta para o endpoint.

404 — Entrega nao encontrada

{"detail": "Entrega nao encontrada"}

422 — Transicao de status invalida

{"detail": "Transicao invalida: entrega ja esta em in_progress"}

422 — Saldo insuficiente

{"detail": "Saldo insuficiente para saque"}

502 — Servico externo indisponivel

{"detail": "Erro ao calcular rota: servico OpenRouteService indisponivel"}

Tratamento de erros em codigo

import requests
import time

def call_with_retry(url: str, headers: dict, max_retries: int = 3) -> dict:
"""Chamada com backoff exponencial para erros 502."""
for attempt in range(max_retries):
resp = requests.get(url, headers=headers)

if resp.status_code == 200:
return resp.json()

if resp.status_code == 401:
raise Exception("Token invalido ou expirado — refaca o login")

if resp.status_code == 403:
raise Exception("Acesso negado — verifique sua role")

if resp.status_code == 404:
raise Exception(f"Recurso nao encontrado: {url}")

if resp.status_code == 422:
detail = resp.json().get("detail", "Erro de validacao")
raise Exception(f"Dado invalido: {detail}")

if resp.status_code == 502:
wait = 2 ** attempt # 1s, 2s, 4s
print(f"Servico externo falhou, aguardando {wait}s (tentativa {attempt + 1}/{max_retries})")
time.sleep(wait)
continue

resp.raise_for_status()

raise Exception(f"Falhou apos {max_retries} tentativas")

Estrategia de retry para 502

Para erros 502 (servico externo indisponivel), use backoff exponencial:

TentativaAguardar
11 segundo
22 segundos
34 segundos
4+Desistir e notificar
Quando nao fazer retry

Erros 400, 401, 403, 404 e 422 sao erros do cliente — nao adianta tentar novamente sem corrigir a requisicao.

Rate limit de localizacao

O endpoint PUT /api/v1/locations/me aceita no maximo 1 requisicao a cada 10 segundos por motorista. Exceder esse limite retorna 429 Too Many Requests.