Mandas dos imágenes: la selfie y el frente del documento. Recibes un puntaje de 0 a 100 y la decisión ya tomada contra tu umbral. Acepta la INE, el pasaporte y cualquier documento oficial del mundo.
¿Dudas técnicas? Habla con un ingeniero por WhatsApp — 0% bots.
Es una verificación 1:1: compara dos imágenes entre sí. No busca una cara dentro de una base de datos ni construye un registro biométrico de tus usuarios.
1Recibe las dos imágenesLa selfie en face y el frente del documento en front, ambas en Base64 (JPG o PNG). El cuerpo admite hasta 28 MB.2Detecta y aísla las carasLocaliza la cara en la selfie y extrae la fotografía del documento. Si falta alguna, o si hay más de una persona en la selfie, te lo dice en vez de adivinar.3Compara y decideCalcula la similitud de 0 a 100 y la contrasta con tu umbral. La respuesta ya trae la decisión resuelta en isMatch: tu código no compara nada.Dos campos obligatorios y dos opcionales. Los nombres viajan en inglés en el JSON; esta es su equivalencia.
| Campo | Qué es | Requerido |
|---|---|---|
face | La selfie de tu usuario, en Base64 (JPG o PNG). Debe contener una sola cara: si hay más, la respuesta es MULTIPLE_FACES_DETECTED. | Sí |
front | El frente del documento, en Base64. De ahí se extrae la foto a comparar. Acepta cualquier documento oficial del mundo: INE, pasaporte, tarjeta de residencia, cédula profesional. | Sí |
threshold | Umbral de aceptación, de 1 a 100. Por defecto 90 (grado KYC). Se puede cambiar en cada llamada: umbral alto para operaciones sensibles, más permisivo para acciones de bajo riesgo. | Opcional |
documentType | Exige un tipo exacto de documento: INE, IFE, MEX_PASSPORT, MEX_RESIDENCE_CARD, MEX_PROFESSIONAL_ID. Con ANY basta que sea algún documento reconocido. Si lo omites, no se valida el tipo. | Opcional |
Las imágenes no se guardan: se usan para calcular la comparación y se descartan al responder. No almacenamos plantillas biométricas ni dejamos rastro en logs.
Además del resultado, la respuesta trae un análisis de la selfie pensado para que puedas pedir un reintento útil —"quítate los lentes"— en vez de un "vuelve a intentar" a ciegas.
faceMatchScoreSimilitud de 0 a 100 entre ambas caras. Llega en null cuando el puntaje no fue la base del resultado —documento no detectado, sin cara, varias caras—: no se filtra una señal que no corresponde.isMatchLa decisión ya resuelta: true si el puntaje alcanzó tu umbral. Es el único campo que tu lógica de aprobación necesita leer.thresholdAppliedEl umbral que se usó en esa llamada. Queda en la respuesta para auditar después por qué se aprobó o se rechazó una operación.detectedDocumentTypeQué documento se reconoció en la imagen del frente: INE, MEX_PASSPORT, OTHER…selfieAnalysisQué se vio en la selfie: calidad, orientación del rostro, ojos, lentes, cara cubierta. Ver el detalle campo por campo ↓issues[]Pistas accionables para el reintento: wearing_sunglasses, eyes_closed, face_covered, poor_image_quality, not_facing_camera, low_detection_confidence. Con eso le dices al usuario exactamente qué corregir.La mayoría de los proveedores en México te regresan un puntaje y un sí o no. Nosotros además te entregamos selfieAnalysis: los atributos del rostro que detectamos, listos para tus propias reglas. Si tu política exige la cara de frente, sin lentes oscuros y con los ojos abiertos, no necesitas otro proveedor ni tu propio modelo de visión — ya viene en la misma respuesta, sin costo extra.
"selfieAnalysis": { "imageQuality": "excellent", "detectionConfidence": "high", "orientation": "front", "eyesOpen": true, "mouthOpen": false, "wearingGlasses": true, "wearingSunglasses": false, "faceCovered": false, "issues": ["wearing_glasses"] }
Respuesta real: la persona trae lentes graduados. La comparación pasó (isMatch: true) y el detalle queda registrado en issues por si tu política lo trata distinto.
| Campo | Valores | Para qué sirve |
|---|---|---|
imageQuality | excellent · good · poor | Nitidez y condiciones de la foto. Con poor conviene pedir otra antes de decidir nada. |
detectionConfidence | high · medium · low | Qué tan segura fue la detección del rostro. Útil para exigir revisión manual cuando no es high. |
orientation | front · looking_left · looking_right · looking_up · looking_down · tilted · sideways | Hacia dónde mira la persona. Si tu política pide rostro de frente, aceptas solo front. |
eyesOpen | true · false | Ojos abiertos. Un parpadeo arruina la foto de expediente aunque la comparación pase. |
mouthOpen | true · false | Boca abierta. Relevante si necesitas una foto tipo credencial con gesto neutro. |
wearingGlasses | true · false | Lentes graduados. Muchos flujos los permiten; otros exigen quitarlos para el expediente. |
wearingSunglasses | true · false | Lentes oscuros. Casi ninguna política los acepta: es la bandera que más se usa para forzar reintento. |
faceCovered | true · false | Rostro parcialmente cubierto —cubrebocas, bufanda, mano—. Pide retirar lo que obstruya. |
issues[] | wearing_glasses · wearing_sunglasses · face_covered · eyes_closed · poor_image_quality · not_facing_camera · low_detection_confidence | El resumen accionable. En vez de leer bandera por bandera, recorres este arreglo y le dices al usuario exactamente qué corregir. |
orientation: "front", sin lentes oscuros y con los ojos abiertos, aunque la comparación facial haya pasado. La política la pones tú, no el proveedor.Ojo con lo que sí es: estos atributos describen la imagen, no prueban que haya una persona viva frente a la cámara. Son control de calidad y de política, no prueba de vida.
El campo type es tu punto de decisión. Tres caminos: avanza si las caras coinciden, analiza si el problema es la calidad de la imagen y conviene pedir otra, rechaza si el resultado es que no es la misma persona.
| type | Qué significa | Decisión |
|---|---|---|
SUCCESS | Las caras coinciden: el puntaje alcanzó el umbral. Es la persona del documento. | Avanza |
NO_FACE_DETECTED | No se detectó cara en la selfie o en el documento. Casi siempre es foto borrosa, oscura o mal encuadrada: pide de nuevo solo esa imagen. | Analiza |
MULTIPLE_FACES_DETECTED | Hay más de una cara en la selfie. Pide una nueva, sin nadie más en cuadro. | Analiza |
NO_DOCUMENT_DETECTED | La imagen del frente no es un documento de identidad reconocido. Solo aparece si pediste validación de tipo. | Analiza |
DOCUMENT_MISMATCH | Es un documento válido, pero no el que exigiste: pediste MEX_PASSPORT y llegó una INE. | Analiza |
FACE_MISMATCH | Ambas caras se detectaron bien, pero no son la misma persona: el puntaje quedó por debajo del umbral. | Rechaza |
Los errores técnicos llegan aparte, con status: "ERROR": una imagen que no es JPG/PNG o un cuerpo mayor a 28 MB es INVALID_REQUEST con billable: false — no se cobra.
Mismo envelope que todos los servicios de OrigoID: status, type, data. Aprendes el contrato una vez y sirve para biometría, INE, CURP, RFC e IMSS.
const res = await fetch("https://api.origoid.com/global/biometrics/v1/face-matches", { method: "POST", headers: { "x-api-key": process.env.ORIGOID_API_KEY, "content-type": "application/json", }, body: JSON.stringify({ face: selfieBase64, front: documentoFrenteBase64, threshold: 90, documentType: "INE", }), }); const { data } = await res.json(); if (data.isMatch) approve();
import os, requests res = requests.post( "https://api.origoid.com/global/biometrics/v1/face-matches", headers={ "x-api-key": os.environ["ORIGOID_API_KEY"], "content-type": "application/json", }, json={ "face": selfie_base64, "front": documento_frente_base64, "threshold": 90, "documentType": "INE", }, timeout=30, ) result = res.json()
curl -X POST https://api.origoid.com/global/biometrics/v1/face-matches \ -H "x-api-key: $ORIGOID_API_KEY" \ -H "content-type: application/json" \ -d '{"face": "<base64>", "front": "<base64>", "threshold": 90, "documentType": "INE"}'
{
"status": "OK",
"type": "SUCCESS",
"data": {
"faceMatchScore": 96.4,
"isMatch": true,
"thresholdApplied": 90,
"detectedDocumentType": "INE",
"selfieAnalysis": {
"imageQuality": "excellent", "eyesOpen": true,
"wearingSunglasses": false, "issues": []
}
},
"billable": true
}
Preferimos decirlo antes de que integres. La comparación facial resuelve una pregunta muy concreta; estas otras necesitan otra pieza.
selfieAnalysis mide la calidad de la imagen, no que haya una persona viva frente a la cámara. Una foto de una foto puede pasar la comparación.La comparación facial confirma que es la misma persona; la Lista Nominal confirma que la credencial está registrada y vigente. Cruzar ambas respuestas es un if en tu backend.
Mandas dos imágenes en Base64: la selfie en face y el frente del documento en front. El API detecta la cara en cada una, extrae la foto del documento y regresa un puntaje de 0 a 100 junto con isMatch, la decisión contra tu umbral. Es 1:1: compara dos imágenes, no busca en una base de datos.
Cualquier documento oficial del mundo con fotografía. Si quieres exigir uno en particular, usa documentType: INE, IFE, MEX_PASSPORT, MEX_RESIDENCE_CARD o MEX_PROFESSIONAL_ID. Con ANY basta que sea un documento reconocido; si no lo es, responde NO_DOCUMENT_DETECTED.
El default es 90, calibrado para KYC. Bajarlo acepta más casos legítimos con fotos difíciles, pero deja pasar más impostores; subirlo reduce fraude a costa de rechazar gente legítima. Como se cambia por llamada, es común usar uno alto en operaciones sensibles y uno más permisivo en acciones de bajo riesgo. La respuesta incluye thresholdApplied para auditar la decisión.
Sí, y viene en la misma respuesta sin costo extra. El bloque selfieAnalysis trae wearingGlasses, wearingSunglasses, faceCovered, eyesOpen, mouthOpen, la orientation del rostro (front, looking_left, tilted…), la calidad de imagen y la confianza de detección. Con eso aplicas tus propias reglas de aceptación —por ejemplo, exigir rostro de frente y sin lentes oscuros— aunque la comparación facial ya haya pasado. Ver el detalle.
No. Confirma que dos caras son de la misma persona, y selfieAnalysis describe la calidad de la imagen, pero no verifica que haya una persona viva frente a la cámara: una foto de una foto puede pasar. Tampoco certifica que el documento físico sea auténtico.
No. La selfie y el documento se usan para calcular la comparación y se descartan al responder: sin base de datos de imágenes, sin plantillas biométricas almacenadas, sin rastro en logs. Cero retención en todas nuestras regiones.
Una comparación = 1 crédito. Empiezas gratis con créditos de cortesía, sin tarjeta, y el precio por verificación baja con tu volumen. Todos los planes publicados. Una petición mal formada no se cobra (billable: false).
Créditos de cortesía para probar la comparación facial en producción. El acceso se habilita tras una breve validación de tu empresa.