Chave de acesso NF-e

A chave de acesso de 44 caracteres da NF-e, NFC-e, CT-e, MDF-e e demais documentos fiscais eletrônicos.

  • Matriz de paridade

Validar

Valida uma chave de acesso de DF-e com 44 caracteres: NF-e (55), NFC-e (65), CT-e (57), MDF-e (58), CT-e OS (67), GTV-e (64), BP-e (63), NF3e (66) e NFCom (62). O CF-e-SAT (59) não é aceito.

  • O cUF deve ser uma UF e o mês (AAMM) deve ser de 01 a 12. O modelo deve ser um dos acima. O tipo de emissão (tpEmis) deve ser um dos que o MOC desse modelo atribui: 1 a 7 e 9 para NF-e e NFC-e; 1, 3, 4, 5, 7 e 8 para CT-e; 1, 5, 7 e 8 para CT-e OS; 1, 2, 7 e 8 para GTV-e; 1, 2 e 3 para MDF-e; 1 e 2 para BP-e, NF3e e NFCom.
  • A chave é cUF(2) AAMM(4) CNPJ/CPF(14) mod(2) serie(3) nNF(9) tpEmis(1) cNF(8) cDV(1). A NFCom e a NF3e usam a posição 36 para o nSiteAutoriz e deixam 7 dígitos para o cNF.
  • Na NF-e e na NFC-e, o código numérico (cNF) deve passar na regra B03-10 do MOC (sem valores repetidos ou sequenciais da lista de 20 que a regra traz, e diferente do número do documento). A regra vale para os documentos enviados depois da NT 2019.001, e os programas de NF-e costumavam usar um cNF igual ao número do documento antes dela, então uma chave autorizada antes pode ser rejeitada.
  • A função rejeita um número de documento com todos os dígitos zero. O dígito verificador é um módulo 11 sobre os primeiros 43 caracteres, com pesos de 2 a 9 repetidos da direita para a esquerda; um resto 0 ou 1 dá dígito verificador 0.
  • Os 44 caracteres podem vir agrupados de 4 em 4 por espaço em branco, ., - ou /, sozinhos ou em sequência ("3517 - 0458 ..."). Um separador dentro de um grupo de 4, ou qualquer outro caractere, torna a chave inválida. A função primeiro remove os prefixos Id do XML (NFe, CTe, MDFe, BPe, NF3e, NFCom, em qualquer caixa), com os espaços entre o prefixo e o primeiro grupo.
  • As posições 7 a 18 (raiz e ordem do CNPJ do emitente) podem ter as letras de um CNPJ alfanumérico. Os schemas atuais tipam a chave como [0-9]{6}[0-9A-Z]{12}[0-9]{26} (NT Conjunta 2025.001, pacote PL_010 da NF-e), onde os antigos tinham 44 dígitos. Uma letra em qualquer outra posição, inclusive nos dígitos verificadores do CNPJ nas posições 19 e 20, é rejeitada. Minúsculas são lidas como maiúsculas, mas uma letra não ASCII que vira uma letra ASCII em maiúsculas (ſ, ß) é rejeitada. Um emitente CPF tem sempre 11 dígitos completados com zeros à esquerda, então uma letra ali sempre pertence a um CNPJ alfanumérico. A 2.4.0 só aceitava dígitos.
  • No dígito verificador, cada caractere vale o seu código ASCII menos 48: o próprio dígito para 0 a 9, e 17 a 42 para A a Z, como no CNPJ alfanumérico.
  • A GTV-e (64) aceita tpEmis 1, 2, 7 e 8 (MOC do CT-e, campo D15). O pacote atual PL_CTe_400_RTC só lista 1 e 2, mas 7 (SVC-RS) e 8 (SVC-SP) são mantidos para que chaves autorizadas sob o PL_CTe_400 continuem válidas, já que a chave não carrega versão de schema. É o comportamento da 2.4.0.
  • Um valor que não é string retorna false. Os dígitos verificadores do CPF ou CNPJ do emitente não são conferidos, só o dígito verificador da chave (leia a chave com nfeKey.getInfo e confira o taxId com cnpj.isValid, ou os 11 últimos dígitos de um taxId completado com zeros com cpf.isValid).
ParâmetroTipoObrigatório
valuestringsim
retornaboolean

