API
Dashboard
API · v1 · Estável

Documentação
da API

Integre pagamentos PIX, boleto e cartão em minutos.
REST + JSON. Autenticação via Bearer Token.

PIX Cartão Boleto 60 req/min Valores em centavos
Base URL https://api.chasepay.com.br
Começando

Introdução

API REST com respostas em JSON. Todos os valores monetários são em centavos inteiros (ex: 4890 = R$ 48,90).

  • Versão: v1
  • Formato: JSONContent-Type: application/json
  • Erros: sempre em {"error": {"message": "..."}}
  • Limites: mín. R$ 1,00 (PIX mín. R$ 10,00) · máx. R$ 100.000,00 · PIX máx. R$ 2.000,00 por transação
  • Rate limit: 60 requisições/minuto por token — header X-RateLimit-Limit: 60
  • Datas: horário de Brasília (UTC-3), formato YYYY-MM-DD HH:MM:SS (exceto boleto_due: apenas YYYY-MM-DD)
Começando

Autenticação

Envie o header Authorization: Bearer {sua_api_key} em todas as chamadas. Gere sua chave em Dashboard → Configurações → API. A chave secreta é exibida uma única vez — guarde-a com segurança.

🔑
Bearer Token — não Basic Auth
A API ChasePay usa Bearer Token. Inclua Authorization: Bearer SEU_TOKEN em cada requisição. Não use HTTP Basic Auth.
cURL — Autenticação
curl https://api.chasepay.com.br/v1/balance \
  -H "Authorization: Bearer SEU_TOKEN"
🚫
Proteja seu token com máxima prioridade
O token dá acesso completo à sua conta: criar cobranças, emitir saques e processar reembolsos. Armazene exclusivamente em variáveis de ambiente do servidor. Nunca exponha no frontend, código-fonte ou repositórios.
Começando

Primeiros passos

Teste sua integração em minutos. Não há sandbox separado — use valores mínimos para testar.

1

Crie sua conta e obtenha o token

Acesse Dashboard → Configurações → API e copie seu token. Exibido uma única vez — salve em lugar seguro.

2

Crie sua primeira cobrança PIX

Mínimo R$ 10,00 (1.000 centavos). Use external_id para identificar o pedido e garantir idempotência.

3

Renderize o QR Code

O campo pix_qr_code contém o código EMV — renderize no seu frontend com qualquer biblioteca QR. O status muda para paid em segundos após pagamento.

4

Configure webhooks para notificações

Registre seu endpoint via POST /v1/user/webhooks e teste com POST /v1/user/webhooks/:id/test. Valide sempre a assinatura HMAC antes de processar.

Limites: PIX mín R$ 10 / máx R$ 2.000. Outros métodos: mín R$ 1 (linha digit: ~R$ 4) / máx R$ 100.000. Rate limit: 60 req/min por token (header X-RateLimit-Limit: 60).

Exemplo — Primeira cobrança PIX
curl -X POST https://api.chasepay.com.br/v1/charges \
  -H "Authorization: Bearer SEU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "method": "pix",
    "amount_cents": 1000,
    "payer_name": "Teste",
    "payer_document": "00000000000"
  }'
Cobranças

Criar cobrança

POST /v1/charges

Cria uma cobrança PIX, cartão ou boleto. Retorna 201 com os dados da transação incluindo o QR Code (PIX) ou linha digitável (boleto).

⚠️
Sem sandbox separado — todas as cobranças são reais. Use valor mínimo (R$ 10,00 PIX) e external_id para identificar testes. Se boleto estiver indisponível, retorna HTTP 503.

Parâmetros da requisição

