API NFS-e Nacional

Sistema Nacional de Nota Fiscal de Serviços Eletrônica · API REST v1 · Schema DPS v1.01

RESTful API
XML/JSON
Produção

Sandbox NFS-e Nacional — AMBIENTE DE HOMOLOGAÇÃO

Este ambiente é destinado a testes de integração . As notas emitidas aqui possuem (homologação), não são transmitidas ao Ambiente de Dados Nacional (ADN) , não substituem NFS-e em produção e não geram efeitos fiscais .


URL base: https://tributario.speedgov.com.br/integracao/api/v1/...

Bem-vindo à API NFS-e Nacional

Cronograma de obrigatoriedade do IBS/CBS

O Ato Conjunto RFB/CGIBS nº 4, de 30/07/2026, definiu quando o preenchimento das informações de IBS e CBS passa a ser obrigatório na emissão de NFS-e. Para prestadores não optantes do Simples Nacional: 01/10/2026 para os serviços em geral da lista da LC 116, e 01/12/2026 para os subitens 1.03, 1.05, 1.09 e 16.01, locações, condomínio, bens imateriais e serviços de plataformas digitais.

Optantes do Simples Nacional (inclusive MEI) só a partir de 01/01/2027.

A partir da data aplicável ao serviço, notas sem essas informações serão rejeitadas pelo Ambiente de Dados Nacional (ADN) da Receita Federal.

O que muda na API: a partir da data aplicável, requisições de emissão sem o grupoibscbs passam a ser rejeitadas comHTTP 422. O segmento é determinado pelocodigo_tributacao_nacionalda nota, e o enquadramento no Simples é apurado no cadastro municipal, na competência — não pelo campo enviado no payload. O leiaute 1.00 não comporta o grupo: migre para a versão 1.01 antes da data.

Consulte a fonte oficial (comunicado do CGIBS) ↗

Em produção

Esta é a API oficial para emissão de Notas Fiscais de Serviço Eletrônicas (NFS-e) conforme o padrão nacional NFS-e (Adendo Técnico v1.01 do CGNFS-e).

Base URL:https://tributario.speedgov.com.br

Importante: Todas as URLs devem incluir o prefixo do município (tenant).
Exemplo:/{municipio}/api/v1/nfse/ibicuitinga/api/v1/nfse
Emissão

Emita NFS-e através de DPS (Declaração de Prestação de Serviços) em formato XML

Consulta

Consulte notas fiscais emitidas através da chave de acesso

Eventos

Registre eventos como cancelamento ou substituição de notas

DANFSEDepreciado

Depreciado — consulte o DANFSe pela chave no portal nacional (nfse.gov.br/ConsultaPublica)

Fluxo de Integração
Preparar DPS
XML Schema v1.0
Emitir NFS-e
POST /nfse
Consultar
GET /nfse/:chave
Download PDF
GET /danfse/:chave
Ciclo de Vida da NFS-e
Pendente
Autorizada
Cancelada
Substituída
Especificações Técnicas

Formato
XML Schema v1.0
Protocolo
HTTP/HTTPS REST
Encoding
UTF-8
Response
JSON
O que é DPS?

DPS (Declaração de Prestação de Serviços) é o documento XML que contém todas as informações da prestação de serviço e que será transformado em NFS-e após o processamento.

A DPS deve conter: dados do prestador, tomador, serviço prestado, valores, tributos e local da prestação. Após validação, o sistema gera automaticamente a NFS-e com chave de acesso única.

Guia Rápido - Primeiros Passos

Comunicação Cliente ↔ API
Seu Sistema
API NFS-e
1
POST /nfse + XML DPS
JSON { chave_acesso, numero_protocolo }

2
GET /nfse/:chave_acesso
JSON { nota: { dados completos } }

3
GET /danfse/:chave_acesso
application/pdf (DANFSE)
1Prepare seu XML DPS

Primeiro, você precisa criar o arquivo XML com os dados da prestação de serviço. Veja um exemplo mínimo funcional:

dps_exemplo.xml
<?xml version="1.0" encoding="UTF-8"?>
<DPS versao="1.01" xmlns="http://www.sped.fazenda.gov.br/nfse">
      <infDPS Id="DPS230533221122233300018180000177920370165622">
        <tpAmb>2</tpAmb>
        
        <verAplic>1.01</verAplic>
        <serie>80000</serie>
        <nDPS>177920370165622</nDPS>
        <dCompet>2026-05-19</dCompet>
        <tpEmit>1</tpEmit>
        <cLocEmi>2301000</cLocEmi>
        <prest>
          <CNPJ>11222333000181</CNPJ>
          <IM>123456</IM>
          <xNome>Prestador Teste LTDA</xNome>
          <fone>11999999999</fone>
          <email>prestador@teste.com</email>
          <regTrib>
            <opSimpNac>1</opSimpNac>
            <regEspTrib>0</regEspTrib>
          </regTrib>
        </prest>
        <toma>
          <CNPJ>12345678000195</CNPJ>
          <xNome>Tomador Teste</xNome>
          <end>
            <endNac>
              <cMun>2301000</cMun>
              <CEP>12345678</CEP>
            </endNac>
            <xLgr>Rua Teste</xLgr>
            <nro>100</nro>
            <xBairro>Centro</xBairro>
          </end>
          <fone>11888888888</fone>
          <email>tomador@teste.com</email>
        </toma>
        <serv>
          <locPrest>
            <cLocPrestacao>2301000</cLocPrestacao>
          </locPrest>
          <cServ>
            <cTribNac>010101</cTribNac>
            <cTribMun>16100100</cTribMun>
            <xDescServ>Serviço de teste para homologação do sistema de NFS-e</xDescServ>
            <cNBS>101011100</cNBS>
          </cServ>
        </serv>
        <valores>
          <vServPrest>
            <vServ>1000.00</vServ>
          </vServPrest>
          <trib>
            <tribMun>
              <tribISSQN>1</tribISSQN>
              <tpRetISSQN>1</tpRetISSQN>
              <pAliq>5.00</pAliq>
            </tribMun>
            <totTrib>
              <indTotTrib>0</indTotTrib>
            </totTrib>
          </trib>
        </valores>
      </infDPS>
    </DPS>
Campos importantes:
  • tpAmb - Tipo de ambiente: 1=Produção, 2=Homologação
  • dCompet - Data de competência do serviço (obrigatória)
  • prest/CNPJ - CNPJ do prestador (deve estar cadastrado no município)
  • serv/locPrest/cLocPrestacao - Código IBGE do município onde o serviço foi prestado
  • serv/cServ/cTribNac - Código de tributação nacional (item da LC 116/03)
  • serv/cServ/cNBS - Código NBS (Nomenclatura Brasileira de Serviços) — obrigatório na v1.01
  • ibscbs - Grupo IBS/CBS (Reforma Tributária, LC 214/2025). OBRIGATÓRIO conforme o cronograma do Ato Conjunto RFB/CGIBS nº 4/2026: 01/10/2026 para os serviços em geral, 01/12/2026 para os subitens 1.03, 1.05, 1.09 e 16.01 e demais segmentos prorrogados, e 01/01/2027 para optantes do Simples Nacional — requisições sem o grupo passam a ser rejeitadas com HTTP 422. O segmento vem do codigo_tributacao_nacional; o enquadramento no Simples é apurado no cadastro municipal, na competência da nota, e não pelo campo enviado no payload
  • ibscbs/valores/trib/gIBSCBS/CST - Código de Situação Tributária do IBS/CBS (3 dígitos)
  • ibscbs/valores/trib/gIBSCBS/cClassTrib - Código de Classificação Tributária (6 dígitos). Precisa existir e estar ativo | na tabela de classificações vigente; caso contrário a nota é recusada com HTTP 422 | e mensagem indicando o código não encontrado. A tabela é a publicada pela RFB e | pode ser renumerada por ela — confira o código em uso antes de integrar
  • ibscbs - Em operação sem IBS/CBS a apurar (imunidade/não-incidência e isenção), o DPS | informa apenas CST e cClassTrib: o leiaute não transporta alíquota. As alíquotas | e os totais de IBS/CBS são apurados pelo município e retornam zerados na NFS-e
  • valores/vServPrest/vServ - Valor total do serviço
  • valores/trib/tribMun/tribISSQN - Tributação do ISSQN: 1=tributável, 2=imune, 3=isento
  • valores/trib/tribMun/pAliq - Alíquota do ISS (%) — o ISS é calculado pela ADN, não envie vISSQN
  • valores/trib/tribFed - (Opcional) Tributos federais: PIS/COFINS de apuração própria e os valores | retidos na fonte. Ver a seção abaixo
  • valores/vDedRed - (Opcional) Dedução/redução da base:vDR (valor) oupDR (percentual)
  • valores/vDescCondIncond - (Opcional) Descontos:vDescIncond (incondicionado) evDescCond (condicionado)
  • valores/trib/tribMun/bM - (Opcional) Benefício municipal de redução de base:pRedBCBM (percentual) ouvRedBCBM (valor)
  • valores/trib/tribMun/exigSusp - (Opcional) Suspensão da exigibilidade do ISSQN. Quando informado, exigetpSusp (1=decisão judicial, 2=processo administrativo) enProcesso (exatamente 30 dígitos). Com a suspensão informada, o leiaute admite apenasvLiq no grupo de valores (E1311): não enviepAliq,vBC,vISSQN nemvISSQNRet. A nota é escriturada como suspensa e não gera crédito de ISSQN. Só é aceita emtribISSQN=1 (E0585)

Quando informados, esses redutores são considerados na apuração da base de cálculo do ISSQN.

Suspensão da exigibilidade do ISSQN (exigSusp)

Use quando houver decisão judicial ou processo administrativo que suspenda a exigibilidade do ISSQN sobre o serviço. A ordem dos elementos dentro detribMun segue a sequência do XSD e é validada pelo Ambiente Nacional:tribISSQN,cPaisResult,tpImunidade,exigSusp,BM,tpRetISSQN,pAliq. Enviar fora dessa ordem resulta em rejeição.

<valores>
  <vServPrest>
    <vServ>1000.00</vServ>
  </vServPrest>
  <trib>
    <tribMun>
      <tribISSQN>1</tribISSQN>
      <exigSusp>
        <tpSusp>1</tpSusp>
        <nProcesso>000000000000012345620248060001</nProcesso>
      </exigSusp>
      <tpRetISSQN>1</tpRetISSQN>
    </tribMun>
  </trib>
</valores>

OnProcesso tem exatamente 30 dígitos, sem pontuação. Um número CNJ tem 20 dígitos — complete com zeros à esquerda, preservando os 20 finais. A retenção do ISSQN não é permitida com a exigibilidade suspensa, portanto envietpRetISSQN=1.

Tributos federais (tribFed)

Grupo opcional. Use para declarar o PIS e a COFINS de apuração própria do prestador e os valores retidos na fonte. O grupo é aceito nas duas versões do leiaute — na1.01 ele convive com o grupoIBSCBS, que fica em outro nível do documento e não o substitui.

  • valores/trib/tribFed/piscofins/CST - Código de Situação Tributária do PIS/COFINS, com dois dígitos (ex.:01). Obrigatório quando o subgrupopiscofins for informado
  • valores/trib/tribFed/piscofins/vBCPisCofins - Base de cálculo. Deve ser menor ou igual ao valor do serviço (E0677)
  • valores/trib/tribFed/piscofins/pAliqPis epAliqCofins - Alíquotas (%), entre 0 e 100 (E0686 e E0692)
  • valores/trib/tribFed/piscofins/vPis evCofins - Quando a alíquota correspondente for informada, o valor precisa ser igual a base × alíquota, com tolerância de 0,01 (E0694 e E0696)
  • valores/trib/tribFed/piscofins/tpRetPisCofins - Indica quais contribuições retidas na fonte compõem ovRetCSLL: 0=nenhuma, 1=PIS/COFINS, 2=PIS/COFINS não retidos, 3=PIS/COFINS/CSLL, 4=PIS/COFINS retidos e CSLL não, 5=só PIS, 6=só COFINS, 7=COFINS/CSLL, 8=só CSLL, 9=PIS/CSLL
  • valores/trib/tribFed/vRetCP,vRetIRRF evRetCSLL - Valores retidos de contribuição previdenciária, imposto de renda e contribuições sociais. Quando informados, devem ser maiores que zero e menores que o valor do serviço (E0699, E0700 e E0701)

A ordem dos elementos segue a sequência do XSD e é validada pelo Ambiente Nacional: dentro detribFed vêmpiscofins,vRetCP,vRetIRRF evRetCSLL; dentro depiscofins,CST,vBCPisCofins,pAliqPis,pAliqCofins,vPis,vCofins etpRetPisCofins. Enviar fora dessa ordem resulta em rejeição.

<trib>
  <tribMun>
    <tribISSQN>1</tribISSQN>
    <tpRetISSQN>1</tpRetISSQN>
    <pAliq>3.00</pAliq>
  </tribMun>
  <tribFed>
    <piscofins>
      <CST>01</CST>
      <vBCPisCofins>1000.00</vBCPisCofins>
      <pAliqPis>0.65</pAliqPis>
      <pAliqCofins>3.00</pAliqCofins>
      <vPis>6.50</vPis>
      <vCofins>30.00</vCofins>
      <tpRetPisCofins>0</tpRetPisCofins>
    </piscofins>
  </tribFed>
