Webhooks cobrem a NF-e (eventos
nfe_*). A NFS-e é acompanhada por polling em GET /notas/{id} — veja o Ciclo de vida.Verificação de assinatura
Cada entrega traz dois cabeçalhos:| Cabeçalho | Conteúdo |
|---|---|
X-Webhook-Signature | O HMAC-SHA256 em hexadecimal. |
X-Webhook-Timestamp | Instante da assinatura (epoch Unix, em segundos). |
X-Webhook-Timestamp, um ponto (.) e o corpo bruto do POST, concatenados:
chave_seguranca do endpoint e compare com X-Webhook-Signature usando uma comparação de tempo constante (ex.: Rack::Utils.secure_compare) — nunca uma igualdade simples de string, que vaza informação por timing. O timestamp na string assinada também permite rejeitar entregas antigas (proteção contra replay).
Semântica de entrega
A entrega é não ordenada e at-least-once (pelo menos uma vez): há um job independente por endpoint, com retries independentes. Portanto:- a ordem entre eventos não é garantida (um
nfe_autorizadarápido pode chegar antes de umnfe_solicitacao_autorizacaoque sofreu retry); - o mesmo evento pode ser entregue mais de uma vez.
event_id (UUID estável entre retries) e occurred_at (instante do evento). Os consumidores devem:
Tipos de evento (nfe_*)
| Evento | Quando dispara |
|---|---|
nfe_solicitacao_autorizacao | nota criada, autorização enfileirada |
nfe_autorizada | veredito terminal: autorizada pela SEFAZ |
nfe_rejeitada | veredito terminal: rejeitada pela SEFAZ |
nfe_denegada | veredito terminal: denegada pela SEFAZ |
nfe_solicitacao_cancelamento | pedido de cancelamento enviado |
nfe_cancelamento_autorizado | cancelamento aceito pela SEFAZ |
nfe_cancelamento_rejeitado | cancelamento rejeitado (a nota segue autorizada) |
nfe_inutilizada | faixa/nota inutilizada com sucesso |
nfe_inutilizada tem dois formatos de payload
O evento nfe_inutilizada cobre os dois modos de inutilização, com payloads distintos — diferencie pela presença dos campos:
- Modo nota — carrega
uuidechave_acesso(uma nota específica). - Modo faixa — carrega
numero_inicialenumero_final(uma faixa de numeração, sem nota associada).
As URLs de
xml_url / danfe_url são as rotas autenticadas da API (Basic auth), nunca links públicos a documentos fiscais.