Respostas HTTP

Formato padrão das respostas da API

Toda resposta da API segue o mesmo formato JSON. Sucesso ou erro, a estrutura é previsível.

Sucesso

Requisição processada com sucesso:

{
  "success": true,
  "data": {
    // dados da resposta variam por endpoint
  },
  "request_id": "1a65b43fce4aa7c60f22d59d",
  "timestamp": "2026-04-04T13:19:02Z"
}
CampoTipoDescrição
successbooleanSempre true em respostas de sucesso
dataobjectObjeto contendo os dados da resposta
request_idstringID único da requisição (útil para suporte)
timestampstringData/hora ISO 8601 da resposta

Exemplo real — Consultar Saldo:

{
  "success": true,
  "data": {
    "balances": [
      {
        "type": "fiat",
        "currency": "BRL",
        "available": "8446.75",
        "blocked": "7682.19",
        "pending": "0.00",
        "total": "16128.94",
        "price_usd": "0.19385044",
        "price_brl": "1.00000000"
      }
    ],
    "wallet_total_usd": "106172.09817828",
    "wallet_total_brl": "547701.08443680"
  },
  "request_id": "1a65b43fce4aa7c60f22d59d",
  "timestamp": "2026-04-04T13:19:02Z"
}

Nota: Alguns endpoints legados (ex: /v2/pix/qrcode) retornam o payload diretamente sem o envelope success/data.

Erro

Quando algo dá errado, a resposta segue este formato:

{
  "success": false,
  "error": {
    "code": "CODIGO_DO_ERRO",
    "message": "Descrição amigável do erro",
    "group": "VALIDATION",
    "retryable": false
  }
}
CampoTipoDescrição
successbooleanSempre false em erros
error.codestringCódigo do erro (use para tratamento no código)
error.messagestringMensagem legível (pode exibir ao usuário)
error.groupstringGrupo do erro: AUTH, VALIDATION, FINANCIAL, SYSTEM
error.retryablebooleanSe true, a requisição pode ser repetida automaticamente

Alguns erros incluem detalhes extras:

{
  "success": false,
  "error": {
    "code": "MISSING_REQUIRED_FIELD",
    "message": "A required field is missing.",
    "group": "VALIDATION",
    "retryable": false,
    "details": {
      "fields": ["amount", "currency"]
    }
  }
}

Exemplo real — Token inválido:

{
  "success": false,
  "error": {
    "code": "INVALID_TOKEN",
    "message": "Invalid or malformed authentication token.",
    "group": "AUTH",
    "retryable": false
  }
}

Exemplo real — Credenciais inválidas (OAuth):

{
  "success": false,
  "error": {
    "code": "INVALID_CREDENTIALS",
    "message": "Invalid authentication credentials.",
    "group": "AUTH",
    "retryable": false
  }
}

Códigos HTTP

CódigoSignificadoQuando acontece
200OKOperação síncrona concluída
201CriadoRecurso criado
202AceitoOperação assíncrona aceita — confirmação chega via webhook (cashout, transfer, conversion)
400Requisição InválidaDados enviados estão incorretos
401Não AutenticadoToken inválido / expirado / sem assinatura HMAC
403ProibidoSem permissão, IP bloqueado ou conta sob revisão
404Não EncontradoRecurso não existe
409ConflitoDuplicidade, limite excedido ou conflito de saldo
415Tipo Não SuportadoContent-Type incorreto
422Não ProcessávelDados válidos mas não aceitos (saldo insuf., chave inválida)
423BloqueadoConta bloqueada temporariamente
428Pré-condiçãoAção adicional necessária (ex: 2FA)
429Muitas RequisiçõesRate limit excedido
500Erro InternoErro no servidor (contate o suporte)
502Bad GatewayErro no provedor (PIX/blockchain) — retryable
503IndisponívelServiço temporariamente fora — retryable

Catálogo de erros

Autenticação

CódigoHTTPRetryableDescrição
MISSING_AUTH_HEADER401nãoHeader Authorization ausente
INVALID_AUTH_FORMAT401nãoFormato do Authorization incorreto
INVALID_CREDENTIALS401nãoclient_id/client_secret inválidos
INVALID_TOKEN401nãoToken Bearer inválido ou malformado
TOKEN_EXPIRED401nãoToken Bearer expirou — gere um novo
UNAUTHORIZED403nãoSem autorização para este recurso
FORBIDDEN403nãoAcesso negado
UNAUTHORIZED_IP403nãoIP não está na whitelist da credencial
INVALID_OTP401nãoCódigo OTP/2FA incorreto
CREDENTIAL_PENDING_ADMIN_ACTIVATION403nãoCredencial aguardando ativação do admin

Assinatura HMAC (rotas financeiras)

