Pular para o conteúdo

Idempotência - Evitar Duplicados

Para evitar a criação de boletos duplicados em cenários de retry, falhas de rede ou requisições concorrentes, a API Boleto Cloud suporta o padrão de idempotência através do campo boleto.tokenControleUsuario.

Em integrações via API, situações como timeout de rede, erros de conexão ou processamento lento podem fazer com que sua aplicação reenvie a mesma requisição. Sem um mecanismo de proteção, isso pode resultar em:

  • Boletos duplicados para o mesmo pagador
  • Cobranças indevidas
  • Inconsistência entre seu sistema e o Boleto Cloud

O tokenControleUsuario é um identificador único definido por você que garante que cada boleto seja criado apenas uma vez.

┌─────────────────────────────────────────────────────────────────────────┐
│ FLUXO DE IDEMPOTÊNCIA │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 1ª Requisição 2ª Requisição (retry) │
│ tokenControleUsuario="pedido-123" tokenControleUsuario="pedido-123"
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ API verifica: │ │ API verifica: │ │
│ │ Token existe? │ │ Token existe? │ │
│ └────────┬────────┘ └────────┬────────┘ │
│ │ NÃO │ SIM │
│ ▼ ▼ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Cria o boleto │ │ Retorna erro │ │
│ │ Retorna 201 │ │ 409 Conflict │ │
│ └─────────────────┘ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
  1. Você envia uma requisição com um tokenControleUsuario único
  2. A API verifica se esse token já foi utilizado
  3. Se não existir: cria o boleto e retorna 201 Created
  4. Se já existir: retorna 409 Conflict, indicando que o boleto já foi criado
AtributoValor
Campoboleto.tokenControleUsuario
Tipostring
Tamanho máximo44 caracteres
Caracteres permitidosAlfanuméricos e \ - _ =
UnicidadeObrigatória (único por boleto)
ObrigatoriedadeOpcional, mas altamente recomendado
Terminal window
curl -v "https://sandbox.boletocloud.com/api/v1/boletos" \
-H "Content-Type: application/x-www-form-urlencoded; charset=utf-8" \
-X "POST" \
-u "api-key_SUA-API-KEY:token" \
-d boleto.conta.token="api-key_SEU-TOKEN-DA-CONTA" \
-d boleto.tokenControleUsuario="pedido-12345-abc" \
-d boleto.pagador.nome="Alberto Santos Dumont" \
...
{
"batch": {
"boletos": [
{
"tokenControleUsuario": "pedido-12345-parcela-1",
"conta": { "token": "api-key_SEU-TOKEN-DA-CONTA" },
"pagador": { "nome": "Alberto Santos Dumont", ... },
"vencimento": "2024-02-15",
"valor": 500.00
},
{
"tokenControleUsuario": "pedido-12345-parcela-2",
"conta": { "token": "api-key_SEU-TOKEN-DA-CONTA" },
"pagador": { "nome": "Alberto Santos Dumont", ... },
"vencimento": "2024-03-15",
"valor": 500.00
}
]
}
}

Exemplos de tokens recomendados:

CenárioExemplo de Token
Pedido de e-commercepedido-12345
Fatura mensalfatura-2024-01-cliente-789
Parcela de carnêcontrato-456-parcela-3
UUID gerado550e8400-e29b-41d4-a716-446655440000

Quando receber 409 Conflict, significa que o boleto já foi criado. A API retorna nos headers todas as informações necessárias para identificar o boleto existente:

HeaderDescriçãoExemplo
X-BoletoCloud-TokenToken do boleto existenteabc123def456...
X-BoletoCloud-NIB-Nosso-NumeroNosso Número do boleto00000012345-6
X-BoletoCloud-Token-Controle-UsuarioToken de controle enviadopedido-12345-abc
LocationPath para acessar o boleto/api/v1/boletos/abc123def456
Terminal window
# Ao usar -v (verbose), os headers são exibidos na saída
# Em caso de 409 Conflict, a resposta incluirá:
#
# < HTTP/1.1 409 Conflict
# < X-BoletoCloud-Token: abc123def456...
# < X-BoletoCloud-NIB-Nosso-Numero: 00000012345-6
# < X-BoletoCloud-Token-Controle-Usuario: pedido-12345-abc
# < Location: /api/v1/boletos/abc123def456
curl -v "https://sandbox.boletocloud.com/api/v1/boletos" \
-H "Content-Type: application/x-www-form-urlencoded; charset=utf-8" \
-X "POST" \
-u "api-key_SUA-API-KEY:token" \
-d boleto.conta.token="api-key_SEU-TOKEN-DA-CONTA" \
-d boleto.tokenControleUsuario="pedido-12345-abc" \
-d boleto.pagador.nome="Alberto Santos Dumont" \
...
CenárioRecomendação
Integrações via APISempre usar
E-commerce / CheckoutSempre usar (evita cobranças duplicadas)
Geração em loteSempre usar (cada boleto com token único)
Sistemas com retry automáticoSempre usar
Ambientes com alta concorrênciaSempre usar