</trib>
  • PIS e COFINS próprios não são retenção. Os valores devPis evCofins são débito de apuração própria e não entram no total de retenções da nota — esse total soma apenasvRetCP,vRetIRRF,vRetCSLL e o ISSQN retido. O PIS/COFINS retido na fonte é declarado dentro dovRetCSLL, conforme otpRetPisCofins
  • ComtpRetPisCofins=0 não informevRetCSLL (E0720). Com qualquer valor diferente de 0 e de 2, ovRetCSLL passa a ser obrigatório (E0724)
  • Emitente identificado como MEI não pode informar tributos federais (E0676)
  • Em competências de 2026, o PIS e a COFINS informados são deduzidos da base de cálculo do IBS/CBS, junto do ISSQN, dos descontos incondicionados e do reembolso. A partir de 2027 essa dedução deixa de se aplicar
Importante - Data de Emissão:

A data/hora de emissão (dhEmi) é geradaautomaticamente pelo sistema no momento da criação da nota.NÃO envie este campo no XML. Envie apenas a data de competência (dCompet).

2Envie a requisição

Use o comando curl para enviar o XML ao endpoint de emissão:

Terminal
curl -X POST https://tributario.speedgov.com.br/{municipio}/api/v1/nfse/v101 \
  -H "Content-Type: application/xml" \
  -H "Accept: application/json" \
  --data @dps_exemplo.xml

# Exemplo com município específico:
curl -X POST https://tributario.speedgov.com.br/ibicuitinga/api/v1/nfse/v101 \
  -H "Content-Type: application/xml" \
  -H "Accept: application/json" \
  --data @dps_exemplo.xml
Resposta de Sucesso (200 OK)
{
  "status": "OK",
  "numero_protocolo": "20251111120000000001",
  "chave_acesso": "35503081234567800019500010...",
  "xml_nfse": "..."
}
Resposta de Erro (422)
{
  "codigo_erro": "E101",
  "mensagem": "Estabelecimento não encontrado",
  "detalhes": "O CNPJ não está cadastrado",
  "timestamp": "2025-11-11T12:00:00-03:00"
}
3Consulte a NFS-e emitida

Após a emissão, você pode consultar a nota pela chave de acesso:

Terminal
curl -X GET https://tributario.speedgov.com.br/{municipio}/api/v1/nfse/23044002300600973590300001000000000000011264046313 \
  -H "Accept: application/json"

# Exemplo:
curl -X GET https://tributario.speedgov.com.br/ibicuitinga/api/v1/nfse/23044002300600973590300001000000000000011264046313 \
  -H "Accept: application/json"
4Baixe o PDF (DANFSE)
Endpoint depreciado

