Boleto

Requer autenticação
POST/v2/transactions/boleto

Gera um boleto bancário (ou boleto híbrido com PIX) e retorna a linha digitável, código de barras e URL do PDF. O valor é creditado no seu saldo assim que o boleto é pago. Você recebe o webhook cashin.confirmed na postback_url (ver Webhooks).

Dois modos suportados:

  • BOLETO — boleto puro
  • PIX_BOLETO — híbrido: o cliente pode pagar via QR Code PIX ou via boleto bancário (mesma transação, qualquer um dos dois meios liquida)

O endpoint legado /v2/boleto continua ativo com schema v1 (bloco boleto separado). Novos clientes devem usar /v2/transactions/boleto.

Parâmetros
amountnumberobrigatório
Valor do boleto em BRL (até 2 decimais). Mínimo: 1.00.
methodstring
Modo de cobrança. Valores: BOLETO (padrão), PIX_BOLETO.
payer.namestringobrigatório
Nome completo do pagador.
payer.documentstringobrigatório
CPF (11 dígitos) ou CNPJ (14 dígitos) do pagador. Validação automática.
payer.emailstringobrigatório
E-mail válido do pagador.
payer.phonestringobrigatório
Telefone do pagador — 8 a 12 dígitos, apenas números.
payer.address.addressstringobrigatório
Logradouro (rua, avenida).
payer.address.numberstring
Número do endereço.
payer.address.complementstring
Complemento (apto, bloco, sala).
payer.address.districtstringobrigatório
Bairro.
payer.address.citystringobrigatório
Cidade.
payer.address.zipCodestringobrigatório
CEP (8 dígitos, apenas números).
payer.address.ufstringobrigatório
UF do endereço (2 letras maiúsculas, ex: SP).
due_datestring
Data de vencimento no formato YYYY-MM-DD. Default: hoje + 3 dias.
descriptionstring
Descrição do boleto (até 250 caracteres).
external_idstring
Identificador único no seu sistema (idempotência). Reenviar o mesmo external_id retorna a mesma transação.
postback_urlstring
URL HTTPS que receberá o webhook cashin.confirmed. Sobrescreve o webhook default da credencial.
splitarray
Divisão automática do valor entre contas BSPAY. Ver Split.

Rate limit

60 reqs/min por credencial.

Erros

CódigoHTTPDescrição
MISSING_REQUIRED_FIELD400Campo obrigatório ausente (amount, payer.*)
INVALID_AMOUNT422Valor inválido ou abaixo do mínimo
INVALID_DOCUMENT422CPF/CNPJ do pagador inválido
EXCEEDS_MAX_LIMIT409Valor acima do máximo permitido — details.max_cashin
LIMIT_EXCEEDED409Limite diário atingido
CASHIN_BLOCKED403Cashin bloqueado pela administração
ACCOUNT_UNDER_REVIEW403Conta em revisão de compliance
PERMISSION_DENIED403Credencial sem permissão can_cashin
PROVIDER_ERROR502Erro no provedor do boleto — retryable

Boleto puro

cURL
PHP
JavaScript
Python
curl -X POST https://api.bspay.co/v2/transactions/boleto \
  -H "Authorization: Bearer SEU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 150.00,
    "method": "BOLETO",
    "external_id": "pedido_123",
    "due_date": "2026-10-20",
    "description": "Pedido #123",
    "payer": {
      "name": "João da Silva",
      "document": "11370243480",
      "email": "[email protected]",
      "phone": "11987654321",
      "address": {
        "address": "Avenida Paulista",
        "number": "1000",
        "complement": "Sala 101",
        "district": "Bela Vista",
        "city": "São Paulo",
        "zipCode": "01310100",
        "uf": "SP"
      }
    },
    "postback_url": "https://seusite.com/webhook"
  }'

Híbrido PIX + Boleto — mesmo payload, mas method: "PIX_BOLETO". O response inclui qrcode dentro de payment_info:

curl -X POST https://api.bspay.co/v2/transactions/boleto \
  -H "Authorization: Bearer SEU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 150.00,
    "method": "PIX_BOLETO",
    "external_id": "pedido_124",
    "payer": { ... },
    "postback_url": "https://seusite.com/webhook"
  }'
200 BOLETO
200 PIX_BOLETO
registration pendente
{
  "success": true,
  "data": {
    "transaction_id": "bc29f8989cc0ab75a9c4a691e716bbf4",
    "external_id": "pedido_123",
    "currency": "BRL",
    "amount": 150.00,
    "fee": 1.50,
    "payment_method": "boleto",
    "payment_info": {
      "barcode": "23795000020000015000900100012345678900000012345",
      "digitable_line": "23790.00005 00000.015008 00100.012345 6 78900000012345",
      "url": "https://provider.example.com/boleto/abc123.pdf",
      "due_date": "2026-10-20",
      "registration": "registered"
    },
    "status": "pending",
    "postback_url": "https://seusite.com/webhook",
    "created_at": "2026-10-13T15:00:00-03:00"
  },
  "request_id": "7ff30940df6de2e368af7ea2",
  "timestamp": "2026-10-13T18:00:00Z"
}

registration: pending_registration: o boleto foi aceito no gateway mas ainda não foi registrado no banco. A linha digitável/barcode chega via webhook cashin.boleto_registered quando o registro conclui (normalmente em < 60s). Esse status é raro — a maioria dos boletos é retornada já registered.

Endpoint legado — /v2/boleto (schema v1)

Mesmo payload do endpoint v2. Retorna o schema legado, com bloco boleto separado em vez de payment_info:

200 v1 — BOLETO
200 v1 — PIX_BOLETO
{
  "transaction_id": "bc29f8989cc0ab75a9c4a691e716bbf4",
  "external_id": "pedido_123",
  "amount": 150.00,
  "payment_method": "BOLETO",
  "status": "pending",
  "boleto": {
    "barcode": "23795000020000015000900100012345678900000012345",
    "digitable_line": "23790.00005 00000.015008 00100.012345 6 78900000012345",
    "url": "https://provider.example.com/boleto/abc123.pdf",
    "due_date": "2026-10-20",
    "registration": "registered"
  }
}

Os dois endpoints criam a mesma transação (mesma transaction_id), mesmo gateway, mesmo webhook. A única diferença é o schema do response. Clientes integrados ao /v2/boleto continuam funcionando sem alteração.

Esta página foi útil?