Webhooks
O sistema de webhooks da Saq envia notificações em tempo real sobre
mudanças de status das suas transações. Quando você cria uma transação
e fornece um callbackUrl, nosso sistema envia atualizações para essa
URL toda vez que houver mudança de status.
O que é um webhook (callback)
Um webhook (também chamado de callback) é uma requisição POST que a Saq envia para o seu servidor quando algo acontece. Ao contrário da API normal (onde você chama a Saq), aqui é o oposto: a Saq chama você.
Pensa numa cobrança Pix. Você criou ela, exibiu o QR ao cliente, e agora precisa saber quando o cliente paga. Duas opções:
- Polling, ficar perguntando a cada X segundos "já pagou? já pagou?" (custoso, lento, desnecessário).
- Webhook, deixar a Saq te avisar assim que o pagamento entrar (instantâneo, eficiente, recomendado).
Como configurar
Não existe endpoint separado para "cadastrar webhook". A URL é informada a cada transação criada, no campo callbackUrl do body:
{
"amount": 99.90,
"callbackUrl": "https://seusite.com.br/webhooks/saq",
"clientReference": "pedido-2025-001"
}A Saq vai enviar o callback para essa URL toda vez que aquela transação mudar de status (PENDING → COMPLETED, COMPLETED → REFUNDED, etc).
Crie um endpoint público no seu servidor
Algum lugar acessível pela internet que aceite POST com JSON. Exemplos: https://seusite.com.br/webhooks/saq, https://api.suaempresa.com/saq/callback.
Durante desenvolvimento local, use túneis como ngrok ou Cloudflare Tunnel pra expor o localhost.
Passe a URL ao criar a transação
Em todo POST /pix, POST /withdraw, POST /internal-transfer, inclua o campo callbackUrl. Pode ser a mesma URL pra todos.
Implemente o handler
Receba o POST, leia o JSON, processe e responda 2xx em até 5 segundos. Veja exemplos em Receber Pix · passo 3.
Header obrigatório no POST enviado pela Saq: Content-Type: application/json.
Sistema de retry
Os webhooks da Saq têm um sistema robusto de retentativa que garante a entrega mesmo em falhas temporárias. A Saq reenvia até 72 vezes o mesmo callback com backoff exponencial e jitter, distribuindo melhor a carga e evitando picos de requisições.
Tempo de resposta: o webhook deve responder com HTTP 200 OK em
até 5 segundos. Se exceder esse tempo, o sistema considera timeout
e inicia o processo de retentativa.
Segurança
Para garantir integridade e segurança, restrinja o acesso ao seu endpoint de webhook. Solicite o IP oficial da Saq ao suporte e aceite callbacks apenas dessa origem.
Campos do payload
Identificação
| Campo | Tipo | Descrição |
|---|---|---|
id | string | ID da transação |
clientReference | string | Referência externa que você forneceu |
virtualAccount | string | Subconta virtual (até 50 caracteres). Volta no callback para correlacionar lojas, filiais, marketplaces. |
callbackUrl | string | URL configurada para receber este webhook |
Status e valores
| Campo | Tipo | Descrição |
|---|---|---|
status | string | PENDING, COMPLETED, CANCELED, WAITING_FOR_REFUND, REFUNDED, EXPIRED, ERROR |
type | string | DEPOSIT, WITHDRAW, INTERNAL_TRANSFER |
amount | number | Valor em BRL |
serviceFeeCharged | number | Tarifa cobrada |
Cobrança gerada (depósito)
| Campo | Tipo | Descrição |
|---|---|---|
qrCodeText | string | Código Pix copia-e-cola |
qrCodeUrl | string | URL da imagem do QR Code |
qrCodeBase64 | string | Imagem do QR Code em formato Base64 |
generatedName | string | Nome de referência |
generatedDocument | string | CPF ou CNPJ |
generatedEmail | string | Email vinculado à transação |
Pagador
| Campo | Tipo | Descrição |
|---|---|---|
payerName | string | Nome do pagador |
payerDocument | string | Documento do pagador |
payerInstitutionIspb | string | ISPB do banco do pagador |
payerInstitutionName | string | Nome do banco do pagador |
payerAccountNumber | string | Conta Saq do pagador (6 dígitos). Presente apenas em transferências internas. |
Recebedor
| Campo | Tipo | Descrição |
|---|---|---|
receiverName | string | Nome do destinatário |
receiverDocument | string | Documento do destinatário |
receiverInstitutionIspb | string | ISPB do banco do destinatário |
receiverInstitutionName | string | Nome do banco do destinatário |
receiverAccountNumber | string | Conta Saq do destinatário (6 dígitos). Presente apenas em transferências internas. |
Saque via chave Pix
| Campo | Tipo | Descrição |
|---|---|---|
withdrawPixKey | string | Chave Pix usada no saque |
withdrawPixType | string | cpf, cnpj, phone, email, evp |
Liquidação e estorno
| Campo | Tipo | Descrição |
|---|---|---|
endToEndId | string | EndToEnd ID do Pix |
paidAt | string | Timestamp do pagamento (ISO 8601) |
cancellationReason | string | Motivo do cancelamento |
refundEndToEndId | string | EndToEnd ID do estorno |
refundAmount | string | Valor estornado |
refundStatus | string | PENDING, COMPLETED, CANCELED |
refundReason | string | Motivo do estorno |
refundDescription | string | Descrição do estorno |
refundedAt | string | Timestamp do estorno (ISO 8601) |
Timestamps
| Campo | Tipo | Descrição |
|---|---|---|
createdAt | string | Timestamp de criação (ISO 8601) |
updatedAt | string | Timestamp de atualização (ISO 8601) |
Infração (disputa Pix)
| Campo | Tipo | Descrição |
|---|---|---|
infraction | object | Detalhes da infração quando aberta (ver MED) |
Boas práticas
- Responda rápido: devolva
2xxem menos de 5s. Processe pesado em fila/worker, não no handler. - Idempotência: armazene
id+statuspara deduplicar. O mesmo callback pode chegar mais de uma vez (retentativa, mudanças sucessivas). - Use
clientReference: passe um identificador externo na criação da transação. Volta no callback e facilita correlacionar com seu pedido. - Restrinja por IP: aceite callbacks apenas do IP oficial da Saq.
Inspeção e reenvio
A API expõe a lista completa de callbacks enviados:
GET /user/callbacks, lista paginadaGET /user/callbacks/{id}, detalhesPOST /user/callbacks/resend/{transactionId}, reenviar callback de uma transaçãoPOST /user/callbacks/resend, reenvio em lote
Infrações (MED)
O MED é o processo do Bacen para contestar Pix em casos de fraude ou erro do pagador. Quando uma cobrança recebida vira disputa, a Saq cria uma infração e você tem prazo curto para responder com defesa.
Boas práticas
Padrões testados em produção que separam uma integração que dura uma semana de uma que aguenta produção. Idempotência, multi-tenant, callbacks, paginação, dinheiro, segurança, tratamento de erros e checklist final.