Este endpoint está depreciado e será removido futuramente. Após a autorização no ADN, consulte o DANFSe oficial pela chave de acesso no portal nacional (https://www.nfse.gov.br/ConsultaPublica). O XML da NFS-e fica disponível no endpoint de consulta da nota (GET /{municipio}/api/v1/nfse/:chave_acesso ou por protocolo), permitindo montar a própria representação gráfica.

Para obter o PDF da nota fiscal:

Terminal
curl -X GET https://tributario.speedgov.com.br/{municipio}/api/v1/danfse/23044002300600973590300001000000000000011264046313 \
  -H "Accept: application/pdf" \
  -o nota_fiscal.pdf

# Exemplo:
curl -X GET https://tributario.speedgov.com.br/ibicuitinga/api/v1/danfse/23044002300600973590300001000000000000011264046313 \
  -H "Accept: application/pdf" \
  -o nota_fiscal.pdf
Próximos Passos

Agora que você conhece o fluxo básico, explore:

  • Endpoints - Documentação completa de todos os endpoints
  • Exemplos - Casos de uso mais complexos
  • Códigos de Erro - Tratamento de erros e validações
  • Status - Monitoramento da disponibilidade da API

Referência Completa da API

Prefixo de Município: Todas as URLs devem ser prefixadas com o slug do município.Exemplo:/{municipio}/api/v1/nfse onde{municipio} é o slug do município (ex: ibicuitinga, davinopolis).
A chave_acesso e o status de autorização

A chave_acesso (50 dígitos) retornada no POST de emissão é estável : ela é gerada na emissão e não muda de valor . O envio ao Ambiente Nacional (ADN) é assíncrono, mas a chave gerada localmente é exatamente a mesma que o ADN confirma ao autorizar a nota. Use-a como identificador da NFS-e.

Toda resposta inclui o campo chave_acesso_provisoria (booleano), que indica apenas o status de autorização da nota — não que a chave mude de valor:

ValorSignificadoAção recomendada
trueA nota ainda não foi autorizada pelo ADN (status rascunho). A chave_acesso já é definitiva e não mudará. Use a chave_acesso normalmente; acompanhe a autorização via GET /api/v1/nfse/:chave_acesso .
falseA nota já foi autorizada pelo ADN. A chave_acesso é a mesma desde a emissão. Use a chave no endpoint de consulta da nota (GET /api/v1/nfse/:chave_acesso).
Resumo prático: a chave_acesso não muda — guarde-a na emissão e use-a como identificador da nota. O campo chave_acesso_provisoria apenas informa se a nota já foi autorizada pelo ADN. O endpoint GET /api/v1/nfse/protocolo/:numero_protocolo permanece disponível ( depreciado ) para integrações existentes.
POST/{municipio}/api/v1/nfse
Descontinuado
Emissão descontinuada. Este endpoint não emite mais NFS-e e responde HTTP 410 (Gone) . Utilize POST /api/v1/nfse/v101 para emitir no layout nacional vigente. As consultas GET /api/v1/nfse/:chave_acesso e GET /api/v1/nfse/protocolo/:numero_protocolo permanecem disponíveis.
Emitir NFS-e (descontinuado)

Qualquer requisição a POST /api/v1/nfse passa a retornar o erro E111 com HTTP 410 , indicando o endpoint correto.

Resposta (HTTP 410 Gone)
{
  "codigo_erro": "E111",
  "mensagem": "A emissão de NFS-e pelo endpoint v1.00 foi descontinuada. Utilize POST /api/v1/nfse/v101.",
  "detalhes": { "endpoint_correto": "/api/v1/nfse/v101" }
}
GET/{municipio}/api/v1/nfse/protocolo/:numero_protocolo
Depreciado
Endpoint depreciado. Como a chave_acesso é estável desde a emissão, prefira GET /api/v1/nfse/:chave_acesso . Este endpoint permanece disponível (sem data de remoção) para integrações existentes.
Consultar NFS-e por número de protocolo

Retorna a nota fiscal identificada pelo numero_protocolo — um identificador estável, 1:1 com a nota, alternativo à chave_acesso (que também é estável). Útil para integrações que já persistiram o numero_protocolo retornado na emissão.

Este endpoint funciona tanto para notas emitidas via POST /api/v1/nfse (v1.00 — emissão descontinuada) quanto via POST /api/v1/nfse/v101 (v1.01 estrita). O caminho /api/v1/nfse/v101/protocolo/:numero_protocolo também é válido.
Parâmetros
ParâmetroTipoDescrição
numero_protocolostringNúmero de protocolo retornado na criação da nota (campo numero_protocolo da resposta de POST /api/v1/nfse/v101 ).
Response
200 OKNota encontrada
404Protocolo não encontrado
Observações de tipos:
  • valor_servico , valor_issqn , valor_base_calculo , aliquota_issqn são strings decimais (ex.: "1000.00" ), não numbers — faça parsing decimal no seu lado.
  • data_competencia vem em formato BR "DD/MM/YYYY" .
  • data_emissao e data_protocolo vêm em formato "YYYY-MM-DD HH:MM:SS ±HHMM" .
  • codigo_situacao_nfse é integer ( 100 ) ou null .
  • numero_dps é o número sequencial da NFS-e (integer); numero é string ou null (até a autorização).
  • numero_dps_nacional é o nDPS transmitido ao Ambiente Nacional — o número que aparece no portal nacional e o usado na consulta por DPS ( GET /api/v1/dps/:id ). Reflete o numero_dps informado; quando omitido, é o número sequencial da NFS-e. serie_dps_nacional é a série correspondente — a informada, ou 70000 quando omitida. Ambos ficam null enquanto a DPS não foi transmitida ao ADN.
  • xml_nota devolve a NFS-e autorizada pelo ADN quando disponível; antes da autorização, devolve a DPS assinada que foi enviada. Pode ser null enquanto a nota está em rascunho (sem XML gerado ainda).
Exemplo de Resposta — Nota em rascunho (ainda não autorizada)

A chave_acesso (50 dígitos) é a mesma em rascunho e após a autorização — não muda de valor. A flag chave_acesso_provisoria apenas indica se a nota já foi autorizada pelo ADN ( true = ainda em rascunho).

{
  "status": "OK",
  "nota": {
    "id": 28579,
    "numero": null,
    "serie_dps": "001",
    "numero_dps": 1,
    "serie_dps_nacional": null,
    "numero_dps_nacional": null,
    "chave_acesso": "23044002300600973590300001000000000000011264046313",
    "identificador": "IDNFS23044002300600973590300001000000000000011264046313",
    "status": "rascunho",
    "versao": "1.01",
    "data_emissao": null,
    "data_competencia": "06/01/2026",
    "codigo_situacao_nfse": null,
    "prestador_cpf_cnpj": "12345678000195",
    "prestador_razao_social": "Empresa Prestadora LTDA",
    "prestador_inscricao_municipal": "12345",
    "tomador_cpf_cnpj": "12345678901",
    "tomador_razao_social": "João da Silva",
    "valor_servico": "1000.00",
    "valor_issqn": "50.00",
    "valor_base_calculo": "1000.00",
    "aliquota_issqn": "5.00",
    "xml_nota": null
  },
  "protocolo": {
    "numero_protocolo": "20251111120000000001",
    "status": "processando",
    "mensagem_retorno": null,
    "data_protocolo": "2025-11-11 12:00:00 -0300",
    "chave_acesso": "23044002300600973590300001000000000000011264046313"
  },
  "chave_acesso_provisoria": true
}
Exemplo de Resposta — Nota autorizada pelo ADN (mesma chave_acesso)
{
  "status": "OK",
  "nota": {
    "id": 28579,
    "numero": "1",
    "serie_dps": "001",
    "numero_dps": 1,
    "serie_dps_nacional": "1",
    "numero_dps_nacional": "1",
    "chave_acesso": "23044002300600973590300001000000000000011264046313",
    "identificador": "IDNFS23044002300600973590300001000000000000011264046313",
    "status": "autorizada",
    "versao": "1.01",
    "data_emissao": "2025-11-11 12:05:32 -0300",
    "data_competencia": "06/01/2026",
    "codigo_situacao_nfse": 100,
    "prestador_cpf_cnpj": "12345678000195",
    "prestador_razao_social": "Empresa Prestadora LTDA",
    "prestador_inscricao_municipal": "12345",
    "tomador_cpf_cnpj": "12345678901",
    "tomador_razao_social": "João da Silva",
    "valor_servico": "1000.00",
    "valor_issqn": "50.00",
    "valor_base_calculo": "1000.00",
    "aliquota_issqn": "5.00",
    "xml_nota": "..."
  },
  "protocolo": {
    "numero_protocolo": "20251111120000000001",
    "status": "autorizado",
    "mensagem_retorno": "Autorizado pelo ADN",
    "data_protocolo": "2025-11-11 12:00:00 -0300",
    "chave_acesso": "23044002300600973590300001000000000000011264046313"
  },
  "chave_acesso_provisoria": false
}
Exemplo de Resposta — Protocolo não encontrado (404)

Para tratamento programático use o status HTTP 404 e o campo campo da resposta. A descrição da mensagem pode evoluir; prefira tratar pelo campo estruturado.

{
  "codigo_erro": "E601",
  "mensagem": "Nota fiscal a ser substituída não encontrada",
  "detalhes": "Numero de protocolo 20251111120000000001 nao encontrado",
  "campo": "numero_protocolo",
  "timestamp": "2025-11-11T12:00:00-03:00"
}
Acompanhar a autorização: a chave_acesso já é definitiva desde a emissão; para saber quando a nota foi autorizada pelo ADN, re-consulte periodicamente até chave_acesso_provisoria virar false (backoff exponencial recomendado). Não há SLA contratual — o tempo depende do tráfego do ADN e do agendamento do job de envio de lote.
GET/{municipio}/api/v1/nfse/:chave_acesso
Consulta
Consultar NFS-e

Consulta uma nota fiscal emitida pela chave de acesso.

A resposta inclui o objeto protocolo (pode ser null se a nota não tiver protocolo associado). Diferente do GET /api/v1/nfse/protocolo/:numero_protocolo , este endpoint não retorna a flag chave_acesso_provisoria .
Parâmetros
ParâmetroTipoDescrição
chave_acessostringChave de 50 caracteres
Response
200 OKNota encontrada
404Nota não encontrada
Exemplo de Resposta
{
  "status": "OK",
  "nota": {
    "id": 28579,
    "numero": "1",
    "serie_dps": "001",
    "numero_dps": 1,
    "serie_dps_nacional": "1",
    "numero_dps_nacional": "1",
    "chave_acesso": "23044002300600973590300001000000000000011264046313",
    "identificador": "IDNFS23044002300600973590300001000000000000011264046313",
    "status": "autorizada",
    "versao": "1.01",
    "data_emissao": "2025-11-11 12:00:00 -0300",
    "data_competencia": "06/01/2026",
    "codigo_situacao_nfse": 100,
    "prestador_cpf_cnpj": "12345678000195",
    "prestador_razao_social": "Empresa Prestadora LTDA",
    "prestador_inscricao_municipal": "12345",
    "tomador_cpf_cnpj": "12345678901",
    "tomador_razao_social": "João da Silva",
    "valor_servico": "1000.00",
    "valor_issqn": "50.00",
    "valor_base_calculo": "1000.00",
    "aliquota_issqn": "5.00",
    "xml_nota": "..."
  },
  "protocolo": {
    "numero_protocolo": "20251111120000000001",
    "status": "autorizado",
    "mensagem_retorno": "Autorizado pelo ADN",
    "data_protocolo": "2025-11-11 12:00:00 -0300",
    "chave_acesso": "23044002300600973590300001000000000000011264046313"
  }
}
GET/{municipio}/api/v1/danfse/:chave_acessoDepreciado
PDF
Endpoint depreciado

Será removido futuramente. Após a autorização no ADN, consulte o DANFSe oficial pela chave de acesso no portal nacional (https://www.nfse.gov.br/ConsultaPublica). O XML da NFS-e fica disponível no endpoint de consulta da nota (GET /{municipio}/api/v1/nfse/:chave_acesso ou por protocolo), permitindo montar a própria representação gráfica. As respostas deste endpoint incluem os cabeçalhos Deprecation, Link e Warning.

Download DANFSE

Retorna o PDF da nota fiscal (Documento Auxiliar da NFS-e), apenas para notas autorizadas.

Parâmetros
ParâmetroTipoDescrição
chave_acessostringChave de 50 caracteres
Response
Content-Typeapplication/pdf
200 OKArquivo PDF
404Nota não encontrada
422Nota não está autorizada
Dica: Use o parâmetro-o nome_arquivo.pdf no curl para salvar o PDF localmente.
POST/{municipio}/api/v1/nfse/:chave_acesso/eventos
Eventos
Registrar Evento

Registra um evento na NFS-e (cancelamento, confirmação, rejeição, etc).

Tipos de Evento e Códigos CGOA

Códigos do padrão nacional NFS-e (CGOA) aceitos no tipo_evento.

Código CGOAtipo_evento (slug)
101101cancelamento
105102cancelamento_por_substituicao
101103solicitacao_analise_fiscal_para_cancelamento
105104cancelamento_deferido_por_analise_fiscal
105105cancelamento_indeferido_por_analise_fiscal
202201confirmacao_prestador
203202confirmacao_tomador
204203confirmacao_intermediario
205204confirmacao_tacita
202205rejeicao_prestador
203206rejeicao_tomador
204207rejeicao_intermediario
205208anulacao_rejeicao
305101cancelamento_por_oficio
305102bloqueio_por_oficio
305103desbloqueio_por_oficio

Campos obrigatórios por tipo (motivos enumerados, descrições, etc) podem ser consultados em GET /:tenant/api/v1/catalogo/motivos_evento

Autor do evento (cnpj_autor / cpf_autor)

Campos opcionais. Quando omitidos, o autor é inferido a partir do tipo_eventoe dos dados da nota:

  • cancelamento,cancelamento_por_substituicao,solicitacao_analise_fiscal_para_cancelamento,confirmacao_prestador,rejeicao_prestador→ CPF/CNPJ do prestador da nota.
  • confirmacao_tomador,rejeicao_tomador→ CPF/CNPJ do tomador.
  • confirmacao_intermediario,rejeicao_intermediario→ CPF/CNPJ do intermediário.

Para sobrescrever a inferência, envie cnpj_autor(14 dígitos) oucpf_autor(11 dígitos). Os dois campos são mutuamente exclusivos.

Exemplo de requisição (cancelamento)
curl -X POST "https://tributario.speedgov.com.br/{tenant}/api/v1/nfse/:chave_acesso/eventos" \
     -H "Content-Type: application/json" \
     -H "X-Evento-Assinatura: " \
     -d '{
       "tipo_evento": "cancelamento",
       "codigo_motivo_cancelamento": "erro_na_emissao",
       "descricao_motivo_cancelamento": "Erro no valor do serviço"
     }'
Resposta de sucesso (HTTP 201)

O mesmo conjunto de campos é retornado pelos endpoints GETde evento (consistência POST↔GET).

{
  "id_evento": 638,
  "codigo_tipo_evento": "101101",
  "tipo_evento": "cancelamento",
  "numero_sequencial": 1,
  "numero_protocolo": "20260508122141000001",
  "chave_acesso": "...",
  "data_hora_evento": "2026-05-13T10:30:50-03:00",
  "data_hora_processamento": null,
  "aguardando_desde": null,
  "status_evento": "pendente",
  "protocolo": null,
  "codigo_retorno": null,
  "mensagem_retorno": null,
  "erros_adn": null,
  "reprocessamentos_count": 0,
  "ultimo_reprocessamento_em": null,
  "acao_sugerida": "aguardar",
  "descricao_evento": "Cancelamento de NFS-e",
  "mensagem": "Evento de cancelamento registrado com sucesso. Acompanhe em GET /api/v1/nfse/:chave/eventos/:tipo/:num_seq.",
  "status": "OK"
}
Significado deacao_sugerida

Recomendação de próximo passo para o integrador.

  • aguardar— evento em processamento normal (pendente recente, enviado, aguardando ADN dentro de 24h).
  • consultar_suporte— evento em estado problemático (erro sem retry disponível, pendente travado > 5 min, aguardando ADN > 24h ou erro_reprocessamento).
  • retentar— evento em errocom código reprocessável.
  • cancelado_ok— evento finalizado com sucesso ( processado,canceladoou dispensado).
Códigos de retorno HTTP
  • 201 Created— evento registrado.
  • 404 Not Found— nota fiscal não encontrada para a chave_acesso informada.
  • 409 Conflict— colisão concorrente no número sequencial do evento após retry (raro, requer nova tentativa do cliente).
  • 422 Unprocessable Entity— validação falhou (tipo_evento inválido, campos obrigatórios ausentes) ou já existe outro cancelamento desta nota em processamento (estados não-terminais).
Endpoint equivalente:o evento também pode ser registrado pelo numero_protocolo(identificador alternativo; a chave_acesso já é estável desde a emissão): POST /{municipio}/api/v1/nfse/protocolo/:numero_protocolo/eventos— payload e response idênticos ao endpoint por chave_acesso.
GET/{municipio}/api/v1/nfse/:chave_acesso/eventos
Eventos
Listar Eventos da NFS-e

Retorna todos os eventos vinculados à chave de acesso, ordenados por code.mx-1 created_at DESC | .

Resposta de sucesso (HTTP 200)
{
  "total": 2,
  "eventos": [
    { ...mesmo conjunto de campos do POST... },
    { ... }
  ],
  "status": "OK"
}

Cada item da lista contém o mesmo conjunto de campos descrito em Registrar Evento.

GET/{municipio}/api/v1/nfse/:chave_acesso/eventos/:tipo_evento
Eventos
Consultar Eventos por Tipo

Retorna apenas eventos do especificado (ex: cancelamento), ordenados pornumero_sequencial ASC.

Resposta de sucesso (HTTP 200)
{
  "total": 1,
  "tipo_evento": "cancelamento",
  "eventos": [
    { ...mesmo conjunto de campos do POST... }
  ],
  "status": "OK"
}
GET/{municipio}/api/v1/nfse/:chave_acesso/eventos/:tipo_evento/:num_seq_evento
Eventos
Consultar Evento Específico

Retorna um único evento identificado pela combinação .

Resposta de sucesso (HTTP 200)
{
  "evento": { ...mesmo conjunto de campos do POST... },
  "status": "OK"
}
  • 404 Not Found— nota ou evento não encontrado para os parâmetros informados.
Perguntas frequentes — Fluxo de cancelamento

Respostas para dúvidas recorrentes de integradores sobre o ciclo de cancelamento de NFS-e.

PerguntaComo obter
Como sei a data em que a nota foi cancelada?Campo data_cancelamentono GET /api/v1/nfse/:chave_acesso. Retornado quando;nullpara notas autorizadas.
Como consulto o protocolo de um cancelamento que eu fiz?O POST /eventosretorna numero_sequencial. Com ele, useGET /api/v1/nfse/:chave_acesso/eventos/:tipo_evento/:num_seq_eventopara acompanhar o evento específico. Para ver todos os eventos da nota, use GET /api/v1/nfse/:chave_acesso/eventos.
A consulta da nota nunca muda paracancelada: como saber se o cancelamento falhou?Consulte o evento(não a nota). O response traz status_evento,codigo_retorno,mensagem_retornoe erros_adn. O campoacao_sugeridajá indica em uma palavra o que fazer: aguardar, retentar ou consultar_suporte(quando há erro persistente).
Como saber se o cancelamento ainda está em processamento?Leia acao_sugeridano payload do evento. Valores possíveis: aguardar(em processamento normal), retentar(erro transitório, pode tentar de novo), consultar_suporte(estado persistente, acionar suporte), cancelado_ok(finalizado com sucesso).
Preciso enviarcnpj_autor/cpf_autor?Não é obrigatório. Quando omitido, o autor é inferido a partir do tipo_evento: cancelamentos usam o documento do prestador da nota; manifestações de tomador (confirmacao_tomador,rejeicao_tomador) usam o documento do tomador; manifestações de intermediário usam o documento do intermediário. Envie explicitamente apenas para sobrescrever o padrão.
Fluxo recomendado:(1) registre o cancelamento via POSTe guarde numero_sequencialdo response; (2) consulte o evento por GETaté (sucesso) ou "consultar_suporte"(acionar suporte); (3) a data_cancelamentofica disponível no GET da nota quando o cancelamento for efetivado.
Histórico de Eventos da NFS-e

Use o GET /api/v1/nfse/:chave_acesso/eventospara reconstruir a linha do tempo completa de eventos da nota — a lista vem ordenada do mais recente para o mais antigo. Cada evento traz seu próprio numero_sequencialpor tipo_evento, permitindo ordenar cronologicamente também dentro de um mesmo tipo.

Campos temporais
  • data_hora_evento— quando o evento foi criado (momento do POST).
  • data_hora_processamento— quando o ADN deu palavra final ( nullenquanto pendente/aguardando).
  • aguardando_desde— início da espera quando .
  • ultimo_reprocessamento_em— timestamp do último retry automático.
  • reprocessamentos_count— contador cumulativo de retries (0 a 3; após 3 sem sucesso o evento vai para erro).
Estados possíveis emstatus_evento
status_eventoSemântica
pendenteEvento criado, ainda não enviado ao ADN.
enviadoPacote enviado ao ADN, aguardando retorno.
aguardando_autorizacao_notaADN respondeu mas a nota referenciada ainda não foi reconhecida. O sistema retenta automaticamente quando a nota é autorizada.
processadoADN concluiu o processamento com sucesso.
rejeitadoADN rejeitou o evento (motivo em code.mx-1 erros_adn | ).
erroErro local ou do ADN, ainda elegível a retry conforme code.mx-1 reprocessamentos_count | .
erro_reprocessamentoEvento marcado em ciclo anterior como exigindo análise manual via suporte. Não é retentado automaticamente.
canceladoEvento cancelado localmente.
dispensadoEvento dispensado de envio ao ADN.
Interpretando o estado atual

Para decidir o próximo passo sem precisar interpretar cada campo manualmente, leia acao_sugerida— vem em todo payload de evento (POST e GETs). Mapa de decisão:

  • aguardar— fluxo normal (recente ou dentro de janelas saudáveis); volte a consultar em alguns minutos.
  • retentar— erro com código reprocessável; tente o mesmo evento novamente.
  • consultar_suporte— estado persistente que exige acompanhamento humano (erro sem retry, travado, ou erro_reprocessamento).
  • cancelado_ok— evento já finalizado em estado terminal de sucesso ( processado,canceladoou dispensado).

Exemplos de Integração

Coleção Postman - Todos os Exemplos

A coleção Postman contém exemplos prontos para todos os endpoints da API, incluindo XMLs de exemplo, respostas de sucesso e erro.

Emissão
XML DPS completo com todos os campos
Consulta
Busca por chave de acesso
DANFSEDepreciado
Download do PDF (depreciado)
Eventos
Cancelamento, Substituição, etc.
Baixar Coleção Postman
Como Usar a Coleção
Passo a Passo
  1. Baixe a coleção clicando no botão acima
  2. Abra o Postman e vá em File → Import
  3. Selecione o arquivo JSON baixado
  4. A variável base_url já vem configurada
  5. Explore os exemplos em cada pasta e execute as requisições
Estrutura das Pastas
API NFS-e Nacional/
├── Emissão/
│   └── Emitir NFS-e (POST /nfse)
├── Consulta/
│   └── Consultar NFS-e (GET /nfse/:chave)
├── DANFSE/ (depreciado)
│   └── Download DANFSE (GET /danfse/:chave)
└── Eventos/
    ├── Cancelamento (101101)
    ├── Cancelamento por Substituição (105102)
    ├── Solicitação Análise Fiscal (101103)
    ├── Confirmação do Tomador (203202)
    └── Rejeição do Tomador (203206)
Tipos de Eventos Suportados
TipoCódigoDescrição
cancelamento101101Cancelamento simples de NFS-e
cancelamento_por_substituicao105102Cancelamento com chave da nota substituta
solicitacao_analise_fiscal_para_cancelamento101103Solicita análise fiscal para cancelar
confirmacao_tomador203202Confirmação pelo tomador
rejeicao_tomador203206Rejeição pelo tomador
Dica

Cada requisição na coleção Postman inclui exemplos de resposta (sucesso e erro). Clique em "Examples" no Postman para visualizá-los.

Operações com Exterior

Tomador no Exterior (NIF / Comércio Exterior)

O tomador estrangeiro é identificado por NIF ou cNaoNIF (motivo de não informação do NIF) no lugar de CPF/CNPJ. O endereço usa o grupo endExt, cujos quatro campos são obrigatórios quando o endereço no exterior é informado: cPais (código do país em ISO 3166-1 alfa-2), cEndPost (código postal alfanumérico, até 11 caracteres), xCidade e xEstProvReg. Quando o tomador é identificado pelo NIF e o emitente por CNPJ, o grupo de endereço no exterior é obrigatório (E0242). Quando o tomador é do exterior, o grupo comExt é obrigatório.

Exemplo completo de DPS (v1.01) com tomador no exterior
<?xml version="1.0" encoding="UTF-8"?>
<DPS xmlns="http://www.sped.fazenda.gov.br/nfse" versao="1.01">
  <infDPS Id="DPS1">
    <verAplic>1.01</verAplic>
    <serie>001</serie>
    <nDPS>000000000000001</nDPS>
    <dCompet>2026-07-01</dCompet>
    <tpEmit>1</tpEmit>
    <cLocEmi>2101707</cLocEmi>
    <prest>
      <CNPJ>35369787000148</CNPJ>
      <IM>241</IM>
      <regTrib>
        <opSimpNac>1</opSimpNac>
        <regEspTrib>0</regEspTrib>
      </regTrib>
    </prest>
    <toma>
      <NIF>987654321</NIF>
      <xNome>SILBECK SOFTWARE LTDA</xNome>
      <end>
        <endExt>
          <cPais>BN</cPais>
          <cEndPost>99999999</cEndPost>
          <xCidade>EXTERIOR</xCidade>
          <xEstProvReg>EX</xEstProvReg>
        </endExt>
        <xLgr>RUA BERNARDO LOCKS</xLgr>
        <nro>148</nro>
        <xBairro>CENTRO</xBairro>
      </end>
    </toma>
    <serv>
      <locPrest>
        <cLocPrestacao>2101707</cLocPrestacao>
      </locPrest>
      <cServ>
        <cTribNac>090101</cTribNac>
        <xDescServ>Hospedagem - tomador residente no exterior</xDescServ>
        <cNBS>103031100</cNBS>
      </cServ>
      <comExt>
        <mdPrestacao>2</mdPrestacao>
        <vincPrest>1</vincPrest>
        <tpMoeda>220</tpMoeda>
        <vServMoeda>200.00</vServMoeda>
        <mecAFComexP>01</mecAFComexP>
        <mecAFComexT>01</mecAFComexT>
        <movTempBens>1</movTempBens>
      </comExt>
    </serv>
    <valores>
      <vServPrest>
        <vServ>1000.00</vServ>
      </vServPrest>
      <trib>
        <tribMun>
          <tribISSQN>1</tribISSQN>
          <tpRetISSQN>1</tpRetISSQN>
        </tribMun>
      </trib>
    </valores>
  </infDPS>
</DPS>
O tpMoeda usa o código SISCOMEX da moeda (ex.: 220 = USD, 978 = EUR), não o código ISO numérico — consulte a lista completa em GET /api/v1/catalogo/moedas (aba Consulta de Catálogos). Para tomador sem NIF, troque a tag <NIF> por <cNaoNIF>1</cNaoNIF> (1 dispensado, 2 não exigido). O grupo comExt é obrigatório para tomador no exterior; o exemplo mostra o mínimo aceito. O envio pelo webservice exige a assinatura digital (bloco <Signature> irmão de <infDPS> — ver aba Assinatura Digital), omitida acima por legibilidade.
Domínios dos campos do grupo comExt

O valor 0 (Desconhecido / não informado na nota de origem) é reservado ao compartilhamento de notas do município com o Ambiente Nacional — não o utilize na emissão.

mdPrestacao — Modo de Prestação
1Transfronteiriço
2Consumo no Brasil
3Movimento Temporário de Pessoas Físicas
4Consumo no Exterior
vincPrest — Vínculo entre as partes
1Controlada
2Controladora
3Coligada
4Matriz
5Filial ou Sucursal
6Outro vínculo

O valor 0 (Sem vínculo) não é aceito pelo webservice — informe um dos valores de 1 a 6.

movTempBens — Movimentação Temporária de Bens
1Não
2Vinculada — Declaração de Importação (exige nDI)
3Vinculada — Declaração de Exportação (exige nRE)
mecAFComexP — Mecanismo de apoio (prestador)
1Nenhum
2ACC — Adiantamento sobre Contrato de Câmbio — Redução a Zero do IR e do IOF
3ACE — Adiantamento sobre Cambiais Entregues — Redução a Zero do IR e do IOF
4BNDES-Exim Pós-Embarque — Serviços
5BNDES-Exim Pré-Embarque — Serviços
6FGE — Fundo de Garantia à Exportação
7PROEX — Equalização
8PROEX — Financiamento
mecAFComexT — Mecanismo de apoio (tomador)
1Nenhum
2Adm. Pública e Repr. Internacional
3Alugueis e Arrend. Mercantil de máquinas, equip., embarc. e aeronaves
4Arrendamento Mercantil de aeronave para empresa de transporte aéreo público
5Comissão a agentes externos na exportação
6Despesas de armazenagem, mov. e transporte de carga no exterior
7Eventos FIFA (subsidiária)
8Eventos FIFA
9Fretes, arrendamentos de embarcações ou aeronaves e outros
10Material Aeronáutico
11Promoção de Bens no Exterior
12Promoção de Dest. Turísticos Brasileiros
13Promoção do Brasil no Exterior
14Promoção Serviços no Exterior
15RECINE
16RECOPA
17Registro e Manutenção de marcas, patentes e cultivares
18REICOMP
19REIDI
20REPENEC
21REPES
22RETAERO
23RETID
24Royalties, Assistência Técnica, Científica e Assemelhados
25Serviços de avaliação da conformidade vinculados aos Acordos da OMC
26ZPE

Consulta de Catálogos

Endpoints REST somente-leitura para descobrir os valores aceitos pela API:seis catálogos de campos do XML DPS (códigos de tributação, NBS, municípios, países, moedas)mais o catálogo dos tipos de evento aceitos em POST /eventos . Sem autenticação. Resposta em JSON.

Padrão de resposta: os catálogos de DPS retornam{ "itens": [...], "paginacao": { "pagina_atual", "por_pagina", "total", "total_paginas" } }. Cada um aceita?page=e?per_page=(1..100, padrão 25). Cache HTTP de 1h. O catálogo motivos_evento é estático (sem paginação) — devolve a árvore completa de tipos.

Campo opcional. O XSD nacional () tornacTribMunfacultativo. DPS enviadas apenas comcTribNacsão aceitas — a NFS-e é gerada sem código municipal vinculado.Quem precisar de agrupamento por código municipal nos relatórioslocais deve enviar ocTribMuncorrespondente.

GET/:tenant/api/v1/catalogo/codigos_tributacao_municipal

Lista os códigos cadastrados localmente no município. O campocodigoretornado é o valor que vai em<serv><cServ><cTribMun>no XML DPS.

Filtros:?descricao=(ILIKE),?cnae_codigo=

curl "https://tributario.speedgov.com.br/{tenant}/api/v1/catalogo/codigos_tributacao_municipal?descricao=consultoria&per_page=10"

Campo obrigatórioem toda DPS — definido pelo XSD nacional. Código inválidoretorna erroE002sem fallback automático; consulte o catálogo abaixo antes de enviar.

GET/:tenant/api/v1/catalogo/codigos_tributacao_nacional

Catálogo nacional ADN. Campocodigo(6 dígitos) =<cTribNac>do XML.

Filtros:?codigo=,?descricao=,?item=. Cabeçalhos do catálogo (não-emitíveis) são sempre omitidos.

curl "https://tributario.speedgov.com.br/{tenant}/api/v1/catalogo/codigos_tributacao_nacional?item=1"

GET/:tenant/api/v1/catalogo/nbs

Campocodigo(9 dígitos sem formatação) =<cNBS>do XML.codigo_formatado é a versão XX.XX.XX.XX-X.

Filtros:?codigo=(aceita com ou sem pontos),?descricao=,?secao=

curl "https://tributario.speedgov.com.br/{tenant}/api/v1/catalogo/nbs?codigo=01.01.51.00-1"

GET/:tenant/api/v1/catalogo/municipios

Campocodigo_ibge(7 dígitos) é o valor que vai em qualquer<cMun*>do XML.

Filtros:?codigo_ibge=(exato),?uf=(case-insensitive),?nome=(ILIKE).

curl "https://tributario.speedgov.com.br/{tenant}/api/v1/catalogo/municipios?uf=CE&nome=fortal"

GET/:tenant/api/v1/catalogo/paises

Catálogo usado quando o endereço do tomador é exterior (<cPais>).

Filtros:?codigo=(exato),?nome=(ILIKE).

curl "https://tributario.speedgov.com.br/{tenant}/api/v1/catalogo/paises?nome=brasil"

GET/:tenant/api/v1/catalogo/moedas

Catálogo da moeda usada no comércio exterior (<tpMoeda>). Use o código BACEN/SISCOMEX (ex.: 220 = USD, 978 = EUR), não o código ISO 4217 numérico.

Filtros:?codigo=(exato),?sigla=(ILIKE).

curl "https://tributario.speedgov.com.br/{tenant}/api/v1/catalogo/moedas?sigla=usd"

GET/:tenant/api/v1/catalogo/motivos_evento

Catálogo dos eventos aceitos em POST /api/v1/nfse/:chave_acesso/eventos . Para cada tipo_evento (cancelamento, cancelamento_por_substituicao, rejeicao_prestador, rejeicao_tomador, rejeicao_intermediario, solicitacao_analise_fiscal_para_cancelamento, cancelamento_por_oficio, bloqueio_por_oficio, confirmacao_*, etc.) retorna a lista de campos obrigatórios e, quando aplicável, as opções aceitas em cada campo enumerado ( codigo usado no payload, valor inteiro persistido, descricao legível para popular selects).

Filtro opcional: ?tipo_evento=cancelamentodevolve apenas a entrada do tipo solicitado (404 se desconhecido, com lista de valores_validos ).

Sem filtro
curl "https://tributario.speedgov.com.br/{tenant}/api/v1/catalogo/motivos_evento"
Por tipo
curl "https://tributario.speedgov.com.br/{tenant}/api/v1/catalogo/motivos_evento?tipo_evento=cancelamento"
Códigos enviados fora dos valores listados aqui são rejeitados pelo POST /eventos com 400 e mensagem indicando o conjunto aceito. Use este catálogo para validar o payload antes de chamar o POST.

Códigos de Erro e Tratamento

Formato de Resposta de Erro

Todos os erros retornam um JSON padronizado com os seguintes campos:

{
  "codigo_erro": "E101",
  "mensagem": "Descrição curta do erro",
  "detalhes": "Explicação detalhada e como resolver",
  "timestamp": "2025-11-11T12:00:00-03:00"
}
Erros de Estabelecimento (E1XX)
HTTPCódigoMensagemSolução
422E101Estabelecimento não encontradoVerifique se o CNPJ está cadastrado no sistema
403E102Estabelecimento não autorizadoO estabelecimento não tem permissão para emitir NFS-e
422E103Inscrição municipal inválidaA inscrição municipal não corresponde ao CNPJ
Erros de Validação de XML (E2XX)
HTTPCódigoMensagemSolução
422E201XML mal formadoVerifique a estrutura do XML e o encoding UTF-8
422E202Campo obrigatório ausenteVerifique se todos os campos obrigatórios estão presentes
422E203Schema inválidoO XML não está conforme o schema NFS-e v1.0
Erros de Nota Fiscal (E3XX)
HTTPCódigoMensagemSolução
404E301Nota fiscal não encontradaVerifique se a chave de acesso está correta
422E302Nota já canceladaNão é possível operar sobre uma nota cancelada
422E303DPS duplicadoJá existe uma nota com esta série e número
Erros de Valores e Tributos (E4XX)
HTTPCódigoMensagemSolução
422E401Valor inválidoValores devem ser maiores que zero
422E402Código de tributação inválidoO código de serviço não está cadastrado
422E403Município inválidoCódigo IBGE do município não encontrado
422E404Cálculo do ISS incorretoValor do ISS não corresponde ao cálculo (Base × Alíquota)
Erros de Assinatura Digital (E9XX)
Importante: O XML da DPS deve ser assinado digitalmente com certificado ICP-Brasil do prestador (e-CNPJ ou e-CPF) na emissão via POST /api/v1/nfse/v101.O documento do certificado (CNPJ no e-CNPJ, CPF no e-CPF) deve corresponder ao CPF/CNPJ do prestador informado no XML.
HTTPCódigoMensagemSolução
422E901XML não está assinado digitalmenteAssinar o XML com certificado e-CNPJ ou e-CPF válido antes de enviar
422E902Assinatura digital inválidaVerificar se a assinatura foi gerada corretamente (RSA-SHA256)
422E903Certificado digital expiradoRenovar o certificado digital junto à autoridade certificadora
422E904Certificado digital inválidoUsar certificado ICP-Brasil válido (e-CNPJ ou e-CPF)
422E905Certificado não encontrado na assinaturaIncluir o elemento X509Certificate na assinatura
422E906Documento do certificado diverge do prestadorUsar certificado do próprio prestador (CNPJ ou CPF deve coincidir)
Caminho JSON (assinatura no cabeçalho): Na emissão e nos eventos enviados em JSON (Content-Type application/json), a assinatura vai em um cabeçalho — X-DPS-Assinatura na emissão, X-Evento-Assinatura nos eventos — como assinatura CMS/PKCS#7 destacada (Base64) sobre os bytes do corpo. Esses erros retornam HTTP 401.
HTTPCódigoMensagemSolução
401E9002Requisição JSON sem assinatura digitalEnviar a assinatura no cabeçalho (X-DPS-Assinatura na emissão, X-Evento-Assinatura nos eventos)
401E9003Assinatura digital inválidaA assinatura deve cobrir exatamente os bytes do corpo enviado; não reserializar o JSON após assinar
401E9006Certificado fora da validadeUsar certificado dentro do período de validade
401E9007Documento do certificado diverge da parte esperadaAssinar com o certificado do prestador da nota (CNPJ conferido pela raiz, ou CPF)
401E9016Evento de ofício/sistema indisponível por webserviceEventos cujo autor não é parte da nota (prestador/tomador/intermediário) não são aceitos por este canal
Erros Internos do Sistema
HTTPCódigoMensagemSolução
500E999Erro interno no processamentoEntre em contato com o suporte técnico
Grupo obra (construção civil)

Enviado em/DPS/infDPS/serv/obra. Obrigatório quando ocTribNacpertence aos subitens 07.02.01, 07.02.02, 07.04.01, 07.05.01, 07.05.02, 07.06.01,07.06.02, 07.07.01, 07.08.01, 07.17.01, 07.19.01, 14.14.03 e 14.14.04; opcional parao código 99.01.01; não permitido nos demais.

Informe apenas UMA identificação. As três são alternativas exclusivas:

CampoDescriçãoRegras
cObraNúmero da obra no CNO ou no CEI.Até 30 caracteres. Exige o envio deinscImobFiscjunto.
cCIBCadastro Imobiliário Brasileiro.Exatamente 8 dígitos numéricos.
endEndereço da obra.Ver o quadro abaixo.

inscImobFisc— inscrição imobiliária fiscal, até 30 caracteres. Acompanha qualquer uma das três enão conta como alternativa; é obrigatório quando a obra vem porcObra.

Endereço da obra

Escolha entreCEP(8 dígitos, endereço no Brasil) eendExt(exterior, comcEndPost,xCidade exEstProvReg, até 11, 60 e 60 caracteres). Em ambos:xLgr(até 255),nro(até 60),xCpl(opcional, até 156) exBairro(até 60).

O grupo não tem município. Ele não é exigido nem devolvido nas notas recebidas por este webservice.

Erros deste grupo:E0011,E0370,E0372,E0373,E0382,E0384 eE0386.

Grupo infoCompl (informações complementares)

Opcional, enviado em/DPS/infDPS/serv/infoCompl.

CampoDescriçãoLimite
idDocTecDocumento de responsabilidade técnica (ART, RRT ou equivalente).40 caracteres
docRefDocumento de referência.255 caracteres
xInfCompTexto livre de informações complementares.2000 caracteres

Os camposxPed egItemPed do leiaute ainda não são recebidos por este webservice.

Erros do webservice NFS-e (xpath e exemplo)

Cada erro retornado pela API tem código (E1305), xpath do elemento problemáticoe link para esta tabela. Anchor do erro: clique para ir direto.

CódigoCampoXPathOrigemMensagemExemplo
E0001Webservice (validação de tipo na entrada)Tipo de dado inválido. Valor enviado não corresponde ao tipo esperado pelo schema (decimal, inteiro, etc).iss_no_municipio_prestacao
E0002Webservice (validação de tipo na entrada)Valor fora do intervalo permitido pelo schema (ex: alíquota > 100%, tributação ISSQN fora do enum 1, 2, 3, 4).iss_no_municipio_prestacao
E0003Webservice (validação de tipo na entrada)Formato inválido (ex: código IBGE deve ter 7 dígitos, cTribNac deve ter 6 dígitos).iss_no_municipio_prestacao
E0010Webservice (validação estrutural na entrada)Tag XML não aceita pelo padrão nacional vigente. O XML DPS deve estar no formato canônico do Adendo Técnico v1.01 do CGNFS-e.iss_no_municipio_prestacao
E110/DPS/@versaoWebservice (roteamento de versão)DPS no padrão v1.01 foi enviada ao endpoint v1.00. Reenvie para POST /api/v1/nfse/v101.iss_no_municipio_prestacao
E002GenéricoCampo obrigatório não informado.iss_no_municipio_prestacao
E502tributacao_nacional_id/DPS/infDPS/serv/cServ/cTribNacGenérico (validação de cadastro)Código de tributação inválido ou não cadastrado.iss_no_municipio_prestacao
E802/DPS/infDPS/IBSCBSMOC ADN — IBSCBSCampo obrigatório do grupo IBSCBS não foi informado.iss_no_municipio_prestacao
E0310tributacao_nacional_id/DPS/infDPS/serv/cServ/cTribNacMOC ADN — E0310Código de tributação nacional não está cadastrado ou não é administrado por este município.iss_no_municipio_prestacao
E0011obra_tipo/DPS/infDPS/serv/obraXSD v1.01 — TCInfoObra (xs:choice)O grupo obra admite uma identificação: código da obra, CIB ou endereço. A inscrição imobiliária fiscal acompanha qualquer uma delas e não conta como alternativa.iss_no_municipio_prestacao
E0370obra_tipo/DPS/infDPS/serv/obraMOC ADN — E0370Grupo obra é obrigatório quando cTribNac pertence aos subitens de construção civil.iss_no_municipio_prestacao
E0372obra_tipo/DPS/infDPS/serv/obraMOC ADN — E0372Grupo obra não permitido quando cTribNac não pertence aos subitens de construção civil.iss_no_municipio_prestacao
E0373obra_codigo_cib/DPS/infDPS/serv/obra/cCIBMOC ADN — E0373O CIB informado é inválido.iss_no_municipio_prestacao
E0382obra_endereco_cep_brasil/DPS/infDPS/serv/obra/end/CEPMOC ADN — E0382O CEP não deve ser informado quando o endereço da obra ocorrer no exterior.iss_no_municipio_prestacao
E0384obra_exterior_logradouro/DPS/infDPS/serv/obra/end/endExtMOC ADN — E0384O endereço da obra no exterior deve ser informado quando o país do local da prestação for informado na DPS.iss_no_municipio_prestacao
E0386obra_exterior_logradouro/DPS/infDPS/serv/obra/end/endExtMOC ADN — E0386O endereço da obra no exterior não deve ser informado quando o município do local da prestação for informado na DPS.iss_no_municipio_prestacao
E0390/DPS/infDPS/serv/atvEventoMOC ADN — E0390Grupo atvEvento é obrigatório quando cTribNac pertence ao item 12 da LC 116/2003.iss_no_municipio_prestacao
E0392/DPS/infDPS/serv/atvEventoMOC ADN — E0392Grupo atvEvento não permitido quando cTribNac não pertence ao item 12 ou 99.01.01.iss_no_municipio_prestacao
E0928/DPS/infDPS/IBSCBSMOC ADN — E0928Inconsistência entre cTribNac, indicador de operação e dados de imóvel.iss_no_municipio_prestacao
E0931/DPS/infDPS/IBSCBSMOC ADN — E0931Grupo imóvel não pode ser informado para este cTribNac.iss_no_municipio_prestacao
E0932/DPS/infDPS/IBSCBSMOC ADN — E0932Grupo imóvel é obrigatório quando o cTribNac não for de construção civil.iss_no_municipio_prestacao
E1301codigo_municipio_incidencia_id/DPS/infDPS/serv/locPrest/cLocPrestacaoMOC ADN — E1301Município de incidência não pode ser informado para este tipo de tributação (Imunidade, Exportação ou Não Incidência).iss_no_municipio_prestacao
E1305codigo_municipio_incidencia_id/DPS/infDPS/serv/locPrest/cLocPrestacaoMOC ADN — E1305Município de incidência é obrigatório quando a tributação é 'Operação Tributável'.iss_no_municipio_prestacao
E1313codigo_municipio_prestacao_id/DPS/infDPS/serv/locPrest/cLocPrestacaoMOC ADN — E1313Quando local de prestação é 'Águas Marítimas' (0000000), cTribNac deve ser 200101.iss_no_municipio_prestacao
E1317codigo_municipio_incidencia_id/DPS/infDPS/serv/locPrest/cLocPrestacaoMOC ADN — E1317Códigos de tributação nacional cuja regra indica o município da prestação devem ter cMunIncid igual ao cMunPrest.iss_no_municipio_prestacao
E1321codigo_municipio_incidencia_id/DPS/infDPS/serv/locPrest/cLocPrestacaoMOC ADN — E1321Códigos de tributação nacional cuja regra indica o município do tomador devem ter cMunIncid igual ao cMun do tomador.iss_no_tomador
E1402codigo_municipio_prestacao_id/DPS/infDPS/serv/locPrest/cLocPrestacaoMOC ADN — E1402Quando cTribNac = 200101, não é permitido usar 0000000 (Águas Marítimas) como local de prestação.iss_no_municipio_prestacao
E0188tomador_documento/DPS/infDPS/tomaMOC ADN — E0188Informe exatamente um identificador do tomador: CPF, CNPJ, NIF ou cNaoNIF (motivo de não informação do NIF).iss_no_tomador
E0191tomador_nif/DPS/infDPS/toma/NIFMOC ADN — E0191NIF é obrigatório quando o tomador estrangeiro é identificado por NIF (máximo 40 caracteres).iss_no_tomador
E0193tomador_motivo_nao_informacao_nif/DPS/infDPS/toma/cNaoNIFMOC ADN — E0193cNaoNIF é obrigatório quando o tomador é estrangeiro sem NIF (0 sem NIF, 1 dispensado, 2 não exigido).iss_no_tomador
E0235tomador_pais_id/DPS/infDPS/toma/end/endExt/cPaisMOC ADN — E0235País é obrigatório quando o endereço do tomador é no exterior (cPais em ISO 3166-1 alfa-2).iss_no_tomador
E0246tomador_pais_id/DPS/infDPS/toma/end/endExt/cPaisMOC ADN — E0246O código do país do endereço exterior deve existir na tabela ISO e não pode ser o Brasil.iss_no_tomador
E1235comercio_exterior_modo_prestacao/DPS/infDPS/serv/comExtMOC ADN — E1235Grupo de comércio exterior (comExt) incompleto: informe modo de prestação, vínculo, moeda (tpMoeda SISCOMEX), valor em moeda estrangeira, mecanismos de apoio e movimentação temporária de bens.iss_no_tomador
Tags XML depreciadas

A DPS deve ser enviada no formato canônico do Adendo Técnico v1.01 (coluna "Tag correta").O endpointPOST /:tenant/api/v1/nfse/v101 rejeita as tags abaixo com erroE0010 e HTTP 422 indicando a forma correta.O endpoint legadoPOST /:tenant/api/v1/nfse foi descontinuado: qualquer emissão por ele respondeHTTP 410 (erroE111) apontando o endpoint v1.01.

Tag depreciadaTag corretaAnchor
<serv><cMunPrest><serv><locPrest><cLocPrestacao>#tag-cmunprest-depreciada
<serv><cMunInc><infNFSe><cLocIncid> (gerado pela ADN, nao pelo integrador)#tag-cmuninc-depreciada
<tom><toma>#tag-tom-depreciada
<xEmail><email>#tag-xemail-depreciada
<serv><xDescServ><serv><cServ><xDescServ>#tag-xdescserv-fora-cserv-depreciada
Boas Práticas no Tratamento de Erros
  • Sempre verifique o campo code.mx-1 codigo_erro | para tratamento automatizado
  • Exiba o campo code.mx-1 mensagem | para o usuário final
  • Registre o campo code.mx-1 detalhes | em logs para debugging
  • Use o code.mx-1 timestamp | para rastreamento temporal de problemas
  • Implemente retry com backoff exponencial para erros 500

Histórico de Alterações

Esta página registra mudanças no contrato público da API que possam afetar integrações externas.

Formato baseado emKeep a Changelog— categorias:Adicionado·Alterado·Corrigido·Depreciado·Removido·Segurança

Histórico de Alterações — API NFS-e Nacional

Este registro documenta mudanças no contrato público da API que possam afetar integrações externas. Formato baseado em Keep a Changelog — categorias: Adicionado, Alterado, Corrigido, Depreciado, Removido, Segurança.

O registro inicia em 07/05/2026, com a publicação da documentação pública em /api/docs. Mudanças anteriores existem no histórico do código, mas não foram catalogadas formalmente aqui.


18/06/2026

Segurança

  • Assinatura digital obrigatória também no endpoint v1.01. POST /api/v1/nfse/v101 passa a exigir que a DPS chegue assinada digitalmente (XMLDSig), como já ocorre em POST /api/v1/nfse. DPS sem assinatura é rejeitada com E901; assinatura ou certificado inválidos retornam E902, E903 ou E905. Integrações que enviavam XML não assinado ao endpoint v1.01 precisam passar a assinar a DPS.

Alterado

  • Conferência do certificado por CPF, além de CNPJ. O documento do certificado do assinante é conferido contra o prestador também quando o certificado é e-CPF (antes apenas e-CNPJ): CNPJ no e-CNPJ, CPF no e-CPF. A divergência continua retornando E906, cuja mensagem passa de "CNPJ do certificado diverge do prestador informado" para "Documento do certificado diverge do prestador informado".

17/06/2026

Adicionado

  • Emissão para tomador no exterior. O webservice passa a aceitar tomador estrangeiro, identificado por <NIF> (Número de Identificação Fiscal) ou por <cNaoNIF> (motivo de não informação do NIF: 0 sem NIF, 1 dispensado, 2 não exigido), no lugar de <CNPJ>/<CPF>. O endereço usa o grupo <end><endExt><cPais> (código do país em ISO 3166-1 alfa-2, ex.: BN). Quando o tomador é do exterior, o grupo de comércio exterior <comExt> passa a ser obrigatório (mdPrestacao, vincPrest, tpMoeda, vServMoeda, mecAFComexP, mecAFComexT, movTempBens). O tpMoeda usa o código da moeda no padrão SISCOMEX (ex.: 220 = USD, 978 = EUR). Veja o exemplo na aba Exemplos → Tomador no Exterior.

Corrigido

  • Tomador estrangeiro era recusado com erro genérico de campo obrigatório. Ao emitir para tomador identificado por NIF (sem CPF/CNPJ), o webservice retornava Campo obrigatório ausente: tomador_cpf_cnpj, mesmo o cenário sendo válido. Agora o webservice aplica as mesmas validações da emissão pela tela e os erros passam a vir com os códigos oficiais da ADN (ex.: E0188, E0191, E0235, E1235) no lugar do código genérico — ver a aba Códigos de Erro. Não é necessário reenviar notas já emitidas.

01/06/2026

Corrigido

  • DANFSe de nota imune/exportação/não-incidência exibia "Valor Líquido da NFS-e" igual a R$ 0,00. Nessas tributações (sem alíquota de ISSQN) o valor líquido do DANFSe passa a ser calculado corretamente (= valor do serviço, descontadas eventuais retenções). O XML autorizado no ADN já estava correto (campo vLiq, conforme a regra E1303); a correção afeta apenas a representação gráfica (DANFSe). Não é necessário reenviar, cancelar ou alterar notas no ADN. Notas emitidas antes desta correção mantêm o valor antigo na representação até serem reprocessadas.

Depreciado

  • GET /api/v1/danfse/:chave_acessodepreciado (mantido em funcionamento, sem data de remoção). A geração do DANFSe não é responsabilidade da API: após a autorização no ADN, o DANFSe oficial é consultável pela chave de acesso no portal nacional (https://www.nfse.gov.br/ConsultaPublica). Integrações que emitem via webservice podem obter o XML completo no endpoint de consulta da nota (GET /api/v1/nfse/:chave_acesso) e montar a própria representação gráfica. As respostas do endpoint passam a incluir os cabeçalhos Deprecation: true, Link (apontando para o portal nacional) e Warning.

30/05/2026

Corrigido

  • chave_acesso agora é estável desde a emissão. A chave de acesso (50 dígitos) retornada no POST /api/v1/nfse é a mesma do início ao fim do ciclo de vida da nota — não muda mais entre a emissão e a autorização pelo ADN. Antes, uma chave local "provisória" podia ser substituída por outra ao autorizar o lote; agora a chave gerada na emissão é exatamente a que o ADN confirma. Use a chave_acesso como identificador da NFS-e.
  • chave_acesso_provisoria foi ressignificada. O campo continua presente nas respostas de POST e do GET por protocolo, mas passa a indicar apenas o status de autorização da nota (true = ainda não autorizada pelo ADN; false = autorizada). Ele não significa mais que a chave mudará de valor.

Depreciado

  • GET /api/v1/nfse/protocolo/:numero_protocolodepreciado (mantido para integrações existentes, sem data de remoção). Como a chave_acesso é estável, o identificador recomendado passa a ser a própria chave: prefira GET /api/v1/nfse/:chave_acesso. O numero_protocolo segue válido como identificador alternativo.

26/05/2026

Corrigido

  • POST /api/v1/nfse/v101 — DPS com <cTribNac>990101</cTribNac> (Serviços sem incidência de ISSQN e ICMS) combinada a <tribISSQN>4</tribISSQN> (Não Incidência) deixa de retornar o erro falso E0532 ("Tributacao issqn deve ser 'Não Incidência' (4) quando o código de tributação for 990101"). A combinação correta agora é aceita; a regra E0532 continua sendo aplicada quando o XML envia tribISSQN diferente de 4 com cTribNac=990101.
  • POST /api/v1/nfse/v101 — DPS com <tribISSQN>2</tribISSQN> (Imunidade) e <tpImunidade> informado agora propaga o tipo de imunidade para a NFS-e. Antes, o valor não era persistido, causando rejeições falsas em validações posteriores (E0592).
  • POST /api/v1/nfse/v101 — quando <tribISSQN> é 2 (Imunidade), 3 (Exportação de Serviço) ou 4 (Não Incidência), a NFS-e resultante não traz mais base de cálculo, alíquota nem código de município de incidência preenchidos automaticamente. Antes esses campos eram populados internamente e disparavam E1303, E1301 ou E0601 indevidamente após a correção do E0532.
  • POST /api/v1/nfse/:chave_acesso/eventos com tipo_evento cancelamento, cancelamento_por_substituicao ou cancelamento_por_oficio deixa de revalidar as regras de emissão da nota (validações IBS/CBS, base de cálculo, local de incidência etc.). Cancelamento de NFS-e v1.01 do Simples Nacional em 2026 passava a falhar com E1539 ("Alíquota da UF para IBS incorreta") por causa dessa revalidação indevida — a nota já foi validada na emissão e o cancelamento não deve verificar regras de emissão novamente.

Adicionado

  • Novo retorno E003 — Formato do campo inválido (HTTP 400) quando o body XML é enviado com Content-Type incompatível (ex.: application/json). A resposta inclui detalhes orientando o uso de Content-Type: application/xml e exibe o valor recebido. Antes, esse cenário retornava E703 — Erro ao processar DPS sem detalhes úteis, dificultando o diagnóstico do integrador.

Alterado

  • A mensagem do retorno de sucesso de POST /api/v1/nfse/v101 foi reescrita para orientar a consulta do XML pelo endpoint correto: "NFS-e v1.01 em processamento. Aguarde autorização da ADN; consulte o XML em GET /api/v1/nfse/v101/:chave_acesso ou GET /api/v1/nfse/protocolo/:numero_protocolo." Mensagem anterior sugeria que o integrador precisaria gerar o XML, o que é incorreto — o XML é gerado e enviado à ADN pelo próprio sistema.
  • E703 — Erro ao processar DPS: o campo detalhes agora preserva mensagens multilinha. Antes, exceções cuja mensagem começava com quebra de linha retornavam detalhes vazio, ocultando a causa do erro do integrador.

23/05/2026

Alterado

  • POST /api/v1/nfse/v101<cTribMun> (código de tributação municipal) passa a ser opcional no XML da DPS, alinhando ao XSD nacional (minOccurs="0" em TCCServ). DPS contendo apenas <cTribNac> (código de tributação nacional) é aceita; a NFS-e resultante fica sem código municipal vinculado. Integradores que precisam do agrupamento por código municipal nos relatórios locais devem continuar enviando <cTribMun>.
  • Mensagem do erro E002 ("Campo obrigatório não informado") aplicada a codigo_de_tributacao_id foi reescrita para citar explicitamente as tags cTribMun e cTribNac e referenciar o endpoint do catálogo (/api/v1/catalogo/codigos_tributacao_nacional).
  • Catálogo cTribMun em /api/docs/nfse recebeu marcação visual opcional com nota explicativa; catálogo cTribNac recebeu marcação obrigatório indicando que código inexistente retorna E002 sem fallback automático.

Corrigido

  • POST /api/v1/nfse/v101 — quando o <cTribNac> enviado não existia no catálogo nacional, o sistema usava silenciosamente o primeiro código do catálogo como substituto, gerando NFS-e com tributação incorreta. Agora retorna erro explícito E002 — Código de tributação nacional não encontrado ou não informado, alinhado ao comportamento já existente na v1.00.

Adicionado

  • Novo exemplo de DPS sem_ctribmun no catálogo público de exemplos (docs/exemplos_api_nfse_v101/), demonstrando o caminho mínimo de envio: apenas <cTribNac> no bloco <cServ>, sem <cTribMun>.

Adicionado

  • Sandbox NFS-e Nacional — tenant compartilhado integracao para testes de integração sem afetar dados de produção. URL base: https://tributario.speedgov.com.br/integracao/api/v1/. Documentação completa na nova aba /api/docs#sandbox.
  • Header HTTP X-NFSe-Ambiente em todas as respostas dos endpoints NFS-e: valor producao em tenants de prefeituras reais; valor homologacao em tenants com sandbox ativo. Permite ao integrador confirmar em qual ambiente a chamada foi processada.
  • Tag <tpAmb> no XML da NFS-e/DPS em sandbox é sempre 2 (homologação), independente do valor enviado.
  • Marca d'água diagonal AMBIENTE DE HOMOLOGAÇÃO — SEM VALOR FISCAL aplicada no DANFSE retornado por GET /api/v1/danfse/:chave_acesso quando a nota foi emitida em sandbox.
  • Auto-cadastro de prestador em sandbox — quando uma DPS chega ao sandbox com CPF/CNPJ ainda não cadastrado, o sistema cria automaticamente o cadastro do prestador a partir dos dados do bloco <prest> (tags CNPJ/CPF e xNome). Elimina a necessidade de pré-cadastro manual e viabiliza testes self-service.
    • Validação algorítmica de CPF e CNPJ (módulo 11) continua ativa. Documentos mal formados são rejeitados antes do cadastro.
    • O campo xNome é obrigatório. Se vier vazio, a resposta é E101 com detalhes: "Auto-cadastro do prestador no sandbox falhou: razao_social_obrigatoria".
    • Documento algoritmicamente inválido: E101 com detalhes: "Auto-cadastro do prestador no sandbox falhou: documento_invalido".
  • Nova aba Assinatura Digital em /api/docs/nfse com:
    • Tabela dos algoritmos exigidos (CanonicalizationMethod, SignatureMethod, Transform, DigestMethod, Reference URI)
    • Nota sobre suporte ao padrão SPED Nacional com os dois transforms
    • Estrutura do bloco <Signature> (irmão de <infDPS>)
    • Exemplo XML completo com placeholders nos campos que dependem do certificado do prestador
    • Tabela dos códigos de erro E901 a E906
  • Novo arquivo de exemplo iss_no_municipio_prestacao_assinado_exemplo.xml (na coleção de exemplos da v1.01) contendo o bloco <Signature> completo com placeholders.
  • Coleção Postman (Baixar Coleção Postman) — o raw body do request Emitir NFS-e agora inclui o bloco <Signature> com placeholders, espelhando o novo exemplo.

Alterado

  • Em sandbox, a validação E103 ("Estabelecimento não autorizado para emissão") é bypassada — qualquer estabelecimento ativo do tenant pode emitir, independentemente de estar configurado para emissão de NFS-e na prefeitura. Em produção, E103 continua sendo aplicado normalmente.
  • Em sandbox, a validação E101 ("Estabelecimento não encontrado") passa a ser bypassada via auto-cadastro automático (ver acima). Em produção, E101 continua sendo retornado normalmente quando o prestador não está cadastrado.
  • Em sandbox, eventos da NFS-e (POST /api/v1/nfse/:chave_acesso/eventos) são gravados localmente com tpAmb=2, mas não são transmitidos ao Ambiente Nacional (ADN).
  • POST /api/v1/nfse — quando a validação de assinatura falha por um erro inesperado, o campo detalhes da resposta E902 agora retorna a mensagem genérica "Erro interno ao validar assinatura digital", em vez de expor detalhes técnicos internos do servidor.

Corrigido

  • POST /api/v1/nfse — validador de assinatura digital deixa de retornar E902 falso-positivo quando a DPS é assinada conforme o padrão SPED Nacional oficial, em que o elemento <Transforms> contém os dois algoritmos [enveloped-signature, exc-c14n] (caso em que <Signature> é irmão de <infDPS> e o nó referenciado por <Reference URI="#..."> não contém <Signature> como descendente).

Segurança

  • Auto-cadastro de prestador ocorre apenas em tenants com sandbox ativo. Em produção, o comportamento de validação de cadastro permanece inalterado e CPF/CNPJ não cadastrado continua disparando E101.

13/05/2026

Adicionado

  • GET /api/v1/nfse/:chave_acesso/eventos — lista todos os eventos vinculados à chave, ordenados por created_at DESC.
  • GET /api/v1/nfse/:chave_acesso/eventos/:tipo_evento — eventos filtrados por tipo, ordenados por numero_sequencial ASC.
  • GET /api/v1/nfse/:chave_acesso/eventos/:tipo_evento/:num_seq_evento — consulta de um evento específico pela combinação (chave_acesso, tipo_evento, num_seq_evento).
  • Resposta do POST /api/v1/nfse/:chave_acesso/eventos e dos novos GETs passa a expor o conjunto completo do evento (19 campos): id_evento, codigo_tipo_evento (padrão CGOA), tipo_evento, numero_sequencial, numero_protocolo, chave_acesso, data_hora_evento, data_hora_processamento, aguardando_desde, status_evento, protocolo, codigo_retorno, mensagem_retorno, erros_adn (sanitizado — remove chaves sensíveis, trunca strings, limita profundidade a 3 níveis), reprocessamentos_count, ultimo_reprocessamento_em, acao_sugerida, descricao_evento. O POST inclui também o campo mensagem.
  • Campo data_cancelamento no GET /api/v1/nfse/:chave_acesso — retornado quando status == "cancelada", derivado do evento de cancelamento mais recente da nota (cancelamento, cancelamento_por_substituicao ou cancelamento_por_oficio). Para notas autorizadas retorna null.
  • Campo acao_sugerida em todo payload de evento (POST e GETs). Valores possíveis: aguardar, retentar, consultar_suporte, cancelado_ok. Permite ao integrador decidir o próximo passo sem precisar interpretar manualmente o conjunto de campos.
  • Seção Perguntas frequentes — Fluxo de cancelamento em /api/docs#faq-cancelamento, mapeando dúvidas comuns (data do cancelamento, consulta de protocolo do evento, diagnóstico de cancelamento que falhou, polling assíncrono) para os endpoints e campos correspondentes.
  • Campos opcionais cnpj_autor (14 dígitos) e cpf_autor (11 dígitos) no POST /api/v1/nfse/:chave_acesso/eventos, mutuamente exclusivos. Quando omitidos, o autor é inferido do tipo_evento e da nota: cancelamentos (cancelamento, cancelamento_por_substituicao, solicitacao_analise_fiscal_para_cancelamento, confirmacao_prestador, rejeicao_prestador) usam o documento do prestador; manifestações de tomador (confirmacao_tomador, rejeicao_tomador) usam o documento do tomador; manifestações de intermediário (confirmacao_intermediario, rejeicao_intermediario) usam o documento do intermediário.

Alterado

  • O envelope { "status": "OK" } agora é preservado em toda resposta de sucesso da API v1, mesmo quando o payload do recurso usa a chave status. O status do evento foi renomeado de status para status_evento para evitar colisão com o envelope.
  • Postman collection (download em /api/docs/postman):
    • Códigos CGOA corrigidos em confirmacao_tomador (203212203202) e rejeicao_tomador (203216203206). Os códigos anteriores não existem no catálogo oficial.
    • Adicionadas três requests GET na pasta Eventos: lista, por tipo, e específico (tipo + num_seq).

Corrigido

  • POST /api/v1/nfse/:chave_acesso/eventos agora retorna HTTP 409 Conflict quando há colisão concorrente no numero_sequencial após retry interno. Antes, dois POSTs simultâneos podiam criar dois eventos com o mesmo (nota, tipo_evento, numero_sequencial).
  • POST /api/v1/nfse/:chave_acesso/eventos agora retorna HTTP 422 Unprocessable Entity com mensagem explicativa quando já existe outro cancelamento desta nota em estado não-terminal (pendente, enviado, aguardando_autorizacao_nota ou erro com retry pendente). Evita corridas entre múltiplos cancelamentos da mesma nota.
  • GET /api/v1/nfse/:chave_acesso/eventos[/...] retornam o envelope { "status": "OK", ... } (antes vinha sem envelope por efeito colateral da renderização).
  • Eventos criados via POST /api/v1/nfse/:chave_acesso/eventos sem cnpj_autor/cpf_autor agora seguem para o ADN preenchendo o autor automaticamente (ver Adicionado). Antes, ausência do autor podia gerar rejeição no ADN com código E1235 (falha de esquema XML).
  • Quando o ADN rejeita um evento, o motivo passa a aparecer no campo erros_adn da resposta do GET do evento. Antes, o status_evento virava rejeitado mas erros_adn ficava null — o motivo só estava disponível internamente.

Segurança

  • O campo erros_adn exposto nas respostas é sanitizado antes da serialização: remove qualquer chave contendo senha, password, token, secret, chave_privada, backtrace, stack, cookie ou authorization; trunca strings com mais de 1000 caracteres; limita profundidade do objeto a 3 níveis.

08/05/2026

Adicionado

  • GET /api/v1/catalogo/motivos_evento — catálogo público dos campos obrigatórios e opções aceitas em cada tipo_evento do POST /api/v1/nfse/:chave_acesso/eventos. Retorna, para cada tipo:
    • campos_obrigatorios — lista de campos exigidos pelo Grape;
    • enums — opções aceitas em cada campo enumerado, com codigo (string usada no payload), valor (inteiro persistido) e descricao (label legível em pt-BR);
    • endpoint — método, URL por chave_acesso e por numero_protocolo (recomendada) e content_type;
    • exemplo_payload — corpo JSON pronto para enviar (com tipo_evento + primeiro código do enum + placeholders textuais);
    • doc_url — link para a âncora correspondente em /api/docs. Use sem filtro para receber a árvore completa, ou ?tipo_evento=cancelamento para uma única entrada chata.
  • POST /api/v1/nfse/protocolo/:numero_protocolo/eventos — rota paralela ao endpoint de eventos por chave_acesso. Recomendada para registrar eventos pós-emissão: o numero_protocolo é estável, enquanto a chave_acesso provisória pode ser substituída pela oficial após autorização do ADN.

Corrigido

  • POST /api/v1/nfse/:chave_acesso/eventos agora aceita corretamente os campos de motivo enumerado para todos os tipos que dependem deles (cancelamento, cancelamento_por_substituicao, solicitacao_analise_fiscal_para_cancelamento, rejeicao_prestador, rejeicao_tomador, rejeicao_intermediario, cancelamento_por_oficio, bloqueio_por_oficio e similares). Antes, mesmo com payload completo, a chamada era rejeitada com 422. Quando algum campo obrigatório do tipo está ausente ou um valor de enum está fora do conjunto permitido, a resposta agora é 400 com mensagem indicando o campo e o conjunto de valores aceitos.
  • Validador de tipos do XML DPS aceita tribISSQN=4 (Não Incidência), conforme o XSD oficial v1.01 do ADN. Antes a entrada era rejeitada com erro E0002 mesmo sendo válida pelo schema.
  • protocolo.status agora reflete o estado final da NFS-e após o ADN confirmar o lote: processandoautorizado (ou cancelado/rejeitado quando aplicável). Antes o status ficava preso em processando mesmo após nota.status=autorizada, confundindo integradores que rastreavam o ciclo via numero_protocolo.
  • Campo xml_nota na resposta dos endpoints de emissão e consulta passa a retornar o XML real da nota: prioriza a NFS-e autorizada pelo ADN (xml_nfse), com fallback para a DPS assinada (xml_assinado) enquanto o ADN ainda não devolveu a NFS-e final. Antes o campo retornava null em todas as notas emitidas via webservice, mesmo após autorização.

Alterado

  • Postman collection (download em /api/docs/postman):
    • URL dos eventos corrigida de /api/v1/eventos para /api/v1/nfse/:chave_acesso/eventos.
    • Payloads dos cinco eventos atualizados com os campos corretos por tipo (incluindo codigo_motivo_cancelamento, descricao_motivo_cancelamento, motivo_rejeicao_*, etc.).
    • Adicionadas variáveis chave_acesso e numero_protocolo.
    • Nova entrada na pasta Catalogo: "Motivos por Tipo de Evento".
    • Nova entrada na pasta Eventos: "Cancelamento via numero_protocolo (recomendado)".

07/05/2026

Adicionado

  • GET /api/v1/nfse/protocolo/:numero_protocolo — consulta NFS-e pelo número de protocolo. Diferente da chave_acesso (que pode ser substituída pela oficial após autorização do ADN), o numero_protocolo é estável durante todo o ciclo de vida da nota. É o jeito recomendado de o integrador rastrear a nota e descobrir a chave oficial depois do processamento assíncrono.
  • Flag chave_acesso_provisoria (booleana) nas respostas dos POSTs de emissão e dos GETs de consulta. Quando true, o valor da chave_acesso ainda é local e pode ser substituído pela chave oficial quando o lote for autorizado pelo ADN. Persista também o numero_protocolo como ancoragem confiável.
  • Cinco endpoints públicos de catálogo, sem autenticação, com Cache-Control: public, max-age=3600 e paginação:
    • GET /api/v1/catalogo/codigos_tributacao_municipal
    • GET /api/v1/catalogo/codigos_tributacao_nacional
    • GET /api/v1/catalogo/nbs
    • GET /api/v1/catalogo/municipios
    • GET /api/v1/catalogo/paises
  • Catálogo de erros DPS com âncora HTML por código na página /api/docs#codigos-erro. Códigos catalogados nesta release: E002, E0001, E0002, E0003, E0010, E0310, E0370, E0372, E0390, E0392, E0928, E0931, E0932, E1301, E1305, E1313, E1317, E1321, E1402, E502, E802.
  • Toda resposta 422 dos endpoints de emissão (v1.00 e v1.01) passa a incluir, para cada erro, os campos codigo, xpath, mensagem, origem_moc, doc_url (link para a âncora correspondente em /api/docs) e, quando aplicável, exemplo_ref indicando qual exemplo público cobre o cenário.
  • Validador de tipos do XML DPS pré-parser. Rejeita 422 antes da extração silenciosa quando o XML traz tipo numérico inválido (ex.: <vServ>abc</vServ>, alíquota fora de [0,100], tribISSQN fora do enum, código IBGE com tamanho errado). Erros usam os códigos E0001, E0002, E0003.
  • No POST /api/v1/nfse/v101, o XML é pré-validado contra tags legadas de padrões municipais antigos. Tags como <serv><cMunPrest>, <serv><cMunInc>, <tom>, <xEmail> e <serv><xDescServ> são rejeitadas com erro E0010 indicando a forma canônica equivalente do ADN (ex.: <serv><locPrest><cLocPrestacao>, <toma>, <email>, <serv><cServ><xDescServ>).
  • Quando o POST /api/v1/nfse (v1.00) tolera uma tag legada por compatibilidade, a resposta inclui o header HTTP Warning: 299 com link para a seção /api/docs#tags-depreciadas. Sinaliza que existe forma canônica preferida — não é prazo de remoção.
  • Inferência automática do município de incidência a partir do cTribNac informado no DPS. Integradores conformes ao MOC ADN não precisam enviar a tag de município de incidência: o webservice resolve pelo local_incidencia_imposto cadastrado para o cTribNac (município do prestador, do local da prestação, ou do tomador).
  • Página /api/docs publicada com guia rápido, exemplos completos de DPS XML de envio (3 cenários: ISS no município da prestação, ISS no tomador, com retenção de ISS), catálogos de códigos, lista de tags aceitas e depreciadas, e Postman collection v2.1 baixável.

Corrigido

  • Parser v1.00 lê cTribMun do caminho canônico <valores><trib><tribMun> do XML DPS.

Alterado

  • URL pública de produção centralizada na documentação. Os campos doc_url retornados nas respostas de erro 422 sempre apontam para o domínio público, mesmo em ambientes de desenvolvimento local (evita exposição de localhost:3000 para integradores).

Sandbox NFS-e Nacional

Você está navegando dentro do sandbox agora.

As notas emitidas neste tenant são geradas com tpAmb=2 (homologação) e não são transmitidas ao Ambiente Nacional (ADN). O DANFSE retornado contém a marca d'água AMBIENTE DE HOMOLOGAÇÃO — SEM VALOR FISCAL, e o header X-NFSe-Ambiente: homologacao é devolvido em todas as respostas dos endpoints NFS-e.

O que é o Sandbox NFS-e

O Sandbox NFS-e Nacional é um tenant compartilhado (slug integracao) dedicado a testes de integração com o webservice de NFS-e. Integradores podem validar o layout do XML da DPS, a montagem das chamadas REST, o tratamento de erros e o consumo do DANFSE sem afetar dados de produção de prefeituras reais e sem necessidade de certificado digital A1.

Base URL do sandbox
https://tributario.speedgov.com.br/integracao/api/v1/

Toda chamada para o sandbox usa o prefixo /integracao (slug do tenant). As demais URLs da API permanecem idênticas às de produção — apenas o município muda.

Sandbox vs Produção

ProduçãoSandbox (tenant integracao)
Base URLhttps://tributario.speedgov.com.br/{municipio}/api/v1/https://tributario.speedgov.com.br/integracao/api/v1/
Tag <tpAmb> no XML1 (produção)2 (homologação)
Header X-NFSe-Ambienteproducaohomologacao
Transmissão ao ADNSim (após assinatura A1 do município)Não — fluxo encerrado localmente no banco do sandbox
Certificado digital A1 do municípioObrigatório (assinatura XML antes do envio)Não utilizado (transmissão desligada)
Marca d'água diagonal no DANFSEAusenteAMBIENTE DE HOMOLOGAÇÃO — SEM VALOR FISCAL
Valor fiscal das notasSimNão — uso exclusivo de teste
Cadastro prévio do prestador no municípioObrigatórioNão — criado automaticamente na primeira DPS (E101 bypassado)
Validação de autorização para emitir (E103)AplicadaBypassada — estabelecimento criado já entra autorizado para teste
Validação algorítmica de CPF/CNPJAplicadaAplicada (idêntica à produção)
Validação do schema XSD da DPSAplicadaAplicada (idêntica à produção)
Regras fiscais nacionais (NBS, IBS/CBS, cTribNac)AplicadasAplicadas (idênticas à produção)

Como começar

  1. Aponte sua integração para a base URL https://tributario.speedgov.com.br/integracao/api/v1/
  2. Monte o XML da DPS conforme o Guia Rápido — o schema é idêntico ao de produção, incluindo cTribNac (6 dígitos), cTribMun e estrutura de tributos.
  3. Envie a DPS via POST /nfse com Content-Type: application/xml e o XML da DPS no body.
  4. Confirme na resposta o header X-NFSe-Ambiente: homologacao e que o XML retornado contém <tpAmb>2</tpAmb>.
  5. Consulte a NFS-e por chave de acesso via GET /nfse/{chave_acesso} ou pelo número de protocolo via GET /nfse/protocolo/{numero_protocolo}.
  6. Baixe o DANFSE em GET /danfse/{chave_acesso} e confirme a presença da marca d'água diagonal.
  7. (Opcional) Teste eventos da NFS-e via POST /nfse/{chave_acesso}/eventos — eles são registrados localmente com tpAmb=2 e não são enviados ao ADN.

Auto-cadastro do prestador no sandbox

Quando uma DPS chega ao sandbox com um CPF/CNPJ ainda não cadastrado no tenant integracao, o cadastro do prestador é criado automaticamente a partir dos dados presentes no XML — tags CNPJ/CPF e xNome dentro do bloco <prest>. Já é provisionado um estabelecimento ativo no município, pronto para emitir. Não é necessário pedir pré-cadastro ao suporte.

  • Detecção PF vs PJ pelo comprimento do documento normalizado (11 dígitos → CPF/PF; 14 → CNPJ/PJ).
  • Validação algorítmica de CPF (gem cpf_cnpj) e CNPJ (módulo 11) continua ativa — documentos mal formados são rejeitados antes do auto-cadastro.
  • O estabelecimento criado tem situacao=ativo, endereço genérico de sandbox e fica disponível para emissão imediata.
  • O município do estabelecimento auto-criado é definido pelo cLocEmi da DPS — se o IBGE informado não existir no catálogo, o auto-cadastro falha com cidade_padrao_indisponivel.
  • O auto-cadastro ocorre apenas em modo sandbox. Em produção, CPF/CNPJ não cadastrado continua disparando E101 normalmente.
Sobre o campo xNome: opcional no XSD v1.01 (minOccurs="0"). Quando ausente, o auto-cadastro do sandbox usa "PRESTADOR <CPF/CNPJ>" como nome — você pode atualizar depois pelo painel do município.

O que NÃO testar no sandbox

  • Assinatura digital ICP-Brasil: ainda não é obrigatória no webservice (passará a ser no futuro). O sandbox espelha o comportamento atual de produção — a DPS é aceita sem assinatura.
  • Transmissão ao ADN (Ambiente Nacional): desligada por design no sandbox. As notas são autorizadas localmente e permanecem apenas no banco do tenant integracao.
  • Eventos transmitidos ao ADN: cancelamentos, substituições e demais eventos são gravados localmente com tpAmb=2, mas não são enviados ao Ambiente Nacional.
  • Regras específicas do seu município: o sandbox usa as configurações do tenant integracao (alíquotas, lista de serviços, cadastros). Configurações específicas do município do cliente final não são replicadas aqui — para validar regras do seu município, continue usando o tenant dele em produção.

Diferenças de erros vs produção

Algumas validações de produção são bypassadas no sandbox para facilitar testes. A tabela completa de códigos está na aba Erros.

Erros que NÃO aparecem no sandbox
  • E101 — Estabelecimento não encontrado. O sandbox auto-cadastra o prestador a partir dos dados da DPS (ver "Auto-cadastro do prestador" acima). Exceção: dispara mesmo no sandbox se o documento for algoritmicamente inválido ou se o xNome vier vazio — o campo detalhes da resposta indica o motivo.
  • E103 — Estabelecimento não autorizado para emissão. O sandbox bypassa a validação do campo nota_fiscal do estabelecimento.
Erros que continuam ativos no sandbox
  • E0003 e demais erros de schema XSD (formato de cTribNac, campos numéricos, tamanhos máximos).
  • E002 — Campos obrigatórios ausentes (ex: tomador_cpf_cnpj, valor_servico).
  • Todas as validações de regras fiscais nacionais (NBS, IBS/CBS, alíquotas efetivas, cTribNac/cTribMun) permanecem idênticas à produção.

Assinatura Digital da DPS

Obrigatória — tanto em XML quanto em JSON

Os endpoints de emissão e de eventos exigem que a requisição chegue já assinada digitalmente com certificado A1 ICP-Brasil do prestador (e-CNPJ ou e-CPF). O webservice apenas valida a assinatura — ele não assina.

Em XML (Content-Type application/xml): a assinatura vai no próprio XML, no elemento <Signature> (XMLDSig). Sem <Signature> válido, a API retorna E901 ou E902.

Em JSON (Content-Type application/json): a assinatura vai em um cabeçalho HTTP (assinatura CMS/PKCS#7 destacada). Veja a seção Assinatura no caminho JSON abaixo. Sem assinatura válida, a API retorna 401.

Algoritmos exigidos

Padrão XML Signature (W3C XMLDSig 1.1) com algoritmos conforme especificação SPED Nacional NFS-e.

ElementoAlgorithm
CanonicalizationMethodhttp://www.w3.org/2001/10/xml-exc-c14n#
SignatureMethodhttp://www.w3.org/2001/04/xmldsig-more#rsa-sha256
Transformhttp://www.w3.org/2001/10/xml-exc-c14n#
DigestMethodhttp://www.w3.org/2001/04/xmlenc#sha256
Reference URI#<Id do <infDPS>>
O webservice também aceita o padrão SPED Nacional oficial, em que o elemento <Transforms> contém dois algoritmos na ordem enveloped-signature seguido de exc-c14n.
Estrutura do bloco <Signature>

O elemento <Signature> deve ser inserido como irmão de <infDPS>, dentro de <DPS>. O atributo URI do <Reference> aponta para o atributo Id do <infDPS>.

O exemplo abaixo contém placeholders nos campos que dependem do certificado do prestador (DigestValue, SignatureValue, X509Certificate). Não envie este XML diretamente — o integrador deve gerar esses valores assinando o XML com a chave privada do certificado e-CNPJ do prestador antes de fazer o POST.
iss_no_municipio_prestacao_assinado_exemplo.xml
<?xml version="1.0" encoding="UTF-8"?>
<DPS versao="1.01" xmlns="http://www.sped.fazenda.gov.br/nfse">
      <infDPS Id="DPS230533221122233300018180000177817194766143">
        <tpAmb>2</tpAmb>

        <verAplic>1.01</verAplic>
        <serie>80000</serie>
        <nDPS>177817194766143</nDPS>
        <dCompet>2026-05-07</dCompet>
        <tpEmit>1</tpEmit>
        <cLocEmi>2301000</cLocEmi>
        <prest>
          <CNPJ>11222333000181</CNPJ>
          <IM>123456</IM>
          <xNome>Prestador Teste LTDA</xNome>
          <fone>11999999999</fone>
          <email>prestador@teste.com</email>
          <regTrib>
            <opSimpNac>1</opSimpNac>
            <regEspTrib>0</regEspTrib>
          </regTrib>
        </prest>
        <serv>
          <locPrest>
            <cLocPrestacao>2301000</cLocPrestacao>
          </locPrest>
          <cServ>
            <cTribNac>010101</cTribNac>
            <xDescServ>Serviço de teste para homologação do sistema de NFS-e</xDescServ>
            <cNBS>010151001</cNBS>
          </cServ>
        </serv>
        <valores>
          <vServPrest>
            <vServ>1000.00</vServ>
          </vServPrest>
          <trib>
            <tribMun>
              <tribISSQN>1</tribISSQN>
              <tpRetISSQN>1</tpRetISSQN>
              <pAliq>5.00</pAliq>
            </tribMun>
            <totTrib>
              <indTotTrib>0</indTotTrib>
            </totTrib>
          </trib>
        </valores>
      </infDPS>
      <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
        <SignedInfo>
          <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
          <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
          <Reference URI="#DPS230533221122233300018180000177817194766143">
            <Transforms>
              <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
            </Transforms>
            <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
            <DigestValue>PREENCHER_DIGEST_BASE64</DigestValue>
          </Reference>
        </SignedInfo>
        <SignatureValue>PREENCHER_SIGNATURE_VALUE_BASE64</SignatureValue>
        <KeyInfo>
          <X509Data>
            <X509Certificate>PREENCHER_CERTIFICADO_A1_BASE64</X509Certificate>
          </X509Data>
        </KeyInfo>
      </Signature>
    </DPS>
Como gerar a assinatura

A assinatura é gerada pelo integrador, do lado do cliente, antes do envio. O webservice apenas valida. Os passos abaixo descrevem o procedimento padrão W3C XMLDSig 1.1 aplicado ao <infDPS>.

  1. Montar o template: adicionar o bloco <Signature> (com a estrutura mostrada acima) como irmão do <infDPS>, dentro de <DPS>. Nesse momento, <DigestValue> e <SignatureValue> ficam vazios e <X509Certificate> é o Base64 do certificado A1 ICP-Brasil do prestador (e-CNPJ ou e-CPF; DER em Base64, sem cabeçalhos -----BEGIN/END CERTIFICATE----- e sem quebras de linha).
  2. Calcular o DigestValue: aplique a canonicalização http://www.w3.org/2001/10/xml-exc-c14n# sobre o elemento <infDPS> (referenciado pela Reference URI), calcule o SHA-256 do resultado e preencha o campo <DigestValue> com o valor em Base64.
  3. Calcular o SignatureValue: aplique a mesma canonicalização Exclusive XML sobre o elemento <SignedInfo> (já com o DigestValue preenchido), assine o resultado com a chave privada do certificado usando RSA-SHA256 (http://www.w3.org/2001/04/xmldsig-more#rsa-sha256) e preencha o campo <SignatureValue> com a assinatura em Base64.
  4. Enviar: faça POST /api/v1/nfse/v101 com header Content-Type: application/xml e o XML completo (com <Signature> preenchida) no body.
A maioria das linguagens tem bibliotecas para o padrão W3C XML Signature que fazem os passos 2 e 3 automaticamente a partir do template do passo 1. Procure pelas implementações de XMLDSig ou XML Signature da sua linguagem ou framework.
Assinatura no caminho JSON

Quando a requisição é enviada em JSON (Content-Type: application/json), o corpo também precisa ser assinado, mas a assinatura não vai dentro do JSON — vai em um cabeçalho HTTP:

OperaçãoCabeçalho da assinatura
Emissão (POST /api/v1/nfse/v101)X-DPS-Assinatura
Eventos (POST /api/v1/nfse/:chave_acesso/eventos e a variante por :numero_protocolo) — ex.: cancelamentoX-Evento-Assinatura

O valor do cabeçalho é uma assinatura CMS/PKCS#7 destacada (detached), em Base64, calculada sobre os bytes exatos do corpo enviado. O certificado A1 ICP-Brasil do prestador (e-CNPJ ou e-CPF) deve estar embutido na própria estrutura CMS.

Quem assina: na emissão, o prestador; nos eventos, a parte autorizada para o tipo (no cancelamento, o prestador da nota). A conferência de CNPJ é pela raiz (8 dígitos) — o certificado da matriz pode assinar por uma filial do mesmo titular; para CPF, a conferência é exata.
Passos
  1. Montar o corpo JSON exatamente como ele será enviado (mesma sequência de bytes).
  2. Gerar a assinatura CMS/PKCS#7 destacada sobre esses bytes, com a chave privada do certificado do prestador, incluindo o certificado na estrutura CMS.
  3. Codificar em Base64 e colocar no cabeçalho correspondente (X-DPS-Assinatura na emissão, X-Evento-Assinatura nos eventos).
  4. Enviar com Content-Type: application/json e o JSON no body. Importante: não reserialize o JSON depois de assinar — a assinatura cobre os bytes exatos.
Exemplo (cancelamento via JSON)
curl -X POST "https://tributario.speedgov.com.br/{tenant}/api/v1/nfse/:chave_acesso/eventos" \
     -H "Content-Type: application/json" \
     -H "X-Evento-Assinatura: " \
     -d '{
       "tipo_evento": "cancelamento",
       "codigo_motivo_cancelamento": "erro_na_emissao",
       "descricao_motivo_cancelamento": "Erro no valor do serviço"
     }'

Erros do caminho JSON (HTTP 401): E9002, E9003, E9006, E9007, E9016 — ver a aba Erros.

Códigos de erro de assinatura

HTTP status: 422 Unprocessable Entity. Veja a aba Erros para a lista completa de códigos retornados pela API.

CódigoMensagemQuando ocorre
E901XML não está assinado digitalmenteFalta o elemento <Signature> no XML enviado
E902Assinatura digital inválidaDigest ou SignatureValue não confere com o conteúdo
E903Certificado digital expiradoCertificado fora da janela not_before / not_after
E904Certificado digital inválidoX509Certificate não é parseável por OpenSSL
E905Certificado não encontrado na assinaturaFalta o elemento <X509Certificate> em <KeyInfo>
E906CNPJ do certificado diverge do prestador informadoCNPJ no SubjectAltName do cert ≠ CNPJ em <prest><CNPJ>