Trilha — Recorrência
Quickstart de integração
Para empresas de recorrência — telecom, academia, condomínio, convênio. Em ~10 minutos sua primeira fatura é paga e o BMC fica creditado na carteira do cliente.
Modelo mental — leia antes dos curls
A integração de recorrência tem três momentos distintos no ciclo de vida do cliente:
Por que este desenho: o cliente assina o serviço na sua plataforma meses antes da primeira cobrança. Pré-cadastrá-lo na hora da assinatura cria o vínculo com sua loja imediatamente — sem disparar a validação oficial do CPF (que tem custo). A validação + ativação acontece quando a primeira fatura real chega: uma única chamada à API faz a ativação e o crédito de BMC na mesma transação.
Pré-requisitos
- CNPJ aprovado pela equipe Bumcash (status approved no portal).
- Termos de Uso aceitos no portal.
- Pelo menos um local cadastrado com companyType = recurrency (ou hybrid) e integrationMode = self.
- Chave Merchant sandbox emitida no portal (bmc_test_mch_…). Para sandbox, use a base de fixtures pré-cadastrados — testes não disparam a validação real.
Sua chave deve carregar as permissões customers:register, customers:activate, recurring:bill_payment, customers:query,refunds:create, transactions:list, statements:read, earnings:read. São os defaults para um lojista recurrency/hybrid.
URL base
https://api-v2.bumcash.com.br/v1Passo 1
Pré-cadastrar o cliente
Chame este endpoint no momento em que o cliente assina o serviço na sua plataforma, não no momento da primeira cobrança. Cria o vínculo cliente↔loja com status = pending. Não dispara a validação oficial do CPF — esse passo fica para a primeira fatura.
/v1/customers/registerperm: customers:registercurl -X POST https://api-v2.bumcash.com.br/v1/customers/register \
-H "Authorization: Bearer bmc_test_mch_xxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"location_id": "loc_f1b2f0bf-7e8f-4a16-93da-1b6120e475e1",
"customer_cpf": "71593209991",
"customer_phone": "+5511987654321",
"external_reference_id": "samuel_subscription_42",
"idempotency_key": "register_samuel_2026-05-02"
}'Resposta — 201 Created
{
"id": "cust_a1b2c3d4e5f6",
"cpf": "71593209991",
"phone": "+5511987654321",
"status": "pending",
"registered_by_location_id": "loc_f1b2f0bf-7e8f-4a16-93da-1b6120e475e1",
"external_reference_id": "samuel_subscription_42",
"registered_at": "2026-05-02T18:30:00.000Z"
}| Campo | Tipo | Obrig. | Notas |
|---|---|---|---|
| location_id | string | ✓ | Sua loja recurrency/hybrid. |
| customer_cpf | string (11 dígitos) | ✓ | Sem pontuação. Identificador autoritativo. |
| customer_phone | string E.164 | — | Opcional. Se enviado, é gravado para uso futuro (notificações, ativação). |
| external_reference_id | string | — | ID interno do cliente no seu ERP/CRM. Aparece em webhooks e listagens. Único dentro da sua organização. |
| idempotency_key | string | — | Opcional. Útil para retentativas seguras de rede; mantida 90 dias. |
Passo 2
Notificar a primeira fatura (ativa o cliente)
Quando a primeira fatura real do cliente é paga, chame /recurring/bill-payment com o bloco activate. Numa única chamada o CPF é validado, o cliente passa para status = active, e o BMC é creditado.
/v1/recurring/bill-paymentperm: recurring:bill_payment + customers:activatecurl -X POST https://api-v2.bumcash.com.br/v1/recurring/bill-payment \
-H "Authorization: Bearer bmc_test_mch_xxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"location_id": "loc_f1b2f0bf-7e8f-4a16-93da-1b6120e475e1",
"customer_cpf": "71593209991",
"bill_amount": 8990,
"reference_external_id": "fatura_2026_05",
"activate": {
"cpf": "71593209991",
"phone": "+5511987654321"
},
"idempotency_key": "bill_samuel_2026-05_v1"
}'Resposta — 201 Created
{
"id": "rbp_9f8e7d6c5b4a",
"location_id": "loc_f1b2f0bf-7e8f-4a16-93da-1b6120e475e1",
"customer_id": "cust_a1b2c3d4e5f6",
"bill_amount": 8990,
"coins_minted": 8990,
"customer_activation": "activated",
"created_at": "2026-05-02T18:35:00.000Z"
}- Valores em centavos. R$ 89,90 =
8990. Para locais comrecurrency_conversion_rate = 100(default) é 1:1. customer_activationé uma enum:"activated"(esta chamada efetivou a ativação) ou"already_active"(cliente já estava ativo).- O bloco
activateé idempotente: cliente já ativo? Bloco vira no-op e o BMC é creditado normalmente.
Passo 3
Notificar faturas subsequentes
Da segunda fatura em diante, omita o bloco activate. O cliente já está active.
/v1/recurring/bill-paymentperm: recurring:bill_paymentcurl -X POST https://api-v2.bumcash.com.br/v1/recurring/bill-payment \
-H "Authorization: Bearer bmc_test_mch_xxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"location_id": "loc_f1b2f0bf-7e8f-4a16-93da-1b6120e475e1",
"customer_cpf": "71593209991",
"bill_amount": 8990,
"reference_external_id": "fatura_2026_06",
"idempotency_key": "bill_samuel_2026-06_v1"
}'{
"id": "rbp_5b4a3f2e1d0c",
"location_id": "loc_f1b2f0bf-7e8f-4a16-93da-1b6120e475e1",
"customer_id": "cust_a1b2c3d4e5f6",
"bill_amount": 8990,
"coins_minted": 8990,
"customer_activation": "already_active",
"created_at": "2026-06-02T18:35:00.000Z"
}Erros que você vai encontrar
Resumo dos códigos mais comuns desta trilha. Veja todos em referência de erros.
| HTTP | error.code | Causa | O que fazer |
|---|---|---|---|
| 400 | customer_pending | Cliente está pending e a chamada não traz activate. | Re-enviar com bloco activate. |
| 400 | customer_blocked | Cliente está blocked (suspenso/falecido). | Não retentar. Notificar internamente. |
| 404 | customer_not_found | CPF não tem registro. | Chamar /customers/register antes — bill-payment não auto-cadastra sem activate. |
| 403 | insufficient_permissions | Sua chave não tem o verbo necessário. | Conferir as permissões da chave no portal. |
| 409 | conflict | external_reference_id já está em uso na sua organização para um cliente diferente. | Use um external_reference_id diferente. |
Conciliação
GET /statements?location_id=…— extratos por período. Cada extrato traz total devido + contagem de transações.GET /statements/:id— line items para conciliar contra sua base.POST /refunds— estornar umabill-paymentespecífica. Requerrefunds:create.GET /transactions— listagem das suas transações (mints, pagamentos, estornos).
Webhooks recomendados
Subscreva no portal em Webhooks → Endpoints:
- customer.activated
- Cliente passou de pending → active (na 1ª fatura com activate).
- recurring.bill_payment.succeeded
- BMC creditado com sucesso.
- recurring.bill_payment.refunded
- Estorno processado.
Sandbox — fixtures pré-cadastrados
Para testar sem cadastrar nada, use estes identificadores que já existem no banco sandbox:
| Recurso | Tipo | Valor | Telefone |
|---|---|---|---|
| Local recorrência | CNPJ | 11111111000111 | |
| Local híbrido | CNPJ | 22222222000122 | |
| Cliente sandbox 1 | CPF | 11111111111 | +5511900000001 |
| Cliente sandbox 2 | CPF | 22222222222 | +5511900000002 |
| Cliente sandbox 3 | CPF | 33333333333 | +5511900000003 |
Checklist para produção
- Pré-cadastro chamado no signup do serviço (não no primeiro billing).
- idempotency_key derivada de algo estável da sua base (ex: bill_<contract_id>_<period>), não um UUID aleatório por retentativa.
- Webhook receptor com verificação HMAC + dedup por transaction_id.
- Tratamento de erros 4xx é específico por código (não retentar 4xx exceto idempotency_conflict com nova chave).
- Conciliação contábil bate GET /statements contra sua base de cobranças mensais.
- Validado em sandbox com fixtures, depois trocada a chave para bmc_live_mch_…