CaktoDevelopers
Referência

Erros HTTP

Referência de erros HTTP retornados pela Cakto Payments API.

Erros HTTP

HTTP 400 — Validação ou bloqueio

Erro de validação no payload ou pagamento bloqueado por regra interna.

{ "error": "Recusado por análise de risco" }
{
  "errors": {
    "threeDSecure": ["Cavv, Eci e Version são obrigatórios para pagamento 3DS."]
  }
}
{
  "errors": {
    "amount": ["Este campo é obrigatório."]
  }
}

Causas comuns de HTTP 400

Mensagem de erroCausaSolução
"Recusado por análise de risco"Fraude detectadaNão revelar ao usuário — exibir mensagem genérica
"Cavv, Eci e Version são obrigatórios..."threeDSecure incompletoVerificar se onSuccess foi chamado antes do checkout
"Este campo é obrigatório"Campo faltando no payloadVerificar campos obrigatórios na referência de request
"Seller not found"user (Merchant ID) inválidoVerificar Merchant ID com a equipe Cakto
"docType inválido"docType com letra maiúsculaUsar "cpf" ou "cnpj" (minúsculas)

HTTP 401 — Não autenticado

{ "detail": "Authentication credentials were not provided." }

Verifique o header Authorization: Token {API_TOKEN}.


HTTP 403 — Permissão negada

{ "detail": "You do not have permission to perform this action." }

O Merchant ID no campo user não corresponde às credenciais fornecidas.


HTTP 429 — Rate limit

Muitas requisições em curto período.

Estratégia recomendada: Retry com backoff exponencial.

async function fetchWithRetry(url, options, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    const response = await fetch(url, options)
    if (response.status !== 429) return response

    const delay = Math.pow(2, attempt) * 1000  // 1s, 2s, 4s
    await new Promise(resolve => setTimeout(resolve, delay))
  }
  throw new Error('Rate limit excedido após 3 tentativas')
}

HTTP 500 / 502 — Erro interno

Erro temporário no servidor da Cakto.

Comportamento recomendado:

  1. Logar o erro com o payload completo
  2. Aguardar 5–10 segundos
  3. Tentar novamente (máximo 3 vezes)
  4. Se persistir, exibir mensagem genérica e notificar o suporte
// Verificar se é seguro fazer retry
function isSafeToRetry(status) {
  return status === 429 || status >= 500
}

Para erros 5xx, verifique se o pagamento não foi processado antes de tentar novamente — para evitar cobranças duplicadas. Consulte o status pelo postbackUrl (webhook) ou pelo ID da transação se disponível.


Timeout de rede

Configure um timeout razoável para cada tipo de chamada:

ChamadaTimeout recomendado
Token 3DS (GET /api/3ds/token/)10 segundos
Checkout (POST /api/checkout/)30 segundos
SDK 3DS bpmpi_authenticate()90 segundos (global)