DemoPay

Saldo e Saques

Consultando o saldo

GET /account-balance retorna o saldo disponível pra saque, o saldo retido em reserva financeira (se sua instância usar essa configuração) e a lista de holds pendentes:

{
  "status": 200,
  "message": "Saldo consultado com sucesso",
  "data": {
    "balance": 250000,
    "currency": "BRL",
    "reservedBalance": 12000,
    "reserveHolds": [
      {
        "chargeId": "chg_abc123",
        "amountCents": 12000,
        "releaseAt": "2026-08-14T00:00:00.000Z",
        "status": "HELD"
      }
    ]
  }
}

balance e reservedBalance estão em centavos. Um valor em reserveHolds some da lista automaticamente quando liberado — o saldo correspondente passa a contar em balance.

Sobre reserva financeira

Retenção de reserva é uma configuração por instância/empresa (não é um valor fixo da plataforma) — algumas contas não têm retenção nenhuma, e todo o valor pago fica disponível pra saque imediatamente após a confirmação do pagamento. Não existe webhook de "valor liberado" hoje — consulte este endpoint periodicamente se seu fluxo depende de saber quando um hold libera.

Fazendo um saque

O fluxo tem 3 passos: iniciar, confirmar com OTP, e (opcional) reenviar ou cancelar.

1. Iniciar

curl -X POST "https://api.sua-instancia.com/account-balance/withdraw" \
  -H "X-API-KEY: cpk_live_sua_chave_aqui" \
  -H "Content-Type: application/json" \
  -d '{ "value": 10000 }'

value em centavos, mínimo R$ 1,01 (101 centavos) mais a taxa de saque configurada na instância. Retorna um withdrawId e envia um código OTP de 6 dígitos por email pro responsável da conta.

Um saque por vez

Só existe um saque em aberto por empresa. Iniciar um novo enquanto outro está pendente retorna 409 com o withdrawId do saque já em andamento — confirme, cancele ou reenvie o OTP dele antes de tentar de novo.

2. Confirmar

curl -X POST "https://api.sua-instancia.com/account-balance/withdraw/confirm" \
  -H "X-API-KEY: cpk_live_sua_chave_aqui" \
  -H "Content-Type: application/json" \
  -d '{ "withdrawId": "withdraw_abc123", "otpCode": "123456" }'

O código expira em poucos minutos e aceita no máximo 5 tentativas erradas antes do saque ser invalidado (nesse caso, inicie um novo). Se a instância exigir aprovação manual de saques, a resposta vem com status: "PENDING_REVIEW" em vez de "APPROVED" — o saque fica parado até um super admin aprovar; senão, segue direto pra adquirente.

A confirmação junto à adquirente é assíncrona: a resposta desse endpoint reflete o saque entrando em processamento, não a liquidação final. O evento withdraw.completed (veja Webhooks) dispara quando a adquirente confirma o pagamento.

Reenviar ou cancelar

# reenviar OTP (reseta o contador de tentativas)
curl -X POST ".../account-balance/withdraw/resend-otp" -d '{ "withdrawId": "withdraw_abc123" }'

# cancelar (só funciona se ainda não foi confirmado)
curl -X POST ".../account-balance/withdraw/cancel" -d '{ "withdrawId": "withdraw_abc123" }'

Histórico

GET /account-balance/withdrawals lista os saques da conta, com status (CREATED, PENDING_REVIEW, APPROVED, CONFIRMED, FAILED, CANCELLED), valor, chave PIX usada e o endToEndId da transação quando disponível.

Saque automático

Saque automático (transferir o saldo disponível todo dia, sem chamar a API) não é autoatendimento — é configurado por um super admin da instância, por empresa, pelo painel administrativo. Se sua conta tiver saque automático ativo, os saques daí também aparecem em GET /account-balance/withdrawals e disparam o mesmo withdraw.completed.

Veja a Referência da API pra o schema completo de request/response de cada endpoint.

On this page