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
- Guarde o token em uma variável de ambiente do servidor.
- Monte o valor esperado:
Bearerseguido do token. - Compare com o header recebido usando uma comparação de tempo constante.
- Se não bater, responda
401e não processe nada. - Se bater, responda
200e 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:
- use HTTPS na URL do webhook, para o token e o corpo não trafegarem abertos;
- antes de uma ação de alto valor, como liberar um produto caro, confirme o status em
GET /sales/{identifier}usandodata.transaction.id.
Se o token vazar
Você tem duas saídas:
| Opção | Como | Efeito |
|---|---|---|
| Trocar o token | Em 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 tudo | Revogue a credencial e crie outra. | Chave de API e token novos. Atualize os dois no seu servidor. |