Ir al contenido

DNI, NIE, NIF y CIF

Los identificadores fiscales españoles tienen varios nombres, y se solapan. En resumen: todo número que valida esta librería es un NIF, y el DNI, el NIE, el NIF K/L/M y el CIF son clases de NIF.

El NIF (número de identificación fiscal) identifica a cada persona y a cada entidad ante la Administración tributaria española. El Real Decreto 1065/2007 (arts. 19 a 22) define quién recibe cada clase. El primer carácter del número distingue las clases, que nunca se solapan (NIF-1):

Clase A quién se asigna Formato Ejemplo type en validate()
DNI Ciudadanos españoles 8 dígitos y una letra de control 12345678Z "DNI"
NIF K/L/M Personas sin DNI ni NIE (ver más abajo) K, L o M, 7 dígitos y una letra de control K1234567L "NIF_KLM"
NIE Personas extranjeras X, Y o Z, 7 dígitos y una letra de control X1234567L "NIE"
CIF Empresas y otras entidades Una clave de entidad, 7 dígitos y un carácter de control (un dígito o una letra) B12345674 "CIF"
import { getNifType } from "nif-dni-nie-cif-validation";
getNifType("12345678Z"); // "DNI"
getNifType("K1234567L"); // "NIF_KLM"
getNifType("X1234567L"); // "NIE"
getNifType("B12345674"); // "CIF"
getNifType("T1234567A"); // null: ninguna clase de NIF empieza por T

getNifType() solo mira el formato: getNifType("12345678A") es "DNI" aunque su letra sea incorrecta. Para saber si un número es válido, usa validate() o una función isValid….

Para un ciudadano español, el NIF es el número de su DNI (documento nacional de identidad): 8 dígitos, con los ceros a la izquierda incluidos, y una letra de control en mayúscula calculada a partir del número (DNI-1, DNI-2). Mucha gente lo escribe sin los ceros iniciales, o con puntos y un guion; la librería acepta ambas cosas y devuelve la forma canónica para que la guardes:

import { validate } from "nif-dni-nie-cif-validation";
validate("1234567L").normalized; // "01234567L": se vuelve a añadir el cero inicial
validate("12.345.678-z").normalized; // "12345678Z"

Las personas extranjeras reciben un NIE (número de identidad de extranjero): X, Y o Z, 7 dígitos y una letra de control (NIE-1). Primero se usó la serie X; cuando se agotó, siguió la Y, y después la Z.

Hasta 2008, los NIE tenían 10 caracteres: una X, 8 dígitos y una letra. Esos números siguen siendo válidos, y su forma canónica elimina el cero que sigue a la X (NIE-3):

import { isValidNie, validate } from "nif-dni-nie-cif-validation";
isValidNie("X01234567L"); // true: la forma antigua de 10 caracteres
validate("X01234567L").normalized; // "X1234567L"
isValidNie("X11234567L"); // false: solo se puede suprimir un 0 inicial

Algunas personas físicas necesitan un NIF pero no tienen DNI ni NIE. Reciben un NIF que empieza por una letra (KLM-1):

  • K: españoles menores de 14 años residentes en España que no tienen DNI.
  • L: españoles residentes en el extranjero que no tienen DNI.
  • M: personas extranjeras que no tienen NIE (por ejemplo, mientras se tramita; un NIF M puede ser temporal).

Son personas, no empresas. isValidDni() e isValidNaturalPersonNif() los aceptan, y validate() los identifica como "NIF_KLM":

import { isValidCif, isValidDni, validate } from "nif-dni-nie-cif-validation";
isValidDni("K1234567L"); // true
isValidCif("K1234567L"); // false: K no es una clave de entidad
validate("M1234567L").type; // "NIF_KLM"

Las empresas, asociaciones, organismos públicos y demás entidades tienen un NIF que empieza por una clave de entidad, una letra que indica qué tipo de entidad es, seguida de 7 dígitos y un carácter de control (CIF-1, CIF-2).

Hasta 2008, este número se llamaba CIF (código de identificación fiscal). La Orden EHA/451/2008 le cambió el nombre: oficialmente ahora es el «NIF de persona jurídica o entidad». Todo el mundo sigue buscando «CIF», así que la librería mantiene el nombre (isValidCif, type: "CIF"), con isValidLegalEntityNif como alias.

import { describeCifOrganisation, validate } from "nif-dni-nie-cif-validation";
validate("B12345674").meta; // { orgKey: "B", orgDescription: "Limited liability company" }
describeCifOrganisation("G"); // "Association"

Estas son las 17 claves de entidad, con el nombre que la librería da a cada una en el idioma de esta página y la clase de carácter de control que lleva cada clave (CIF-3):

Las claves de entidad del CIF, el tipo de entidad que representa cada una y la clase de carácter de control que lleva
ClaveTipo de entidadCarácter de control
ASociedad anónimaun dígito
BSociedad de responsabilidad limitadaun dígito
CSociedad colectivaun dígito
DSociedad comanditariaun dígito
EComunidad de bienes, herencia yacente u otra entidad carente de personalidad jurídica no incluida expresamente en otras clavesun dígito
FSociedad cooperativaun dígito
GAsociaciónun dígito
HComunidad de propietarios en régimen de propiedad horizontalun dígito
JSociedad civilun dígito
NEntidad extranjerauna letra
PCorporación localuna letra
QOrganismo públicouna letra
RCongregación o institución religiosauna letra
SÓrgano de la Administración del Estado o de una comunidad autónomauna letra
UUnión temporal de empresasun dígito
VOtro tipo no definido en el resto de clavesun dígito
WEstablecimiento permanente de una entidad no residente en territorio españoluna letra

Desde 2008, los 7 dígitos son aleatorios: ya no dicen nada de la provincia, así que la librería no comprueba códigos de provincia (CIF-5).

Un NIF-IVA español, que se usa en las operaciones intracomunitarias, es ES seguido del NIF (VAT-1). isValidSpanishVat() comprueba ese formato; validate() solo acepta el prefijo si lo pides:

import { isValidSpanishVat, validate } from "nif-dni-nie-cif-validation";
isValidSpanishVat("ES12345678Z"); // true
validate("ES12345678Z").error?.code; // "INVALID_FORMAT"
validate("ES12345678Z", { allowVatPrefix: true }).normalized; // "12345678Z"

Algunas reglas que encontrarás en internet no tienen fuente oficial, y la librería no las aplica. Un número que empieza por T no es un NIF, un CIF que empieza por 00 no necesita una letra y los dígitos del CIF no llevan código de provincia. Las preguntas frecuentes explican cada caso, y las fuentes oficiales los enumeran.