Pular para o conteúdo
Docs

Webhooks da Emitra no Zapier

Atualizado em

Nesta página

Com o Zapier você liga eventos da Emitra (nota autorizada, rejeitada, lote concluído) a planilhas, CRMs, chats e e-mail, sem escrever um servidor.

Pré-requisitos#

  • Conta no Zapier com acesso a Webhooks by Zapier (verifique no seu plano do Zapier).
  • Usuário owner ou admin na Emitra, para cadastrar webhooks.
  • Uma chave de API, se o Zap for chamar a Emitra de volta. Comece com uma chave de teste (emt_test_...). Veja Autenticação.

1. Crie o gatilho no Zapier#

  1. Crie um Zap e escolha Webhooks by Zapier como gatilho, no modo Catch Hook.
  2. Copie a URL que o Zapier gerar. Ela já é https.

2. Cadastre a URL na Emitra#

  1. No painel, vá em Notas › Automação › Integrações › Webhooks e clique em Novo webhook.
  2. Cole a URL do Zapier e marque os eventos, por exemplo nfse.authorized e nfse.rejected.
  3. Salve e guarde o segredo de assinatura mostrado na tela.
  4. Clique em Testar. O Zapier vai receber um evento de exemplo, que você usa para mapear os campos nas próximas etapas.

Os campos disponíveis estão no catálogo de eventos. Os mais usados:

Campo no Zapier O que é
type Tipo do evento
data.numero_nfse Número da nota autorizada
data.tomador.nome Nome do tomador
data.valores.valor_servico Valor do serviço, como texto decimal ("1500.00")
data.rejeicao.orientacao Explicação da rejeição em português
is_test true para eventos do sandbox

3. Valide a origem do evento#

O Catch Hook aceita qualquer POST na URL e não verifica a assinatura HMAC sozinho. Trate a URL como segredo e, se o Zap fizer algo sensível, valide a assinatura num passo de código.

Adicione um passo Code by Zapier (JavaScript) logo depois do gatilho. Para isso você precisa do corpo bruto e dos headers da requisição; o Catch Hook comum entrega o corpo já interpretado. Use o modo do gatilho que expõe o corpo bruto e os headers (no Zapier, a variante "raw" do Catch Hook) e passe para o passo de código:

Code by Zapier
const crypto = require("crypto");

const secret = inputData.secret; // guarde o segredo no próprio passo, nunca no corpo
const timestamp = inputData.timestamp; // header X-Emitra-Timestamp
const signature = inputData.signature; // header X-Emitra-Signature
const rawBody = inputData.raw_body;

const expected =
  "sha256=" +
  crypto.createHmac("sha256", secret).update(`${timestamp}.${rawBody}`).digest("hex");

const age = Math.abs(Date.now() / 1000 - Number(timestamp));
const valid =
  age <= 300 &&
  expected.length === signature.length &&
  crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));

output = { valid, event: valid ? JSON.parse(rawBody) : null };

Depois, use um Filter que só continua quando valid for true.

4. Chame a API de volta (opcional)#

Para baixar o PDF, consultar a nota ou emitir a partir de outro app, use um passo Webhooks by Zapier de requisição (método GET ou POST) apontando para a API:

Consultar a nota do evento
GET https://emitra.com.br/api/v1/integracao/nfse/{{data.nfse_id}}
Authorization: Bearer emt_test_xxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Para emitir, faça um POST em /integracao/nfse com o header Idempotency-Key. Use um valor estável do app de origem (o ID do pedido, por exemplo), para que uma repetição do Zap não gere nota duplicada. Veja Idempotência e a referência de NFS-e.

Próximos passos#

Esta página foi útil?