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.
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-validationDatos do 3 de outubro de 2026
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.
Os números xerados son ficticios e só serven para probas: algún podería coincidir por casualidade co dunha persoa ou empresa real.
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.
import { isValidNif } from "nif-dni-nie-cif-validation";
isValidNif("12345678Z"); // trueisValidNif(" 12.345.678-z "); // true: elimínanse os espazos, os puntos e os guións, e as minúsculas pasan a maiúsculasisValidNif("B12345675"); // false: o díxito de control non é correctoisValidNif(null); // false: nunca lanza excepciónsimport { 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 valorimport { 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 CIFimport * 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 CIFimport { 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 CIFimport { createGenerator, generateCif, generateDni, generateNie } from "nif-dni-nie-cif-validation/generate";
generateDni({ seed: 1 }); // "62707394X": o mesmo en cada execución e plataformagenerateNie({ 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óngen.nif(); // "Y8524657C"gen.nif(); // "X5265925Y"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# 44829056Dnpx 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).
| Biblioteca | DNI, M ops/s | Tamaño, calquera tipo |
|---|---|---|
| nif-dni-nie-cif-validation esta compilación | 929 B | |
| @maistik/validate-nif 2.0.1 | 456 B | |
| dni-js 1.0.0 | 882 B | |
| nif-dni-nie-cif-validation 1.0.11 | 1.517 B | |
| better-dni 4.4.2 | 1.134 B | |
| spain-id 1.1.14 | 583 B | |
| validator.js isIdentityCard(x, "ES") 13.15.35 | 2.539 B | |
| validator.js isTaxID(x, "es-ES") 13.15.35 | 6.537 B | |
| @kreyo/nif-validator 0.1.0 | 533 B | |
| jsvat (Spain) 2.5.4 | 1.186 B | |
| stdnum 1.12.6 | 51.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.