Documentation v1

Integrate PIX into your application with SymbolPay

Generate charges, share public payment links, receive signed webhooks and make withdrawals via PIX key. This documentation describes the real flows of the dashboard, public checkout and webhook integration.

Apphttps://wavez.online
Dashboard + API
Manage charges in the dashboard and via SDK
Real-time PIX
Copy and paste returned instantly
Inbound webhook
HMAC-signed events
Layered security
RLS, SSRF protection, atomic reserve and idempotency

Introduction#

A SymbolPay é uma gateway de pagamentos PIX B2B. O comerciante cria cobranças a partir do painel autenticado ou via links de pagamento públicos; o pagador paga o QR Code e a confirmação chega por webhook, credita o saldo do comerciante. O repasse é solicitado na página de saques.

Existem dois modos de uso:

  • • Painel do comerciante (autenticado por sessão) — criação de cobranças, links, saques e gestão de conta.
  • • Checkout público via link /pay/:slug — o pagador não precisa de conta.

A taxa é fixa: R$ 0,65 por cobrança recebida e R$ 0,65 por saque. O valor mínimo de cobrança e saque é R$ 1,00. A validade padrão é de 30 minutos; no painel, você também pode escolher 1 hora ou 24 horas.

Autenticação por chave de API
Você pode gerar chaves wz_live_ / wz_test_ na aba API do painel. A chave crua é exibida uma única vez e armazenada apenas como hash SHA-256. As funções do gateway (gatewayCreateCharge e gatewayWithdraw) aceitam tanto a sessão do painel quanto o header Authorization: Bearer wz_live_... para acesso programático.

Environments#

As chaves de API usam prefixo wz_live_ (produção) ou wz_test_ (teste). Ambas apontam para o mesmo app; o ambiente é definido pelo prefixo da chave.

Live · Produção

Cobranças e saques reais, movimentação de dinheiro de verdade.

Prefixo wz_live_
Test · Sandbox

Para desenvolvimento e testes de integração.

Prefixo wz_test_
Sem sandbox isolado
As chaves test e live usam o mesmo processamento. O prefixo test não simula pagamentos: cobranças e saques podem movimentar dinheiro real.

Authentication#

A SymbolPay usa três modelos de autenticação, um para cada superfície:

  • 1. Painel e funções do gateway — sessão do usuário autenticado (login por e-mail/senha ou Google) ou chave de API no header Authorization: Bearer wz_live_.... As funções gatewayCreateCharge e gatewayWithdraw aceitam ambos os métodos e validam o status da conta.
  • 2. Checkout público — sem autenticação do pagador. As funções getPublicPaymentLink e gatewayCreateChargeFromLink rodam como serviço e validam apenas o link e o comerciante.
  • 3. Webhook de entrada — assinado em HMAC-SHA256 (header x-goatpay-signature).
Nunca exponha a chave de API
A chave wz_live_ dá acesso à sua conta. Mantenha-a em variáveis de ambiente do servidor. Se vazar, revogue no painel e gere uma nova.

Create charge#

O comerciante autenticado cria uma cobrança PIX no painel (/cobrancas/nova). A função gatewayCreateCharge valida o comerciante, calcula a taxa e devolve o copia e cola + QR Code.

POSThttps://wavez.online/functions/gatewayCreateCharge

Parâmetros do body (JSON)

  • amount number · obrigatório — Valor em reais (mín. R$ 1,00)
  • description string — Descrição da cobrança (máx. 120 chars)
  • external_reference string — ID do pedido no seu sistema (máx. 60 chars, volta no webhook)
  • payer_name string — Nome do pagador
  • payer_email string — E-mail do pagador
  • payer_document string — CPF/CNPJ do pagador (só dígitos)
  • fee_payer enum — "merchant" (padrão, taxa descontada do recebimento) ou "client" (cliente paga a taxa)
Resposta · JSON
{
  "id": "chg_abc123",
  "goatpay_id": "pay_xyz",
  "copy_paste": "00020126...",
  "qrcode_url": "https://api.goatpay.com.br/qr/pay_xyz.png",
  "expires_at": "2026-10-04T20:30:00Z",
  "fee_payer": "merchant"
}
Quem paga a taxa
Com fee_payer: "merchant" o comerciante recebe amount - R$ 0,65. Com fee_payer: "client" o cliente paga amount + R$ 0,65 e o comerciante recebe o valor integral.

Crie um link reutilizável no painel (/links-pagamento) e compartilhe a URL https://wavez.online/pay/:slug por qualquer canal. O pagador abre, preenche os dados e paga — sem login.

Fluxo do checkout público

  1. getPublicPaymentLink — consulta o link pelo slug e devolve nome, valor, descrição e marca do comerciante.
  2. gatewayCreateChargeFromLink — valida o link (ativo, não expirado, dentro do limite de usos), cria a cobrança PIX e devolve o QR Code.
