Biometría · Comparación facial

La cara de tu usuario, contra la foto de su identificación.

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.

umbral configurableatributos del rostro incluidoscero retención
simula-la-decisionGRATIS · EN TU NAVEGADOR
Cómo funciona

Dos imágenes entran. Una decisión sale.

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.
Datos de entrada

Qué le mandas.

Dos campos obligatorios y dos opcionales. Los nombres viajan en inglés en el JSON; esta es su equivalencia.

CampoQué esRequerido
faceLa selfie de tu usuario, en Base64 (JPG o PNG). Debe contener una sola cara: si hay más, la respuesta es MULTIPLE_FACES_DETECTED.
frontEl 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.
thresholdUmbral 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
documentTypeExige 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.

La respuesta del API

Un puntaje, una decisión y por qué falló.

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.
Más que un puntaje

Cada respuesta te dice qué se vio en la selfie.

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
"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.

CampoValoresPara qué sirve
imageQualityexcellent · good · poorNitidez y condiciones de la foto. Con poor conviene pedir otra antes de decidir nada.
detectionConfidencehigh · medium · lowQué tan segura fue la detección del rostro. Útil para exigir revisión manual cuando no es high.
orientationfront · looking_left · looking_right · looking_up · looking_down · tilted · sidewaysHacia dónde mira la persona. Si tu política pide rostro de frente, aceptas solo front.
eyesOpentrue · falseOjos abiertos. Un parpadeo arruina la foto de expediente aunque la comparación pase.
mouthOpentrue · falseBoca abierta. Relevante si necesitas una foto tipo credencial con gesto neutro.
wearingGlassestrue · falseLentes graduados. Muchos flujos los permiten; otros exigen quitarlos para el expediente.
wearingSunglassestrue · falseLentes oscuros. Casi ninguna política los acepta: es la bandera que más se usa para forzar reintento.
faceCoveredtrue · falseRostro 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_confidenceEl resumen accionable. En vez de leer bandera por bandera, recorres este arreglo y le dices al usuario exactamente qué corregir.
Reintento con instrucción, no a ciegas"Quítate los lentes oscuros" convierte en aprobación lo que otro proveedor te habría devuelto como un rechazo sin explicación.
Tus propias reglas de aceptaciónPuedes exigir 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.
Foto de expediente utilizableSi guardas la selfie en el expediente del cliente, estas banderas te dicen si la imagen sirve antes de archivarla.

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.

Cada type, una decisión

Qué significa cada respuesta y qué hace tu código con ella.

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.

typeQué significaDecisión
SUCCESSLas caras coinciden: el puntaje alcanzó el umbral. Es la persona del documento.Avanza
NO_FACE_DETECTEDNo 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_DETECTEDHay más de una cara en la selfie. Pide una nueva, sin nadie más en cuadro.Analiza
NO_DOCUMENT_DETECTEDLa imagen del frente no es un documento de identidad reconocido. Solo aparece si pediste validación de tipo.Analiza
DOCUMENT_MISMATCHEs un documento válido, pero no el que exigiste: pediste MEX_PASSPORT y llegó una INE.Analiza
FACE_MISMATCHAmbas 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.

Infraestructura cruda · 100% API REST

Una llamada, un crédito.

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.

Umbral tuyo, no nuestroPor defecto 90, grado KYC — y lo cambias por llamada según el riesgo de la operación.
Global desde el día unoEl documento puede ser de cualquier país. La validación de tipo es opcional y explícita.
Cero retenciónLas imágenes se procesan y se descartan. Sin plantillas biométricas almacenadas, sin logs.
compara-caras
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"}'
Respuesta con la decisión ya tomada
{
  "status": "OK",
  "type": "SUCCESS",
  "data": {
    "faceMatchScore": 96.4,
    "isMatch": true,
    "thresholdApplied": 90,
    "detectedDocumentType": "INE",
    "selfieAnalysis": {
      "imageQuality": "excellent", "eyesOpen": true,
      "wearingSunglasses": false, "issues": []
    }
  },
  "billable": true
}
Alcance real

Lo que este servicio no hace.

Preferimos decirlo antes de que integres. La comparación facial resuelve una pregunta muy concreta; estas otras necesitan otra pieza.

¿Identidad completa? Son dos llamadas.

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.

Ver Validar INE
Preguntas frecuentes

Lo que suelen preguntarnos.

¿Cómo funciona la comparación facial contra una identificación?

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.

¿Qué documentos acepta?

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.

¿Qué umbral debo usar?

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.

¿Puedo saber si la persona trae lentes o no mira a la cámara?

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.

¿Es prueba de vida?

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.

¿Guardan las imágenes?

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.

¿Cuánto cuesta?

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).

Empieza gratis, sin tarjeta.

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.

Solicitar acceso