NIF
Número de Identificación Fiscal (NIF)¶
Overview¶
The NIF is the umbrella identifier for natural persons in Spain. In practice it accepts three historical variants:
- Standard DNIs (eight digits plus the control letter).
- NIEs for foreign residents (prefix
X/Y/Zplus seven digits and the control letter). - KLM cards with prefixes
K,L, orM.
Algorithm Walkthrough¶
- Canonicalise by uppercasing the input; values must already include only significant characters.
- Reject empties – a missing identifier is invalid.
- Attempt NIE validation if the prefix is
X,Y, orZ. The NIE logic translates the prefix and reuses the DNI control-letter rules. - Attempt DNI validation for pure eight-digit numbers.
- Fallback to klm prefixes
K,L, orM: treat the following seven digits as the numeric part, reuse the DNI control-letter mapping on that number, and verify the trailing letter. - Fail if none of the previous branches succeed.
Worked Examples¶
12345678Z: standard DNI branch, remainder14→ letterZ.X1234567L: NIE branch; control letter from numeric value01234567.K0867756N: klm branch; digits0867756, remainder13→N.
Formal Specification¶
- Input must be 9 ASCII characters after removing separators.
- Valid prefixes: digits
0-9, klmKLM, or NIEXYZ. - Let
letters = "TRWAGMYFPDXBNJZSQVHLCKE". - For NIE prefixes, set
n = int(prefix_map[prefix] + digits), whereprefix_map = {"X": "0", "Y": "1", "Z": "2"}. - For klm prefixes, set
n = int(digits)wheredigitsare positions 2–8. - For DNI-like values, set
n = int(first eight digits). - Valid iff
letters[n % 23] == final_letter.
Using the Library¶
from spanish_nif import NIF, InvalidNIF
nif = NIF("K0867756N")
assert nif.variant == "klm"
assert nif.letter == "N"
if not NIF.is_valid("12345678A"):
print("Control letter mismatch")
Generating Sample NIFs¶
NIF.random() builds valid identifiers for tests and demos and lets you pin the variant you need:
from spanish_nif import NIF
some_nif = NIF.random() # variant picked automatically
klm_nif = NIF.random(variant="klm")
assert klm_nif[0] in {"K", "L", "M"}
Supply a random.Random instance if you need deterministic output (for example, inside test suites).
Official References¶
- Real Decreto 1065/2007, de 27 de julio, por el que se aprueba el Reglamento General de las actuaciones y los procedimientos de gestión e inspección tributaria — el artículo 18 concreta la composición del número de identificación fiscal para personas físicas.
- Orden EHA/451/2008, de 20 de febrero, por la que se regula el número de identificación fiscal — establece los códigos y caracteres de control para personas jurídicas y otros sujetos.
- Agencia Tributaria: Número de identificación fiscal (NIF) — resumen oficial sobre la asignación y estructura del NIF según el tipo de contribuyente.