Validador de CURP (México)
Valida CURP mexicanas en lote: estructura, fecha, código de estado y dígito verificador de RENAPO.
Las CURP se validan en tu navegador — no se envían a ningún ladoVerifica la estructura, la fecha, el estado y el dígito de RENAPO — en lote
Qué revisa este validador y qué no puede confirmar
Pega una CURP o una columna entera (una por línea) y ve, para cada fila, si la estructura de 18 caracteres es correcta, si la fecha existe, si el código de estado es uno de los que emite RENAPO, si la letra de sexo es H o M, si el marcador de generación cuadra con el siglo y —lo que a simple vista no se ve— si el dígito verificador final calcula bien a partir de los diecisiete anteriores. La herramienta marca cada línea con ✓ o ✗, indica el motivo concreto del rechazo y totaliza el lote: mete la lista completa o un solo valor.
Lo que a propósito no hace es confirmar que la CURP esté registrada en RENAPO. Esa comprobación requiere una consulta autenticada al servicio del gobierno, y cualquier página del navegador que diga hacerla o bien no la hace, o está enviando tus datos a un tercero. Una CURP bien formada con dígito correcto puede seguir sin corresponder a una persona registrada — el alcance honesto de esta herramienta es cazar erratas y entradas claramente inválidas antes de que un sistema oficial las rechace.
Vale la pena explicar el mecanismo, porque explica también los modos de fallo. Una CURP codifica letras del nombre (cuatro al principio y tres consonantes en las posiciones 14–16), una fecha de nacimiento AAMMDD, un marcador de sexo H o M, un código de estado de dos letras del catálogo de RENAPO, un 17.º carácter de generación (un dígito 0–9 para personas nacidas entre 1900 y 1999, una letra A–Z para las nacidas desde el 2000) y un dígito verificador calculado ponderando cada uno de los primeros 17 caracteres contra un alfabeto base-37, sumando, tomando el módulo 10 y restándolo a 10. El dígito verificador atrapa toda errata de un solo carácter y la mayoría de las transposiciones — justo la clase de errores que las CURP acumulan cuando se copian entre sistemas.
Dos sutilezas que conviene nombrar. Primera: RENAPO sustituye una X en la segunda letra cuando las cuatro primeras formarían una de una lista documentada de palabras vulgares en español (BUEI, CACA, MAME, PUTO y unas ochenta más). Esa sustitución es silenciosa y la CURP resultante es completamente válida; el cálculo del dígito funciona porque la X entró antes de que se computara. Segunda: el 17.º carácter es un marcador de generación, no un relleno cualquiera. Sirve para desambiguar el siglo detrás del año de dos dígitos. Una CURP con dígito en la posición 17 pertenece a alguien nacido en el siglo XX; una letra indica el siglo XXI. Esta herramienta deduce el siglo con ese carácter y muestra la fecha completa en la línea de resultado.
Todo corre en tu navegador: la entrada no sale de la pestaña y no hay subida, ni cola, ni tope diario. Es un trabajo de procesamiento de texto —una expresión regular, una tabla de consulta y una suma— y no necesita servidor. Eso importa cuando la entrada es un CSV de nómina o una lista de clientes, porque un validador que envía tus identificadores a un backend desconocido es un problema de cumplimiento en el que no te apuntaste.
Anatomía de una CURP, carácter por carácter
Toda CURP son exactamente 18 caracteres y cada posición significa algo. Una vez que sabes leer la estructura, la mayoría de las entradas inválidas saltan a la vista antes de correr la herramienta.
| Posición | Qué es | Regla |
|---|---|---|
| 1 | Primera letra del apellido paterno | Letra mayúscula (o Ñ) |
| 2 | Primera vocal interna del apellido paterno | A E I O U — o X tras el reemplazo por palabra vulgar |
| 3 | Primera letra del apellido materno | Letra mayúscula, o X si la persona no tiene apellido materno |
| 4 | Primera letra del nombre | Letra mayúscula |
| 5–10 | Fecha de nacimiento | AAMMDD, el año en dos dígitos |
| 11 | Sexo | H (hombre) o M (mujer) |
| 12–13 | Estado de nacimiento | Código de dos letras del catálogo de RENAPO; NE para nacidos en el extranjero |
| 14 | Primera consonante interna del apellido paterno | Consonante mayúscula |
| 15 | Primera consonante interna del apellido materno | Consonante mayúscula |
| 16 | Primera consonante interna del nombre | Consonante mayúscula |
| 17 | Marcador de generación | Dígito 0–9 para nacidos entre 1900 y 1999; letra A–Z para 2000 en adelante |
| 18 | Dígito verificador | Calculado a partir de los primeros 17 caracteres (algoritmo abajo) |
Cómo se calcula el dígito verificador
El 18.º carácter es el detector de erratas integrado de RENAPO. Cada uno de los primeros 17 caracteres se mapea a un valor en un alfabeto base-37, se multiplica por un peso, se suma y se reduce.
ALFABETO = "0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"
para cada i en 0..16:
valor = índice de curp[i] en ALFABETO
peso = 18 - (i + 1)
suma += valor * peso
resto = suma mod 10
digito_verif = (10 - resto) mod 10Ejemplo resuelto con GOFC560731HDFRRR09 (una CURP de entrenamiento citada por RENAPO): sumar los 17 valores ponderados da 1831, mod 10 = 1, y (10 − 1) mod 10 = 9 — que es el dígito verificador en la posición 18.
Validar CURP en Excel o Google Sheets
Para una primera revisión estructural de una columna, esta REGEX empareja toda CURP bien formada. NO valida el dígito verificador —para eso hace falta una función auxiliar—, pero atrapa la mayoría de las erratas en una sola fórmula.
Google Sheets (A2 = CURP):
=REGEXMATCH(MAYUSC(A2); "^[A-ZÑ]{4}\d{6}[HM][A-Z]{2}[A-ZÑ]{3}[0-9A-Z]\d$")
Excel 365 (A2 = CURP):
=IF(ISNUMBER(SEARCH("?"; A2)); NOT(ISERROR(FIND("^"; ""))); FALSE) // usa un helper de regex, p. ej. vía Office ScriptsPara una verificación completa que incluya el dígito, arma una función definida por el usuario en Google Apps Script u Office Scripts que implemente el algoritmo de arriba. O pega la columna en la caja de esta página y copia los resultados de vuelta.
Validar CURP en SQL
Una primera revisión estructural como una sola cláusula WHERE. Usa el operador de regex propio de tu motor — el patrón es el mismo.
-- PostgreSQL / Snowflake (regex insensible a mayúsculas)
SELECT curp
FROM clientes
WHERE curp !~* '^[A-ZÑ]{4}[0-9]{6}[HM][A-Z]{2}[A-ZÑ]{3}[0-9A-Z][0-9]$';
-- MySQL / MariaDB
SELECT curp
FROM clientes
WHERE UPPER(curp) NOT REGEXP '^[A-ZÑ]{4}[0-9]{6}[HM][A-Z]{2}[A-ZÑ]{3}[0-9A-Z][0-9]$';
-- SQL Server necesita LIKE con guiones bajos o una regex CLR; el patrón LIKE solo cubre longitud + dígitos
-- SELECT curp FROM clientes WHERE curp NOT LIKE '____[0-9][0-9][0-9][0-9][0-9][0-9][HM]________';Preguntas frecuentes
¿Qué atrapa realmente el dígito verificador de la CURP?
Cualquier error de un solo carácter y casi toda transposición de dos caracteres — los dos tipos de errata que dominan cuando los identificadores se mueven entre sistemas. La matemática pondera cada uno de los 17 caracteres previos por su posición (17 hasta 1) contra un alfabeto base-37 (0–9, luego A–Z con Ñ intercalada), los suma, toma módulo 10 y lo resta a 10. Cambia un carácter y la suma cambia; intercambia dos contiguos y también. Por eso RENAPO lo usa como última línea de defensa contra los errores de captura.
¿Una CURP válida significa que la persona está registrada de verdad?
No — y cualquier herramienta que lo afirme desde el navegador o se equivoca o está enviando tus datos a algún lado. Este validador demuestra que la CURP está bien formada y es internamente consistente (estructura, fecha, estado, sexo, marcador de generación, dígito verificador). Confirmar que existe en el registro nacional requiere una consulta autenticada al servicio oficial de RENAPO; una página web estática, a propósito, no puede hacerlo. Úsala para cazar las falsas; usa el servicio de verificación de RENAPO para confirmar las reales.
¿Por qué algunas CURP llevan X en la segunda letra?
RENAPO cambia silenciosamente una X en el segundo carácter cuando las cuatro primeras letras formarían una de unas ochenta palabras vulgares — BUEI, CACA, MAME, PUTO y sus variantes. La sustitución ocurre antes de calcular el dígito verificador, así que la CURP resultante es completamente válida y el dígito sigue funcionando. Las personas no la eligen; la asignación es automática al emitirse. Si miras una lista real de CURP, verás el patrón de vez en cuando, y es genuino, no una errata.
¿En qué se diferencia la CURP del RFC?
Los emiten agencias distintas y codifican cosas distintas. La CURP la emite RENAPO para identificación civil y la tiene toda persona nacida o residente legal en México; son 18 caracteres. El RFC lo emite el SAT con fines fiscales; las personas físicas tienen 13 caracteres y las morales, 12. Los primeros diez caracteres de la CURP y el RFC de una persona vienen de reglas iguales y suelen coincidir, pero los caracteres finales (estado + consonantes + generación frente a homoclave + dígito) difieren. Esta herramienta valida CURP; el validador de RFC de este sitio maneja el algoritmo del SAT.