Valida uma chave de acesso de DF-e. Cobre todo DF-e com chave de acesso de 44 caracteres; o CF-e-SAT (59) fica de fora.

  • Modelos: NF-e (55), NFC-e (65), CT-e (57), MDF-e (58), CT-e OS (67), GTV-e (64), BP-e (63), NF3e (66) e NFCom (62).
  • Todo caractere é dígito, exceto as posições 7 a 18, a raiz e a ordem do CNPJ do emitente, que podem trazer as letras de um CNPJ alfanumérico: os schemas atuais (NF-e PL_010 TChNFe, CT-e PL_CTe_400_RTC, MDF-e 3.00b, NFCom) tipam a chave como [0-9]{6}[0-9A-Z]{12}[0-9]{26}, em produção na NF-e a partir de 01/07/2026 (NT 2026.004). Uma letra em qualquer outra posição, incluídos os dígitos verificadores do CNPJ nas posições 19 e 20, é rejeitada. O schema só admite maiúsculas; minúsculas são lidas como maiúsculas, como isValidCnpj faz com { version: 2 }. Uma letra não ASCII que vira letra ASCII em maiúsculas (ſ, ß) é rejeitada.
  • Os 44 caracteres podem ser agrupados de 4 em 4 por espaço, ., - ou /. Os prefixos Id do XML (NFe, CTe, MDFe, BPe, NF3e, NFCom) são removidos antes.
  • tpEmis precisa ser um dos que o MOC do modelo atribui (tabela abaixo).
  • Para NF-e e NFC-e o cNF precisa passar na regra B03-10 do MOC (sem valores repetidos ou sequenciais, diferente do número do documento). A regra vale para os documentos enviados depois da NT 2019.001, e os softwares de NF-e costumavam usar um cNF igual ao número do documento antes dela, então uma chave autorizada antes pode ser rejeitada.
  • Os dígitos verificadores do CPF ou CNPJ do emitente não são conferidos, só o dígito verificador da própria chave. Leia a chave com getNfeKeyInfo e passe o taxId dela ao isValidCnpj, ou os 11 últimos dígitos de um taxId preenchido com zeros ao isValidCpf, para conferir também o emitente.
  • Um número de documento todo zerado é rejeitado. O dígito verificador é um módulo 11 sobre os 43 primeiros caracteres, cada um valendo seu código ASCII menos 48 (A = 17 ... Z = 42), como a NT Conjunta 2025.001 define.
ModelotpEmis aceitos
NF-e (55), NFC-e (65)1 a 7 e 9
CT-e (57)1, 3, 4, 5, 7, 8
CT-e OS (67)1, 5, 7, 8
GTV-e (64)1, 2, 7, 8 (veja abaixo)
MDF-e (58)1, 2, 3
BP-e (63), NF3e (66), NFCom (62)1, 2

Para a GTV-e, o pacote de schemas atual do CT-e (PL_CTe_400_RTC) enumera apenas os tpEmis 1 (normal) e 2 (contingência off-line); o PL_CTe_400 anterior também tinha 7 e 8 (autorização pela SVC-RS e pela SVC-SP). A chave não traz a versão do schema, então a biblioteca aceita os quatro, e as chaves de GTV-e autorizadas sob o pacote anterior continuam válidas.

import { isValidNfeKey } from '@brazilian-utils/brazilian-utils';

isValidNfeKey('35170458716523000119550010000000121000123458'); // true (NF-e, SP)
isValidNfeKey('NFe35170458716523000119550010000000121000123458'); // true (prefixo Id do XML)
isValidNfeKey('CTe35170458716523000119570010000000128000123452'); // true (CT-e autorizado pela SVC-SP)
isValidNfeKey('3517 0458 7165 2300 0119 5500 1000 0000 1210 0012 3458'); // true (com máscara)
isValidNfeKey('3517.0458.7165.2300.0119.5500.1000.0000.1210.0012.3458'); // true (qualquer um dos caracteres de máscara)
isValidNfeKey('35260712ABC34501DE35550010000001231102030403'); // true (CNPJ alfanumérico 12ABC34501DE35)
isValidNfeKey('35260712ABC34501DEA5550010000001231102030408'); // false (letra na posição 19, dígito verificador do CNPJ)
isValidNfeKey('351 70458716523000119550010000000121000123458'); // false (separador dentro de um grupo de 4)
isValidNfeKey('99170458716523000119550010000000121000123458'); // false (cUF inválido)
isValidNfeKey('35170458716523000119010010000000121000123450'); // false (modelo inválido)
isValidNfeKey('35170458716523000119550010000000128000123455'); // false (o MOC da NF-e não atribui tpEmis 8)
isValidNfeKey('35170458716523000119550010000000121000000003'); // false (cNF 00000000, regra B03-10)

Fonte: MOC da NF-e, schemas da NF-e, NT Conjunta 2025.001 (CNPJ alfanumérico) e os MOCs citados em src/is-valid-nfe-key/is-valid-nfe-key.ts.

Código: brazilian-utils/javascript
Teste com JavaScript isValidNfeKey
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (60) e o resultado em cada biblioteca nfeKey.isValid

Formatar

