Verificaciones y decisiones
Toda verificación — por widget o servidor a servidor — se resuelve en el mismo resultado normalizado. Esta página es la referencia para interpretarlo.
El payload de resultado
{
"sessionId": "9f1c8e42-7c3e-4f2b-9d7a-2b1e5c8f4a10",
"userRef": "user-123",
"status": "completed",
"decision": "approved",
"document": {
"type": "passport",
"number": "A12345678",
"personalNumber": null,
"issuingState": null,
"issuingCountry": "USA",
"issuingCountryName": "United States",
"expirationDate": "2033-09-30",
"dateOfIssue": null
},
"person": {
"firstName": "ALEX",
"lastName": "MORGAN",
"fullName": "ALEX MORGAN",
"dateOfBirth": "1988-03-04",
"gender": "F",
"nationality": "USA",
"address": null,
"city": null,
"region": null,
"postalCode": null
},
"checks": [
{ "name": "document_scene_clear", "status": "passed", "group": "document", "severity": "low", "detail": "no screen-recapture signals" },
{ "name": "document_readable", "status": "passed", "group": "document", "severity": "critical", "detail": "all core fields extracted" },
{ "name": "document_authentic", "status": "passed", "group": "document", "severity": "high", "detail": "genuine — laminate sheen, crisp typography, natural depth" },
{ "name": "document_not_expired", "status": "passed", "group": "document", "severity": "critical", "detail": "expirationDate 2033-09-30" },
{ "name": "document_number_valid", "status": "passed", "group": "document", "severity": "medium", "detail": "passport:USA — document number matches the USA passport format" },
{ "name": "document_mrz_valid", "status": "passed", "group": "document", "severity": "low", "detail": "all check digits valid" },
{ "name": "face_detected", "status": "passed", "group": "selfie", "severity": "medium", "detail": "One face, fully visible and facing the camera." },
{ "name": "liveness", "status": "passed", "group": "selfie", "severity": "high", "detail": "heuristic (selfie mode): face confidence + quality vs threshold 80.0" },
{ "name": "face_match", "status": "passed", "group": "selfie", "severity": "high", "detail": "portrait-to-selfie similarity vs threshold 90.0" }
],
"prefillMismatches": [],
"prefillComparison": [],
"provider": "inyo",
"trustIndex": 100
}
Campos de nivel superior
| Campo | Descripción |
|---|---|
sessionId | El identificador de la verificación. Úselo con GET /v1/sessions/{sessionId} |
userRef | Su identificador, devuelto exactamente como usted lo suministró |
status | Dónde está la sesión en su ciclo de vida — vea Estado y decisión |
decision | Lo que Inyo concluyó. Presente solo bajo decisionamiento gestionado, y solo para una sesión que llegó a una evaluación — de lo contrario la clave está ausente, no null. Vea Estado y decisión |
document | Datos extraídos del documento |
person | Datos de identidad extraídos |
checks | Las verificaciones individuales que produjeron la decisión — vea Cómo leer checks[] |
prefillMismatches | Nombres de los campos de prefill que no coincidieron con el documento. Vacío a menos que haya enviado prefill |
prefillComparison | Detalle de comparación campo por campo — vea Comparación de prefill |
selfieDescription | Descripción estructurada de la apariencia. Presente solo cuando está habilitada para su tenant — de lo contrario la clave está ausente, no null |
screening | Coincidencias de listas de sanciones detrás de un cribado fallido. Presente solo cuando hay algo que adjudicar — la clave está ausente cuando el cribado sale limpio, y ausente por completo si el cribado no está habilitado para su tenant. Vea Cribado de sanciones |
trustIndex | La puntuación de la verificación, de 0 a 100 |
provider | inyo para una verificación real, inyo-simulated para una dictada por un número de documento reservado — vea Sandbox |
notifiedAt | Presente solo en las notificaciones entregadas, no en el resultado almacenado. Úselo para ordenar entregas concurrentes — vea Recepción de Resultados |
document
| Campo | Descripción |
|---|---|
type | passport, drivers_license o identity_card — el mismo vocabulario que envía en prefill.documentType |
number | Número de documento tal como se leyó del documento |
personalNumber | Identificador nacional secundario cuando el documento lo incluye |
issuingState | La subdivisión tal como aparece impresa — un estado de EE. UU. para licencias. null en un pasaporte, que no lleva subdivisión; lea issuingCountry para el emisor |
issuingCountry | País resuelto en formato ISO 3166-1 alpha-3 |
issuingCountryName | Nombre para mostrar de issuingCountry (por ejemplo United States). Recurre al código mismo cuando no es un país reconocido, y es null solo cuando issuingCountry es null |
expirationDate, dateOfIssue | YYYY-MM-DD, o null cuando el documento no lo incluye |
person
firstName, lastName, fullName, dateOfBirth, gender, nationality, address, city, region, postalCode.
Cualquier campo que el documento no incluya — o que no pudo leerse — es null. Los campos de dirección suelen ser null en pasaportes y se completan a partir de licencias de conducir. Los nombres llegan tal como están impresos en el documento, lo que en pasaportes significa en mayúsculas.
Estado y Decisión
Son dos campos distintos. status dice dónde está la sesión; decision dice lo que Inyo concluyó, y solo existe si usted pidió que concluyéramos algo.
status — siempre presente
status | Significado | Qué hacer |
|---|---|---|
pending | Creada, aún no completada | Espere |
completed | El cliente terminó y la sesión fue evaluada | Lea checks, trustIndex y decision, si lo tiene |
failed | La captura nunca fue utilizable — en el widget, el cliente agotó los intentos | Cree una nueva sesión. No hay decision en una sesión failed |
errored | Un fallo de plataforma detuvo la evaluación. Alcanzable solo en verificaciones server-to-server | Repita la llamada con una Idempotency-Key nueva. No hay decision, y nada llegó a un revisor |
status nunca nombra un veredicto.
decision — solo en decisionamiento gestionado
decision | Significado | Qué hacer |
|---|---|---|
approved | La verificación quedó aprobada | Continúe con el onboarding |
declined | La verificación no quedó aprobada | No continúe. Las filas failed en checks dicen el motivo |
inconclusive | La evidencia no resolvió el caso en ninguna dirección — final | No continúe. No es una decisión en contra del cliente, así que una captura nueva y más nítida puede resolverlo |
in_review | Un humano está decidiendo — no es final | Trátela como pendiente. Vea Revisión Manual |
Dos modos de decisionamiento. Bajo decisionamiento no gestionado — el predeterminado — Inyo publica la evaluación y usted decide: checks y trustIndex están ahí, y decision está totalmente ausente del payload. Bajo decisionamiento gestionado Inyo además llega a un veredicto, que es el campo decision, y puede enrutar la sesión a un revisor humano antes.
La clave queda ausente, no
null."decision" in payloaddistingue "nunca le íbamos a dar una decisión" de una decisión que no pudimos alcanzar — esta última no existe.
Cómo leer checks[]
Cada verificación tiene exactamente seis campos: name, status, group, severity, reason, detail.
| Campo | Qué hacer con él |
|---|---|
status | "passed", "failed", "undetermined" o "not_evaluated". Es la autoridad — no lo vuelva a derivar a partir de detail |
severity | "critical", "high", "medium" o "low", de la más pesada a la más leve — cuánto peso carga esta verificación en esta verificación. Es un peso, nunca un destino, y es configurable: lea decision para el resultado en vez de derivarlo de aquí |
group | document, selfie, screening o policy. El grupo de un nombre nunca cambia, así que filtre por él en lugar de mantener sus propias listas de nombres |
reason | Un token estable en las filas undetermined y not_evaluated — provider_unavailable, no_mrz, y así. null en las demás |
detail | Texto para que lo lea una persona, incluido el umbral cuando la verificación tiene uno. Nunca ramifique según él — la redacción puede cambiar, el estado no |
El conjunto varía. Las verificaciones aparecen solo cuando son aplicables — una zona de lectura mecánica requiere un documento que la lleve, las de rostro requieren una selfie, varias se habilitan por cuenta. Recorra el arreglo; nunca lo indexe por posición.
Dos formas en que una verificación no llega a un veredicto, y ninguna es una constatación contra el cliente. undetermined significa que se ejecutó y no pudo concluir; not_evaluated significa que nunca obtuvimos veredicto — un proveedor inalcanzable, un dato que el documento no traía, una captura rechazada antes de su turno. Ambas se cobran como una fracción del peso de la verificación, en vez de ignorarse, y reason dice cuál fue. Una fila ausente es una tercera cosa: la verificación nunca fue aplicable.
Las verificaciones
Una fila por verificación. severity es configurable, así que cuánto cuesta una falla en sus verificaciones se define para su cuenta.
| Verificación | Grupo | Qué comprueba | Presente |
|---|---|---|---|
document_readable | document | Los campos centrales de identidad — número, nombre, fecha de nacimiento — se extrajeron todos del documento | Siempre |
document_not_expired | document | La fecha de vencimiento no está en el pasado | Cuando el documento la lleva |
document_authentic | document | Una revisión forense de cada lado enviado no encuentra recaptura, impresión, fotocopia ni falsificación. Los lados se fusionan en esta única fila, y detail nombra el veredicto de cada uno. Un rechazo se lee dos veces antes de sostenerse | Cuando está habilitada en su cuenta (por defecto: activada) |
document_scene_clear | document | Ningún teléfono, monitor o pantalla es visible en ninguna parte del cuadro. Lee la imagen entera, así que una pantalla detrás de un documento genuino también la dispara | Siempre |
document_mrz_valid | document | Los dígitos de control de la zona de lectura mecánica validan | Cuando el documento tiene MRZ |
document_barcode_valid | document | El código de barras del reverso contiene un registro de identidad bien formado. Un reverso ilegible publica not_evaluated con motivo no_barcode y no cuesta nada | Cuando el documento es una licencia de conducir o cédula de identidad estatal de EE. UU. |
document_sources_agree | document | Los datos de lectura mecánica del documento — la zona de un pasaporte, el código de barras de una licencia de EE. UU. — concuerdan con lo impreso en su anverso. Un desacuerdo nombra los campos que difieren, nunca sus valores | Cuando el documento arrojó datos de lectura mecánica y su anverso arrojó campos para comparar |
document_number_valid | document | El número coincide con el formato conocido de su jurisdicción. Consultivo — las tablas de formato son públicas pero imperfectas | Cuando existe una regla para esa jurisdicción |
document_data_match | document | Los datos que envió concuerdan con el documento | Cuando establece dataCheck: true y el documento arrojó una identidad |
document_type_match | document | El documento es del tipo que declaró. El tipo se lee de las imágenes y se compara con prefill.documentType; sin un tipo declarado, la verificación publica not_evaluated en lugar de un veredicto | Siempre |
face_detected | selfie | Exactamente un rostro utilizable — no ojos cerrados, gafas de sol ni cabeza muy girada | Cuando se capturó una selfie |
liveness | selfie | La selfie es de una persona viva, no de una reproducción | Cuando se capturó una selfie |
face_match | selfie | La selfie es de la misma persona del retrato del documento | Cuando se capturó una selfie |
age_match | selfie | La fecha de nacimiento del documento concuerda con la edad estimada a partir de la selfie, dentro de una tolerancia definida para su cuenta. Una estimación es un indicio, no una prueba | Cuando la descripción de apariencia está habilitada (por defecto: desactivada), la selfie arrojó un rostro utilizable y el documento arrojó una fecha de nacimiento |
sanctions_clear | screening | El nombre no coincide con una lista OFAC SDN cuya fecha de nacimiento también concuerde. Una coincidencia que no se puede confirmar publica undetermined — vea Cribado de sanciones | Cuando el cribado está habilitado en su cuenta (por defecto: desactivado) y el documento arrojó una identidad |
dmv_record_match | screening | Los datos extraídos de una licencia de EE. UU. concuerdan con el registro del DMV emisor | Cuando la verificación de DMV está habilitada (por defecto: desactivada) y el documento arrojó una identidad |
jurisdiction_accepted | policy | El país emisor es uno que usted acepta para ese tipo de documento | Cuando ha configurado jurisdicciones aceptadas |
capture_attempts | policy | El cliente no agotó el límite de reintentos — vea Entrega por el widget | Solo en el flujo del widget |
Comparación de prefill
Cuando usted envía prefill, el resultado reporta cómo coincidió cada campo comparable. prefillMismatches es la lista corta de nombres de campos que no coincidieron; prefillComparison incluye el detalle:
"prefillComparison": [
{ "field": "lastName", "sent": "Silva", "received": "SILVA SANTOS", "match": true, "method": "subset", "score": 0.95, "threshold": 0.85 },
{ "field": "dateOfBirth", "sent": "1988-03-04", "received": "1988-03-04", "match": true, "method": "exact", "score": null, "threshold": null },
{ "field": "issuingState", "sent": "Florida", "received": "FL", "match": true, "method": "normalized", "score": null, "threshold": null }
]
| Campo | Descripción |
|---|---|
field | Uno de firstName, lastName, dateOfBirth, documentType, documentNumber, nationality, issuingState, issuingCountry |
sent / received | Su valor, y el valor leído del documento |
match | Si se consideran iguales |
method | Para nombres: exact, subset (un apellido compuesto que contiene el suyo, con puntaje 0.95), fuzzy (puntuación de similitud) o empty. Para estados y tipos de documento: normalized. En los demás casos exact |
score / threshold | Similitud de nombres y el umbral de aceptación, null para campos que no son nombres |
Los campos ausentes en cualquiera de los dos lados no se comparan, así que nunca aparecen — el issuingState de un pasaporte es uno de ellos, ya que ningún pasaporte evidencia subdivisión. Envíe el país en issuingCountry, que sí se compara. Los nombres usan coincidencia difusa — acentos eliminados, apellidos compuestos aceptados como coincidencias de subconjunto, errores cercanos de OCR tolerados hasta el umbral — de modo que la variación ortográfica ordinaria no crea falsos desacuerdos. Los estados y tipos de documento se normalizan primero, y por eso Florida coincide con FL.
Un desacuerdo solo afecta la decisión cuando usted establece dataCheck: true, lo que agrega la verificación document_data_match. Sin eso, la comparación es informativa.
Descripción de la selfie
null a menos que la descripción de apariencia esté habilitada para su tenant. Cuando está presente, incluye atributos observables de la selfie para una comparación posterior de re-verificación:
"selfieDescription": {
"estimatedAgeLow": 30,
"estimatedAgeHigh": 40,
"skinTone": "light",
"eyeColor": "brown",
"hairColor": "dark brown",
"hairStyle": "shoulder length, straight",
"facialHair": "none",
"eyewear": "none",
"headwear": "none",
"distinguishingFeatures": ["small scar above left eyebrow"],
"notes": null
}
Cualquier atributo que no pueda observarse es null.
Las descripciones de apariencia son datos personales sensibles. Conllevan exposición bajo el RGPD y leyes de privacidad biométrica (por ejemplo BIPA), y la selfie es procesada por un servicio de visión externo. Confirme que tiene una base legal, un acuerdo de procesamiento de datos vigente y una justificación de retención documentada antes de pedirnos habilitar esto.
Cribado de sanciones
Desactivado por defecto, y habilitado por tenant por Inyo cuando se solicita. Cuando está activo, el nombre extraído del documento se criba contra la lista OFAC de Nacionales Especialmente Designados (SDN).
Un nombre que coincide no es una persona
Dos tokens de nombre comunes aparecen en muchos nombres listados, así que una coincidencia de nombre por sí sola nunca rechaza. La confirmación es por fecha de nacimiento, y el resultado es el status de la única verificación sanctions_clear:
| Resultado | sanctions_clear | Efecto |
|---|---|---|
| Ninguna coincidencia en su umbral o por encima | "passed" | sin cambio |
| Una coincidencia y su fecha de nacimiento concuerda | "failed" | cobrada con el peso total de esta verificación |
| Una coincidencia, pero ninguna fecha de nacimiento concuerda | "undetermined" | cobrada menos — una coincidencia sin confirmar no es una constatación |
Nada ambiguo se resuelve hacia la aprobación. Base sus decisiones en status. El umbral de aceptación se configura por tenant — consulte a su contacto en Inyo cuál es el suyo.
El bloque screening
Presente solo cuando se entregó una coincidencia — es decir, junto a un sanctions_clear que está failed (coincidencia confirmada) o undetermined (sin confirmar). Está ausente cuando el cribado sale limpio, por lo que su presencia significa "hay algo que adjudicar", no "el cribado se ejecutó".
"screening": {
"matches": [
{
"name": "SAMPLE, Ali Hassan",
"sourceList": "us_ofac",
"programs": ["SDGT"],
"entityId": "12345",
"score": 91.5,
"dobAgrees": true
}
]
}
| Campo | Significado |
|---|---|
name | El nombre de la entidad listada, tal como se publica |
sourceList | Siempre us_ofac hoy |
programs | Programas de sanciones de OFAC a los que pertenece la entrada |
entityId | Identificador de la entrada, para consultarla en la fuente |
score | Similitud de nombre, 0-100 |
dobAgrees | true, false, o null cuando es indecidible — la fecha de nacimiento del documento no pudo leerse, o la entrada no publica ninguna |
Se entregan como máximo cinco coincidencias — suficientes para distinguir una coincidencia única plausible de un grupo obvio de colisiones. Solo aparecen candidatos en su umbral o por encima.
Una particularidad que conviene saber al adjudicar: OFAC publica fechas imprecisas colapsadas al 1 de enero, así que un candidato listado en ese día se compara solo por año. Para quien nació genuinamente el 1 de enero eso afloja la correspondencia, en dirección al rechazo.
Su cliente nunca sabe que una coincidencia de sanciones fue lo que lo rechazó. La respuesta de rechazo es idéntica byte a byte a cualquier otro fallo sin reintento.
Si el cribado no está disponible
El cribado falla abierto: una caída del proveedor omite la verificación en vez de bloquear o rechazar. Nada en el resultado entregado distingue una sesión que se entregó sin cribar de una que se cribó y salió limpia — en ese caso simplemente no existe ninguna fila sanctions_clear. Si necesita evidencia positiva de que toda verificación fue cribada, compruebe la presencia de esa verificación, no la ausencia de coincidencia.
Próximos pasos
- Revisión Manual — qué significa
in_reviewy cómo cambia una decisión - Recepción de Resultados — cómo le llega este payload
