A configuração fiscal vive em recursos reutilizáveis. Cada emissão referencia um emitente e um perfil de serviço, entra em uma fila assíncrona e evolui até um estado final.
1
Configure
Emitente, perfil de serviço e certificado A1 válido.
2
Valide e envie
Valide o payload e crie a emissão com uma chave de idempotência.
3
Acompanhe
Consulte o estado ou processe os webhooks assinados.
4
Concilie
Relacione o resultado ao seu billing e obtenha o XML autorizado.
Antes de começar
A URL-base da API é fornecida durante o onboarding. Não use a URL da landing page como endpoint.
Autenticação
Uma credencial por integração, com o menor escopo possível
Todas as rotas /v1 exigem o header Authorization: Bearer <API_KEY>. A chave identifica a organização automaticamente.
emissions:read
Listar emissões, consultar detalhes, eventos e XML.
emissions:write
Validar payloads, criar emissões e registrar eventos fiscais.
webhooks:read
Listar destinos configurados.
webhooks:write
Criar, alterar ou remover destinos.
Credenciais
Nunca exponha API keys no frontend, em logs ou em exemplos compartilhados. A criação e a revogação de chaves exigem uma sessão do dashboard.
Primeira chamada
Confirme a URL e a disponibilidade do serviço
Defina as variáveis no seu shell. O healthcheck é público e não acessa dados da organização.
Retorna a emissão completa com os erros persistidos e a linha do tempo de eventos.
Escopoemissions:read
GET/v1/emissions/:id/events
Somente leitura
Lista eventos fiscais, como o cancelamento, vinculados à emissão.
Escopoemissions:read
GET/v1/emissions/:id/nfse.xml
Somente leitura
Retorna uma URL assinada para o XML. A URL expira em 300 segundos e só existe quando o XML já está disponível.
Escopoemissions:read
Paginação
Navegue com limit e offset
A resposta de listagem sempre inclui data, total, limit e offset. Para a próxima página, some o limit atual ao offset.
proximoOffset = offset + limitContinue enquanto proximoOffset < total.
Ciclo de vida
Estados de uma emissão
01queued
Recebida e aguardando processamento.
02validating
Dados e contexto fiscal em validação.
03signing
DPS em preparação e assinatura.
04transmitting
Transmissão para o ambiente nacional iniciada.
05sent
DPS transmitida; resultado ainda em processamento.
06authorized
NFS-e autorizada e XML disponível.
07rejected
Rejeitada com erros fiscais para diagnóstico.
08error
Falha técnica definitiva após as tentativas previstas.
09cancelled
NFS-e autorizada que recebeu evento de cancelamento.
Estados finais
authorized, rejected e error encerram o processamento. cancelled acontece depois de uma autorização e de um evento fiscal aceito.
Integração nacional
SEFIN: protocolo, ambientes e regras de transporte
A API Invio encapsula a comunicação com o Sistema Nacional NFS-e. A unidade enviada é uma DPS no layout 1.01; a NFS-e é o documento autorizado devolvido pelo ambiente nacional.
O ambiente pertence ao emitente e é copiado para cada emissão. Uma emissão criada em restrita não deve ser reaproveitada em producao.
Operações do protocolo nacional
Transmitir DPSPOST /nfse
Corpo JSON com dpsXmlGZipB64.
Consultar NFS-eGET /nfse/{chave}
Chave de acesso com 50 dígitos.
Enviar eventoPOST /nfse/{chave}/eventos
Corpo JSON com pedRegXmlGZipB64.
Essas são operações entre a infraestrutura Invio e a SEFIN, não endpoints para consumo direto do cliente. O transporte usa timeout de 60 segundos e valida a cadeia TLS do servidor.
Regras que evitam rejeições recorrentes
Id da DPS
Começa com DPS, possui 45 caracteres e precisa corresponder exatamente aos campos que o compõem.
Data e hora
dhEmi usa YYYY-MM-DDTHH:mm:ss±HH:mm, sem milissegundos e sem Z.
Códigos como texto
CNPJ, CPF, série, códigos fiscais e decimais permanecem strings para preservar zeros à esquerda e precisão.
Ordem XML
Os elementos precisam seguir a ordem do XSD nacional; XML semanticamente parecido pode ser rejeitado se estiver fora do leiaute.
Diagnóstico rápido
E0004
O Id da DPS diverge da concatenação exigida pelo leiaute.
E0010
A série informada não é aceita para o emissor ou canal de API.
E1229
O XML não contém a declaração UTF-8 esperada.
E1235
dhEmi está fora do formato aceito, normalmente por milissegundos ou uso de Z.
HTTP 400
O GZip/Base64 está malformado ou o XML não respeita o schema.
HTTP 403
O certificado ou sua cadeia não foi aceito no handshake mTLS.
SDK TypeScript
@useinvio/nfse-sdk: a camada protocolar da NFS-e Nacional
O pacote público atende Node.js 20 ou superior, usa ESM e não depende de banco, tenant ou estado da aplicação. Ele transforma dados declarativos em DPS, valida, assina, compacta e transporta — sem decidir o tratamento fiscal pelo integrador.
A SDK faz
XML 1.01, validação estrutural, XMLDSIG, GZip/Base64, PFX A1, mTLS, consulta, eventos e normalização de rejeições.
A aplicação decide
Códigos fiscais, tributação, numeração, persistência, idempotência, regras contábeis e autorização do usuário.
Pontos de entrada públicos
NfseClient
Cliente orientado a recursos; concentra ambiente, certificado e defaults.
buildDpsFromJson
Valida JSON e gera DPS XML não assinada, sem chamada de rede.
prepararNota
Valida no XSD, assina e verifica a XMLDSIG sem transmitir.
emitirNfse
Prepara e transmite; retorna chave, DPS ID e XML autorizado.
consultarNfse
Consulta a SEFIN pela chave de acesso.
enviarEvento
Transmite evento fiscal já assinado e compactado.
EmitirNotaError
Preserva status HTTP, DPS ID, corpo bruto e rejeições normalizadas.
createSefinLatencyTracker
Agrega latência externa por operação e ambiente.
Exemplo seguro: gerar a DPS sem transmitir
Este exemplo apenas valida o objeto e produz o XML localmente. Use dados fictícios em desenvolvimento e valide escolhas fiscais com a contabilidade.
As métricas de round-trip da SEFIN ficam desligadas por padrão. Ative com NFSE_SEFIN_LATENCY_METRICS=1; percentis p50, p95 e p99 exigem includePercentiles: true.
Tratamento de falhas
Leia o status HTTP e preserve o corpo da resposta
A API ainda possui formatos de erro específicos por rota. Sempre trate o status e o campo error; respostas de validação também podem incluir issues, warnings ou um relatório fiscal.
400
Parâmetros ou payload inválidos.
401
Authorization ausente, chave inválida, revogada ou sessão expirada.
403
Escopo insuficiente ou operação bloqueada no ambiente informado.
404
Recurso não encontrado na organização autenticada.
409
Conflito de estado, como tentar revogar uma chave já revogada.
422
Validação fiscal ou regra de negócio não atendida.
429
Limite de criação de emissões atingido; respeite retryAfter.
500
Falha interna. Registre endpoint, horário e resposta sem credenciais.
429 · exemplo
{
"error": "Muitas requisições",
"message": "Limite de emissões atingido. Tente novamente em 30s.",
"retryAfter": 30
}
Eventos assíncronos
Webhooks assinados com HMAC-SHA256
A Invio envia JSON por POST para uma URL HTTPS pública. O header X-Invio-Signature contém sha256=<hex>, calculado sobre os bytes exatos do corpo.
Valide o corpo bruto antes de fazer o parse do JSON e compare os hashes em tempo constante.
Node.js
import { createHmac, timingSafeEqual } from "node:crypto";
export function isValidInvioSignature(rawBody, signature, secret) {
const received = signature.replace(/^sha256=/, "");
const expected = createHmac("sha256", secret).update(rawBody).digest("hex");
const a = Buffer.from(received, "hex");
const b = Buffer.from(expected, "hex");
return a.length === b.length && timingSafeEqual(a, b);
}
Entrega
Responda rapidamente com 2xx e processe o evento de forma idempotente. Não confie apenas na ordem de chegada; consulte a emissão quando precisar reconciliar o estado.
Mapa de recursos
Superfície da API v1
Emitentes
GET · POST · PATCH · DELETE
/v1/emitters
CNPJ, ambiente e parâmetros fiscais do prestador.
Perfis de serviço
GET · POST · DELETE
/v1/service-profiles
Defaults declarativos usados na emissão.
Certificados
GET · POST · DELETE
/v1/certificates
Certificado A1 associado ao emitente.
Emissões
GET · POST
/v1/emissions
Validação, criação, consulta, eventos e XML.
Webhooks
GET · POST · PATCH · DELETE
/v1/webhooks
Destinos HTTPS e eventos assinados.
Chaves e alertas
GET · POST · DELETE
/v1/api-keys · /v1/alerts
Credenciais mascaradas e vencimento de certificados.
Operações com efeito
Entenda o impacto antes de executar
Estas rotas são parte da API, mas não recebem comandos copiáveis nesta documentação pública.
POST/v1/emissions/validate
Valida dados fiscais sem enfileirar uma emissão. Não transmite para a SEFIN.
Escopoemissions:write
POST/v1/emissions
Cria e enfileira uma emissão. Envie Idempotency-Key para evitar duplicidade.
Escopoemissions:write
POST/v1/emissions/:id/consultar
Faz uma nova consulta externa à SEFIN e registra o evento de consulta.
Escopoemissions:read
POST/v1/emissions/:id/events
Registra e transmite um evento fiscal de cancelamento para uma NFS-e autorizada.