Volver al blog

El Pasaporte Mexicano: Campos, Versiones y Cómo Leerlo

Guía de la página de datos del pasaporte mexicano: qué campos contiene, dónde aparece la CURP, por qué no cabe en la MRZ, cómo se transliteran los apellidos con ñ y acentos, y qué cambia con el pasaporte electrónico.

Extraer Datos de Pasaporte
pasaporte mexicanoSRECURPpasaporte electrónicocampos pasaporteMéxico

El pasaporte mexicano sigue el estándar ICAO 9303 como cualquier otro, así que su MRZ es idéntica en estructura a la de un pasaporte alemán o japonés. Pero tiene particularidades —en la CURP, en los dos apellidos, en la transliteración— que importan mucho si estás procesando documentos mexicanos.

Quién lo emite y cuánto dura

El pasaporte mexicano lo emite la Secretaría de Relaciones Exteriores (SRE), y en la MRZ aparece con el código de país MEX, tanto en las posiciones 3-5 de la línea 1 (país emisor) como en las 11-13 de la línea 2 (nacionalidad).

Se expide con distintos periodos de vigencia según el trámite —de uno a diez años, con los plazos más largos reservados a personas adultas y los más cortos a menores de edad—. Esto tiene una consecuencia práctica: no puedes asumir un periodo de validez fijo al hacer comprobaciones de coherencia. Una diferencia de tres años entre emisión y vencimiento es perfectamente normal en un pasaporte mexicano.

Los campos de la página de datos

La página de datos contiene, en la zona visual:

CampoNotas
Tipo / TypeP
País emisorMEX
Número de pasaporteHabitualmente una letra seguida de dígitos
ApellidosLos dos: paterno y materno
Nombre(s)
NacionalidadMEXICANA
Fecha de nacimiento
Sexo
Lugar de nacimientoEntidad federativa
Fecha de expedición
Fecha de vencimiento
CURPZona visual únicamente — ver abajo
Autoridad emisoraSRE, con la oficina expedidora

Más las dos líneas de la MRZ al pie.

La CURP no está en la MRZ

Este es el punto que más confusión genera, y conviene ser preciso.

La MRZ tiene un campo llamado número personal en las posiciones 29-42 de la línea 2. Son 14 caracteres. La CURP tiene 18. La aritmética es concluyente: una CURP completa no cabe en la MRZ de ningún pasaporte, mexicano o no.

En la práctica, la MRZ de un pasaporte mexicano suele traer ese campo relleno de <:

G123456786MEX8007050F3307054<<<<<<<<<<<<<<08
                            └── número personal: relleno ──┘

La CURP se lee de la zona visual de la página de datos, donde sí aparece completa. Por eso una extracción que solo procese las dos líneas del pie te devolverá la CURP vacía, y por eso nuestra API lee ambas zonas: la MRZ para los campos verificables por dígito, y la zona visual para lo que solo vive ahí.

Dos apellidos en un campo pensado para uno

ICAO 9303 divide el nombre en identificador primario (apellidos) e identificador secundario (nombres de pila), separados por <<. El estándar no distingue apellido paterno de materno: ambos van juntos en el bloque primario, separados por un < sencillo.

GOMEZ<VELAZQUEZ<<MARGARITA
└── apellidos ──┘  └ nombre ┘

Se lee: apellidos Gómez Velázquez, nombre Margarita.

Dos advertencias para quien integra:

No asumas que el primer bloque es un solo apellido. Si tu base de datos guarda apellidoPaterno y apellidoMaterno por separado, tendrás que partir por el < — y aceptar que un apellido compuesto (De la Cruz, Del Río) también lleva < entre sus palabras, así que la partición no siempre es limpia. Cuando la exactitud importa, guarda el bloque completo tal como viene y no lo trocees.

