Todo erro segue o mesmo envelope, com um error.code estável que você pode tratar programaticamente. Os códigos abaixo estão organizados pelo HTTP status.
{
"error": {
"code": "customer_pending",
"message": "Customer is pre-registered but not yet activated. Re-send the request with an `activate` block to perform first-touch activation, or activate the customer separately first."
},
"request_id": "req_…"
}
Cliente está em status = blocked (suspensão administrativa ou CPF inelegível na validação interna).
o que fazer
Não retentar. Notificar o cliente externamente. Se foi um bloqueio transitório, ele será desbloqueado automaticamente pelo time interno e a próxima chamada passará.
json
{
"error": {
"code": "customer_blocked",
"message": "Customer is blocked and cannot transact."
}
}
Sua chave não carrega o verbo necessário (ex.: customers:register, customers:activate, recurring:bill_payment). Mensagem inclui o verbo específico, e a resposta vem com error.hint + error.docs indicando qual trilha é dona do verbo e o que usar no lugar.
o que fazer
Ler error.hint primeiro — ele já diz se o verbo é de outra trilha. Se a sua persona realmente precisa do verbo, confira as permissões da chave em Portal → API Keys. Lojistas mch_ recurrency/hybrid recebem por padrão todos os verbos do quickstart. Lojistas varejo (retail-only) recebem somente leitura — peça à equipe Bumcash para liberar payments:create se você precisa enviar cashback via API.
json
{
"error": {
"code": "insufficient_permissions",
"message": "Merchant API key is missing required permission: payments:create",
"hint": "Verbo da trilha varejo (POST /payments/pos-cashback). Empresas de recorrência (telecom, academia) usam POST /recurring/bill-payment com bloco activate.",
"docs": "https://docs.bumcash.com.br/recurrency/quickstart#passo-2"
}
}
Duas opções: (a) chamar POST /customers/register antes de tentar transacionar, ou (b) incluir o bloco activate na própria chamada de bill-payment / pos-cashback (a ativação cria o cliente).
json
{
"error": {
"code": "customer_not_found",
"message": "Customer not found. Pre-register the CPF via POST /customers/register, or include an `activate` block on this request to perform first-touch activation."
}
}
Recurso genérico não existe ou não está acessível à sua chave —location_id errado, transação de outra organização, webhook inexistente, etc.
o que fazer
Conferir o ID enviado. Se a sua chave é mch_, ela só consegue ver locais da própria organização — IDs fora desse escopo aparecem como 404, não 403, para evitar enumeração.
external_reference_id já está em uso na sua organização para um cliente diferente. O índice único (merchant_org_id, external_reference_id) bloqueia a alias acidental.
o que fazer
Verificar na sua base interna se você está tentando reciclar um ID já usado. Reusar o mesmo external_reference_id para o mesmo CPF é OK (idempotente); reusá-lo para outro CPF não é.
Mesma idempotency_key usada anteriormente, mas com parâmetros diferentes. A política Bumcash é mesma chave = mesmo resultado por 90 dias; mudar o payload não é permitido.
o que fazer
Gerar uma idempotency_key nova para a nova intenção. Mesma chave + mesmo payload = retorna o registro original.
Erro inesperado do lado da Bumcash. Não retentar imediatamente — pode duplicar trabalho se a primeira já tiver sido aplicada.
o que fazer
Enviar o request_id para o suporte Bumcash e aguardar. Se for crítico, retentar com a mesma idempotency_key garante que chamadas duplicadas não causem efeito colateral.