Formata uma chave de acesso de DF-e em grupos de 4 caracteres separados por espaços, como o DANFE e os outros documentos auxiliares a imprimem. Não valida a chave (use nfeKey.isValid).

Todo documento auxiliar imprime a chave nessa forma: o DANFE da NF-e e da NFC-e, o DACTE do CT-e, do CT-e OS e da GTV-e, o DAMDFE do MDF-e, o DABPE do BP-e, o DANF3E da NF3e e o DANFE-COM da NFCom.

  • A função agrupa uma chave com máscara ou parcial até onde vão os seus caracteres. options.pad primeiro completa a chave com zeros à esquerda até 44 caracteres ("12345" dá "0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 2345").
  • Os prefixos Id do XML (NFe, CTe, MDFe, BPe, NF3e, NFCom) são removidos primeiro, com os espaços nas pontas, do jeito que nfeKey.parse os lê. Até a 2.4.0 o prefixo não era removido, então o dígito de NF3e entrava na chave.
  • As letras de um CNPJ alfanumérico são mantidas em maiúsculas nas posições 7 a 18. Uma letra em qualquer outra posição é descartada, e as posições são contadas sobre os caracteres mantidos. A 2.4.0 descartava toda letra.
  • Um valor que não é string nem inteiro seguro não negativo (um objeto, true, -1, 1.5, um bigint) retorna uma string vazia em vez de lançar erro. Um número é lido como a string dos seus dígitos. Os caracteres depois do 44º são descartados.
  • Retorna uma string vazia quando não há nada para formatar. Até a 2.4.0, um valor sem dígitos com pad: true retornava a máscara toda de zeros.
ParâmetroTipoObrigatório
valuestringsim
optionsFormatNfeKeyOptionsnão
options.padbooleannão
retornastring

Formata uma chave de acesso de DF-e (Documento Fiscal eletrônico) em grupos de 4 caracteres separados por espaço. É a forma em que o DANFE, o DACTE, o DAMDFE, o DABPE, o DANF3E e o DANFE-COM a imprimem.

  • Opções (FormatNfeKeyOptions): pad preenche o valor com zeros à esquerda até os 44 caracteres de uma chave de acesso completa (padrão false). Um valor vazio, ou sem dígitos, devolve '' mesmo com pad.
  • Uma chave com máscara ou parcial é agrupada até onde os caracteres vão.
  • As letras de um CNPJ alfanumérico são mantidas, em maiúsculas, nas posições 7 a 18; uma letra em qualquer outra posição é descartada.
  • Os prefixos NFe, CTe, MDFe, BPe, NF3e e NFCom do atributo Id do XML são removidos antes, como o parseNfeKey os lê.
  • Um valor que não seja string nem inteiro seguro não negativo (-1, 1.5, um bigint, um objeto) resulta em ''.
  • Use isValidNfeKey para verificar uma chave.
import { formatNfeKey } from '@brazilian-utils/brazilian-utils';

formatNfeKey('35170458716523000119550010000000121000123458');
// '3517 0458 7165 2300 0119 5500 1000 0000 1210 0012 3458'

formatNfeKey('35260712abc34501de35550010000001231102030403');
// '3526 0712 ABC3 4501 DE35 5500 1000 0001 2311 0203 0403' (CNPJ alfanumérico)

formatNfeKey('NF3e35170458716523000119550010000000121000123458');
// '3517 0458 7165 2300 0119 5500 1000 0000 1210 0012 3458' (prefixo do Id do XML)

formatNfeKey('12345'); // '1234 5'

formatNfeKey('12345', { pad: true });
// '0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 2345'
Código: brazilian-utils/javascript
Teste com JavaScript formatNfeKey
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (31) e o resultado em cada biblioteca nfeKey.format

Interpretar

Remove a formatação de uma chave de acesso de DF-e e mantém só os caracteres da chave, limitados a 44: dígitos, mais as letras de um CNPJ alfanumérico em maiúsculas nas posições 7 a 18.

  • A função primeiro remove os prefixos Id do XML (NFe, CTe, MDFe, BPe, NF3e, NFCom), com os espaços nas pontas. O prefixo sai primeiro porque NF3e traz um dígito próprio que não faz parte da chave.
  • Uma letra em qualquer outra posição é descartada, como qualquer outro caractere fora da chave. A 2.4.0 descartava toda letra.
  • Um valor mais curto passa até onde vai, então o agrupamento de uma chave ainda em digitação também é removido. Não confere a chave (use nfeKey.isValid).
  • Um número só é lido se for um inteiro seguro não negativo. Número negativo, fracionário, não finito ou inseguro retorna uma string vazia (a 2.4.0 lia os dígitos de qualquer número, descartando sinal e ponto decimal).
