CashPayCashPayVoltar ao login

Documentação da API

Base URL: https://seu-dominio/api/v1. Use as credenciais geradas em Painel → API depois que o KYC da conta principal for aprovado.

Uso da API
Cobranças PIX, saldo, saques, webhooks (PIX, saque e infração), criação da conta matriz e criação de franquias.

Autenticação

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

Criar cobrança PIX

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.

Criar PIX com vencimento (pix_boleto)

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: true

Criar PIX recorrente

Gera 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 efeito

Consultar saldo

Retorna 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"
    }
  ]
}

Solicitar saque

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.

Consultar saques

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.

Consultar cobrança

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
}

Webhooks

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, ...).

Criação de conta matriz

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).

Criação de franquias

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.