Ir ao contido
nif-dni-nie-cif-validation: validación de NIF, DNI, NIE e CIF españoisnif-dni-nie-cif-validation: validación de NIF, DNI, NIE e CIF españois

Valide NIF, DNI, NIE e CIF españois

Correcta, rápida, pequena e tipada. Cada regra indica a súa fonte en SPEC.md, e cada erro explica por que.

Instalación con npm
npm i nif-dni-nie-cif-validation yarn add nif-dni-nie-cif-validation pnpm add nif-dni-nie-cif-validation bun add nif-dni-nie-cif-validation

Próbea

Escriba ou pegue un NIF, DNI, NIE ou CIF. A propia biblioteca compróbao mentres escribe e indícalle por que non é válido.

Pode usar espazos, puntos, guións e minúsculas, como en 12.345.678-z.

O resultado aparece aquí mentres escribe.

O validador en directo necesita JavaScript. O resto da páxina funciona sen el.

Execútase por completo no seu navegador: ningún dato sae do navegador.

Por que esta biblioteca

  • Correcta, con fontes

    24 regras, cada unha cun identificador (DNI-2, NIE-3, CIF-3…) e a súa fonte en SPEC.md: o BOE, a AEAT, unha convención identificada como tal ou o contrato da biblioteca. Cada erro indica a regra que non se cumpriu.

  • Rápida

    Polo menos 6,3 veces o rendemento de calquera outra biblioteca probada

    60,1 M ops/s con DNI (millóns de validacións por segundo; canto maior sexa a cifra, maior será o rendemento), cun rendemento de entre 7,0 e 8,9 veces o da v1.

  • Pequena

    929 B min+gzip para isValidNif e 4,7 kB para toda a biblioteca. Admite tree shaking, e cada idioma impórtase por separado.

    Algunhas bibliotecas dun só propósito ocupan menos para un validador (@maistik/validate-nif 456 B, @kreyo/nif-validator 533 B, spain-id 583 B e dni-js 882 B). Algunhas validan menos tipos: esta dedica bytes a normalizar a entrada, aos tipos de control de CIF-3 e aos NIF K/L/M.

  • 0 dependencias

    Sen dependencias en tempo de execución. Zod, Valibot e Yup son dependencias peer opcionais, que só necesitan os seus adaptadores.

  • Tipada

    Escrita en TypeScript, con declaracións para import e require. Módulos ES e CommonJS, compilados a ES2016.

  • Nunca lanza excepcións

    Os validadores aceptan unknown: null, números e obxectos dan false, ou NOT_A_STRING con validate(). O que escriba a persoa usuaria nunca a fai fallar.

  • 5 idiomas

    Mensaxes de erro e nomes dos tipos de entidade en inglés, castelán, catalán, éuscaro e galego. O validador de arriba fala o idioma desta páxina.

  • Xeradores e esquemas

    Xeradores de datos de proba con semente, e esquemas de Zod, Valibot e Yup que devolven o valor normalizado e a mensaxe no seu idioma.

Medido nun AMD EPYC 9V74 80-Core Processor con Node.js v24.21.0 o 2 de outubro de 2026, cada biblioteca coas súas opcións predeterminadas. As proporcións entre bibliotecas mantéñense mellor dunha máquina a outra ca as cifras absolutas.

Úsea

Comprobacións booleanas para un si ou un non, validate() cando precise saber por que, puntos de entrada opcionais para esquemas e datos de proba, e unha liña de comandos para terminais, scripts e axentes de IA.

