Documentação da API

Erros, request_id, idempotência e rate limit

Envelope de erro

As rotas /developer/* respondem erros no formato abaixo, com um code estável para o seu código tratar e o request_id (também no header X-Request-Id) para o suporte localizar a chamada.

{
  "success": false,
  "message": "Esta chave não tem o escopo 'payments:read'.",
  "error": {
    "code": "insufficient_scope",
    "message": "Esta chave não tem o escopo 'payments:read'.",
    "details": {
      "required_scope": "payments:read"
    },
    "request_id": "req_01J9..."
  },
  "request_id": "req_01J9..."
}
HTTPcodeQuando
400bad_requestRequisição malformada
401invalid_api_keyChave ausente ou inválida
401api_key_revoked / api_key_expiredChave revogada ou expirada
403insufficient_scopeA chave não tem o escopo da rota
403account_inactiveConta suspensa ou inativa
404payment_not_found, withdrawal_not_found, not_foundRecurso inexistente neste ambiente
409idempotency_key_in_progressMesma Idempotency-Key ainda em processamento
422idempotency_key_reusedMesma Idempotency-Key com rota ou corpo diferentes
422validation_errorCampos inválidos (detalhes em errors)
429rate_limitedLimite da chave atingido
5xxinternal_errorErro nosso: tente de novo com a mesma Idempotency-Key

Erros na criação de cobranças

As rotas POST /payments/{metodo} mantêm o formato antigo por compatibilidade: o código estável vem em error_code (compare sem diferenciar maiúsculas), o texto em message, os erros por campo em errors e o request_id no corpo. O campo error, quando vem, pode ser um texto.

{
  "success": false,
  "message": "Erro de validação: O número de telefone é obrigatório.",
  "errors": {
    "phone": [
      "O número de telefone é obrigatório."
    ]
  },
  "error_code": "validation_error",
  "request_id": "6f1c..."
}
HTTPerror_codeQuando
401invalid_api_key, api_key_revoked, api_key_expiredChave ausente, inválida, revogada ou expirada
403insufficient_scopeChave sem payments:write (aqui o erro vem em error.code)
403account_pending_approvalConta ainda não aprovada pela equipe
403account_inactiveConta suspensa ou bloqueada
422validation_errorCampos inválidos (veja errors); order_id repetido também cai aqui
422amount_out_of_limitsValor fora dos limites da plataforma
422idempotency_key_reusedMesma Idempotency-Key com corpo diferente
429rate_limitedMais de 30 criações por minuto do mesmo IP

Idempotência

Envie Idempotency-Key (até 255 caracteres) nas criações, estornos e simulações. Mesma chave + mesma rota + mesmo corpo em até 24 h devolve a resposta original com o header Idempotent-Replayed: true, sem executar de novo. Mesma chave com rota ou corpo diferente: 422 idempotency_key_reused. Ainda processando: 409 idempotency_key_in_progress. Respostas 5xx e 429 não são guardadas, então é seguro tentar de novo. As chaves valem por ambiente: a mesma Idempotency-Key usada no sandbox não devolve a resposta de teste numa chamada de produção.

Limites de requisição

A API pública (/developer/*) limita por chave: 120 requisições por minuto por padrão. Toda resposta traz X-RateLimit-Limit e X-RateLimit-Remaining; no limite, 429 com Retry-After em segundos. A criação de pagamentos tem limite próprio de 30 por minuto por IP.

Versão

Os webhooks levam api_version. Mudanças incompatíveis ganham nova versão e são anunciadas no changelog.