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

ResultadoComo os webhooks ajudam
Reaja em tempo realFaça fulfillment de pedidos, conceda acesso ou notifique clientes no instante em que um pagamento é autorizado — sem loop de polling.
Um handler, todos os provedoresOs 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ávelEntregas 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ávelCada 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 auditoriaCada tentativa de entrega é persistida e inspecionável, dando a você rastreabilidade para reconciliação e depuração.

Como funciona a entrega

  1. Ocorre um evento. Uma transação, reembolso, disputa, método de pagamento ou assinatura muda de estado.
  2. A Tokeflow constrói um evento normalizado e o assina com o signing secret do seu endpoint.
  3. A Tokeflow faz um POST do evento para cada endpoint correspondente como um corpo de requisição JSON.
  4. 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çãoDescrição
URL do endpointUma URL HTTPS acessível publicamente que aceita requisições POST. Você pode registrar mais de uma.
Filtro de eventosUma allowlist opcional de tipos de evento. Omita-a para receber todos os tipos de evento.
Signing secretGerado 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"
    }
  }
}
FieldTypeDescription
idstringIdentificador único do evento (prefixo evt_). Use-o para deduplicar.
typestringO tipo de evento, ex.: transaction.authorized.
created_atstringTimestamp ISO 8601 UTC de quando o evento foi gerado.
data.objectobjectO 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 eventosdata.object representaTipos de exemplo
TransaçõesUma transação de pagamentotransaction.authorized, transaction.failed, transaction.voided
ReembolsosUm reembolsotransaction.refunded, transaction.partially_refunded, transaction.refund_failed
DisputasUm chargeback / disputatransaction.dispute_created, transaction.dispute_won, transaction.dispute_lost
Métodos de pagamentoUm instrumento de pagamento armazenadopayment_method.action_required
AssinaturasUma assinaturasubscription.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:

HeaderDescription
Content-TypeSempre application/json.
X-Tokeflow-SignatureAssinatura HMAC do evento, no formato t=<unix-seconds>,v1=<hex>.
User-AgentIdentifica 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 2xx em poucos segundos. Retorne a resposta assim que tiver persistido o evento com segurança (por exemplo, enfileirado). A Tokeflow trata qualquer 2xx como 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 mesmo id de 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:

TentativaAtraso após a tentativa anterior
1Imediato (entrega inicial)
21 minuto
35 minutos
430 minutos
52 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-Signature não valide contra o corpo bruto e o seu secret whsec_.
  • 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

Nesta página