Exemplos de código
import { isValidNif } from "nif-dni-nie-cif-validation";
isValidNif("12345678Z"); // true
isValidNif(" 12.345.678-z "); // true: elimínanse os espazos, os puntos e os guións, e as minúsculas pasan a maiúsculas
isValidNif("B12345675"); // false: o díxito de control non é correcto
isValidNif(null); // false: nunca lanza excepcións
import { validate } from "nif-dni-nie-cif-validation";
import { gl } from "nif-dni-nie-cif-validation/locales/gl";
validate(" b-1234567-4 ", { locale: gl });
// { valid: true, type: "CIF", normalized: "B12345674",
// meta: { orgKey: "B", orgDescription: "Sociedade de responsabilidade limitada" } }
validate("12345678A", { locale: gl }).error;
// { code: "INVALID_CONTROL_CHARACTER", rule: "DNI-2", expected: "Z",
// message: "O carácter de control non é correcto: para este DNI debería ser «Z»." }
validate(" 12.345.678-z ").normalized; // "12345678Z": garde este valor
import { z } from "zod";
import { gl } from "nif-dni-nie-cif-validation/locales/gl";
import { zNif } from "nif-dni-nie-cif-validation/zod";
const schema = z.object({ nif: zNif({ types: ["DNI", "NIE"], locale: gl }) });
schema.parse({ nif: " 12.345.678-z " }); // { nif: "12345678Z" }
schema.safeParse({ nif: "B12345674" }).success; // false: aquí non se acepta ningún CIF
import * as v from "valibot";
import { gl } from "nif-dni-nie-cif-validation/locales/gl";
import { vNif } from "nif-dni-nie-cif-validation/valibot";
const schema = v.object({ nif: vNif({ types: ["DNI", "NIE"], locale: gl }) });
v.parse(schema, { nif: " 12.345.678-z " }); // { nif: "12345678Z" }
v.safeParse(schema, { nif: "B12345674" }).success; // false: aquí non se acepta ningún CIF
import { object } from "yup";
import { gl } from "nif-dni-nie-cif-validation/locales/gl";
import { yNif } from "nif-dni-nie-cif-validation/yup";
const schema = object({ nif: yNif({ types: ["DNI", "NIE"], locale: gl }) });
schema.validateSync({ nif: " 12.345.678-z " }); // { nif: "12345678Z" }
schema.isValidSync({ nif: "B12345674" }); // false: aquí non se acepta ningún CIF
import { createGenerator, generateCif, generateDni, generateNie } from "nif-dni-nie-cif-validation/generate";
generateDni({ seed: 1 }); // "62707394X": o mesmo en cada execución e plataforma
generateNie({ seed: 1, prefix: "Z" }); // "Z6270739R"
generateCif({ seed: 1, orgKey: "B" }); // "B62707393"
generateDni({ seed: 1, format: true }); // "62707394-X"
const gen = createGenerator(42); // unha secuencia con semente: valores distintos, os mesmos en cada execución
gen.nif(); // "Y8524657C"
gen.nif(); // "X5265925Y"
Terminal window
npx nif-dni-nie-cif-validation validate 12345678Z B12345674 12345678A --locale gl
# 12345678Z: valid DNI 12345678Z
# B12345674: valid CIF B12345674 (Sociedade de responsabilidade limitada)
# 12345678A: invalid [DNI-2 INVALID_CONTROL_CHARACTER] O carácter de control non é correcto: para este DNI debería ser «Z».
npx nif-dni-nie-cif-validation generate dni --count 2 --seed 42
# 60110375J
# 44829056D

npx descarga o paquete a primeira vez. A saída JSON para scripts e axentes, os códigos de saída, os datos de proba e a revisión de ficheiros CSV están na guía da liña de comandos.

Comparación

Rendemento co conxunto de DNI, en millóns de validacións por segundo (M ops/s; canto maior sexa a cifra, maior será o rendemento), e tamaño dun validador de calquera tipo (min+gzip; canto menor sexa a cifra, menor será o tamaño).

Rendemento e tamaño das bibliotecas de identificadores españois en npm
BibliotecaDNI, M ops/sTamaño, calquera tipo
nif-dni-nie-cif-validation esta compilación60,12929 B
@maistik/validate-nif 2.0.19,46456 B
dni-js 1.0.08,90882 B
nif-dni-nie-cif-validation 1.0.118,591.517 B
better-dni 4.4.28,441.134 B
spain-id 1.1.146,96583 B
validator.js isIdentityCard(x, "ES") 13.15.355,732.539 B
validator.js isTaxID(x, "es-ES") 13.15.354,226.537 B
@kreyo/nif-validator 0.1.02,78533 B
jsvat (Spain) 2.5.42,101.186 B
stdnum 1.12.60,4151.063 B

Todas as cifras saen de bench/results/latest.json. A velocidade non o é todo: a páxina de rendemento inclúe ligazóns aos resultados completos, que tamén comparan a concordancia con SPEC.md e as funcionalidades.

Rendemento e comparación completos →