CampoTipoDescrição
amount_centsobrigintegerValor em centavos. PIX: mín 1.000 (R$ 10), máx 200.000 (R$ 2.000). Outros: mín 100 (R$ 1), máx 10.000.000 (R$ 100.000).
methodobrigstringpix | card | boleto
external_idrecomstringSeu ID de pedido para idempotência. Máx 64 chars. Reenviar o mesmo external_id retorna 409 em vez de duplicata — é seguro para retry.
descriptionstringDescrição exibida ao pagador. Máx 255 chars.
customer.namestringNome completo do pagador.
customer.documentstringCPF (11 dígitos) ou CNPJ (14 dígitos). Apenas números, sem pontuação. Inválidos retornam 422 com code: "invalid_document".
customer.emailstringEmail do pagador.
customer.phonestringTelefone do pagador.
payer_namestringAtalho: nome do pagador sem objeto customer.
payer_documentstringAtalho: CPF/CNPJ sem objeto customer. Apenas dígitos, sem pontuação.
cardobjectSomente method=card: number, holder, expiry (MM/AA), cvv, installments.
metadataobjectChaves/valores customizados (máx 10). Devolvidos em webhooks.
Requisição completa
{
  "amount_cents": 4890,
  "method": "pix",
  "description": "Pedido #123",
  "external_id": "meu-pedido-001",

  "customer": {
    "name": "Amanda Carvalho",
    "email": "amanda@email.com",
    "document": "12345678900",
    "phone": "11999999999"
  },

  // ou atalho sem objeto customer:
  "payer_name": "Amanda Carvalho",
  "payer_document": "12345678900"
}
Resposta PIX (201)
{
  "data": {
    "id": 42,
    "external_id": "meu-pedido-001",
    "status": "pending",
    "method": "pix",
    "amount_cents": 4890,
    "fee_cents": 220,
    "net_cents": 4670,
    "pix_qr_code": "00020126...bcb.pix",
    "discount_cents": 0,
    "description": "Pedido #123",
    "payer_name": "Amanda Carvalho",
    "payer_document": "12345678900",
    "paid_at": null,
    "created_at": "2026-06-20 19:25:06",
    "updated_at": "2026-06-20 19:25:06"
  }
}
Resposta Boleto (201)
{
  "data": {
    "id": 43,
    "external_id": "tx_abc123",
    "status": "pending",
    "method": "boleto",
    "amount_cents": 4890,
    "fee_cents": 608,
    "net_cents": 4282,
    "pix_qr_code": null,
    "boleto_line": "19790000058044...",  // linha digitável
    "boleto_url":  "https://...",        // link para o PDF
    "boleto_due":  "2026-06-30",        // vencimento (YYYY-MM-DD)
    "discount_cents": 0,
    "description": "Pedido #456",
    "payer_name": "João Silva",
    "payer_document": "12345678900",
    "paid_at": null,
    "created_at": "2026-06-20 19:25:06",
    "updated_at": "2026-06-20 19:25:06"
  }
}
// ⚠ Se 201 sem boleto_line/url/due: provedor falhou, verifique antes de usar
// ⚠ Boleto indisponível no momento → HTTP 503
Cobranças

Listar cobranças

GET /v1/transactions

Lista transações da mais recente à mais antiga com suporte a filtros e paginação.

Parâmetros de query
status  paid | pending | failed | disputed
method  pix | card | boleto
period  hoje | 7 | 30 | 90
from    2026-01-01  (YYYY-MM-DD)
to      2026-06-30  (YYYY-MM-DD)
page    1           (padrão)
limit   20          (padrão, máx 100)
Resposta 200
{
  "data": [
    {
      "id": 42,
      "external_id": "tx_64100c30d74fe430",
      "status": "paid",
      "method": "pix",
      "amount_cents": 4890,
      "fee_cents": 220,
      "net_cents": 4670,
      "discount_cents": 0,
      "description": null,
      "payer_name": "Amanda Carvalho",
      "payer_document": "12345678900",
      "customer_name": "Amanda Carvalho",
      "customer_email": null,
      "customer_document": null,
      "customer_phone": null,
      "checkout_name": null,
      "product_name": null,
      "receiver_name": "SUA EMPRESA",
      "pix_qr_code": "00020126...",
      "boleto_line": null,
      "boleto_url": null,
      "boleto_due": null,
      "paid_at": "2026-06-20 10:05:12",
      "created_at": "2026-06-20 10:00:00",
      "updated_at": "2026-06-20 10:05:12"
    }
  ],
  "total": 160,
  "page": 1,
  "limit": 20
}
Cobranças

