Base URL: https://seu-dominio/api/v1. Use as credenciais geradas em Painel → API depois que o KYC da conta principal for aprovado.
Envie o Client ID e a secret em toda requisição. As credenciais ficam em Painel → API, após o KYC aprovado.
Authorization: Basic base64(client_id:secret) # ou Authorization: Bearer client_id:secret
nome_pagador é opcional na cobrança avulsa (o mesmo nome que o checkout do link grava nas entradas). No PIX recorrente, nome e CPF continuam obrigatórios.
POST /api/v1/charges
Content-Type: application/json
{
"amount": 19.9,
"description": "Pedido 1024",
"nome_pagador": "Maria Silva"
}
# Resposta:
{
"id": 123,
"txid": "...",
"status": "ATIVA",
"copy_paste": "...",
"amount": 19.9,
"description": "Pedido 1024",
"nome_pagador": "Maria Silva",
"saldo_liquido": 19.3,
"taxa_matriz": 3,
"taxa_matriz_fixa": 0,
"taxa_matriz_minima": 0,
"retencao_matriz": 0.6,
"saldo_liquido_matriz": 19.3
}
# saldo_liquido já vem com o desconto das taxas da conta.
# Em franquia também entram taxa_franquia*, retencao_franquia e saldo_liquido_franquia.QR Code que permanece aberto até o vencimento e continua pagável depois, com multa (%) e juros (% ao mês). Não pode ser combinado com recurring.
POST /api/v1/charges
Content-Type: application/json
{
"amount": 150.0,
"description": "Fatura março",
"pix_boleto": true,
"data_vencimento": "15-04-2026",
"multa": 2.0,
"juros": 1.0,
"pagador": {
"nome": "Maria Silva",
"cpf": "00000000000"
}
}
# pix_boleto=true exige data_vencimento, multa, juros e pagador (nome + CPF)
# multa: percentual sobre o valor (ex.: 2.00 = 2%); 0 = sem multa
# juros: percentual ao mês, dias corridos (ex.: 1.00 = 1% a.m.); 0 = sem juros
# Após o vencimento o QR segue válido por 30 dias, com encargos
# Incompatível com recurring: trueGera a primeira cobrança e o QR composto do Pix Automático. O pagador paga agora e autoriza as próximas no app do banco. Exige nome e CPF.
POST /api/v1/charges
Content-Type: application/json
{
"amount": 49.9,
"description": "Assinatura mensal",
"recurring": true,
"periodicity": "MENSAL",
"retry": true,
"pagador": {
"nome": "Maria Silva",
"cpf": "00000000000"
}
}
# periodicity: SEMANAL | MENSAL | TRIMESTRAL | SEMESTRAL | ANUAL
# retry (opcional): true = até 3 retentativas em 7 dias
# end_date (opcional): "2027-12-31"
# nome_pagador também pode ser enviado no topo; pagador.nome tem o mesmo efeitoRetorna saldo disponível para saque, bloqueios cautelares (infrações abertas ou deferidas) e saldo total. Inclui as chaves PIX cadastradas para uso no saque via API.
GET /api/v1/balance
# Resposta:
{
"saldo_disponivel": 850.0,
"bloqueio_cautelar": 150.0,
"saldo_total": 1000.0,
"chaves_pix": [
{
"id": 1,
"tipo": "cnpj",
"chave": "00000000000191",
"rotulo": "Principal"
}
]
}Só é possível sacar até o saldo disponível (valores em bloqueio cautelar não entram). O PIX vai para uma chave cadastrada no perfil; use o id retornado em chaves_pix no GET de saldo.
POST /api/v1/withdrawals
Content-Type: application/json
{
"valor": 500.0,
"chave_pix_id": 1
}
# Resposta:
{
"id": 42,
"valor": 500.0,
"status": "pendente",
"chave_pix_id": 1,
"automatico": false,
"pix_tipo": "cnpj",
"pix_chave": "00000000000191",
"created_at": "2026-09-16T13:00:00Z"
}
# status: pendente (aguarda gerente) ou pago (saque automático)
# A chave PIX é consultada no DICT antes do saque. Se não existir, a API recusa.
# Também aceita amount e pix_key_id como aliases em inglês.Lista os saques da conta autenticada (mais recentes primeiro) ou consulta um saque pelo id.
GET /api/v1/withdrawals
# Resposta:
{
"items": [
{
"id": 42,
"valor": 500.0,
"status": "pago",
"pix_tipo": "cnpj",
"pix_chave": "00000000000191",
"created_at": "2026-09-16T13:00:00Z",
"processado_at": "2026-09-16T13:05:00Z",
"destinatario_nome": "Loja Centro",
"destinatario_documento": "00000000000191",
"destinatario_banco": "NU PAGAMENTOS",
"destinatario_ispb": "18236120",
"destinatario_agencia": "0001",
"destinatario_conta": "123456",
"end_to_end_id": "E123..."
}
]
}
GET /api/v1/withdrawals/{id}
# Resposta:
{
"id": 42,
"valor": 500.0,
"status": "pendente",
"pix_tipo": "cnpj",
"pix_chave": "00000000000191",
"created_at": "2026-09-16T13:00:00Z"
}
# status: pendente | pago | recusado | falhou
# Quando pago, a resposta inclui a conta de destino e o end_to_end_id.
GET /api/v1/withdrawals/{id}/receipt
# Página do comprovante CashPay. Só quando status = pago.
# 409 se o saque ainda não foi pago ou não tem comprovante.GET /api/v1/charges/{id}
# ou GET /api/v1/charges/{txid}
# Resposta:
{
"id": 123,
"txid": "...",
"status": "CONCLUIDA",
"copy_paste": "...",
"amount": 19.9,
"description": "Pedido 1024",
"nome_pagador": "Maria Silva",
"saldo_liquido": 19.3,
"taxa_matriz": 3,
"taxa_matriz_fixa": 0,
"taxa_matriz_minima": 0,
"retencao_matriz": 0.6,
"saldo_liquido_matriz": 19.3
}A CashPay envia um POST para cada URL cadastrada em Painel → API quando cobranças PIX, saques ou bloqueios cautelares (infrações) são atualizados. Identifique o tipo pelo campo event.
POST {cada_webhook_cadastrado}
Content-Type: application/json
# --- PIX (entrada) ---
{
"event": "pix.updated",
"id": 123,
"txid": "...",
"status": "CONCLUIDA",
"amount": 10,
"saldo_liquido": 6.03,
"taxa_matriz": 3,
"taxa_matriz_fixa": 0,
"taxa_matriz_minima": 0,
"retencao_matriz": 0.3,
"saldo_liquido_matriz": 3.67,
"taxa_franquia": 10,
"taxa_franquia_fixa": 2.97,
"taxa_franquia_minima": 0,
"retencao_franquia": 3.97,
"saldo_liquido_franquia": 6.03,
"description": "Pedido 1024",
"nome_pagador": "Maria Silva"
}
# --- PIX com vencimento (pix_boleto), pago com atraso ---
{
"event": "pix.updated",
"id": 124,
"txid": "...",
"status": "CONCLUIDA",
"amount": 100,
"amount_pago": 105,
"valor_multa": 3,
"valor_juros": 2,
"pix_boleto": true,
"description": "Fatura março",
"nome_pagador": "Maria Silva"
}
# amount = valor original da cobrança
# amount_pago = total recebido (original + multa + juros)
# valor_multa / valor_juros = valores em R$ efetivamente pagos
# Cobrança da matriz: só entram taxa_matriz, taxa_matriz_fixa,
# taxa_matriz_minima, retencao_matriz e saldo_liquido_matriz.
# saldo_liquido é o mesmo que saldo_liquido_matriz.
#
# Cobrança da franquia (exemplo: franquia 10% + R$ 2,97, matriz 3%):
# retencao_matriz = taxa da matriz sobre o amount (fica com a plataforma)
# saldo_liquido_matriz = o que a matriz recebe nesta venda
# retencao_franquia = retenção total da franquia
# saldo_liquido_franquia = o que a franquia recebe
# saldo_liquido = saldo_liquido_franquia
# A taxa é percentual + fixa, respeitando a mínima e limitada ao amount.
# Cada ciclo do PIX recorrente gera uma nova entrada e o mesmo POST
# quando a cobrança daquele período for paga.
# --- Saque ---
{
"event": "withdrawal.updated",
"id": 42,
"valor": 500.0,
"status": "pago",
"pix_tipo": "cnpj",
"pix_chave": "00000000000191"
}
# Disparado ao solicitar, pagar, recusar, cancelar ou falhar o saque.
# status: pendente | pago | recusado | falhou
# observacao traz o motivo da Nixfin em cancelamento/falha
# (ex.: conta recebedora bloqueada).
# --- Infração / bloqueio cautelar ---
{
"event": "infraction.updated",
"id": 7,
"status": "OPEN",
"motivo": "Contestação Pix",
"transacao_id": 123,
"valor": 19.9,
"tipo": "FRAUD"
}
# Disparado ao abrir, atualizar, resolver ou defender a infração.
# status pode ser aberta, deferida, indeferida ou os status Nixfin
# (OPEN, ACKNOWLEDGED, DEFENDED, CLOSED, CANCELLED, ...).Endpoint público: não envia Authorization. Cria a conta principal (sem franquia), com pessoa jurídica (cnpj) ou pessoa física (tipo_pessoa: "pf" e cpf). A conta entra na análise de KYC e a resposta já devolve client_id e secret (também como secret_id). Guarde a secret: ela não volta a ser exibida. Essas credenciais só autenticam as outras rotas depois que o gerente aprovar o KYC. Pessoa física não envia kyc.cartao_pj; o KYC pede identidade (frente e verso) e selfie com a identidade. Em pessoa física, kyc.cpf precisa ser o mesmo CPF da conta. O campo cnpj da resposta é o documento gravado: 14 dígitos na jurídica e 11 na física. O campo webhooks é uma lista de URLs (até 10, http ou https). Uma lista vazia não cadastra nenhum webhook. Sem o campo, a conta também fica sem webhooks. Opcionalmente envie taxa_percentual, taxa_fixa e taxa_minima (a percentual não pode ficar abaixo da taxa da provedora). Há também PATCH /api/v1/matrizes/taxas e PATCH /api/v1/matrizes/pix.
POST /api/v1/matrizes
Content-Type: application/json
# Pessoa jurídica
{
"tipo_pessoa": "pj",
"nome": "João Souza",
"email": "financeiro@empresa.com",
"cnpj": "00.000.000/0001-91",
"senha": "Abc123!",
"taxa_percentual": 3,
"taxa_fixa": 0,
"taxa_minima": 0,
"webhooks": ["https://empresa.exemplo.com/hooks/cashpay"],
"kyc": {
"tipo_produto": "digital",
"cpf": "52998224725",
"telefone": "11999999999",
"ticket_medio": 150.5,
"cep": "01310100",
"rua": "Avenida Paulista",
"bairro": "Bela Vista",
"numero": "1000",
"complemento": "Sala 12",
"estado": "SP",
"banco": "260",
"agencia": "0001",
"conta": "123456-7",
"pix_tipo": "cnpj",
"pix_chave": "00000000000191",
"doc_frente": "data:image/jpeg;base64,...",
"doc_verso": "data:image/jpeg;base64,...",
"cartao_pj": "data:image/jpeg;base64,...",
"selfie": "data:image/jpeg;base64,..."
}
}
# Pessoa física: troque tipo_pessoa, envie cpf e omita cnpj e kyc.cartao_pj.
# kyc.cpf deve repetir o CPF da conta.
{
"tipo_pessoa": "pf",
"nome": "Maria Silva",
"email": "maria@email.com",
"cpf": "529.982.247-25",
"senha": "Abc123!",
"webhooks": [],
"kyc": {
"tipo_produto": "digital",
"cpf": "52998224725",
"telefone": "11999999999",
"ticket_medio": 80,
"cep": "01310100",
"rua": "Avenida Paulista",
"bairro": "Bela Vista",
"numero": "1000",
"estado": "SP",
"banco": "260",
"agencia": "0001",
"conta": "123456-7",
"pix_tipo": "cpf",
"pix_chave": "52998224725",
"doc_frente": "data:image/jpeg;base64,...",
"doc_verso": "data:image/jpeg;base64,...",
"selfie": "data:image/jpeg;base64,..."
}
}
# webhooks: lista de até 10 URLs http(s). [] não cadastra nenhum.
# Sem tipo_pessoa, a conta é tratada como pessoa jurídica.
# tipo_pessoa: pf | pj
# tipo_produto: fisico | digital | ambos
# pix_tipo: cpf | cnpj | email | celular | aleatoria
# banco: código COMPE (001, 237, 341, 033, 104, 260, 077, 756, 748, 208)
# documentos: PNG ou JPG em data URI (data:image/png;base64,... ou jpeg)
# Resposta 201:
{
"id": 12,
"nome": "João Souza",
"email": "financeiro@empresa.com",
"tipo_pessoa": "pj",
"cnpj": "00000000000191",
"kyc_status": "pending",
"webhooks": ["https://empresa.exemplo.com/hooks/cashpay"],
"created_at": "2026-08-24T21:00:00Z",
"client_id": "cp_...",
"secret": "sk_live_...",
"secret_id": "sk_live_...",
"taxa_percentual": 3,
"taxa_fixa": 0,
"taxa_minima": 0
}
# Guarde client_id e secret.
# Depois do KYC aprovado: Authorization: Bearer client_id:secret
# E-mail ou documento já usado responde 409.
# Taxas (opcionais no POST): taxa_percentual, taxa_fixa, taxa_minima.
# taxa_percentual não pode ser menor que a taxa da provedora.
PUT /api/v1/matrizes
Authorization: Bearer client_id:secret
Content-Type: application/json
{
"banco": "260",
"agencia": "0001",
"conta": "123456-7",
"pix_tipo": "cnpj",
"pix_chave": "00000000000191",
"taxa_percentual": 3.5,
"taxa_fixa": 0.5,
"taxa_minima": 1,
"rotacionar_secret": true
}
# Atualiza banco/agência/conta/PIX, taxas e/ou rotacionar_secret.
# Os cinco campos de pagamento vão juntos. Sem eles, os dados atuais permanecem.
# As três taxas também vão juntas quando informadas.
# rotacionar_secret é opcional. true gera uma nova secret e invalida a anterior.
# A secret nova aparece só nessa resposta, em secret e secret_id.
# Conta franquia recebe 403: a franquia é alterada em PUT /api/v1/franquias/{id}.
PATCH /api/v1/matrizes/taxas
Authorization: Bearer client_id:secret
Content-Type: application/json
{
"taxa_percentual": 3.5,
"taxa_fixa": 0.5,
"taxa_minima": 1
}
# Atualiza só as taxas da matriz. As três são obrigatórias.
# taxa_percentual >= taxa da provedora; fixa e mínima >= 0.
PATCH /api/v1/matrizes/pix
Authorization: Bearer client_id:secret
Content-Type: application/json
{
"pix_tipo": "cnpj",
"pix_chave": "00000000000191"
}
# Atualiza só a chave PIX de saque da matriz (kyc + chave Principal).Disponível só para a conta principal (KYC aprovado). Aceita pessoa jurídica (cnpj) ou pessoa física (tipo_pessoa: "pf" e cpf). Sem tipo_pessoa, vale pessoa jurídica. Pessoa física não envia kyc.cartao_pj e o kyc.cpf precisa ser o CPF da conta. A franquia nasce vinculada a você, entra na fila de KYC do gerente e já devolveclient_id e secret (também comosecret_id) para o sistema integrador autenticar essa conta. A secret aparece só nesta resposta. As cobranças da franquia só passam a funcionar depois da aprovação do KYC. Informe a taxa percentual, a fixa e a mínima. Nenhuma pode ficar abaixo da conta principal. O PUT atualiza nome, e-mail, essas taxas e, se o campo vier no JSON, os webhooks. Sem o campo webhooks, a lista já gravada permanece. Uma lista vazia não cadastra nenhum webhook. Uma lista com URLs substitui as da matriz. Contas franquia não podem criar subfranquias.
POST /api/v1/franquias
Content-Type: application/json
{
"tipo_pessoa": "pj",
"nome": "João Souza",
"email": "loja.centro@empresa.com",
"cnpj": "00.000.000/0001-91",
"senha": "Abc123!",
"taxa_retencao_pct": 1,
"taxa_retencao_fixa": 0,
"taxa_retencao_minima": 3,
"webhooks": ["https://loja.exemplo.com/hooks/cashpay"],
"kyc": {
"tipo_produto": "digital",
"cpf": "00000000000",
"telefone": "11999999999",
"ticket_medio": 150.5,
"cep": "01310100",
"rua": "Avenida Paulista",
"bairro": "Bela Vista",
"numero": "1000",
"complemento": "Sala 12",
"estado": "SP",
"banco": "260",
"agencia": "0001",
"conta": "123456-7",
"pix_tipo": "cnpj",
"pix_chave": "00000000000191",
"doc_frente": "data:image/jpeg;base64,...",
"doc_verso": "data:image/jpeg;base64,...",
"cartao_pj": "data:image/jpeg;base64,...",
"selfie": "data:image/jpeg;base64,..."
}
}
# Pessoa física: tipo_pessoa "pf", campo cpf no lugar de cnpj,
# e no kyc apenas doc_frente, doc_verso e selfie (sem cartao_pj).
# kyc.cpf = o mesmo CPF da conta.
# Resposta 201:
{
"id": 45,
"nome": "João Souza",
"email": "loja.centro@empresa.com",
"tipo_pessoa": "pj",
"cnpj": "00000000000191",
"kyc_status": "pending",
"taxa_retencao_pct": 1,
"taxa_retencao_fixa": 0,
"taxa_retencao_minima": 3,
"webhooks": ["https://loja.exemplo.com/hooks/cashpay"],
"created_at": "2026-08-24T21:00:00Z",
"client_id": "cp_...",
"secret": "sk_live_...",
"secret_id": "sk_live_..."
}
# Guarde client_id e secret. Authorization: Bearer client_id:secret
# A secret não é exibida de novo.
# tipo_pessoa: pf | pj (omitido = pj)
# Em pf, cnpj da resposta traz os 11 dígitos do CPF.
# tipo_produto: fisico | digital | ambos
# pix_tipo: cpf | cnpj | email | celular | aleatoria
# banco: código COMPE (001, 237, 341, 033, 104, 260, 077, 756, 748, 208)
# documentos: PNG ou JPG em data URI (data:image/png;base64,... ou jpeg)
# Retenção da venda = max(mínima, fixa + valor × % / 100), limitada ao valor da venda.
# As três taxas são obrigatórias e não podem ficar abaixo da conta principal.
# Se alguma ficar menor, a resposta 400 lista o campo e o mínimo possível.
# Ex.: "A taxa de retenção % não pode ser menor que 1,00%. A taxa de retenção fixa não pode ser menor que R$ 2,00. A taxa de retenção mínima não pode ser menor que R$ 3,00."
# webhooks (opcional, também no PUT):
# omitido no POST -> herda as URLs da matriz
# omitido no PUT -> mantém a lista já gravada
# [] -> nenhum webhook, nem os da matriz
# ["https://a.exemplo.com/hook", "https://b.exemplo.com/hook"] -> só essas URLs
# Até 10 URLs http(s). A resposta devolve a lista efetiva em webhooks.
GET /api/v1/franquias
# Lista as franquias da conta autenticada, com as três taxas e webhooks
PUT /api/v1/franquias/45
Content-Type: application/json
{
"nome": "João Souza",
"email": "loja.centro@empresa.com",
"taxa_retencao_pct": 1.5,
"taxa_retencao_fixa": 0.5,
"taxa_retencao_minima": 3,
"webhooks": ["https://loja.exemplo.com/hooks/cashpay"],
"banco": "260",
"agencia": "0001",
"conta": "123456-7",
"pix_tipo": "cnpj",
"pix_chave": "00000000000191",
"rotacionar_secret": true
}
# Atualiza nome, e-mail, as três taxas e, se vier no JSON, os webhooks.
# Sem webhooks no JSON, a lista da franquia permanece.
# banco, agencia, conta, pix_tipo e pix_chave vão juntos e trocam o destino do saque.
# Sem esses campos, banco e chave PIX atuais permanecem.
# rotacionar_secret: true gera uma nova secret da franquia e invalida a anterior.
# Nesse caso a resposta inclui client_id, secret e secret_id. A secret só aparece aí.
# Sem rotacionar_secret, a secret atual permanece.
# E-mail já usado em outra conta responde 409.
# O mesmo piso da conta principal vale aqui.