Pular para o conteúdo principal

Tratamento de Erros

Formatos diferentes por versão

A API v1 e a API v2 retornam erros em formatos completamente distintos. Certifique-se de tratar cada versão separadamente no seu código.


API v2 — RFC 7807 Problem Details

A API v2 segue o padrão RFC 7807 Problem Details for HTTP APIs. Todos os erros retornam um objeto JSON com os seguintes campos:

{
"type": "urn:frota162-api-v2:error:{tipo}",
"title": "Título legível do erro",
"status": 401,
"detail": "Descrição específica do problema nesta requisição",
"instance": "/v2/driver-indications/SP-2024-000001",
"traceId": "abc123def456"
}
CampoTipoDescrição
typestringURN única que identifica o tipo de erro — estável entre versões
titlestringTítulo do erro — não muda entre ocorrências do mesmo tipo
statusnumberCódigo HTTP da resposta
detailstringDescrição específica desta ocorrência (pode variar)
instancestringCaminho da requisição que gerou o erro
traceIdstringID de rastreamento — inclua ao contatar suporte

Tipos de erro da API v2

typeStatus HTTPQuando ocorre
urn:frota162-api-v2:error:unauthorized401Headers Authorization ou Key ausentes, ou esquema inválido
urn:frota162-api-v2:error:authentication-failed401Assinatura HMAC inválida ou token não reconhecido
urn:frota162-api-v2:error:not-found404Recurso não encontrado (ex: AIT inexistente)
urn:frota162-api-v2:error:validation-error400Campos obrigatórios ausentes ou formato inválido
urn:frota162-api-v2:error:rate-limit-exceeded429Limite de requisições atingido
urn:frota162-api-v2:error:internal-server-error500Erro inesperado no servidor
urn:frota162-api-v2:error:external-api-error502Falha na comunicação com serviço externo

Exemplos

Header de autenticação ausente (401)

{
"type": "urn:frota162-api-v2:error:unauthorized",
"title": "Unauthorized Access",
"status": 401,
"detail": "Missing required header: Authorization",
"instance": "/v2/driver-indications",
"traceId": "abc123"
}

Assinatura HMAC inválida (401)

{
"type": "urn:frota162-api-v2:error:authentication-failed",
"title": "Authentication Failed",
"status": 401,
"detail": "Invalid Key header",
"instance": "/v2/driver-indications",
"traceId": "abc123"
}

Recurso não encontrado (404)

{
"type": "urn:frota162-api-v2:error:not-found",
"title": "Not Found",
"status": 404,
"detail": "Driver indication with AIT 'SP-2024-000001' not found",
"instance": "/v2/driver-indications/SP-2024-000001",
"traceId": "abc123"
}

Validação de payload (400)

{
"type": "urn:frota162-api-v2:error:validation-error",
"title": "Validation Error",
"status": 400,
"detail": "The request contains invalid or missing parameters",
"instance": "/v2/driver-indications",
"traceId": "abc123"
}

Estratégia de retry — API v2

StatustypeFazer retry?Ação recomendada
400validation-errorNãoCorrigir o payload
401unauthorizedNãoVerificar headers Authorization e Key
401authentication-failedNãoRecalcular assinatura HMAC
404not-foundNãoConfirmar o identificador do recurso
429rate-limit-exceededSimAguardar e retentar (ver header Retry-After)
500internal-server-errorSimBackoff exponencial (1s → 2s → 4s)
502external-api-errorSimBackoff exponencial

Exemplo de tratamento em Node.js — API v2

async function chamarApiV2(url, opcoes) {
const resposta = await fetch(url, opcoes);
const dados = await resposta.json();

if (!resposta.ok) {
const { type, title, detail, traceId } = dados;

switch (type) {
case 'urn:frota162-api-v2:error:unauthorized':
case 'urn:frota162-api-v2:error:authentication-failed':
throw new Error(`Autenticação inválida: ${detail}`);

case 'urn:frota162-api-v2:error:not-found':
throw new Error(`Recurso não encontrado: ${detail}`);

case 'urn:frota162-api-v2:error:validation-error':
throw new Error(`Dados inválidos: ${detail}`);

case 'urn:frota162-api-v2:error:rate-limit-exceeded': {
const retryAfter = parseInt(resposta.headers.get('Retry-After') || '60');
await sleep(retryAfter * 1000);
return chamarApiV2(url, opcoes);
}

case 'urn:frota162-api-v2:error:internal-server-error':
case 'urn:frota162-api-v2:error:external-api-error':
await sleep(1000);
return chamarApiV2(url, opcoes);

default:
throw new Error(`Erro da API v2 [${resposta.status}] — ${detail} (traceId: ${traceId})`);
}
}

return dados;
}