Consultar cobrança

GET /v1/transactions/:id

Consulta pelo external_id ou pelo ID numérico retornado na criação.

// Por external_id:
GET /v1/transactions/meu-pedido-001
Authorization: Bearer SEU_TOKEN

// Por ID numérico:
GET /v1/transactions/42
Authorization: Bearer SEU_TOKEN

// Resposta 200
{
  "data": {
    "id": 42,
    "external_id": "meu-pedido-001",
    "status": "paid",
    "method": "pix",
    "amount_cents": 4890,
    "fee_cents": 220,
    "net_cents": 4670,
    "pix_qr_code": "00020126...",
    "boleto_line": null,
    "boleto_url": null,
    "boleto_due": null,          // YYYY-MM-DD para boleto
    "discount_cents": 0,
    "description": "Pedido #123",
    "payer_name": "Amanda Carvalho",
    "payer_document": "12345678900",
    "paid_at": "2026-06-20 10:05:12",
    "created_at": "2026-06-20 10:00:00",
    "updated_at": "2026-06-20 10:05:12"
  }
}
// Datas: horário de Brasília (UTC-3)
Cobranças

Reembolsar

POST /v1/charges/:id/refund

Solicita estorno de uma transação paga. A transação vai para status disputed e o evento charge.chargeback é disparado. O processamento é manual.

// Sem corpo na requisição
POST /v1/charges/42/refund
Authorization: Bearer SEU_TOKEN

// Resposta 200
{
  "data": {
    "id": 42,
    "external_id": "meu-pedido-001",
    "status": "disputed",
    "amount_cents": 4890,
    "method": "pix"
  }
}
Saques

Solicitar saque

POST /v1/payouts

Solicita saque PIX para sua chave cadastrada. Mínimo R$ 10,00. Taxa conforme seu plano.

Requisição
{
  "amount_cents": 50000,
  "pix_key": "financeiro@empresa.com.br"
}
Resposta 201
{
  "data": {
    "id": 7,
    "type": "cashout",
    "status": "processing",
    "amount_cents": 50000,
    "fee_cents": 150,
    "pix_key": "financeiro@empresa.com.br",
    "end_to_end_id": "E0...",
    "error_reason": null,
    "requested_at": "2026-06-20 19:00:00",
    "paid_at": null,
    "created_at": "2026-06-20 19:00:00",
    "updated_at": "2026-06-20 19:00:00"
  }
}
// status: processing | paid | failed
// end_to_end_id: ID E2E Bacen (null enquanto processing)
// paid_at: preenchido quando status=paid
Saques

Listar saques

GET /v1/payouts

Lista saques do mais recente ao mais antigo. Suporta paginação: page e limit (padrão 20, máx 100).

{
  "data": [
    {
      "id": 7,
      "type": "cashout",
      "status": "paid",
      "amount_cents": 50000,
      "fee_cents": 150,
      "pix_key": "financeiro@empresa.com.br",
      "end_to_end_id": "E02026...",
      "error_reason": null,
      "requested_at": "2026-06-20 18:00:00",
      "paid_at": "2026-06-20 19:05:00",
      "created_at": "2026-06-20 18:00:00",
      "updated_at": "2026-06-20 19:05:00"
    }
  ],
  "total": 1,
  "page": 1,
  "limit": 20
}
Saldo

Consultar saldo

GET /v1/balance

Retorna o saldo da conta em centavos, com detalhes de liquidação e histórico acumulado.

// Resposta 200
{
  "data": {
  "available_cents": 46808,       // disponível para saque agora
  "pending_cents": 131030181,     // vendas aguardando liquidação
  "settling_cents": 0,            // em liquidação (boleto+cartão)
  "settling_boleto_cents": 0,     // em liquidação — boleto
  "settling_card_cents": 0,       // em liquidação — cartão
  "withdrawn_cents": 1200,        // total sacado historicamente
  "received_cents": 48659,        // total recebido historicamente
  "blocked_cents": 651,           // bloqueado (disputas/compliance)
  "debt_cents": 0,                // débito com a plataforma
  "boleto_settlement_days": 2,    // prazo liquidação boleto (D+N)
  "card_settlement_days": 30,     // prazo liquidação cartão (D+N)
  "settling_transactions": [
    {
      "id": 62,
      "method": "boleto",
      "external_id": "tx_abc123",
      "amount_cents": 1000,
      "net_cents": 651,
      "payer_name": "João Silva",
      "description": null,
      "paid_at": "2026-06-20 10:05:00"
    }
  ],
  "currency": "BRL"
  }
}
Webhooks