ParâmetroTipoObrigatório
valuestring | numbersim
retornastring

Remove a formatação de uma chave de acesso de DF-e (chave de acesso), mantém apenas os seus caracteres e limita o resultado a 44 caracteres.

  • Os caracteres mantidos são os dígitos e, nas posições 7 a 18, as letras de um CNPJ alfanumérico, em maiúsculas; uma letra em qualquer outra posição é descartada.

  • Os prefixos Id do XML (NFe, CTe, MDFe, BPe, NF3e, NFCom) são removidos antes.

import { parseNfeKey } from '@brazilian-utils/brazilian-utils';

parseNfeKey('3517 0458 7165 2300 0119 5500 1000 0000 1210 0012 3458');
// '35170458716523000119550010000000121000123458'

parseNfeKey('NFe35170458716523000119550010000000121000123458');
// '35170458716523000119550010000000121000123458'

parseNfeKey('3526 0712 abc3 4501 de35 5500 1000 0001 2311 0203 0403');
// '35260712ABC34501DE35550010000001231102030403' (CNPJ alfanumérico)
Código: brazilian-utils/javascript
Teste com JavaScript parseNfeKey
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (20) e o resultado em cada biblioteca nfeKey.parse

Decodificar

Decompõe uma chave de acesso de DF-e em seus campos. Aceita a mesma entrada que nfeKey.isValid e retorna null quando a chave não é válida.

  • Campos: stateCode (a sigla da UF, lida do cUF), year (4 dígitos), month (1 a 12), taxId (inscrição federal do emitente), model (o modelo de 2 dígitos como string, como "55"), series (0 a 999) e number (1 a 999999999) como números, emissionType (o código tpEmis, um número), code (o código numérico como string, mantendo os zeros à esquerda) e checkDigit (um número). Um CNPJ alfanumérico mantém as letras em maiúsculas.
  • Na NFCom e na NF3e (modelos 62 e 66), code tem 7 dígitos e o resultado também traz authorizationSite (nSiteAutoriz, um número de 0 a 9). Os outros modelos não têm authorizationSite.
  • taxId são os 14 caracteres das posições 7 a 20 como estão escritos: um CNPJ numérico, um CNPJ alfanumérico (em maiúsculas) ou um CPF completado com zeros à esquerda. Um taxId com letra é sempre um CNPJ alfanumérico. Um CPF completado e um CNPJ que começa com 000 se parecem, então confira com cpf.isValid (sobre os 11 últimos dígitos) ou cnpj.isValid quando o tipo importar.
  • Retorna null exatamente quando nfeKey.isValid retorna false.
ParâmetroTipoObrigatório
valuestringsim
retornaNfeKeyInfo | null

Interpreta uma chave de acesso de DF-e e retorna seus campos. Aceita as mesmas formas de entrada de isValidNfeKey e retorna null quando a chave não é válida.

  • Retorna um NfeKeyInfo: stateCode, year, month, taxId, model (NfeKeyModel), series, number, emissionType, code e checkDigit.
  • Para NFCom e NF3e (modelos '62' e '66') o resultado também traz authorizationSite e o code tem 7 dígitos em vez de 8.
  • taxId são os 14 caracteres das posições 7 a 20 como escritos: um CNPJ numérico, um CNPJ alfanumérico (em maiúsculas) ou um CPF completado com zeros à esquerda. Um taxId com letra é sempre um CNPJ alfanumérico; um CPF completado e um CNPJ que começa com 000 se parecem, então verifique com isValidCpf ou isValidCnpj quando o tipo importar.
import { getNfeKeyInfo } from '@brazilian-utils/brazilian-utils';

getNfeKeyInfo('35170458716523000119550010000000121000123458');
// { stateCode: 'SP', year: 2017, month: 4, taxId: '58716523000119', model: '55',
//   series: 1, number: 12, emissionType: 1, code: '00012345', checkDigit: 8 }

getNfeKeyInfo('35170458716523000119620010000000121000123450');
// { stateCode: 'SP', year: 2017, month: 4, taxId: '58716523000119', model: '62',
//   series: 1, number: 12, emissionType: 1, code: '0012345', checkDigit: 0, authorizationSite: 0 }

getNfeKeyInfo('35260712ABC34501DE35550010000001231102030403');
// { stateCode: 'SP', year: 2026, month: 7, taxId: '12ABC34501DE35', model: '55',
//   series: 1, number: 123, emissionType: 1, code: '10203040', checkDigit: 3 }

getNfeKeyInfo('invalid'); // null
Código: brazilian-utils/javascript
Teste com JavaScript getNfeKeyInfo
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (22) e o resultado em cada biblioteca nfeKey.getInfo

Fontes oficiais

Veja também CNPJ

Atualizado em

Nesta página