API v1 — Formato fbk_xxx

Todas as respostas da API Frota162 v1 seguem um formato consistente com os campos message, error e code.

Formato de resposta

Sucesso:

{
"message": "...",
"error": false,
"code": "fbk_200"
}

Erro:

{
"message": "Descrição do erro",
"error": true,
"code": "fbk_001"
}

Códigos de retorno (fbk_xxx)

CódigoTipoDescrição
fbk_001AutenticaçãoUsuário/token não encontrado ou inválido
fbk_002AutorizaçãoSem permissão para a empresa
fbk_003ValidaçãoCampo obrigatório ausente
fbk_004Recurso não encontradoRecurso não existe ou não pertence à conta
fbk_006URL inválidaURL do webhook inválida
fbk_008DuplicataWebhook com mesma url + event_id já cadastrado
fbk_200SucessoOperação concluída com sucesso
fbk_400Requisição inválidaDados enviados inválidos ou mal formatados
fbk_500Erro internoErro inesperado no servidor

Exemplos por situação

Token inválido (fbk_001)

{
"message": "Não autorizado",
"error": true,
"code": "fbk_001"
}

Causa: Token ausente, inválido ou assinatura HMAC incorreta.

Como resolver: Verifique se o ACCESS_TOKEN está correto e recalcule a assinatura HMAC. Consulte Autenticação HMAC.


Recurso não encontrado (fbk_004)

{
"message": "Condutor não pertence a empresa que tenha acesso",
"error": true,
"code": "fbk_004"
}

Causa: O recurso solicitado não existe ou não pertence à conta autenticada.

Como resolver: Confirme o ID do recurso listando os registros disponíveis.


Operação bem-sucedida (fbk_200)

{
"message": "Condutor desabilitado com sucesso",
"error": false,
"code": "fbk_200"
}

Dados inválidos (fbk_400)

{
"message": "O campo placa é obrigatório",
"error": true,
"code": "fbk_400"
}

Causa: Campo obrigatório ausente ou dado em formato incorreto.

Como resolver: Verifique os campos obrigatórios do endpoint na documentação.


Erro interno (fbk_500)

{
"message": "Erro inesperado",
"error": true,
"code": "fbk_500"
}

Causa: Erro inesperado no servidor.

Como resolver: Tente novamente após alguns segundos. Se persistir, entre em contato com suporte@frota162.com.br.

Estratégia de retry

Código / SituaçãoFazer retry?Ação recomendada
fbk_001 (token inválido)NãoRevisar ACCESS_TOKEN e recalcular HMAC
fbk_002 (sem permissão)NãoVerificar se o token tem acesso à empresa
fbk_003 (campo ausente)NãoCorrigir os campos obrigatórios
fbk_004 (não encontrado)NãoConfirmar o ID do recurso
fbk_400 (dados inválidos)NãoCorrigir os dados enviados
fbk_500 (erro interno)SimBackoff exponencial (1s → 2s → 4s)
HTTP 429 (rate limit)SimAguardar e retentar

Exemplo de tratamento em Node.js

async function chamarApi(url, opcoes) {
const resposta = await fetch(url, opcoes);
const dados = await resposta.json();

if (dados.error) {
switch (dados.code) {
case 'fbk_001':
throw new Error('Token inválido. Verifique o ACCESS_TOKEN e recalcule o HMAC.');
case 'fbk_004':
throw new Error('Recurso não encontrado: ' + dados.message);
case 'fbk_400':
throw new Error('Dados inválidos: ' + dados.message);
case 'fbk_500':
await sleep(1000);
return chamarApi(url, opcoes);
default:
throw new Error('Erro da API: ' + dados.message);
}
}

return dados.message;
}

function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}

Contato com suporte

Se encontrar erros persistentes, entre em contato em suporte@frota162.com.br informando:

Para erros da API v2:

  • A URL e método HTTP da requisição
  • O campo type do erro retornado
  • O campo traceId retornado
  • O campo detail e o status HTTP

Para erros da API v1:

  • A URL e método HTTP da requisição
  • O código de erro (fbk_xxx) retornado
  • A mensagem de erro completa
  • Timestamp da ocorrência