Criar webhook

POST /v1/user/webhooks

Cadastra um endpoint para receber eventos em tempo real. A URL deve ser HTTPS. O campo secret é retornado apenas na criação — salve imediatamente.

Eventos disponíveis

charge.paidCobrança paga
charge.failedPagamento recusado
charge.refundedReembolso
charge.chargebackChargeback
charge.expiredExpirada
charge.pendingPendente
charge.createdCobrança criada
payout.paidSaque concluído
payout.failedSaque falhou
balance.updatedSaldo atualizado
payout.createdSaque criado
webhook.testTeste
💡
Use "events": ["*"] para receber todos os eventos automaticamente, incluindo futuros.
Requisição
{
  "url": "https://seusite.com/webhooks/chase",
  "name": "Producao",
  "events": ["charge.paid", "charge.failed"]
  // ou: "events": ["*"]
}
Resposta 201
{
  "data": {
    "id": 1,
    "url": "https://seusite.com/webhooks/chase",
    "events": ["charge.paid", "charge.failed"],
    "name": "Produção",
    "active": true,
    "secret": "whsec_abc123..."
    // secret exibido APENAS aqui — salve!
  }
}
Webhooks

Listar webhooks

GET /v1/user/webhooks

Lista todos os webhooks cadastrados. Retorna total, page, limit.

// Resposta 200
{
  "data": [
    {
      "id": 1,
      "url": "https://seusite.com/webhooks/chase",
      "name": "Producao",
      "events": ["charge.paid", "charge.failed"],
      "active": true,
      "success_count": 42,
      "fail_count": 1,
      "last_triggered": "2026-06-20 10:05:00",
      "created_at": "2026-06-01 09:00:00"
    }
  ],
  "total": 1,
  "page": 1,
  "limit": 20
}
Webhooks

Atualizar webhook

PUT /v1/user/webhooks/:id

Atualiza url, nome, eventos ou status ativo/inativo. Envie apenas os campos que deseja alterar.

// Exemplo: desativar webhook
PUT /v1/user/webhooks/1
Authorization: Bearer SEU_TOKEN
Content-Type: application/json

{ "active": false }

// Exemplo: atualizar eventos
{ "events": ["charge.paid", "payout.paid"] }

// Resposta 200
{
  "data": {
    "id": 1,
    "url": "https://seusite.com/webhooks/chase",
    "events": ["charge.paid", "payout.paid"],
    "active": false
  }
}
Webhooks

Remover webhook

DELETE /v1/user/webhooks/:id

Remove o webhook permanentemente.

DELETE /v1/user/webhooks/1
Authorization: Bearer SEU_TOKEN

// Resposta 200
{ "data": { "deleted": true } }
Webhooks

Testar endpoint

POST /v1/user/webhooks/:id/test

Dispara um evento webhook.test para o endpoint cadastrado. Sem corpo na requisição.

Exemplo
POST /v1/user/webhooks/1/test
Authorization: Bearer SEU_TOKEN

// Sem corpo
Resposta 200
{
  "data": {
    "ok": true,         // false se servidor retornou erro
    "status_code": 200  // HTTP status do seu endpoint
  }
}
⏱️
Timeout e retry
Timeout: 8 segundos. Sem retry automático. Use este endpoint para reenviar manualmente após falhas. O evento webhook.test é seguro e não tem efeitos colaterais.
Webhooks

Assinatura HMAC

Cada requisição ao seu endpoint inclui o header X-Chase-Signature. Valide com HMAC-SHA256 usando o corpo bruto (não parseado) e o secret do webhook.

