se você configurou um signing secret no webhook, cada notificação chega assinada. nós usamos essa chave para criar um hashDocumentation Index
Fetch the complete documentation index at: https://docs.teceo.co/llms.txt
Use this file to discover all available pages before exploring further.
HMAC-SHA256 pra você validar que o evento veio realmente da gente.
como funciona
- você configura um secret e salva em algum lugar no seu sistema onde você possa acessar pra validar as requisições
- a gente calcula um hash
HMAC-SHA256e enviamos no headerX-Webhook-Signature - você recalcula o mesmo hash com o secret que você tem salvo
- você compara os dois hashes e se bater, é porque a requisição é legítima
headers que recebe
hash HMAC-SHA256 do payload assinado, no formato
sha256= seguido do valor em hexadecimal (ex: sha256=abc123def456...).timestamp ISO 8601 do evento, usado para evitar ataques de replay.
como calcular o hash
o hash é calculado com a concatenação detimestamp.body:
o valor assinado é construído assim
Typescript
validar a assinatura
importante
- use o corpo bruto (raw): se o seu framework parseia o JSON automaticamente (ex: Express com
express.json()), reconverta comJSON.stringify(body)antes de calcular o hash. se você tiver o raw body como string, use diretamente sem stringify - a ordem importa: é sempre
timestamp+.+body, nessa sequência - timestamp vem do header: sempre use
X-Webhook-Timestamp, nunca tente adivinhar ou usar a hora do seu servidor
segurança
- sempre valide: mesmo se parecer desnecessário
- nunca commite o secret no controle de versão
- guarde em variável de ambiente ou serviço de secrets
- sem validação = risco: qualquer um pode se passar pela plataforma