Validações do link público
Link inativo, expirado ou que atingiu max_uses é rejeitado. Há um teto de 50 cobranças pendentes por link para evitar abuso do endpoint público. O limite de usos é reservado na criação da cobrança, incluindo pagamentos que ainda estejam pendentes.

Track status#

O status de cada cobrança é atualizado automaticamente pelo webhook de entrada e aparece no painel em /cobrancas. Os status possíveis são:

  • pendente — cobrança gerada, aguardando pagamento
  • pago — pagamento confirmado e saldo creditado
  • expirado — cobrança expirou sem pagamento
  • cancelado — cobrança cancelada
Sem endpoint de consulta pública
Não há um endpoint GET público de consulta de cobrança. O status é entregue por webhook (veja abaixo) e visível no painel. Um endpoint de consulta por chave de API está no roadmap.

Inbound webhook#

Eventos de pagamento chegam na função goatpayWebhook, que valida a assinatura HMAC-SHA256 no header x-goatpay-signature (formato sha256=...) e processa o evento de forma idempotente.

Eventos processados

  • payment.paid — marca a cobrança como pago e credita o saldo do comerciante
  • payment.pix.expired — marca a cobrança como expirado
  • transfer.completed — marca o saque como pago e libera o saldo reservado
  • transfer.failed — rejeita o saque e devolve o valor ao saldo disponível
Payload · payment.paid (exemplo)
{
  "event": "payment.paid",
  "data": { "id": "pay_xyz", "status": "paid" }
}
Idempotência
As transições de status são atômicas (pendente → pago, pendente → expirado). Entregas duplicadas ou concorrentes não reprocessam nem creditam duas vezes — apenas uma chamada vence a transição.

Outbound webhook (SYMBOL → you)#

No painel (/webhooks) você cadastra uma URL HTTPS de destino e seleciona os eventos. Um segredo de assinatura é gerado no servidor com entropia criptográfica e exibido uma única vez.

Eventos selecionáveis

  • charge.paid
  • charge.expired
  • charge.cancelled
  • withdrawal.paid
Entrega de eventos
Quando um pagamento é confirmado, a SymbolPay atualiza o estado interno (saldo, status de cobrança e saque) e dispara o evento correspondente para todos os seus endpoints ativos que assinam aquele evento. O payload é assinado em HMAC-SHA256 com o segredo de cada endpoint (header x-wavez-signature, formato sha256=...).

Cashout and withdrawal#

O comerciante solicita o saque do saldo disponível no painel (/saques). A função gatewayWithdraw reserva o valor de forma atômica, transfere para a chave PIX cadastrada no perfil do comerciante e desconta a taxa fixa de R$ 0,65.

POSThttps://wavez.online/functions/gatewayWithdraw
Resposta · JSON
{
  "id": "wdw_xyz789",
  "status": "pendente"
}
Reserva atômica de saldo
O saldo só é debitado se balance ≥ amount, usando uma operação atômica que move o valor para locked_balance. Isso impede saques duplicados concorrentes. Se a transferência falhar, o valor é devolvido ao saldo disponível.
Chave PIX do comerciante
O saque usa sempre a chave PIX cadastrada no perfil do comerciante — não é possível informar uma chave arbitrária no body. Sem chave cadastrada, o saque é rejeitado.

Error codes#

Os erros retornam HTTP apropriado (400, 401, 403, 404, 409, 429, 500, 502) e um objeto JSON com o campo error em português.

HTTPMensagemQuando
401Nao autorizadoSessão inválida ou chave de API inválida
403Conta suspensaComerciante não está ativo
400Valor mínimo para cobrança é R$1,00Abaixo do mínimo
400Saldo insuficiente para saqueSaldo menor que o valor do saque
400Cadastre sua chave Pix para receber o repasseSem chave PIX cadastrada
409Este slug já está em usoSlug de link duplicado
429Muitas cobranças pendentes para este linkTeto de 50 pendentes por link
401Assinatura invalidaWebhook com HMAC inválido

Security#

  • Row-Level Security por comerciante: cobranças, saques, links e chaves só são visíveis para o dono ou administrador.
  • Webhook de entrada assinado em HMAC-SHA256 com validação fail-closed (segredo ausente nunca valida).
  • Proteção SSRF no cadastro de webhooks: HTTPS obrigatório e bloqueio de hosts internos (localhost, faixas privadas, link-local).
  • Reserva atômica de saldo nos saques e idempotência nas transições de status evitam duplo crédito e saques duplicados.
  • Chaves de API com hash SHA-256: só o prefixo e o hash são armazenados; a chave crua é exibida uma única vez.
  • Slug de link único validado no servidor para evitar desvio de cobranças públicas para outro comerciante.

Service status#

Acompanhe a disponibilidade dos serviços da SymbolPay em tempo real na página pública de status.

Access status page

This site uses cookies

We use essential cookies for the site to function and analytics cookies to improve your experience. You can accept all, reject optional ones, or manage your preferences. Learn more in our Cookie Policy