🔒
Sempre valide a assinatura
Nunca processe eventos sem validar o HMAC. Use o corpo bruto (Buffer / php://input) — não o JSON re-serializado. Use comparação segura contra timing attacks (timingSafeEqual / hash_equals).
Node.js (Express)
// IMPORTANTE: use express.raw() ANTES do express.json()
// app.use('/webhooks', express.raw({ type: '*/*' }));

const sig = "sha256=" + crypto
  .createHmac("sha256", WEBHOOK_SECRET)
  .update(req.body)  // Buffer com express.raw()
  .digest("hex");

// Header: X-Chase-Signature: sha256=<hex>
if (!crypto.timingSafeEqual(
  Buffer.from(sig),
  Buffer.from(req.headers["x-chase-signature"] ?? "")
)) return res.status(401).end();
PHP
$sig = "sha256=" . hash_hmac(
  "sha256",
  file_get_contents("php://input"),
  $webhookSecret
);

// Header: X-Chase-Signature: sha256=<hex>
if (!hash_equals(
  $sig,
  $_SERVER["HTTP_X_CHASE_SIGNATURE"] ?? ""
)) {
  http_response_code(401);
  exit;
}
Payload recebido no seu servidor
POST https://seusite.com/webhooks/chase
Content-Type: application/json
X-Chase-Signature: sha256=a3f2c1d8...
X-Chase-Event: charge.paid

{
  "event": "charge.paid",
  "data": {
    "id": 42,
    "external_id": "meu-pedido-001",
    "method": "pix",
    "status": "paid",
    "amount_cents": 4890,
    "fee_cents": 190,
    "net_cents": 4700,
    "discount_cents": 0,
    "description": "Pedido #123",
    "payer_name": "João Silva",
    "payer_document": "12345678900",   // apenas dígitos
    "pix_qr_code": "00020126...",
    "boleto_line": null,
    "boleto_url": null,
    "boleto_due": null,
    "paid_at": "2026-06-20 10:05:12",
    "created_at": "2026-06-20 10:01:00",
    "updated_at": "2026-06-20 10:05:12"
  }
}

Datas no horário de Brasília (UTC-3), formato YYYY-MM-DD HH:MM:SS (exceto boleto_due: apenas YYYY-MM-DD). Timeout: 8 s. Sem retry automático.

Referência

Códigos de erro

Erros sempre retornam {"error": {"message": "descrição"}}. Limite de 60 requisições/minuto por token — header X-RateLimit-Limit: 60. Ao exceder retorna 429.

HTTPSignificado
200OK
201Recurso criado com sucesso
400Requisição malformada — JSON inválido ou campo inesperado
401Não autenticado — token ausente ou inválido
402Pagamento recusado pela adquirente
403Conta sem permissão para esta operação
404Recurso não encontrado
409Conflito — external_id já utilizado. Reenvie com o mesmo external_id — idempotência garantida.
422Validação falhou — campo inválido, valor fora do limite ou formato incorreto
429Muitas requisições — aguarde e tente novamente
500Erro interno do servidor
502Falha na adquirente — tente novamente
503Serviço indisponível — ex: boleto temporariamente fora do ar
🔄
Idempotência via external_id
Ao receber timeout ou erro de rede ao criar cobrança, reenvie com o mesmo external_id. Se já foi criada, a API retorna 409 em vez de duplicata. É seguro para retry.
Referência

Status das cobranças

Ciclo de vida de uma cobrança desde a criação até a conclusão.

pendingpaidPIX/boleto confirmado
pendingfailedPIX expirado ou recusado
pendingexpiredBoleto vencido sem pagamento
paidrefundedEstorno confirmado
paiddisputedChargeback / disputa aberta
paidchargebackChargeback finalizado
Referência rápida
pending  -> paid        // PIX/boleto confirmado
pending  -> failed      // PIX expirado ou recusado
pending  -> expired     // boleto vencido sem pagamento
paid     -> refunded    // estorno confirmado
paid     -> disputed    // chargeback / disputa aberta
paid     -> chargeback  // chargeback finalizado

// PIX pendente expira em ~24h (definido pelo banco)
// Boleto: vencimento configurado na geração