Referência técnica · API v1

Integre a NFS-e com contexto, previsibilidade e segurança.

Da primeira consulta ao acompanhamento da emissão: contratos, estados, erros e webhooks explicados a partir do comportamento real da API.

Fale com o Invio API AssistenteTire dúvidas sobre endpoints, SEFIN, SDK e fluxos de integração.
Protocolo
REST · JSON
Autenticação
Bearer token
Ambientes
restrita · producao

Visão geral

O modelo mental da integração

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. 1
    Configure

    Emitente, perfil de serviço e certificado A1 válido.

  2. 2
    Valide e envie

    Valide o payload e crie a emissão com uma chave de idempotência.

  3. 3
    Acompanhe

    Consulte o estado ou processe os webhooks assinados.

  4. 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.

Shell
export INVIO_API_URL="https://SUA_URL_DA_API"
export INVIO_API_KEY="sua_chave_de_api"

curl --fail-with-body "$INVIO_API_URL/health"

Chamadas autenticadas atualizam apenas o campo operacional last_used_at da chave.

Referência principal

Emissões

GET/v1/emissions
Somente leitura

Lista as emissões da organização, da mais recente para a mais antiga.

Escopoemissions:read

Query parameters

statusOpcional

Filtra por um estado válido da emissão.

emitterIdOpcional

UUID de um emitente da organização.

limit1–100

Quantidade por página. Padrão: 50.

offset≥ 0

Itens ignorados antes da página. Padrão: 0.

cURL · somente leitura
curl --fail-with-body   "$INVIO_API_URL/v1/emissions?status=authorized&limit=20&offset=0"   -H "Authorization: Bearer $INVIO_API_KEY"
200 · application/json
{
  "data": [
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "emitter_id": "00000000-0000-0000-0000-000000000000",
      "status": "authorized",
      "ambiente": "restrita",
      "chave_acesso": "00000000000000000000000000000000000000000000000000",
      "created_at": "2026-08-06T12:00:00.000Z"
    }
  ],
  "total": 1,
  "limit": 20,
  "offset": 0
}
GET/v1/emissions/:id
Somente leitura

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.

01DPS

JSON declarativo → XML 1.01

02XMLDSIG

Assinatura enveloped em infDPS

03GZip + Base64

Compactação do XML assinado

04mTLS

Certificado ICP-Brasil A1

05NFS-e

Resposta autorizada ou rejeições

Ambientes nacionais

restritatpAmb = 2

https://sefin.producaorestrita.nfse.gov.br/SefinNacional

producaotpAmb = 1

https://sefin.nfse.gov.br/SefinNacional

Separação de ambiente

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.

TypeScript · sem chamada de rede
import { buildDpsFromJson, type DpsJsonRequest } from "@useinvio/nfse-sdk";

const nota: DpsJsonRequest = {
  ambiente: "restrita",
  prestador: {
    cnpj: "12345678000195",
    cLocEmi: "4106902",
    serie: "1601",
    opSimpNac: "1",
    regEspTrib: "0"
  },
  servico: {
    cTribNac: "010201",
    xDescServ: "Desenvolvimento de software — exemplo",
    cLocPrestacao: "4106902"
  },
  emissao: {
    nDPS: "1",
    dhEmi: "2026-08-06T10:00:00-03:00",
    dCompet: "2026-08-01",
    valores: { vServ: "1000.00" },
    tributacaoMunicipal: { tribISSQN: "3", cPaisResult: "BR", tpRetISSQN: "1" },
    tributacaoFederal: { piscofins: { CST: "07" } },
    totTrib: { pTotTribFed: "0.00", pTotTribEst: "0.00", pTotTribMun: "5.00" }
  }
};

const { id, xml } = buildDpsFromJson(nota);
console.log(id, xml); // apenas gera XML local; não transmite

Validações e invariantes

  • Layout: DPS_SCHEMA_VERSION = 1.01.
  • Sem defaults fiscais silenciosos: blocos obrigatórios, como tributação municipal e total de tributos, precisam ser explícitos.
  • totTrib: segue um xs:choice; informe exatamente uma modalidade de totalização.
  • Certificado: aceita PFX em arquivo, Buffer ou base64; a chave privada e o certificado PEM são usados no handshake mTLS.
  • XML: a DPS é validada no XSD antes de ser assinada; a assinatura é verificada antes da transmissão.
  • Limite atual: o bloco RTC IBSCBS do layout nacional ainda não está implementado na SDK.

Pipeline de emissão da SDK

validateDpsJsonRequestbuildDpsFromJsonvalidateDpsXmlAgainstXsdsignDps + verifyDpsgzipBase64transmitirDpsCompactada
Observabilidade

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.

emission.authorizedemission.rejectedemission.error
Payload · emission.authorized
{
  "event": "emission.authorized",
  "emission_id": "00000000-0000-0000-0000-000000000000",
  "chave_acesso": "00000000000000000000000000000000000000000000000000",
  "timestamp": "2026-08-06T12:00:00.000Z"
}

Validação da assinatura em Node.js

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.

Escopoemissions:write