Volver al blog

CURP: Qué es, Cómo se Forma y Cómo Validarlo

Guía completa sobre el CURP mexicano. Aprende su estructura de 18 caracteres, cómo se genera y cómo validarlo programáticamente con ejemplos de código.

Extraer Datos de INE
qué es CURPvalidar CURPformato CURPestructura CURP Méxicoverificar CURP

El CURP (Clave Única de Registro de Población) es uno de los identificadores más importantes en México. Si tu empresa procesa datos de ciudadanos mexicanos, entender cómo funciona el CURP es fundamental para validar información y prevenir errores.

¿Qué es el CURP?

El CURP es una clave alfanumérica de 18 caracteres que identifica de manera única a cada persona registrada en México, tanto ciudadanos como residentes extranjeros.

Ejemplo de CURP: GOVM800705MCLRLR01

¿Para qué se usa el CURP?

  • Trámites gubernamentales
  • Inscripción escolar
  • Servicios de salud (IMSS, ISSSTE)
  • Declaración de impuestos (SAT)
  • Apertura de cuentas bancarias
  • Contratación laboral
  • Verificación de identidad en procesos KYC

Estructura del CURP: Los 18 caracteres explicados

El CURP no es aleatorio. Cada sección contiene información específica sobre la persona:

G O V M 8 0 0 7 0 5 M C L R L R 0 1
│ │ │ │ │         │ │   │     │ │
│ │ │ │ │         │ │   │     └─┴─ Homoclave (2)
│ │ │ │ │         │ │   └───────── Consonantes internas (3)
│ │ │ │ │         │ └───────────── Estado de nacimiento (2)
│ │ │ │ │         └─────────────── Sexo (1)
│ │ │ │ └───────────────────────── Fecha de nacimiento (6)
└─┴─┴─┴─────────────────────────── Iniciales del nombre (4)

Desglose detallado

PosiciónEjemploSignificado
1-2GOPrimera vocal interna + primera letra del apellido paterno
3VPrimera letra del apellido materno
4MPrimera letra del primer nombre
5-680Últimos dos dígitos del año de nacimiento
7-807Mes de nacimiento
9-1005Día de nacimiento
11MSexo (H = Hombre, M = Mujer)
12-13CLCódigo del estado de nacimiento
14RPrimera consonante interna del apellido paterno
15LPrimera consonante interna del apellido materno
16RPrimera consonante interna del nombre
170Dígito diferenciador de homonimia
181Dígito verificador

Códigos de estados mexicanos en el CURP

CódigoEstadoCódigoEstado
ASAguascalientesNLNuevo León
BCBaja CaliforniaOCOaxaca
BSBaja California SurPLPuebla
CCCampecheQTQuerétaro
CLCoahuilaQRQuintana Roo
CMColimaSPSan Luis Potosí
CSChiapasSLSinaloa
CHChihuahuaSRSonora
DFCiudad de MéxicoTCTabasco
DGDurangoTSTamaulipas
GTGuanajuatoTLTlaxcala
GRGuerreroVZVeracruz
HGHidalgoYNYucatán
JCJaliscoZSZacatecas
MCEstado de MéxicoNENacido en el extranjero
MNMichoacán
MSMorelos
NTNayarit

Cómo validar un CURP

Existen varios niveles de validación que puedes implementar:

1. Validación de formato básico

Verifica que el CURP tenga la estructura correcta usando una expresión regular:

import re

def validar_formato_curp(curp):
    """
    Valida que el CURP tenga el formato correcto

    Returns:
        bool: True si el formato es válido
    """
    if not curp or len(curp) != 18:
        return False

    patron = r'^[A-Z]{4}\d{6}[HM][A-Z]{2}[A-Z]{3}[A-Z0-9]\d$'
    return bool(re.match(patron, curp.upper()))

# Ejemplos
print(validar_formato_curp("GOVM800705MCLRLR01"))  # True
print(validar_formato_curp("INVALIDO"))            # False
print(validar_formato_curp("GOVM800705XCLRLR01"))  # False (X no es válido para sexo)

2. Validación del dígito verificador

El carácter 18 es un dígito verificador calculado con un algoritmo específico:

def calcular_digito_verificador(curp_17):
    """
    Calcula el dígito verificador de un CURP

    Args:
        curp_17: Los primeros 17 caracteres del CURP

    Returns:
        str: El dígito verificador (0-9)
    """
    diccionario = "0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"

    suma = 0
    for i, char in enumerate(curp_17.upper()):
        valor = diccionario.index(char)
        suma += valor * (18 - i)

    residuo = suma % 10
    digito = (10 - residuo) % 10

    return str(digito)

def validar_curp_completo(curp):
    """
    Valida el CURP incluyendo el dígito verificador
    """
    if not validar_formato_curp(curp):
        return False

    digito_calculado = calcular_digito_verificador(curp[:17])
    return curp[17] == digito_calculado

3. Validación cruzada con otros datos

Si tienes acceso a otros datos de la persona (por ejemplo, al extraer datos de una credencial INE), puedes verificar la consistencia:

