Webhook
A LideraNota avisa o desfecho de cada nota com um POST no endereço de webhook do seu sistema. É o ponto de maior risco da integração: siga as regras abaixo à risca. O contrato do evento está na referência do webhook.
Endereço do webhook e token de webhook
O endereço do webhook precisa ser HTTPS, com certificado TLS válido emitido por autoridade certificadora pública, sem usuário e senha embutidos no endereço, e final: sem redirecionamento de http para https, de barra final ou de domínio. O endereço é um por emitente.
Para começar a receber eventos, informe o endereço e peça o cadastro do endereço do webhook; junto com ele, a LideraNota entrega o token de webhook, mostrado uma única vez. A LideraNota executa este passo: pedir pelo WhatsApp.
Para trocar o endereço do webhook, por exemplo numa mudança de servidor, informe o endereço novo. A LideraNota executa este passo: pedir pelo WhatsApp.
Guarde o token de webhook como o token de acesso: no cofre de segredos ou na configuração protegida do seu sistema, nunca em código-fonte, log ou tela.
Requisição recebida
A LideraNota envia POST no endereço cadastrado, com Content-Type: application/json, o cabeçalho X-Lwnfse-Token e o evento em JSON UTF-8. Exemplo de evento autorizada recebido em https://sistema-do-cliente.example/webhook/nfse:
POST /webhook/nfse HTTP/1.1
Host: sistema-do-cliente.example
Content-Type: application/json
X-Lwnfse-Token: <token-de-webhook>
{
"eventoId": "5e6f7a8b-9c0d-4e1f-a2b3-c4d5e6f7a8b9",
"tipo": "autorizada",
"ocorridoEm": "2026-11-10T14:05:41.123Z",
"nota": {
"id": "3f8b2c1a-6d4e-4b7f-9a21-0c5e8d7f6a10",
"idOperacao": "FAT-1001",
"loteId": "7c1e9a4b-2f3d-4e8a-b5c6-1d2e3f4a5b6c",
"status": "autorizada",
"ambiente": "homologacao",
"numeroNfse": "123",
"chaveAcesso": "31062002211222333000181000000000012326110000001234",
"autorizadaEm": "2026-11-10T14:05:40.000Z",
"links": {
"xml": "https://hml.nfse.lideraweb.com/v1/notas/3f8b2c1a-6d4e-4b7f-9a21-0c5e8d7f6a10/xml",
"danfse": "https://hml.nfse.lideraweb.com/v1/notas/3f8b2c1a-6d4e-4b7f-9a21-0c5e8d7f6a10/danfse"
}
}
}
eventoId: identificador do evento, chave da deduplicação.ocorridoEm: instante do evento em UTC, chave da ordenação.nota: o mesmo objeto da consulta da nota, com o estado no instante do evento. O conteúdo é congelado na criação do evento, inclusive quando o mesmo evento chega de novo mais tarde; o estado atual é o da consulta.- Os
linkssão baixados com o token de acesso (Authorization: Bearer), nunca com o token de webhook.
Para testar o receptor do seu sistema antes de cadastrar o endereço, simule a entrega com curl, com URL_WEBHOOK contendo o endereço do seu receptor de teste e TOKEN_WEBHOOK contendo um token de teste configurado nele:
curl -X POST "$URL_WEBHOOK" \
-H "Content-Type: application/json" \
-H "X-Lwnfse-Token: $TOKEN_WEBHOOK" \
--data '{
"eventoId": "5e6f7a8b-9c0d-4e1f-a2b3-c4d5e6f7a8b9",
"tipo": "autorizada",
"ocorridoEm": "2026-11-10T14:05:41.123Z",
"nota": {
"id": "3f8b2c1a-6d4e-4b7f-9a21-0c5e8d7f6a10",
"idOperacao": "FAT-1001",
"loteId": "7c1e9a4b-2f3d-4e8a-b5c6-1d2e3f4a5b6c",
"status": "autorizada",
"ambiente": "homologacao",
"numeroNfse": "123",
"chaveAcesso": "31062002211222333000181000000000012326110000001234",
"autorizadaEm": "2026-11-10T14:05:40.000Z",
"links": {
"xml": "https://hml.nfse.lideraweb.com/v1/notas/3f8b2c1a-6d4e-4b7f-9a21-0c5e8d7f6a10/xml",
"danfse": "https://hml.nfse.lideraweb.com/v1/notas/3f8b2c1a-6d4e-4b7f-9a21-0c5e8d7f6a10/danfse"
}
}
}'
Repita a simulação com o mesmo eventoId (o receptor deve responder 2xx sem processar de novo) e com um token diferente (o receptor deve responder 401).
Tipos de evento
tipo |
Quando | O que vem na nota |
|---|---|---|
autorizada |
NFS-e autorizada pela Sefin Nacional | status autorizada, com numeroNfse, chaveAcesso e links; na nota substituta, também substitui |
rejeitada |
Nota rejeitada pela Sefin Nacional ou pela validação antes do envio | status rejeitada, com erro (codigo e mensagem) |
cancelada |
Cancelamento registrado, pelo cancelamento direto ou pelo deferimento da análise fiscal | status cancelada; no cancelamento direto, cancelamento.status registrado; no deferimento, analiseFiscal.resultado.decisao deferido |
cancelamento_rejeitado |
Cancelamento recusado pela Sefin Nacional | status volta a autorizada; cancelamento.status rejeitado, com erro. Um novo pedido pode ser feito |
substituida |
A substituta da nota foi autorizada | Evento da nota original: status substituida, com substituidaPor. Chega junto do autorizada da substituta, com o mesmo ocorridoEm e eventoId diferente |
analise_fiscal_registrada |
Pedido de análise fiscal registrado na Sefin Nacional | status continua autorizada; analiseFiscal.status registrado. Ainda não é a decisão do município |
analise_fiscal_rejeitada |
A Sefin Nacional recusou o pedido de análise fiscal | status continua autorizada; analiseFiscal.status rejeitado, com erro |
analise_fiscal_indeferida |
O município indeferiu o cancelamento | status continua autorizada; analiseFiscal.resultado com decisao indeferido, codigoMotivo e motivo do município |
- Tipo desconhecido: responda
2xxa qualquertipoque o seu sistema não conheça e registre o evento. Assim uma versão nova da API, com um tipo novo, não faz a entrega falhar até esgotar as tentativas. pendente_intervencaonão gera evento: mantenha uma rotina que consulta as notas enviadas há muito tempo sem evento de desfecho.
Verificação do token
- Compare o cabeçalho
X-Lwnfse-Tokencom o token de webhook guardado no seu sistema em tempo constante, com a função de comparação segura da sua linguagem, nunca com a comparação comum de texto, que vaza o tempo da comparação. - Token ausente ou diferente: responda
401sem processar. Nunca responda2xxnesse caso: qualquer2xxencerra a entrega e o evento se perde. Com401, a LideraNota tenta de novo. - Não registre em log o valor recebido nem o esperado.
- A autenticação da origem é o
X-Lwnfse-Token, e a LideraNota só envia para endereço HTTPS: não é preciso conferir o IP de origem.
Quando o token de webhook vazar ou precisar ser trocado, peça um novo token de webhook. O anterior deixa de valer na hora, e as novas tentativas de eventos pendentes já saem com o token novo: troque o valor configurado no seu sistema logo em seguida. Eventos recusados com 401 nesse intervalo chegam de novo nas próximas tentativas. A LideraNota executa este passo: pedir pelo WhatsApp.
Deduplicação por eventoId
O mesmo evento pode chegar mais de uma vez: a entrega é repetida depois de tempo esgotado ou falha de rede, inclusive quando o seu sistema respondeu 2xx mas a resposta se perdeu no caminho. Grave os eventoId recebidos, com chave única, e, ao receber um eventoId já gravado, ignore o evento sem erro e responda 2xx.
Ordenação por ocorridoEm
Sob novas tentativas, os eventos podem chegar fora de ordem: um evento mais antigo pode chegar depois de um mais recente da mesma nota (por exemplo autorizada depois de cancelada). Guarde, por nota, o ocorridoEm do último estado aplicado e descarte o evento cujo ocorridoEm é mais antigo que ele, mesmo com eventoId novo. Compare instantes, convertidos para UTC, e não o texto recebido.
Resposta esperada e novas tentativas
- Responda
2xxlogo depois de gravar o evento. Não baixe o XML nem o DANFSe e não atualize faturas dentro da requisição do webhook: deixe o processamento para uma fila ou rotina do seu sistema. - Qualquer status de
200a299conta como entregue; o corpo da resposta é descartado sem leitura. - Qualquer outra resposta, tempo de resposta acima de 10 segundos ou erro de rede ou TLS gera nova tentativa, com intervalos de 1, 2, 4, 8, 16 e 32 minutos e depois a cada hora, até 24 tentativas, por cerca de um dia.
- Redirecionamento (
3xx) nunca é seguido e conta como falha.
Esgotadas as tentativas, a entrega daquele evento para. Enquanto isso, a consulta da nota é o caminho. Corrigido o problema no seu receptor, peça o reenvio dos eventos que falharam, que chegam com o mesmo eventoId. A LideraNota executa este passo: pedir pelo WhatsApp.
Lógica sugerida do receptor
- Confira o
X-Lwnfse-Tokenem tempo constante; ausente ou diferente, responda401. - Leia o corpo como JSON; corpo inválido, responda
400e registre o caso. - Se o
eventoIdjá foi gravado, responda2xxsem processar de novo. - Grave o evento com o
eventoId, oidda nota, otipo, oocorridoEme o corpo recebido. - Se o
ocorridoEmfor mais antigo que o último estado aplicado da nota, marque o evento como descartado; senão, enfileire o processamento. - Responda
2xx. Se a gravação falhar, responda500, para a LideraNota tentar de novo. - Na fila do seu sistema, aplique o estado da nota e baixe os documentos com o token de acesso.