Criar Cobrança PIX
Crie uma nova cobrança PIX e receba o QR Code para o cliente efetuar o pagamento.
/v1/chargesCria uma nova cobrança PIX e retorna o QR Code para pagamento
Parâmetros do Request
Body (JSON)
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
amount | number | Sim | Valor da cobrança em reais (decimal)Ex: 150.50 |
customerName | string | Sim | Nome completo do cliente (3-100 caracteres)Ex: "João da Silva" |
customerCpf | string | Sim | CPF do cliente (apenas números, sem pontuação)Ex: "12345678901" |
customerEmail | string | Não | Email do cliente para notificaçõesEx: "joao@email.com" |
customerPhone | string | Não | Telefone do clienteEx: "11999998888" |
expirationMinutes | number | Não | Tempo de expiração do QR Code em minutos (5-1440). Padrão: 30Ex: 60 |
externalReference | string | Não | Identificador externo para referência no seu sistemaEx: "ORDER-12345" |
additionalInfo | string | Não | Informação adicional que aparece no comprovante PIX (máx. 140 caracteres)Ex: "Pagamento pedido #123" |
postbackUrl | string | Não | URL de callback para receber notificação quando o pagamento for confirmadoEx: "https://seusite.com/webhook/pagamento" |
split | array | Não | Split de pagamentos: divide o valor da venda entre subcontas aprovadas (máx. 20). Cada item: { subAccountId, type: "PERCENT" | "FIXED", value }Ex: [{ "subAccountId": "...", "type": "PERCENT", "value": 30 }] |
splitFeePayer | string | Não | Quem absorve a taxa da cobrança no split percentual. SUBACCOUNTS (default): percentuais sobre o valor LÍQUIDO. OWNER: percentuais sobre o valor BRUTO — a taxa sai inteira do residual da conta principalEx: "OWNER" |
Resposta
A API retorna os dados da cobrança criada, incluindo o QR Code em texto e imagem Base64:
Campos da Resposta
- chargeId: ID único da cobrança no ActivePayments (use para consultas)
- externalId: ID da transação no gateway de pagamento
- amount: Valor bruto da cobrança (string com decimal — ex:
"150.50") - netAmount: Valor líquido após taxas (string)
- fee: Taxa cobrada pela transação (string)
- status: Status atual em uppercase (
PENDING,RELEASE,CANCELLED,FAILED,REFUNDED,CHARGEDBACK,DISPUTED) - pix.qrCode: Código PIX copia-e-cola (BR Code) — sempre presente
- pix.qrCodeBase64: Imagem do QR Code em Base64 (PNG). Pode vir como string vazia (
"") dependendo do gateway — nesse caso, gere a imagem do seu lado a partir dopix.qrCode(qualquer lib geradora de QR Code aceita o texto BR Code) - pix.expiresAt: Data/hora de expiração do QR Code (ISO 8601)
- externalReference: Eco do
externalReferenceenviado na requisição
amount, netAmount e fee são retornados como string (serialização de Decimal). Use parseFloat() (JS), float() (Python) ou equivalente antes de fazer cálculos.Códigos de Erro
| Código | Descrição | Solução |
|---|---|---|
400 | Dados inválidos | Verifique se todos os campos obrigatórios estão corretos |
400 | CPF inválido | Envie apenas números, sem pontuação |
400 | Valor mínimo é R$ 1,00 | O valor deve ser pelo menos 1.00 |
401 | Não autenticado | Verifique suas credenciais de API Key |
500 | Erro no gateway | Tente novamente ou entre em contato com o suporte |
Split de Pagamentos (Subcontas)
O campo opcional split divide o valor líquido da venda (após as taxas da plataforma) entre subcontas cadastradas e aprovadas no painel. O residual fica com a conta principal. Veja o guia completo em Split de Pagamentos.
{
"amount": 150.50,
"customerName": "João da Silva",
"customerCpf": "12345678901",
"externalReference": "ORDER-12345",
"split": [
{ "subAccountId": "a1b2c3d4-...", "type": "PERCENT", "value": 30 },
{ "subAccountId": "e5f6g7h8-...", "type": "FIXED", "value": 10.00 }
],
"splitFeePayer": "OWNER"
}Regras do split
- subAccountId: ID da subconta — precisa pertencer à sua conta, estar aprovada (KYC) e ativa
- type:
PERCENT(percentual — veja a base de cálculo abaixo) ouFIXED(valor em reais) - value: percentual (0.01 a 100) ou valor fixo, conforme o tipo
- Máximo de 20 subcontas por cobrança, sem duplicatas
- A soma dos percentuais não pode exceder 100%, e o total do split não pode exceder o valor líquido
- Cobranças sem o campo
splitfuncionam exatamente como antes — o campo é 100% opcional
Quem absorve a taxa (splitFeePayer)
Por padrão, o percentual incide sobre o valor líquido — na prática, a taxa da plataforma é rateada entre todos. Com splitFeePayer: "OWNER", o percentual incide sobre o valor bruto da venda e a taxa sai inteira do residual da conta principal. Exemplo com venda de R$ 15,00, taxa de R$ 0,75 e split de 85%:
SUBACCOUNTS (default) | OWNER | |
|---|---|---|
| Base do percentual | Líquido (R$ 14,25) | Bruto (R$ 15,00) |
| Subconta (85%) | R$ 12,11 | R$ 12,75 |
| Residual da conta principal | R$ 2,14 | R$ 1,50 (já descontada a taxa) |
- Itens
FIXEDnão são afetados — são sempre o valor absoluto informado - O teto continua sendo o valor líquido: no modo
OWNER, a soma das partes + taxa não pode passar do valor da venda (com taxa de 5%, os percentuais somados ficam limitados a ~95%) — acima disso a criação retorna400 - O campo vale por cobrança e vale também para assinaturas (Pix Automático), replicando em cada ciclo
Quando a cobrança tem split, a resposta (e o webhook charge.paid) inclui o array split com o valor calculado de cada parte:
"split": [
{
"subAccountId": "a1b2c3d4-...",
"type": "PERCENT",
"value": 30,
"amount": 43.80
}
]Subconta ... não encontrada, Subconta "..." ainda não foi aprovada, Soma dos percentuais do split excede 100% e Total do split excede o valor líquido da cobrança.Exibindo o QR Code
Você pode exibir o QR Code de duas formas:
- Texto Copia-e-Cola (recomendado): Exiba o
qrCode(BR Code) para o cliente copiar e colar no app do banco, e gere a imagem do QR no seu frontend com qualquer biblioteca (ex:qrcodeno Node,qrcode.reactno React) - Imagem Base64: Quando o gateway fornece a imagem, ela vem no campo
qrCodeBase64e pode ser usada direto no atributosrcde uma<img>. Como esse campo pode vir vazio, sempre tenha um fallback gerando a imagem a partir doqrCode.
<!-- Fallback: usa Base64 quando disponível, senão gera com lib local -->
{data.pix.qrCodeBase64
? <img src={data.pix.qrCodeBase64} alt="QR Code PIX" />
: <QRCode value={data.pix.qrCode} size={300} />}
<!-- Botão para copiar o código -->
<button onClick={() => navigator.clipboard.writeText(data.pix.qrCode)}>
Copiar código PIX
</button>