Pular para o conteúdo
FiscalAPI
FiscalAPI
NFS-e

Chave de acesso da NFS-e: os 50 dígitos, campo a campo (com cálculo do DV)

Equipe FiscalAPI 6 min de leitura
NFS-eChave de AcessoPythonNode.jsTutorial

A chave de acesso da NFS-e do padrão nacional tem 50 dígitos, em 8 campos: código IBGE do município emissor (7), ambiente gerador (1), tipo de inscrição do emitente (1), CPF ou CNPJ do emitente (14), número da NFS-e (13), ano e mês de emissão (4), código numérico (9) e dígito verificador (1). O cálculo do dígito verificador é o módulo 11 (o mesmo da NF-e), com pesos de 2 a 9 sobre os 49 primeiros dígitos, e segue o guia oficial. Com ele, dá para recusar uma chave digitada errada antes de qualquer consulta.

Atualizado em 8 de novembro de 2026.

Os 50 dígitos, campo a campo

A chave usada nos exemplos é fictícia, com dígito verificador válido: 35503082211222333000181000000000012326100000045676.

PosiçãoTamanhoCampoNo exemplo
1 a 77Código IBGE do município emissor3550308 (São Paulo)
81Ambiente gerador: 1 = sistema próprio do município, 2 = Sefin Nacional NFS-e2
91Tipo de inscrição do emitente: 1 = CPF, 2 = CNPJ2
10 a 2314CPF ou CNPJ do emitente (CPF com zeros à esquerda)11222333000181
24 a 3613Número da NFS-e, com zeros à esquerda0000000000123
37 a 404Ano e mês de emissão (AAMM)2610 (outubro de 2026)
41 a 499Código numérico gerado pelo sistema000004567
501Dígito verificador6

O significado de cada campo está no guia oficial do Emissor Público Nacional. Só pela chave você já sabe a cidade que emitiu, quem emitiu, o número da nota e o mês.

Chave da NFS-e x chave da NF-e

NFS-e (serviço)NF-e (produto)
Tamanho50 dígitos44 dígitos
Começa comCódigo IBGE do município (7 dígitos)Código da UF (2 dígitos)
Data na chaveAAMMAAMM
Identificador no XMLId = NFS + 50 dígitos (53 caracteres)Id = NFe + 44 dígitos
No documento impressoDANFSe, bloco único de 50 dígitosDANFE, 11 blocos de 4 dígitos

Se o seu sistema tem um campo "chave de acesso" só para NF-e, ele vai cortar ou recusar a chave da NFS-e. Confira o tamanho do campo antes de importar notas de serviço. Para a chave de 44 dígitos, veja chave de acesso inválida: deve ter 44 caracteres.

Como calcular o dígito verificador

O cálculo é o módulo 11 (o mesmo da NF-e) e segue o guia oficial:

  1. Pegue os 49 primeiros dígitos.
  2. Da direita para a esquerda, multiplique cada dígito por um peso: 2, 3, 4, 5, 6, 7, 8, 9, e volte para 2.
  3. Some os produtos e divida por 11.
  4. Se o resto for 0 ou 1, o DV é 0. Senão, o DV é 11 menos o resto.

No exemplo, o resto é 5. O DV é 11 − 5 = 6, o último dígito da chave.

Em Python

python
import re


def dv_chave_nfse(chave49: str) -> int:
    soma, peso = 0, 2
    for digito in reversed(chave49):
        soma += int(digito) * peso
        peso = 2 if peso == 9 else peso + 1
    resto = soma % 11
    return 0 if resto < 2 else 11 - resto


def chave_nfse_valida(chave: str) -> bool:
    # aceita a chave com espaços, pontos, traços ou o prefixo NFS do XML
    chave = re.sub(r"[\s.\-/]", "", chave).upper()
    if not re.fullmatch(r"(NFS)?\d{50}", chave):
        return False  # tamanho errado ou letra no meio
    chave = chave[-50:]
    return dv_chave_nfse(chave[:49]) == int(chave[49])


print(chave_nfse_valida("35503082211222333000181000000000012326100000045676"))  # True

Em JavaScript

javascript
function dvChaveNfse(chave49) {
  let soma = 0;
  let peso = 2;
  for (let i = chave49.length - 1; i >= 0; i--) {
    soma += Number(chave49[i]) * peso;
    peso = peso === 9 ? 2 : peso + 1;
  }
  const resto = soma % 11;
  return resto < 2 ? 0 : 11 - resto;
}