Los 39 caracteres se agotan. Dos apellidos largos más dos nombres de pila superan fácilmente el límite del campo, y entonces el emisor trunca. El nombre truncado es el dato oficial de la MRZ, no un error de lectura: contrástalo con la zona visual, donde aparece completo.

Acentos y ñ: la transliteración obligatoria

La MRZ solo admite A-Z. Todo lo demás se translitera:

En el documentoEn la MRZ
VelázquezVELAZQUEZ
MuñozMUNOZ
PeñaPENA
IbáñezIBANEZ
JoséJOSE

Esto no es un defecto del OCR: es el estándar funcionando como debe. El problema surge cuando comparas el nombre de la MRZ contra tu base de datos carácter por carácter — todos los apellidos con ñ o acento fallarán la comparación.

La solución es normalizar ambos lados antes de comparar:

function normalizarParaComparar(nombre) {
  return nombre
    .normalize('NFD')                    // separa letra y acento
    .replace(/[\u0300-\u036f]/g, '')     // elimina los acentos
    .replace(/Ñ/gi, 'N')
    .toUpperCase()
    .replace(/[^A-Z]/g, '')             // quita espacios y guiones
}

normalizarParaComparar('Muñoz Velázquez') // 'MUNOZVELAZQUEZ'

Y una nota de diseño que ahorra disgustos: guarda el nombre acentuado de la zona visual como dato de negocio, y usa la versión normalizada solo para comparar. Escribirle a un cliente "Estimado MUNOZ" porque tu sistema guardó la versión MRZ es un error evitable.

El pasaporte electrónico

México emite pasaporte electrónico, con un chip sin contacto incrustado que almacena los datos de la página y la fotografía, firmados criptográficamente. Se distingue por el símbolo internacional del pasaporte electrónico impreso en la portada.

Vale la pena entender qué cambia y qué no para un flujo de OCR:

  • Para la lectura óptica, no cambia nada. La página de datos y la MRZ siguen ahí y se leen igual.
  • El chip es otra cosa. Leerlo requiere hardware NFC y un protocolo distinto, en el que la MRZ actúa como clave de acceso: sin haber leído ópticamente la MRZ, el chip no se abre.

Es decir, la lectura de la MRZ es el prerrequisito de la lectura del chip, no su alternativa. Los pasaportes mexicanos anteriores a la introducción del chip siguen circulando y siendo válidos hasta su vencimiento, así que cualquier sistema que reciba documentos mexicanos tiene que manejar ambas generaciones. La MRZ es lo que las dos tienen en común.

Qué devuelve nuestra API con un pasaporte mexicano

{
  "passportNumber": "G12345678",
  "surname": "GOMEZ VELAZQUEZ",
  "givenNames": "MARGARITA",
  "nationality": "MEX",
  "issuingCountry": "MEX",
  "dateOfBirth": "05/07/1980",
  "dateOfIssue": "10/03/2023",
  "dateOfExpiry": "05/07/2033",
  "sex": "F",
  "placeOfBirth": "CIUDAD DE MEXICO",
  "issuingAuthority": "SRE",
  "personalNumber": "GOVM800705MDFMLR09",
  "mrzLine1": "P<MEXGOMEZ<VELAZQUEZ<<MARGARITA<<<<<<<<<<<<<",
  "mrzLine2": "G123456786MEX8007050F3307054<<<<<<<<<<<<<<08"
}

Nota que personalNumber trae la CURP aunque la MRZ la tenga en blanco: viene de la zona visual. Las dos líneas MRZ llegan completas y con sus cuatro dígitos verificadores comprobados.

Pruébalo con un pasaporte real

La demo gratuita procesa un pasaporte sin registro. Si ya tienes una MRZ transcrita, el validador recalcula sus dígitos verificadores gratis.

Para el detalle de las posiciones, Cómo leer la MRZ línea por línea; para la aritmética de verificación, Dígitos verificadores ICAO 9303.

¿Necesitas extraer datos de pasaportes automáticamente?

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

Comenzar gratis