A partir de julho de 2026, a Emitare envia notificações webhook em tempo real para o endpoint do seu ERP sempre que uma NFS-e é emitida, cancelada ou falha. Sem polling. Sem complexidade. Você configura uma URL e começa a receber eventos imediatamente.

Benefício principal

Elimine o loop de consulta (GET /nfse/:id a cada N segundos). Com webhooks, o seu sistema é notificado em menos de 1 segundo após qualquer alteração no status da NFS-e.

Eventos disponíveis

nfse.emitida
NFS-e emitida com sucesso Disparado quando a prefeitura ou o ADN confirma a emissão. Contém número, chave de acesso e código de verificação.
nfse.cancelada
NFS-e cancelada Disparado após confirmação do cancelamento pela prefeitura. Inclui data e motivo do cancelamento.
nfse.falha
Emissão falhou Disparado quando a prefeitura rejeita a nota. Contém os códigos e mensagens de erro retornados.
lote.concluido
Lote de RPS processado Disparado quando um lote enviado via POST /nfse/lote termina o processamento (sucesso ou com erros parciais).

Payload de exemplo

// POST https://seu-erp.com/webhooks/nfse
// Headers:
//   Content-Type: application/json
//   X-Emitare-Signature: sha256=abc123...
//   X-Emitare-Event: nfse.emitida

{
  "event": "nfse.emitida",
  "timestamp": "2026-07-08T14:32:00.000Z",
  "tenantId": "tenant_abc123",
  "data": {
    "nfseId": "nfse_xyz789",
    "nfseNumero": "000000042",
    "chaveAcesso": "35470000012345678901234...",
    "codigoVerificacao": "ABCD-1234",
    "dataEmissao": "2026-07-08T14:31:58.000Z",
    "valorServicos": 5000.00,
    "valorIss": 250.00,
    "companyId": "comp_123",
    "municipioIbge": "3547809",
    "municipioNome": "Santo André"
  }
}

Segurança: verificando a assinatura HMAC

Cada requisição webhook inclui o header X-Emitare-Signature com uma assinatura HMAC-SHA256. Sempre valide a assinatura antes de processar o evento — isso garante que a requisição veio da Emitare e não foi adulterada.

// Node.js — verificar assinatura HMAC
const crypto = require('crypto');

function verificarAssinatura(payload, signature, secret) {
  const expected = 'sha256=' + crypto
    .createHmac('sha256', secret)
    .update(payload)
    .digest('hex');
  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected)
  );
}

// No handler do webhook:
app.post('/webhooks/nfse', (req, res) => {
  const sig = req.headers['x-emitare-signature'];
  const raw = req.rawBody; // body bruto, antes do JSON.parse

  if (!verificarAssinatura(raw, sig, process.env.EMITARE_WEBHOOK_SECRET)) {
    return res.status(401).send('Signature invalid');
  }

  const event = req.body;
  // processar event.event, event.data...
  res.status(200).send('ok');
});

Como configurar

Via Dashboard

  1. Acesse emitare.com.br/app e vá em Configurações → Webhooks
  2. Clique em Adicionar endpoint
  3. Informe a URL do seu ERP (ex: https://meu-erp.com/webhooks/nfse)
  4. Selecione os eventos que deseja receber
  5. Copie o Webhook Secret gerado e configure na variável de ambiente do seu servidor

Via API

// POST /api/v1/webhooks
// Header: x-api-key: sua-chave
{
  "url": "https://meu-erp.com/webhooks/nfse",
  "events": ["nfse.emitida", "nfse.cancelada", "nfse.falha"],
  "ativo": true
}

Política de tentativas (retry)

TentativaDelayCondição
1ª (imediata)Sempre
1 minutoSe 1ª falhou (timeout ou status ≥ 400)
5 minutosSe 2ª falhou
30 minutosSe 3ª falhou
DescartadoApós 4ª falha
Dica

Retorne HTTP 200 assim que receber o evento, mesmo que o processamento seja assíncrono. Se o seu servidor demorar mais de 10 segundos para responder, a Emitare considera a entrega como falha e tenta novamente.

📱 Recursos da Emitare