Pular para o conteúdo

Erros

Os códigos que a API devolve, o que significam e como tratar cada um.

Erro tem contrato. O código HTTP e o campo code são estáveis: trate por eles, nunca pelo texto de message, que pode mudar.

{
  "error": {
    "code": "documento_invalido",
    "message": "CPF inválido."
  }
}

Códigos

HTTP code O que aconteceu O que fazer
401 token_invalido Token ausente, inválido ou expirado Confira o cabeçalho e o token
402 sem_saldo Saldo abaixo do preço da consulta Adicione saldo
403 escopo_insuficiente O token não tem o escopo da operação Crie um token com o escopo certo
403 conta_inativa Conta suspensa ou inativa Fale com o suporte
403 bloqueado Acesso bloqueado, por exemplo IP fora da lista do token Confira os endereços permitidos
404 servico_indisponivel A consulta não existe ou não está liberada para a conta Confira o identificador no catálogo
404 sem_dados Documento válido, mas sem registro para ele Trate como resposta negativa, não como falha
409 idempotency_conflito A chave de idempotência já foi usada em outra consulta Use uma chave nova por operação
409 idempotency_em_processamento A consulta com essa chave ainda está rodando Espere e repita
422 documento_invalido CPF ou CNPJ não passa na validação Corrija antes de reenviar
422 entrada_invalida Falta ou está errado um campo da consulta Veja campos na resposta
429 rate_limit Chamadas demais por segundo Espere e repita com recuo
429 teto_excedido O token atingiu o teto de gasto Ajuste o teto no painel
500 erro_interno Falha nossa ao processar Repita; se persistir, avise o suporte
502 falha_fornecedor A origem do dado recusou a consulta Repita mais tarde
502 payload_incompativel A origem respondeu sem dado utilizável Repita mais tarde
503 fornecedor_offline A origem do dado está fora do ar Repita com recuo
504 fornecedor_timeout A origem do dado não respondeu a tempo Repita com recuo

Em entrada_invalida, a resposta traz também campos, com o motivo de cada campo recusado:

{
  "error": {
    "code": "entrada_invalida",
    "message": "Confira os campos enviados.",
    "campos": { "selfie_img": "é obrigatório" }
  }
}

Consulta que falha não é cobrada

Nenhum dos erros acima debita saldo, incluindo o sem_dados. A cobrança só acontece quando a consulta é concluída com sucesso.

Repetir com recuo

Para 429, 503 e 504, repita com intervalo crescente em vez de insistir. Mande sempre a mesma Idempotency-Key nas repetições: se a primeira tentativa tiver chegado ao fim do nosso lado, você recebe aquele resultado e não paga de novo.

async function consultarComRecuo(slug, corpo, tentativas = 3) {
  const chave = crypto.randomUUID()

  for (let i = 0; i < tentativas; i++) {
    const resposta = await fetch(`https://api.radardata.com.br/api/v2/${slug}`, {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${process.env.RADARDATA_TOKEN}`,
        'Content-Type': 'application/json',
        'Idempotency-Key': chave,
      },
      body: JSON.stringify(corpo),
    })

    if (![429, 503, 504].includes(resposta.status)) return resposta

    // 1s, 2s, 4s
    await new Promise((ok) => setTimeout(ok, 2 ** i * 1000))
  }

  throw new Error('A consulta seguiu indisponível depois de 3 tentativas.')
}

Não repita em 401, 402, 403 ou 422: o resultado seria o mesmo.