from datetime import date

def validar_consistencia(curp, fecha_nacimiento, sexo):
    """
    Valida que el CURP coincida con la fecha de nacimiento y sexo

    Args:
        curp: CURP a validar
        fecha_nacimiento: objeto date con la fecha
        sexo: 'M' para mujer, 'H' para hombre

    Returns:
        tuple: (es_valido, lista_de_errores)
    """
    errores = []
    curp = curp.upper()

    # Extraer año del CURP
    año_curp = int(curp[4:6])
    # Ajustar siglo: 00-29 = 2000s, 30-99 = 1900s
    año_completo = 2000 + año_curp if año_curp <= 29 else 1900 + año_curp

    mes_curp = int(curp[6:8])
    dia_curp = int(curp[8:10])

    # Comparar fecha
    if (fecha_nacimiento.year != año_completo or
        fecha_nacimiento.month != mes_curp or
        fecha_nacimiento.day != dia_curp):
        errores.append("Fecha de nacimiento no coincide con CURP")

    # Comparar sexo
    if sexo.upper() != curp[10]:
        errores.append("Sexo no coincide con CURP")

    return len(errores) == 0, errores

# Ejemplo de uso
es_valido, errores = validar_consistencia(
    "GOVM800705MCLRLR01",
    date(1980, 7, 5),
    "M"
)
print(f"Válido: {es_valido}")  # True

Cómo extraer información de un CURP

Puedes decodificar información útil directamente del CURP:

def extraer_info_curp(curp):
    """
    Extrae información contenida en el CURP
    """
    curp = curp.upper()

    estados = {
        'AS': 'Aguascalientes', 'BC': 'Baja California',
        'BS': 'Baja California Sur', 'CC': 'Campeche',
        'CL': 'Coahuila', 'CM': 'Colima', 'CS': 'Chiapas',
        'CH': 'Chihuahua', 'DF': 'Ciudad de México',
        'DG': 'Durango', 'GT': 'Guanajuato', 'GR': 'Guerrero',
        'HG': 'Hidalgo', 'JC': 'Jalisco', 'MC': 'Estado de México',
        'MN': 'Michoacán', 'MS': 'Morelos', 'NT': 'Nayarit',
        'NL': 'Nuevo León', 'OC': 'Oaxaca', 'PL': 'Puebla',
        'QT': 'Querétaro', 'QR': 'Quintana Roo', 'SP': 'San Luis Potosí',
        'SL': 'Sinaloa', 'SR': 'Sonora', 'TC': 'Tabasco',
        'TS': 'Tamaulipas', 'TL': 'Tlaxcala', 'VZ': 'Veracruz',
        'YN': 'Yucatán', 'ZS': 'Zacatecas', 'NE': 'Nacido en el extranjero'
    }

    año = int(curp[4:6])
    año_completo = 2000 + año if año <= 29 else 1900 + año

    return {
        'fecha_nacimiento': f"{curp[8:10]}/{curp[6:8]}/{año_completo}",
        'sexo': 'Mujer' if curp[10] == 'M' else 'Hombre',
        'estado_nacimiento': estados.get(curp[11:13], 'Desconocido'),
    }

# Ejemplo
info = extraer_info_curp("GOVM800705MCLRLR01")
print(info)
# {
#     'fecha_nacimiento': '05/07/1980',
#     'sexo': 'Mujer',
#     'estado_nacimiento': 'Coahuila'
# }

Casos especiales del CURP

Personas nacidas en el extranjero

Los mexicanos nacidos fuera del país tienen el código NE (Nacido en el Extranjero) en las posiciones 12-13.

Nombres con Ñ

La letra Ñ es válida en el CURP y se usa tal cual cuando aparece en el nombre o apellidos.

Homonimia

Cuando dos personas tienen el mismo CURP base (posiciones 1-16), RENAPO asigna diferentes valores en la posición 17 para diferenciarlas.

Automatiza la validación de CURP con extracción de INE

Si procesas credenciales INE en tu empresa, puedes extraer automáticamente el CURP y otros datos usando una API de OCR. Esto te permite:

  1. Capturar el CURP sin errores de transcripción
  2. Validar automáticamente el formato y dígito verificador
  3. Cruzar información con fecha de nacimiento y sexo extraídos de la misma credencial

Extraer Datos de INE te permite obtener el CURP y más de 15 campos de la credencial en segundos, con una precisión superior al 98%.

Conclusión

El CURP es más que un simple identificador: es una fuente de información verificable sobre la persona. Implementar validaciones correctas en tus sistemas te ayuda a:

  • Detectar errores de captura
  • Prevenir fraudes de identidad
  • Mantener datos consistentes
  • Cumplir con regulaciones de KYC

¿Necesitas extraer y validar CURPs de manera automática? Prueba nuestra API de extracción de INE con 20 extracciones gratis.

¿Necesitas extraer datos de INE automáticamente?

Prueba nuestra API con 20 extracciones gratis. Integración en minutos, resultados en segundos.

Comenzar gratis