function chaveNfseValida(chave) {
  const limpa = chave.replace(/[\s.\-\/]/g, "").toUpperCase();
  if (!/^(NFS)?\d{50}$/.test(limpa)) return false; // tamanho errado ou letra no meio
  const so = limpa.slice(-50);
  return dvChaveNfse(so.slice(0, 49)) === Number(so[49]);
}

console.log(chaveNfseValida("35503082211222333000181000000000012326100000045676")); // true

Separar os campos

python
def decompor_chave_nfse(chave: str) -> dict:
    return {
        "municipio_ibge": chave[0:7],
        "ambiente_gerador": chave[7],
        "tipo_inscricao": chave[8],   # 1 = CPF, 2 = CNPJ
        "cpf_cnpj": chave[9:23],
        "numero_nfse": int(chave[23:36]),
        "ano_mes": chave[36:40],      # AAMM
        "codigo_numerico": chave[40:49],
        "dv": chave[49],
    }

Erros comuns com a chave

SintomaCausa provávelO que fazer
A chave tem 44 dígitosÉ uma NF-e, não NFS-eUse a consulta de NF-e
A chave tem 53 caracteres e começa com NFSFoi copiada do Id do XMLTire as 3 letras do começo
49 ou 51 dígitosFaltou ou sobrou um dígito ao copiarCopie de novo do DANFSe ou do XML
50 dígitos, DV não confereUm dígito trocado no meioConfira dígito a dígito ou copie de novo
Chave válida, nota não apareceNota fora do padrão nacional ou de outro ambienteConfira no portal da prefeitura do prestador

Uma chave com DV certo garante só que ela foi digitada sem erro. Não garante que a nota existe. Para isso, é preciso consultar a nota.

Chave da NFS-e x identificador da DPS

A DPS (Declaração de Prestação de Serviço) é o documento que o prestador envia para gerar a NFS-e. O identificador da DPS não é a chave da nota. Ele tem município (7), tipo de inscrição (1), CPF ou CNPJ (14), série (5) e número da DPS (15), conforme o guia das APIs do Emissor Público Nacional. Se alguém te passou um número que mistura série e número da DPS, ele não serve como chave de acesso.

Validar e consultar pela API da FiscalAPI

A API da FiscalAPI valida a chave antes de cobrar: tamanho, só números e dígito verificador. Ela aceita a chave com espaços, pontos ou traços e com o prefixo NFS do XML. Chave inválida volta 400 CHAVE_INVALIDA, com o motivo, e não é cobrada.

python
import requests

resp = requests.get(
    "https://api.fiscalapi.com.br/api/consultar-nfse",
    headers={"X-API-Key": "fapi_sua_chave_aqui"},
    params={"chave": "NFS35503082211222333000181000000000012326100000045676"},
    timeout=100,
)
if resp.status_code == 400:
    print("Chave inválida:", resp.json())  # não é cobrada
elif resp.status_code == 404:
    print("Nota não encontrada no padrão nacional")  # não é cobrada
elif resp.ok:
    nota = resp.json()
    print(nota["numero_nfse"], nota["situacao"]["descricao"])
else:
    print("Tente de novo:", resp.status_code, resp.json())

Com a chave válida, a resposta traz emitente, tomador, serviço, ISS, tributos federais e o tipo de geração da nota, em JSON. Com danfse=true, vem também o PDF do DANFSe. Custa de R$ 0,05 (Enterprise) a R$ 2,01 (Lite) por nota entregue. Sem programar, a mesma consulta sai no painel da FiscalAPI. Detalhes na documentação da consulta de NFS-e.

Perguntas frequentes

Quantos dígitos tem a chave de acesso da NFS-e? 50. A da NF-e tem 44.

Onde fica a chave no XML da NFS-e? No atributo Id da NFS-e, depois do prefixo NFS. Tire as 3 letras e sobram os 50 dígitos.

O que significa o 8º dígito da chave? É o ambiente gerador: 1 para nota gerada pelo sistema próprio do município, 2 para nota gerada pela Sefin Nacional NFS-e.

Dá para saber o CNPJ do prestador pela chave? Sim. Ele está nas posições 10 a 23. A posição 9 diz se é CPF (1) ou CNPJ (2).

DV válido quer dizer que a nota existe? Não. Quer dizer só que a chave não tem erro de digitação. Para saber se a nota existe, consulte a chave. Veja como consultar uma NFS-e pela chave de acesso.

Fontes

Artigos relacionados


Precisa validar e consultar chaves de NFS-e no seu sistema? Veja a consulta de NFS-e pela chave ou crie sua conta.

Compartilhar: WhatsApp LinkedIn Twitter

Consulte a NFS-e só com a chave

Dados em JSON e o DANFSe em PDF, sem certificado. A partir de R$ 0,05 por nota.

Ver a consulta de NFS-e