CódigoHTTPRetryableDescrição
MISSING_SIGNATURE401nãoHeader X-Signature ausente
MISSING_TIMESTAMP401nãoHeader X-Timestamp ausente
MISSING_NONCE401nãoHeader X-Nonce ausente
INVALID_SIGNATURE401nãoAssinatura HMAC não bate com hash recalculado
INVALID_TIMESTAMP401nãoTimestamp fora da janela ±5 min
REPLAY_DETECTED401nãoNonce já usado nos últimos 5 min

Segurança

CódigoHTTPRetryableDescrição
RATE_LIMIT_EXCEEDED429sim (após Retry-After)Muitas requisições
IP_BLACKLISTED403nãoIP permanentemente bloqueado
IP_BLOCKED_TEMPORARILY403sim (após 5 min)IP bloqueado por 5 min após 5 falhas de auth
SECURITY_BLOCKED423nãoBloqueio de segurança ativo
ACCOUNT_UNDER_REVIEW403nãoConta sob análise — operação suspensa

Validação

CódigoHTTPRetryableDescrição
INVALID_PAYLOAD400nãoCorpo da requisição inválido
INVALID_JSON400nãoJSON malformado
MISSING_REQUIRED_FIELD400nãoCampo obrigatório ausente — details.field
INVALID_FORMAT422nãoFormato de dado inválido
INVALID_VALUE422nãoValor não aceito
INVALID_AMOUNT422nãoValor monetário inválido (deve ser > 0, até 2 decimais)
INVALID_CURRENCY422nãoMoeda não suportada
INVALID_PIX_KEY422nãoChave PIX inválida
INVALID_SPLIT_CONFIG422nãoConfiguração de split inválida
SELF_TRANSFER_BLOCKED400nãoNão pode transferir para si mesmo
UNSUPPORTED_CONTENT_TYPE415nãoContent-Type não suportado
UNSUPPORTED_CHAIN422nãoBlockchain não suportada — details.supported lista chains aceitas
UNSUPPORTED_CURRENCY422nãoMoeda não suportada para esta operação

Limites e saldo

CódigoHTTPRetryableDescrição
INSUFFICIENT_BALANCE422nãoSaldo insuficiente
INSUFFICIENT_FUNDS422nãoFundos insuficientes para operação + fee
BELOW_MIN_LIMIT409nãoValor abaixo do mínimo — details.min_*
EXCEEDS_MAX_LIMIT409nãoValor acima do máximo — details.max_*
LIMIT_EXCEEDED409nãoLimite diário/mensal atingido

Negócio

CódigoHTTPRetryableDescrição
PERMISSION_DENIED403nãoSem permissão para esta operação
KYC_REQUIRED403nãoVerificação KYC necessária
DUPLICATE_RESOURCE409nãoRecurso duplicado (email, phone, etc.)
DUPLICATE_EXTERNAL_ID409nãoexternal_id já utilizado
PENDING_APPROVAL403nãoOperação pendente de aprovação
MISSING_FEE_CONFIG404nãoConfiguração de taxa não encontrada

Transações

CódigoHTTPRetryableDescrição
TRANSACTION_NOT_FOUND404nãoTransação não encontrada
TRANSACTION_ALREADY_DONE409nãoTransação já processada
INTERNAL_CONFLICT409simConflito de concorrência no saldo — retry com nonce novo

Credenciais

CódigoHTTPRetryableDescrição
CREDENTIAL_NOT_FOUND404nãoCredencial não encontrada
CREDENTIAL_LIMIT_REACHED409nãoLimite de credenciais atingido
CREDENTIAL_ALREADY_ACTIVE409nãoCredencial já está ativa

Sistema / Provedor

CódigoHTTPRetryableDescrição
INTERNAL_ERROR500simErro interno do servidor
PROVIDER_ERROR502simErro no provedor (PIX/blockchain)
SERVICE_UNAVAILABLE503simServiço temporariamente fora

Paginação

Endpoints que retornam listas incluem metadados de paginação:

{
  "success": true,
  "data": {
    "items": [ ... ],
    "pagination": {
      "page": 1,
      "page_size": 50,
      "count": 20,
      "total": 150,
      "total_pages": 8,
      "has_next": true,
      "has_prev": false
    },
    "summary": {
      "total_transactions": 150,
      "total_in": "1000.00",
      "total_out": "500.00",
      "total_fees": "15.00"
    }
  },
  "request_id": "39316c1fcf4333e9f4726180",
  "timestamp": "2026-04-04T13:20:30Z"
}
ParâmetroTipoDescrição
pageintegerPágina atual
page_sizeintegerItens por página
countintegerItens retornados nesta página
totalintegerTotal de registros
total_pagesintegerTotal de páginas
has_nextbooleanSe existe próxima página
has_prevbooleanSe existe página anterior

Boas práticas

  1. Trate erros pelo code, não pela message — mensagens podem mudar entre versões
  2. Retry com backoff para 429 e 503. Nunca retry em outros 4xx
  3. Logue request_id em caso de erro — agiliza o suporte
  4. Verifique retryable antes de implementar retry automático
  5. Não parse HTML — respostas são sempre JSON, mesmo em erros 500

Esta página foi útil?