Autenticar as requisições recebidas

Valide o header Authorization antes de processar qualquer evento de webhook.

A URL do seu webhook é pública. Qualquer pessoa pode enviar um POST para ela fingindo ser a PagPolar. Por isso, confira o header Authorization antes de processar o evento.

Como a PagPolar se identifica

Todo aviso do webhook da credencial chega com este header:

Authorization: Bearer <TOKEN_DO_WEBHOOK>

Não é o token de acesso da API

Este Authorization é o que a PagPolar envia para o seu servidor, com o token do webhook. Ele não tem relação com o token de acesso que você envia para a API, obtido em POST /auth/token. São dois valores diferentes, em direções diferentes. Veja Autenticação.

O token do webhook

O token é exibido uma única vez na janela Chave criada com sucesso, ao criar a credencial. O token criado junto com a credencial tem 32 caracteres hexadecimais. Se você trocar o token em Configurações → Webhooks, ele passa a ter o formato que você digitou ou gerou. O valor é o mesmo em todos os avisos daquele webhook até ser trocado.

O webhook da credencial sempre tem token. Um webhook adicional sem token envia os avisos sem o header Authorization.

Digite só o token, sem Bearer

O valor do campo Authorization (Bearer token) chega no header como Authorization: Bearer <valor do campo>. A PagPolar acrescenta o Bearer sozinha: se você digitar Bearer abc, o header chega como Bearer Bearer abc. Ao trocar o valor, atualize também o valor que o seu servidor confere.

Validar o header

  1. Guarde o token em uma variável de ambiente do servidor.
  2. Monte o valor esperado: Bearer seguido do token.
  3. Compare com o header recebido usando uma comparação de tempo constante.
  4. Se não bater, responda 401 e não processe nada.
  5. Se bater, responda 200 e processe o evento.

Use cURL para testar o seu servidor, simulando um aviso:

curl -X POST "https://seu-servidor.exemplo.com/webhooks/pagpolar" \
  -H "Authorization: Bearer <TOKEN_DO_WEBHOOK>" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "event": "TRANSACTION_PAID",
    "creation_date": "2026-09-15T14:35:05.000Z",
    "version": "1.0.0",
    "data": {}
  }'

Com o token certo, o seu servidor deve responder 200. Troque o token por qualquer outro valor: a resposta deve ser 401.

Exemplo com Express. Instale com npm install express.

import express from 'express';
import { timingSafeEqual } from 'node:crypto';

const app = express();
app.use(express.json());

const expectedAuthorization = Buffer.from(
  `Bearer ${process.env.PAGPOLAR_WEBHOOK_TOKEN}`,
);

const isFromPagPolar = (request) => {
  const receivedAuthorization = Buffer.from(request.get('authorization') ?? '');

  return (
    receivedAuthorization.length === expectedAuthorization.length &&
    timingSafeEqual(receivedAuthorization, expectedAuthorization)
  );
};

app.post('/webhooks/pagpolar', (request, response) => {
  if (!isFromPagPolar(request)) {
    return response.sendStatus(401);
  }

  response.sendStatus(200);

  console.log('Evento recebido:', request.body.event);
});

app.listen(3000);

Por que comparação de tempo constante

Uma comparação comum (===) para no primeiro caractere diferente. Medindo o tempo de resposta, um atacante consegue descobrir o token aos poucos. timingSafeEqual leva sempre o mesmo tempo.

Responder 401 conta como falha de entrega. Se for um aviso verdadeiro com o token desatualizado no seu servidor, a PagPolar tenta de novo. Veja Entregas e retentativas.

O que não existe

  • Não há assinatura do corpo (HMAC). O token prova quem enviou, mas o corpo não é assinado.
  • Não há lista de IPs de origem publicada para os avisos.

Por isso:

Se o token vazar

Você tem duas saídas:

OpçãoComoEfeito
Trocar o tokenEm Configurações → Webhooks, edite o webhook da credencial e troque o valor do campo Authorization (Bearer token), sem Bearer. Atualize o valor no seu servidor.A PagPolar passa a enviar o novo valor. A chave de API continua a mesma.
Trocar tudoRevogue a credencial e crie outra.Chave de API e token novos. Atualize os dois no seu servidor.

Próximos passos