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#
- Crie um Zap e escolha Webhooks by Zapier como gatilho, no modo Catch Hook.
- Copie a URL que o Zapier gerar. Ela já é
https.
2. Cadastre a URL na Emitra#
- No painel, vá em Notas › Automação › Integrações › Webhooks e clique em Novo webhook.
- Cole a URL do Zapier e marque os eventos, por exemplo
nfse.authorizedenfse.rejected. - Salve e guarde o segredo de assinatura mostrado na tela.
- 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:
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:
GET https://emitra.com.br/api/v1/integracao/nfse/{{data.nfse_id}}
Authorization: Bearer emt_test_xxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxPara 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.