Visão geral de webhooks
Receba eventos de pagamento normalizados e assinados da Tokeflow em tempo real — configure endpoints, entenda o envelope do evento e trate entrega e retentativas.
Webhooks permitem que sua plataforma reaja à atividade de pagamento no momento em que ela acontece. À medida que transações, reembolsos, disputas e assinaturas mudam de estado nos seus provedores conectados, a Tokeflow faz um POST de um evento JSON normalizado para o(s) endpoint(s) HTTPS que você configurar.
Em vez de consultar a API por polling, você se inscreve uma vez e deixa os eventos chegarem até você. Como a Tokeflow normaliza os webhooks de todos os provedores que você orquestra, você escreve um único handler — e não um por provedor — e o formato do evento permanece o mesmo, independentemente de qual adquirente processou a cobrança.
A Tokeflow é uma infraestrutura de orquestração de pagamentos. Os webhooks descrevem o ciclo de vida das operações que a Tokeflow coordena; o processamento e a liquidação subjacentes são realizados pelos seus provedores de pagamento conectados.
Por que webhooks
| Resultado | Como os webhooks ajudam |
|---|---|
| Reaja em tempo real | Faça fulfillment de pedidos, conceda acesso ou notifique clientes no instante em que um pagamento é autorizado — sem loop de polling. |
| Um handler, todos os provedores | Os eventos são normalizados para um único schema, de modo que payloads específicos de cada provedor nunca vazam para o seu código. |
| Entrega confiável | Entregas com falha são retentadas com backoff exponencial e registradas, de modo que uma breve indisponibilidade do seu lado não descarte eventos. |
| Autenticidade verificável | Cada requisição é assinada com HMAC-SHA256 para que você possa confirmar que ela veio da Tokeflow e não foi alterada em trânsito. |
| Trilha de auditoria | Cada tentativa de entrega é persistida e inspecionável, dando a você rastreabilidade para reconciliação e depuração. |
Como funciona a entrega
- Ocorre um evento. Uma transação, reembolso, disputa, método de pagamento ou assinatura muda de estado.
- A Tokeflow constrói um evento normalizado e o assina com o signing secret do seu endpoint.
- A Tokeflow faz um POST do evento para cada endpoint correspondente como um corpo de requisição JSON.
- Seu endpoint responde. Um status
2xx(retornado rapidamente) marca a entrega como bem-sucedida. Qualquer outra coisa dispara uma retentativa.
Configure seus endpoints
Você registra endpoints de webhook no Tokeflow Dashboard durante o onboarding (e a qualquer momento depois disso). Para cada endpoint você fornece:
| Configuração | Descrição |
|---|---|
| URL do endpoint | Uma URL HTTPS acessível publicamente que aceita requisições POST. Você pode registrar mais de uma. |
| Filtro de eventos | Uma allowlist opcional de tipos de evento. Omita-a para receber todos os tipos de evento. |
| Signing secret | Gerado quando o endpoint é criado — um valor com o prefixo whsec_. Use-o para verificar assinaturas. |
Registre endpoints separados para responsabilidades separadas — por exemplo, uma URL para eventos transaction.* alimentando o fulfillment e outra para eventos subscription.* alimentando o seu sistema de billing. Cada endpoint carrega seu próprio filtro e signing secret.
O signing secret é exibido quando o endpoint é criado. Armazene-o de forma segura (apenas no lado do servidor) — você precisará dele para verificar cada evento recebido. Trate-o como qualquer outra credencial.
O envelope do evento
Todo corpo de requisição de webhook compartilha o mesmo formato de nível superior. O campo data.object carrega o recurso ao qual o evento se refere (uma transação, reembolso, assinatura e assim por diante).
{
"id": "evt_8f3c2a1b9d7e4f60",
"type": "transaction.authorized",
"created_at": "2026-01-15T12:30:00.000Z",
"data": {
"object": {
"id": "tx_3n8Q2k1p7w",
"merchant_id": "mrc_7Yh2Kd9",
"external_order_id": "order-2026-0042",
"customer": {
"id": "cust_5Tg8Lp2",
"email": "buyer@example.com"
},
"previous_status": "pre_authorized",
"current_status": "authorized",
"amount_authorized": 15000,
"amount_captured": 15000,
"currency": "BRL",
"changed_at": "2026-01-15T12:30:00.000Z"
}
}
}| Field | Type | Description |
|---|---|---|
id | string | Identificador único do evento (prefixo evt_). Use-o para deduplicar. |
type | string | O tipo de evento, ex.: transaction.authorized. |
created_at | string | Timestamp ISO 8601 UTC de quando o evento foi gerado. |
data.object | object | O snapshot do recurso para este evento. Seus campos dependem de type. |
Os valores monetários são inteiros em unidades menores (centavos). 15000 com currency: "BRL" significa R$150,00. Sempre associe um valor à sua currency ISO 4217.
O que data.object contém
O formato de data.object depende da família de eventos. Consulte Tipos de evento para o catálogo completo e os campos por recurso.
| Família de eventos | data.object representa | Tipos de exemplo |
|---|---|---|
| Transações | Uma transação de pagamento | transaction.authorized, transaction.failed, transaction.voided |
| Reembolsos | Um reembolso | transaction.refunded, transaction.partially_refunded, transaction.refund_failed |
| Disputas | Um chargeback / disputa | transaction.dispute_created, transaction.dispute_won, transaction.dispute_lost |
| Métodos de pagamento | Um instrumento de pagamento armazenado | payment_method.action_required |
| Assinaturas | Uma assinatura | subscription.created, subscription.dunning, subscription.cancelled |
Cabeçalhos da requisição
Cada entrega é um POST HTTP com um corpo JSON e estes cabeçalhos notáveis:
| Header | Description |
|---|---|
Content-Type | Sempre application/json. |
X-Tokeflow-Signature | Assinatura HMAC do evento, no formato t=<unix-seconds>,v1=<hex>. |
User-Agent | Identifica a requisição como originada do sistema de entrega de webhooks da Tokeflow. |
Sempre verifique X-Tokeflow-Signature antes de confiar em um evento. A assinatura é calculada sobre os bytes brutos do corpo da requisição — leia e verifique o corpo antes de qualquer parsing JSON ou de qualquer middleware reserializá-lo. Consulte Verificando assinaturas.
Respondendo a eventos
Seu endpoint deve confirmar o recebimento rapidamente e fazer o trabalho real depois.
- Responda
2xxem poucos segundos. Retorne a resposta assim que tiver persistido o evento com segurança (por exemplo, enfileirado). A Tokeflow trata qualquer2xxcomo sucesso. - Processe de forma assíncrona. Faça o trabalho lento — fulfillment, e-mails, chamadas downstream — fora do ciclo de requisição/resposta para que você nunca corra o risco de um timeout.
- Deduplique por
id. Retentativas e entrega at-least-once significam que o mesmoidde evento pode chegar mais de uma vez. Torne o tratamento idempotente: registre os IDs de eventos processados e ignore duplicatas. - Não dependa da ordem. Os eventos podem chegar fora de ordem, especialmente após uma retentativa. Use os campos de status do recurso (e
changed_at) em vez de assumir que a ordem de chegada reflete a sequência real.
// Express example — acknowledge fast, process async.
// Use a raw body parser on this route so signature verification sees exact bytes.
import express from "express";
const app = express();
app.post(
"/webhooks/tokeflow",
express.raw({ type: "application/json" }),
(req, res) => {
// 1. Verify the signature against the raw body (see Verifying signatures).
if (!verifyTokeflowSignature(req)) {
return res.status(400).send("invalid signature");
}
const event = JSON.parse(req.body.toString("utf8"));
// 2. Deduplicate and enqueue for async processing.
enqueueForProcessing(event); // your job queue
// 3. Acknowledge immediately.
return res.status(200).send("ok");
},
);Entrega, falhas e retentativas
A Tokeflow registra cada tentativa de entrega para cada endpoint, para que você possa auditar exatamente o que foi enviado e como o seu endpoint respondeu.
Uma entrega é considerada bem-sucedida somente quando o seu endpoint retorna um HTTP 2xx. Uma entrega falha quando retorna um status não-2xx, sofre timeout ou está inacessível. Cada requisição tem um timeout de entrega de 30 segundos — mantenha os handlers bem abaixo disso.
Quando uma entrega falha, a Tokeflow retenta com backoff exponencial:
| Tentativa | Atraso após a tentativa anterior |
|---|---|
| 1 | Imediato (entrega inicial) |
| 2 | 1 minuto |
| 3 | 5 minutos |
| 4 | 30 minutos |
| 5 | 2 horas |
| (final) | 24 horas |
Depois que o cronograma de retentativas se esgota, a entrega é abandonada e nenhuma outra tentativa é feita. O histórico completo de entrega — códigos de status, trechos de resposta, contagens de tentativas e horário da próxima retentativa — é retido para inspeção. No total, um endpoint que falha em todas as tentativas é reprocessado ao longo de aproximadamente 26 horas antes de a entrega ser abandonada. Cada registro de entrega é carimbado no momento em que foi liquidado — em caso de sucesso ou de abandono — e mantém o código de status HTTP final e o trecho de resposta, de modo que o registro sempre reflete quando a entrega de fato foi concluída, e não quando começou.
Como uma única indisponibilidade do endpoint pode produzir uma rajada de retentativas assim que você se recupera, projete o seu consumidor para absorver picos: retorne 2xx rapidamente, enfileire e processe a partir da fila. A idempotência pelo id do evento evita que eventos retentados sejam aplicados duas vezes.
Um endpoint que falha persistentemente será retentado até o limite acima e então abandonado para aquele evento. Se o seu endpoint ficar fora do ar por um período prolongado, você pode perder eventos; reconcilie com a API assim que se recuperar e mantenha o seu handler idempotente para que replays sejam seguros.
Checklist de segurança
- Verifique cada assinatura. Rejeite requisições cujo
X-Tokeflow-Signaturenão valide contra o corpo bruto e o seu secretwhsec_. - Imponha uma tolerância de timestamp. Rejeite eventos cujo timestamp da assinatura esteja fora de uma pequena janela (por exemplo, 5 minutos) para mitigar ataques de replay.
- Use apenas HTTPS. Os endpoints devem ser HTTPS para que payloads e assinaturas sejam protegidos em trânsito.
- Mantenha os secrets no lado do servidor. O signing secret do webhook, assim como as suas chaves de API
sk_*, nunca deve aparecer em código de navegador ou de cliente.
Próximos passos
- Tipos de evento — o catálogo completo de tipos de evento e o recurso carregado em
data.object. - Verificando assinaturas — valide
X-Tokeflow-Signaturepasso a passo. - Autenticação — como funcionam chaves de API, escopos e ambientes.