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.