Chave de acesso NFS-e
A chave de acesso de 50 dígitos da NFS-e nacional, a nota fiscal de serviço do Sistema Nacional NFS-e.
Validar
- JavaScript, biblioteca
- Python, biblioteca
- Go, biblioteca
- Ruby, biblioteca
- Rust, biblioteca
- .NET, biblioteca
- Erlang, biblioteca
Valida a chave de acesso de 50 dígitos de uma NFS-e nacional: código do município (7), ambiente gerador ambGer (1), tipo de inscrição (1), inscrição federal (14), número da NFS-e nNFSe (13), ano e mês AAMM (4), código numérico (9) e dígito verificador (1).
- A chave pode começar com
NFS, o prefixo do atributoIddo XML, sem diferenciar maiúsculas de minúsculas. Espaços nas pontas são ignorados. - O DANFSe imprime a chave em um único bloco, então ela não tem máscara impressa (não existe
nfseKey.format). Os 8 campos (código do município,ambGer, tipo de inscrição, inscrição federal,nNFSe,AAMM, código numérico e dígito verificador) podem ser escritos separados: qualquer sequência de espaço,.,-ou/é aceita entre dois campos, comocpf.isValidlê sua máscara. Um separador dentro de um campo, ou entre o prefixoNFSe a chave, torna o valor inválido. - Só uma string é lida. Qualquer outro tipo retorna
false. - O código do município deve começar com um código de UF do IBGE. A função confere só esse prefixo e não consulta o município.
- O
ambGerdeve ser 1 (sistema da prefeitura) ou 2 (Sistema Nacional NFS-e). - Tipo de inscrição 1 é um CPF, completado com
000à esquerda. Tipo 2 é um CNPJ. O CPF ou o CNPJ precisa ter os próprios dígitos verificadores válidos. - Um CNPJ alfanumérico é aceito com tipo 2, como
cnpj.isValidcom version 2 o lê: letras só nas 14 posições da inscrição, em maiúsculas ou minúsculas. O schema alfanumérico vem do pacote de produção restrita (RTC) de 27/07/2026. O serviço trata o CNPJ alfanumérico em produção desde 10/08/2026, enquanto o XSD de produção de 09/02/2026 ainda define a chave só com dígitos. - As letras de um CNPJ alfanumérico ficam nas 14 posições da inscrição federal (10 a 23 da chave), como o
TSIdNFSedo pacote de schemas de 27/07/2026 as define. - O número da NFS-e não pode ser todo zero. O mês deve estar entre 01 e 12.
- O dígito verificador é um módulo 11 sobre os 49 primeiros caracteres, pesos de 2 a 9 a partir da direita. Resto 0 ou 1 dá 0. Uma letra vale o seu código ASCII menos 48 (
Avale 17), por analogia com a NT Conjunta 2025.001. - Nenhum documento oficial fixa os pesos nem a regra do resto; os documentos só dizem "módulo 11". A regra foi confirmada com mais de cem chaves de NFS-e de repositórios públicos, dos dois ambientes, com restos 0, 1 e 10 entre elas.
- A chave de exemplo do item 9.1 do Guia do Emissor v1.2 não é válida: o dígito verificador não confere e o CNPJ é inválido.
- As chaves dos modelos municipais de NFS-e que não são o padrão nacional ficam fora do escopo, assim como a chave de 44 dígitos de DF-e (use
nfeKey.isValid).
| Parâmetro | Tipo | Obrigatório |
|---|---|---|
value | string | sim |
| retorna | boolean |
Verifica se a chave de acesso de uma NFS-e nacional, a Nota Fiscal de Serviço eletrônica do Sistema Nacional NFS-e, é válida.
- A chave é um bloco único de 50 caracteres,
Cód.Mun.(7) Amb.Ger.(1) Tipo de Inscrição Federal(1) Inscrição Federal(14) nNFSe(13) AAMM(4) Cód.Num.(9) DV(1), todos dígitos exceto um CNPJ alfanumérico na Inscrição Federal. - O literal
NFSque o atributoIddeinfNFSecoloca antes da chave é retirado, junto com os espaços nas extremidades. - O DANFSe imprime a chave em um único bloco, então ela não tem máscara impressa. As fronteiras entre os 8 campos aceitam os caracteres de máscara que o
isValidCpflê (espaço,.,-ou/, isolados ou em sequência), enquanto um separador dentro de um campo invalida o valor. - O código do município precisa começar com um código IBGE de UF; ele não é consultado na tabela do IBGE.
- O
ambGerprecisa ser1(o sistema do município) ou2(o Sistema Nacional NFS-e), e o tipo de inscrição1(um CPF, preenchido com000à esquerda) ou2(um CNPJ, numérico ou alfanumérico), com um CPF ou CNPJ cujos próprios dígitos verificadores sejam válidos. Letras só são aceitas em um CNPJ, e minúsculas são lidas como maiúsculas, como oisValidCnpjcom{ version: 2 }as lê. - O
nNFSenão pode ser todo de zeros e o mês precisa estar entre 01 e 12. - O dígito verificador é um módulo 11 sobre os 49 primeiros caracteres, pesos de 2 a 9 ciclando a partir da direita, em que resto 0 ou 1 dá 0. Uma letra vale o seu código ASCII menos 48 (
Avale 17). Nenhum documento oficial diz isso: as notas técnicas 001 a 009 da NFS-e, o Anexo I e as Perguntas e Respostas de 08/09/2026 são omissos, e a Nota Técnica Conjunta 2025.001, cuja regra do ASCII menos 48 vale para a chave dos DF-e, lista os documentos que abrange (NF-e, NFC-e, CT-e, CT-e OS, GTV-e, MDF-e, BP-e, BP-e TM, NF3e e NFCom) sem a NFS-e. A regra vem por analogia com essa NT e com os próprios dígitos verificadores do CNPJ. - As letras seguem o
TSIdNFSedo pacote de esquemas de 27/07/2026, nas posições da Inscrição Federal (10 a 23). O pacote de produção de 09/02/2026 ainda tipa a chave como[0-9]{50}. - Os modelos municipais de NFS-e que não são o padrão nacional estão fora do escopo.
import { isValidNfseKey } from '@brazilian-utils/brazilian-utils';
isValidNfseKey('35503082258716523000119000000000001226011357924683'); // true (emitente com CNPJ, SP)
isValidNfseKey('NFS35503082258716523000119000000000001226011357924683'); // true (prefixo Id do XML)
isValidNfseKey('43149021100040364478829000000000105725120484407255'); // true (emitente com CPF, RS)
isValidNfseKey('35503082212ABC34501DE35000000000001226091357924682'); // true (emitente com CNPJ alfanumérico)
isValidNfseKey('35503082258716523000119000000000001226011357924684'); // false (dígito verificador)
isValidNfseKey('3550308 2 2 58716523000119 0000000000012 2601 135792468 3'); // true (separadores entre os campos)Teste com JavaScript isValidNfseKey
Casos de teste compartilhados (29) e o resultado em cada biblioteca nfseKey.isValid
Interpretar
- JavaScript, biblioteca
- Python, biblioteca
- Go, biblioteca
- Ruby, biblioteca
- Rust, biblioteca
- .NET, biblioteca
- Erlang, biblioteca
Remove a formatação da chave de acesso de uma NFS-e nacional e mantém dígitos e letras maiúsculas, limitados a 50 caracteres.
- As letras antes do primeiro dígito são descartadas, incluindo o prefixo
NFSdo atributoIddo XML. As letras depois dele são mantidas em maiúsculas, porque um CNPJ alfanumérico as tem.nfseKey.isValidconfere onde elas estão. - Todo outro caractere é removido. Uma chave parcial é mantida até onde vai.
- Um número só é lido se for um inteiro seguro não negativo. Qualquer outro número retorna uma string vazia.
- O resultado é o bloco único que o DANFSe imprime, por isso não existe
nfseKey.format.
| Parâmetro | Tipo | Obrigatório |
|---|---|---|
value | string | number | sim |
| retorna | string |
Remove tudo o que não é dígito ou letra de um CNPJ alfanumérico da chave de acesso de uma NFS-e nacional e limita o resultado a 50 caracteres.
-
As letras ficam em maiúsculas, como faz o
parseCnpjcom{ version: 2 }, e as letras antes do primeiro dígito são descartadas, inclusive o prefixoNFSdo atributoIddo XML, já que a chave começa com dígitos. OisValidNfseKeyverifica se as letras que restam estão em um CNPJ. -
Essa é a forma em que o leiaute guarda a chave e a que o DANFSe imprime, um bloco único, e por isso não existe
formatNfseKey.
import { parseNfseKey } from '@brazilian-utils/brazilian-utils';
parseNfseKey('NFS35503082258716523000119000000000001226011357924683');
// '35503082258716523000119000000000001226011357924683'
parseNfseKey('3550308 2 2 58716523000119 0000000000012 2601 135792468 3');
// '35503082258716523000119000000000001226011357924683'
parseNfseKey('nfs3550308 2 2 12.abc.345/01de-35 0000000000012 2609 135792468 2');
// '35503082212ABC34501DE35000000000001226091357924682'Teste com JavaScript parseNfseKey
Casos de teste compartilhados (16) e o resultado em cada biblioteca nfseKey.parse
Decodificar
- JavaScript, biblioteca
- Python, biblioteca
- Go, biblioteca
- Ruby, biblioteca
- Rust, biblioteca
- .NET, biblioteca
- Erlang, biblioteca
Decompõe a chave de acesso de uma NFS-e nacional em seus campos. Aceita a mesma entrada que nfseKey.isValid e retorna null exatamente quando essa função retorna false.
- Os separadores entre campos são aceitos como em
nfseKey.isValid. O prefixoNFSdeve encostar na chave. Só uma string é lida: qualquer outro tipo retornanull. - Campos:
municipalityCode(7 dígitos, uma string),stateCode(a sigla da UF lida dos 2 primeiros dígitos do código do município),generatorEnvironment(1 prefeitura, 2 Sistema Nacional NFS-e),taxIdType(cpfoucnpj),taxId,number(o número da NFS-e, um número de 1 a 9999999999999),year,month(1 a 12),code(o código numérico, uma string) echeckDigit(um número). - A inscrição é o CPF de 11 dígitos, sem o preenchimento
000da chave, ou o CNPJ de 14 caracteres, numérico ou alfanumérico, em maiúsculas. - O ano é 2000 mais os 2 dígitos da chave. O código numérico mantém os seus 9 dígitos, com os zeros à esquerda.
| Parâmetro | Tipo | Obrigatório |
|---|---|---|
value | string | sim |
| retorna | NfseKeyInfo | null |
Interpreta a chave de acesso de uma NFS-e nacional e retorna seus campos, como um NfseKeyInfo. Aceita as mesmas formas de entrada do isValidNfseKey.
- Retorna
municipalityCode,stateCode,generatorEnvironment,taxIdType,taxId,number,year,month,codeecheckDigit. - O
generatorEnvironmenté umNfseKeyGeneratorEnvironment:1o sistema do município,2o Sistema Nacional NFS-e. - O
taxIdTypeé umNfseKeyTaxIdType,'cpf'ou'cnpj', e otaxIdé o CPF de 11 dígitos, sem o000que o preenche na chave, ou o CNPJ de 14 caracteres, numérico ou alfanumérico, em maiúsculas. - Retorna
nullquando a chave não é válida.
import { getNfseKeyInfo } from '@brazilian-utils/brazilian-utils';
getNfseKeyInfo('35503082258716523000119000000000001226011357924683');
// { municipalityCode: '3550308', stateCode: 'SP', generatorEnvironment: 2, taxIdType: 'cnpj',
// taxId: '58716523000119', number: 12, year: 2026, month: 1, code: '135792468', checkDigit: 3 }
getNfseKeyInfo('43149021100040364478829000000000105725120484407255');
// { municipalityCode: '4314902', stateCode: 'RS', generatorEnvironment: 1, taxIdType: 'cpf',
// taxId: '40364478829', number: 1057, year: 2025, month: 12, code: '048440725', checkDigit: 5 }
getNfseKeyInfo('35503082212ABC34501DE35000000000001226091357924682');
// { municipalityCode: '3550308', stateCode: 'SP', generatorEnvironment: 2, taxIdType: 'cnpj',
// taxId: '12ABC34501DE35', number: 12, year: 2026, month: 9, code: '135792468', checkDigit: 2 }
getNfseKeyInfo('invalid'); // nullFonte: a documentação técnica do Sistema Nacional NFS-e, cujos tipos de esquema TSIdNFSe e TSChaveNFSe e o campo NFSe/infNFSe/id do ANEXO I definem o leiaute e as regras E1280 e E1284, o manual da emissão por decisão administrativa ou judicial, que nomeia o dígito verificador de módulo 11, a Nota Técnica SE/CGNFS-e 008 (item 2.1.1), que imprime a chave em bloco único, os esquemas atualizados para o CNPJ alfanumérico (o pacote de produção restrita v1.01-20260727; o serviço trata o CNPJ alfanumérico em produção desde 10/08/2026, enquanto o pacote de produção de 09/02/2026 ainda só tem dígitos) e a Nota Técnica Conjunta 2025.001, cuja regra de ASCII menos 48 da chave da NF-e o dígito verificador empresta.
Teste com JavaScript getNfseKeyInfo
Casos de teste compartilhados (28) e o resultado em cada biblioteca nfseKey.getInfo
Fontes oficiais
- gov.br/nfse/pt-br/…/documentacao-tecnica
- gov.br/nfse/pt-br/…/documentacao-atual
- gov.br/nfse/pt-br/…/manual-contribuintes-emissor-publico-api-emissao-decisao-administrativa-e-judicial.pdf
- gov.br/nfse/pt-br/…/nt-008-se-cgnfse-danfse-20260714-v1-02.pdf
- gov.br/nfse/pt-br/…/esquemas-nfse-rtc-v1-01-20260727.zip
- nfe.fazenda.gov.br/portal/exibirArquivo.aspx
Veja também Chave de acesso NF-e, Municípios
Atualizado em
