Prueba gratis la validación estructural aquí mismo. Cuando necesites saber si la credencial está vigente en el padrón —o si fue reportada como robada o extraviada— el API te lo responde en una sola llamada, con el estatus oficial del INE.
¿Dudas técnicas? Habla con un ingeniero por WhatsApp — 0% bots.
Validación estructural en tu navegador — identificamos el modelo de credencial por sus números, no los enviamos a ningún servidor. La vigencia en la Lista Nominal la responde el API.
El número que necesita el API depende del modelo de la credencial. Los tres viven en la zona de lectura mecánica del reverso; la clave de elector va al frente y este servicio no la usa.
Esquema propio del reverso (números de ejemplo). La primera línea del MRZ lleva el CIC y el OCR; el Identificador del Ciudadano son los últimos 9 dígitos del OCR. La clave de elector va al frente y este servicio no la usa.
MODELO DCIC + OCRCIC de 9 dígitos y OCR de 13, ambos en el MRZ del reverso. Emitidas hasta 2019; ya no vigentes para votar, pero aún se presentan como identificación.MODELOS E–JCIC + Identificador del CiudadanoCIC de 9 dígitos e Identificador del Ciudadano de 9 —los últimos del OCR—, en el MRZ del reverso. Son los modelos vigentes (E desde 2014, G/H desde 2019, I/J desde 2026).MODELOS A–CClave de elector + OCRLos más antiguos usan la clave de elector (18) y el OCR. No vigentes; se validan con la combinación heredada.En el JSON, estos números viajan con nombres en inglés. Así se relacionan con la credencial:
cic — CIC · Código de Identificación de la Credencial (9 dígitos). Requerido siempre.ocr — OCR (13 dígitos). Presente en el modelo D.citizenIdentifier — Identificador del Ciudadano (9 dígitos, los últimos del OCR). Presente en los modelos E–J.Puedes enviar los tres: el API distingue cuál usar según lo que reciba, sin que tengas que identificar el modelo de la credencial antes de llamar.
Cada validación confirma si la credencial existe en el padrón del INE y en qué estado está. Ahí vive la detección de fraude: una credencial con datos perfectos puede estar reportada como robada.
VIGENTE
Vigente en el padrón
Existe en la Lista Nominal y está vigente. Puedes aceptarla como identificación con confianza.
type: "VALID_VOTER" · isValid: true
REVISAR
No vigente o suspendida
Está en el padrón pero no vigente para votar, o suspendida por orden judicial. No la aceptes como identificación válida sin más señales.
type: "INE_NOT_VALID"type: "SUSPENDED_BY_JUDICIAL_ORDER"ALERTA
Robo, extravío o no registrada
Reportada como robada o extraviada, o no aparece en el padrón: señal directa de una credencial ajena o falsa. Detente antes de continuar.
type: "REPORTED_AS_STOLEN_OR_LOST"type: "INE_NOT_FOUND"Y no interpretas códigos: el envelope nombra el caso en el campo type — VALID_VOTER, REPORTED_AS_STOLEN_OR_LOST, SUSPENDED_BY_JUDICIAL_ORDER, MISMATCHED_OCR y más. Además del estatus trae la clave de elector, la geografía electoral (distrito federal y local), los años de registro, emisión y vigencia, y el mensaje oficial del INE.
El campo type es tu punto de decisión. Tres caminos: avanza si la credencial es válida, analiza a detalle si el dato es ambiguo o pudo capturarse mal, rechaza si hay señal de fraude o invalidez. Un switch sobre type y tu onboarding decide solo.
| type | Qué significa | Decisión |
|---|---|---|
VALID_VOTER | Vigente en la Lista Nominal: sirve como identificación y para votar. | Avanza |
VALID_FOREIGN_VOTER | Vigente para votar desde el extranjero. Credencial válida. | Avanza |
VALID_AS_ID_ONLY | Vigente solo como medio de identificación con fotografía (no para votar). Válida como ID. | Avanza |
MISMATCHED_OCR | El OCR no coincide con el CIC en el registro. Suele ser un error de captura — o una alteración. | Analiza |
INE_NOT_FOUND | La credencial no aparece en la Lista Nominal. Puede ser captura equivocada o un documento inexistente. | Analiza |
SUSPENDED_BY_JUDICIAL_ORDER | Derechos suspendidos por mandato judicial. No es válida para votar; revísala según tu caso de uso. | Rechaza |
REPORTED_AS_STOLEN_OR_LOST | Reportada como robada o extraviada, con folio de reporte. Señal directa de una credencial ajena. | Rechaza |
INE_NOT_VALID | No vigente como identificación ni para votar. Credencial caduca o dada de baja. | Rechaza |
Aparte de estos casos de negocio, los errores técnicos llegan con status: "ERROR": un CIC u OCR mal formado es INVALID_REQUEST con billable: false (no se cobra), y si el INE no responde en el momento, SERVICE_UNAVAILABLE (reintenta). Nunca pagas por un caso que no se resolvió.
Consultamos la Lista Nominal del INE en vivo en cada llamada —puede tardar unos segundos, no es un cache—. Mismo envelope que todos los servicios de OrigoID: aprende el contrato una vez y sirve para INE, CURP, RFC, IMSS y más.
INVALID_REQUEST y billable: false — no gastas crédito en basura.const res = await fetch("https://api.origoid.com/mex/id/v1/voter-list-validations", { method: "POST", headers: { "x-api-key": process.env.ORIGOID_API_KEY, "content-type": "application/json", }, body: JSON.stringify({ cic: "123456789", ocr: "0123456789012" }), }); const result = await res.json();
import os, requests res = requests.post( "https://api.origoid.com/mex/id/v1/voter-list-validations", headers={ "x-api-key": os.environ["ORIGOID_API_KEY"], "content-type": "application/json", }, json={"cic": "123456789", "ocr": "0123456789012"}, timeout=30, ) result = res.json()
curl -X POST https://api.origoid.com/mex/id/v1/voter-list-validations \ -H "x-api-key: $ORIGOID_API_KEY" \ -H "content-type: application/json" \ -d '{"cic": "123456789", "ocr": "0123456789012"}'
{
"status": "OK",
"type": "VALID_VOTER",
"data": {
"isValid": true,
"personalInfo": { "electorKey": "GOMEZJ80010112H300" },
"validity": { "emissionYear": "2023", "validUntilYear": "2033" },
"validationStatus": { "stolenReport": null, "officialMessage": "Está vigente como medio de identificación y puede votar" }
},
"billable": true
}
Que la credencial esté vigente no prueba que quien la trae sea su titular. Esa es la otra mitad de la identidad y la responde otro servicio del catálogo: comparación facial entre la selfie y la foto del documento.
Varios proveedores validan INE. Lo que cambia: si te avisan de una credencial robada, qué pasa con los datos de tu usuario después, y cuánto te cuesta integrarlo.
Dos niveles: la validación estructural (que el CIC tenga 9 dígitos y el OCR 13, en el reverso) se hace sin conexión — la demo de arriba la hace gratis en tu navegador. La validación real contra la Lista Nominal del INE — si está registrada y vigente, o reportada como robada o extraviada — la responde el API en una sola llamada. La consulta al INE es en vivo, por lo que puede tardar unos segundos: es el precio de un dato real, no de un cache.
Si está vigente en la Lista Nominal, la clave de elector, la geografía electoral (distrito federal y local), los años de registro, emisión y vigencia, si fue reportada como robada o extraviada (con folio) y el mensaje oficial del INE. El type clasifica el caso —VALID_VOTER, REPORTED_AS_STOLEN_OR_LOST, SUSPENDED_BY_JUDICIAL_ORDER, INE_NOT_FOUND, MISMATCHED_OCR y más— y arriba tienes la tabla completa con la decisión que le toca a cada uno.
Depende del modelo. Todos usan el CIC (9 dígitos, reverso). El modelo D agrega el OCR (13 dígitos); los modelos E, F, G, H, I y J agregan el Identificador del Ciudadano (9 dígitos, los últimos del OCR). Y no tienes que averiguar el modelo antes de llamar: puedes mandar los tres —CIC, OCR e Identificador del Ciudadano— y el API distingue cuál usar según lo que reciba.
La Lista Nominal confirma si la credencial existe y está vigente, y si fue reportada como robada o extraviada. Una que no aparece en el padrón (INE_NOT_FOUND) o cuyo OCR no coincide con el CIC (MISMATCHED_OCR) es señal directa de un documento alterado o ajeno. Para confirmar que la foto corresponde a la persona, se combina con coincidencia facial — otro servicio del catálogo.
Sí. La Lista Nominal confirma que la credencial es válida; la comparación facial confirma que quien la presenta es la persona de la foto. Son dos servicios del mismo catálogo, con el mismo envelope, y cruzar sus respuestas es un if en tu backend. Ver Comparación facial.
No. Cada consulta se valida, se responde y se descarta: sin base de datos de consultas, sin rastro en logs. Cero retención en todas nuestras regiones.
Empiezas gratis: créditos de cortesía, sin tarjeta. Después el precio por validación baja con tu volumen. Todos los planes publicados, sin "contáctanos". Formato inválido = billable: false, sin cobro.
Créditos de cortesía para validar credenciales reales en producción. El acceso se habilita tras una breve validación de tu empresa.