Ir al contenido

Validación de QR (V2)

Ver como Markdown Lee esta página como texto plano Abrir en ChatGPT Haz preguntas sobre esta página Abrir en Claude Haz preguntas sobre esta página Abrir en Perplexity Haz preguntas sobre esta página

Las credenciales para votar modelo G/H (2019 en adelante) incluyen dos códigos QR en el reverso, firmados digitalmente por el INE, que guardan los mismos datos que el frente de la credencial —CURP, nombre, vigencia— y una fotografía del titular en baja resolución.

La validación de QR lee esos códigos, verifica su firma digital y coteja lo que dicen contra el resto del documento: el CURP y el nombre extraídos por OCR del anverso, y el rostro de la selfie (si la enviaste). Es una comprobación adicional para detectar una credencial alterada: alguien pudo modificar el anverso (foto, nombre, CURP) dejando intacto el reverso original, o viceversa.

Envía qr_validation: true en el cuerpo de la solicitud a la V2:

{
"ine_front": "data:image/png;base64,iVBORw0KGgoAAAANS....",
"ine_back": "data:image/png;base64,iVBORw0KGgoAAAANS....",
"selfie": "data:image/png;base64,iVBORw0KGgoAAAANS....",
"qr_validation": true
}

Solo el modelo G/H trae los dos códigos QR en el reverso. Las credenciales modelo DEF (anteriores a esa generación) no los incluyen — no hay nada que leer.

Cuando esto ocurre, el campo qr_not_applicable viene en true dentro del resultado, y la validación no se penaliza por ello: es una comprobación que no aplica a ese documento, no un fallo.

Tampoco se penaliza cuando el QR sí existe pero no se pudo leer bien (foto borrosa, mala iluminación, reflejo): eso no es evidencia de fraude, así que no cambia el resultado. Solo cuenta cuando el QR se leyó con éxito y sus datos no coinciden con el resto del documento — ver Cómo afecta el resultado.

El resultado incluye el campo qrValidation dentro de data de la respuesta de la Validación completa de INE (V2). Es null si no pediste esta validación.

CampoTipoDescripción
attemptedBooleanSiempre true cuando pediste qr_validation.
okBooleantrue si los códigos QR se leyeron y decodificaron correctamente.
qr_not_applicableBooleantrue si la credencial es modelo DEF y no trae los 2 QR del reverso.
stageStringEtapa alcanzada por el proceso de lectura ("done" cuando terminó sin problema).
errorStringMotivo de la falla de lectura, o null si no hubo.
modeloStringFormato de cifrado detectado en el QR ("G/H").
signature_checkedBooleanSi se verificó la firma digital del QR.
signature_validBooleanSi la firma digital es válida.
fieldsObjectDatos decodificados del QR: curp, nombres, primer_apellido, segundo_apellido, cic, vigencia, sexo, numero_emision, fecha, entre otros.
data_matchObjectCotejo del QR contra el OCR del anverso — ver abajo.
face_matchObjectCotejo del rostro embebido en el QR contra la selfie enviada — ver abajo.

data_match trae una llave por cada dato cotejado (curp, nombre). Cada una es un objeto { qr, ocr, match } con el valor leído del QR, el valor leído por OCR, y si coinciden. Si no hubo datos suficientes para comparar un campo, esa llave no aparece —no es lo mismo que un match: false—.

face_match es { compared, confidence, matched, threshold }. Si el QR no traía fotografía, no enviaste selfie, o no se detectó rostro en el anverso, compared es false y no se hizo la comparación —tampoco es un fallo—.

También aparece desglosado en documentVerifications

Sección titulada «También aparece desglosado en documentVerifications»

Además del bloque qrValidation, la validación de QR agrega 4 renglones a data.documentInformation.documentVerifications (categoría "Qr") — el mismo lugar donde ya ves los renglones de MRZ y biometría:

keyQué revisa
QrCodeReadSi los códigos QR del reverso se pudieron leer y decodificar.
QrDataMatch_CurpSi el CURP leído del QR coincide con el CURP del OCR.
QrDataMatch_NombreSi el nombre leído del QR coincide con el nombre del OCR.
QrFaceMatchSi el rostro embebido en el QR coincide con el del documento.

Cada uno trae result en "Ok", "Failed" o "NotApplicable" (cuando esa comprobación puntual no tenía datos suficientes para ejecutarse), igual que el resto de documentVerifications.

qrValidation solo pesa en status/message cuando el QR se pudo leer con éxito y sí aplica a esa credencial. En ese caso, un dato que no coincida es una señal real de fraude —alguien pegó un QR ajeno, válido en sí mismo, sobre una credencial distinta— y pesa igual que un fallo de MRZ o de biometría.

  1. No pediste qr_validation, no aplica a la credencial, o el QR no se pudo leer — no afecta el resultado en ningún sentido.
  2. El QR se leyó bien y todo coincide — no cambia nada; el resultado depende del resto de las validaciones como siempre.
  3. El QR se leyó bien pero el CURP, el nombre o el rostro no coinciden — data.status pasa a false, sin importar que Lista Nominal/RENAPO/biometría hayan pasado. data.message explica cuál de las tres comprobaciones falló.

Los mensajes que puedes recibir en data.message cuando el QR reprueba la validación:

MensajeMotivo
El CURP leído del código QR no coincide con el CURP del OCREl CURP leído del QR no coincide con el OCR del anverso.
El nombre leído del código QR no coincide con el nombre del OCREl nombre leído del QR no coincide con el OCR del anverso.
El rostro leído del código QR no coincide con el del documentoEl rostro embebido en el QR no coincide con el rostro capturado.
{
"attempted": true,
"ok": true,
"stage": "done",
"error": null,
"modelo": "G/H",
"qr_not_applicable": false,
"signature_checked": true,
"signature_valid": true,
"fields": {
"curp": "GALJ900101HDFRRN05",
"nombres": "JUAN CARLOS",
"primer_apellido": "GARCIA",
"segundo_apellido": "LOPEZ",
"vigencia": "2019-2029"
},
"data_match": {
"curp": { "qr": "GALJ900101HDFRRN05", "ocr": "GALJ900101HDFRRN05", "match": true },
"nombre": { "qr": "JUAN CARLOS GARCIA LOPEZ", "ocr": "GARCIA LOPEZ JUAN CARLOS", "match": true }
},
"face_match": { "compared": true, "confidence": 99.87, "matched": true, "threshold": 80 }
}

Solo en la V2

/v2/validations/basic — no disponible en la V1 (síncrona ni asíncrona) ni en las validaciones ligeras.

Solo pagas si se lee

5 tokens extra con selfie (10 sin ella), solo cuando el QR se pudo leer.

No todo INE aplica

Solo credenciales modelo G/H (2019+) traen los 2 QR del reverso.

Solo penaliza fraude real

Un QR ilegible no cambia el resultado; un QR leído que no coincide, sí.