KYC JAAK para API

En este apartado explicaremos cómo hacer una implementación de KYC JAAK para API. Antes de comenzar es necesario haber consultado la sección KYC JAAK ya que será necesario contar con un Short Key.

Requisitos

Todas las llamadas API que realizaremos a continuación será mediante la arquitectura REST (Representational State Transfer), con el estándar web HTTP (HyperText Transfer Protocol) y firmando la comunicación con el formato JSON (JavaScript Object Notation).
Recomendamos tener un conocimiento por lo menos básico de estos 3 conceptos para poder continuar con esta guía.


Intercambio de Short Key por Token de Sesión de KYC

Un Short Key es un identificador único de una Sesión KYC. Para poder realizar llamadas a los Servicios JAAK que forman parte de una Sesión KYC, es fundamental autenticarse y autorizar dichas llamadas conociendo el origen de la sesión. Para ello, se utiliza un Token de Sesión KYC, el cual podemos obtener a partir del Short Key.

Para obtener un Token de Sesión KYC a partir de un Short Key debemos hacer la siguiente llamada API:

URL

POST https://sandbox.api.jaak.ai/api/v1/kyc/session

Header

Short-Key: String
Origin-Device String
ParámetroTipoRequeridoDescripción
Short-KeystringSiShort Key de la Sesión KYC de la cual queremos obtener un Token de Sesión KYC.
Origin-DevicestringSiIdentificador desde donde se realizará la Sesión KYC para esta guía seria API

Request

{}

Response

{
  "accessToken": String,
  "step": Integer,
  "sessionId": String,
  "assets": {
    "document": null | String,
    "liveness": null | String,
  },
  "document": String
}
CampoTipoDescripción
accessTokenstringToken de Sesión KYC creado a partir de Short Key proporcionado.
stepintegerNúmero entero que representa el paso actual del proceso.
sessionIdstringIdentificador único de la sesión.
assetsstringContiene información sobre los activos asociados al proceso.
documentstringCódigo del documento procesado (ejemplo: "MEX" para México).

Objeto assets

CampoTipoDescripción
documentstringInformación del documento asociado (puede ser null o un valor).
livenessstringInformación sobre la prueba de vida (puede ser null o un valor).

Todas las siguientes llamadas API deben ser autenticadas mediante una cabecera denominada "Authorization", cuyo valor debe ser "Bearer token-sesion-kyc".
El cual puedes obtenerlo del la propiedad accessToken.


Una vez hecho el intercambio del Short Key y obtenido el Token de Sesión KYC, ya podemos hacer uso de los Servicios JAAK asignados para realizar un proceso KYC.


Servicios JAAK

El proceso KYC JAAK para API requiere de una serie de servicios esenciales, diseñados para verificar la identidad de una persona de manera detallada. Cada uno de los Servicios JAAK mencionado a continuación desempeña un papel fundamental para garantizar que el proceso sea seguro, preciso y cumpla con las normativas legales.

Todos los servicios proporcionados por JAAK son vitales para fortalecer la seguridad del proceso KYC y garantizar su fiabilidad. Además, aseguran el cumplimiento de las normativas internacionales, protegiendo la identidad y los documentos de los clientes durante todo el proceso.

A continuación se detallan cada uno de estos servicios:


1. Geolocalización

El servicio de Geolocalización de JAAK se utiliza para registrar la ubicación (latitud y longitud) donde se lleva a cabo la Sesión KYC. Es importante tener en cuenta que la ubicación es recolectada desde el dispositivo que utiliza el usuario final para realizar la Sesión KYC.

Realiza la siguiente llamada API para registrar la ubicación del dispositivo en la Sesión KYC.


URL

POST https://sandbox.api.jaak.ai/api/v1/kyc/session/location

Header

Authorization: Bearer token-session-kyc
CampoTipoRequeridoDescripción
AuthorizationstringSiEn esta cabecera se debe enviar el Token de Sesión KYC que se ha obtenido del intercambiado con de Short Key

Request

{ 
    "latitude": Double,
    "longitude": Double
}
CampoTipoRequeridoDescripción
latitudedoubleSiLatitud de la posición obtenida por el dispositivo y que se registrara en la Sesión KYC.
longitudedoubleSiLongitud de la posición obtenida por el dispositivo y que se registrara en la Sesión KYC.

Response

{}

El servicio de Geolocalización no tiene un impacto directo en los resultados finales de la sesión, pero es una herramienta útil para la recopilación de datos y en algunos casos, como el financiero, necesaria para llevar a cabo sus procesos.

Continuemos con el siguiente paso...


2. Verificación de documento

La etapa de verificación de documento tiene como objetivo principal validar la autenticidad de los documentos presentados por el usuario, como identificaciones oficiales y así prevenir el fraude con documentos falsos, alterados o que no corresponden a un documento legítimo.

En algunas ocasiones existen documentos que tienen anverso y reverso, de ahí dependerá si se captura una o dos imágenes por documento para usar este servicio, estas imágenes de dichos documentos deben ser convertidas a Base64 antes de ser enviadas al servicio. Por lo tanto, es fundamental realizar el proceso de codificación de imagen para asegurar su correcta transmisión y procesamiento.

Realiza la siguiente llamada API enviando las imágenes o imagen del documento.


URL

POST https://sandbox.api.jaak.ai/api/v3/document/verify

Header

Authorization: Bearer token-session-kyc
CampoTipoRequeridoDescripción
AuthorizationstringSiEn esta cabecera se debe enviar el Token de Sesión KYC que se ha obtenido del intercambiado con de Short Key

Request

{
    "imageFront": String,
    "imageBack": String,
    "dataVerification": Boolean
}
CampoTipoRequeridoDescripción
imageFrontstringImagen del anverso del documento en formato Base64. Es obligatorio proporcionar esta imagen para la verificación.
imageBackstringOpcionalImagen del reverso del documento en formato Base64. Debe incluirse si el documento tiene una contraparte posterior.
dataVerificationbooleanOpcionalPor defecto false. Si se establece en true, la API realizará una comparación de los datos del documento con la base de datos de RENAPO (solo disponible para documentos emitidos en México).

Response

{
    "eventId": String,
    "requestId": String,
    "evaluation": String,
    "document": {
        "type": String,
        "side": String,
        "country": String,
        "icaoCode": String
    },
    "state": {
        "documentCompleteSides": Boolean,
        "dataConsistent": Boolean,
        "documentLiveness": Boolean,
        "securityFeatures": Boolean,
        "documentValidity": Boolean,
        "imageQuality": Boolean,
        "handPresence": Boolean,
        "message": String,
        "validations": {
            "namesMatch": Boolean,
            "lastNameMatch": Boolean,
            "birthDateMatch": Boolean,
            "personalIdNumberMatch": Boolean,
            "message": String
        },
        "photoForgery": Boolean
    },
    "processTime": Integer
}
CampoTipoDescripción
eventIdstringID para trazabilidad de los detalles del evento.
requestIdstringID para trazabilidad de la petición.
evaluationstringResultado de la evaluación del documento.
documentobjectInformación del documento analizado.
stateobjectResultados de diferentes verificaciones sobre el documento.
processTimeintegerTiempo de procesamiento de la verificación en milisegundos.

Objeto document

CampoTipoDescripción
typestringTipo de documento. Ver lista
sidestringIndica si el documento tiene ambos lados o solo uno.
countrystringPaís donde se emite el documento.
icaoCodestringCódigo ICAO asociado al documento.( Descargar lista )

Objeto state

CampoTipoDescripción
documentCompleteSidesbooleanIndica si el documento ha sido capturado completamente por todos los lados requeridos.
dataConsistentbooleanValida si la información contenida en el documento es coherente y no presenta inconsistencias.
documentLivenessbooleanVerifica que el documento sea una identificación física y no una imagen impresa, fotocopia o una fotografía mostrada en una pantalla digital.
securityFeaturesbooleanDetermina si el documento cumple con los elementos de seguridad esperados, como sellos holográficos, logotipos, tipografía y otras características antifraude.
documentValiditybooleanIndica si el documento está vigente y no ha expirado.
imageQualitybooleanEvalúa la calidad de la imagen del documento para garantizar una verificación precisa.
handPresencebooleanDetecta si hay manos sosteniendo la identificación durante la captura de la imagen.
photoForgerybooleanIndica si la imagen del documento ha sido manipulada digitalmente con herramientas de edición.
validationsobjectValidaciones especificas de documentos mexicanos
messagestringProporciona detalles adicionales en caso de errores o discrepancias con los resultados esperados.

Objeto state.validations

CampoTipoDescripción
namesMatchbooleanVerifica si el nombre extraído del documento coincide con el nombre asociado al número de identificación personal (CURP en el caso de México) según la base de datos de RENAPO.
lastNameMatchbooleanComprueba si el apellido extraído del documento coincide con el apellido asociado al número de identificación personal (CURP en el caso de México) según la base de datos de RENAPO.
birthDateMatchbooleanIndica si la fecha de nacimiento extraída del documento coincide con la registrada en la base de datos de RENAPO para el número de identificación personal (CURP en el caso de México).
personalIdNumberMatchbooleanValida si el número de identificación personal extraído del documento coincide con el CURP en la base de datos de RENAPO.
messagestringMensaje que proporciona información adicional en caso de discrepancia en las validaciones.

El objeto state, ubicado dentro del Response, muestra el estado de verificación del documento a lo largo del proceso de validación. Este objeto incluye un grupo de propiedades que indican si el documento cumple o no con los requisitos de autenticidad, calidad y consistencia.

JAAK recomienda que todas las propiedades de verificación se completen con éxito para una mayor seguridad, aunque esto no es obligatorio por lo tanto puedes seleccionar solo un conjunto de propiedades según sus necesidades. Algunos ejemplos incluyen:

  • Aceptar la verificación si todas las validaciones son exitosas.
  • Solicitar una nueva captura si la calidad de la imagen es baja o faltan elementos claves.
  • Rechazar la verificación si se detectan manipulaciones o inconsistencias graves en los datos.

Cada propiedad dentro de state juega un papel específico en la verificación del documento y pueden ser usadas para tomar decisiones y ser integradas en su sistema de verificación.

La propiedad dataVerification dentro de Request, cuando se establece como true, proporciona validaciones adicionales sobre los datos de los documentos mexicanos. Estas validaciones, que se encuentran en state.validations de Response, se realizan exclusivamente para documentos mexicanos a través de entidades oficiales como RENAPO. Para identificaciones de otras nacionalidades, todas las validaciones serán false debido a la incompatibilidad del servicio con estos documentos.

Después de verificar y validar el documento, se puede proceder a la extracción de datos en el siguiente paso, es importante recordar que las mismas imagenes enviadas en este paso se usaran en el siguiente para buscar tener la mayor coherencia en la Sesión KYC.


3. Extracción de datos del documento

El objetivo de la extracción de datos, es capturar y organizar la información del documento para facilitar su análisis y almacenamiento. Esta información se utilizará posteriormente en los siguientes pasos como la verificación de la titularidad del documento y la búsqueda de datos en listas negras.

Para asegurar la coherencia y eficiencia del proceso, es esencial que uses las mismas imágenes del documento tanto en el paso de verificación del documento como en este paso. Recuerda que la codificación de la imagen a Base64 es crucial antes de enviarlas al servicio para garantizar su correcta transmisión y procesamiento.

Realiza la siguiente llamada API enviando las imágenes o imagen del documento.

URL

POST https://sandbox.api.jaak.ai/api/v4/document/extract

Header

Authorization: Bearer token-session-kyc
CampoTipoRequeridoDescripción
AuthorizationstringEn esta cabecera se debe enviar el Token de Sesión KYC que se ha obtenido del intercambiado con de Short Key

Request

{
  "imageFront": String,
  "imageBack": String,
  "documentSessionSelected": {
    "country": String
  }
}
CampoTipoRequeridoDescripción
imageFrontstringImagen del documento en formato Base64. Es obligatorio proporcionar esta imagen para la verificación.
imageBackstringopcionalImagen de la parte trasera del documento en formato Base64. Debe incluirse si el documento tiene una contraparte posterior.

Response

{
    "eventId": String,
    "requestId": String,
    "status": String,
 		"processingTime": String,
     "state": {
        "message": String,
        "documentCompleteSides": Boolean
    },
    "content": {
        "data": {
            "personal": {
                "firstName": String,
                "secondName": String,
                "surname": String,
                "motherSurname": String,
                "fullName": String,
                "sex": String,
                "dateOfBirth": String,
                "face": String,
                "placeOfBirth": String,
                "nationality": String,
                "maritalStatus": String,
                "extra": {
                    "ocr": String,
                    "registerYear": String,
                    "rfc": String
                }
            },
            "address": {
                "fullAddress": String,
                "postalCode": String,
                "extra": {
                    "street": String,
                    "externalNumber": String,
                    "internalNumber": String,
                    "neighborhood": String,
                    "city": String,
                    "state": String
                }
            },
            "document": {
                "type": String,
                "side": String,
                "country": {
                    "name": String,
                    "isoAlpha3Code": String,
                    "isoAlpha2Code": String,
                    "icaoCode": String
                },
                "number": String,
                "personalIdNumber": String,
                "additionalNumber": String,
                "dateOfIssue": String,
                "expiration": {
                    "date": String,
                    "isPermanent": Boolean
                },
                "issuingAuthority": String,
                "extra": {}
            }
        }
    }
}
CampoTipoDescripción
eventIdstringID para trazabilidad de la petición.
requestIdstringID para trazabilidad de la petición.
statusstringEstado del procesamiento
processingTimestringTiempo de procesamiento de la verificación en milisegundos.
stateObjectEstado detallado del procesamiento de extracción
contentObjectContiene la información del contenido extraído del documento

Objeto state

CampoTipoDescripción
documentCompleteSidesbooleanIndica si el documento ha sido capturado completamente por todos los lados requeridos.
messagestringProporciona detalles adicionales en caso de errores o discrepancias con los resultados esperados.

Objeto content

CampoTipoDescripción
dataObjectContiene la información del usuario extraída del documento (ver sub-tablas)

Objeto content.data

CampoTipoDescripción
personalObjetoContiene la información de la persona extraída del documento
addressObjetoContiene la información de la dirección extraída del documento
documentObjetoContiene la información del documento extraída

Objeto content.data.personal

CampoTipoDescripción
firstNamestringPrimer nombre del usuario Se usa para el servicio de listas negras
secondNamestringSegundo nombre del usuario (puede estar vacío).Se usa para el servicio de listas negras
surnamestringApellido paterno del usuario.Se usa para el servicio de listas negras
motherSurnamestringApellido materno del usuario.Se usa para el servicio de listas negras
fullNamestringNombre completo del usuario.
sexstringGénero del usuario (H para hombre, M para mujer).
dateOfBirthstringFecha de nacimiento en formato DD/MM/AAAA.
facestringImagen de la cara del usuario en formato base64. Usa esta imagen para el servicio de One To One
placeOfBirthstringLugar de nacimiento (puede estar vacío).
nationalitystringNacionalidad del usuario.Se usa para el servicio de listas negras
maritalStatusstringEstado civil (puede estar vacío).
extraObjectInformación adicional obtenida del documento
extra.ocrstringNúmero OCR del documento(puede estar vacío).Se usa para el servicio de listas negras
extra.registerYearstringAño de registro del documento(puede estar vacío).
extra.rfcstringRegistro Federal de Contribuyentes (RFC) del usuario(puede estar vacío)(Documentos mexicanos)Se usa para el servicio de listas negras

Objeto content.data.address

CampoTipoDescripción
fullAddressstringDirección completa del usuario en formato texto.
postalCodestringCódigo postal del domicilio.
extra.streetstringCalle del domicilio.
extra.externalNumberstringNúmero exterior del domicilio.
extra.internalNumberstringNúmero interior del domicilio (puede estar vacío).
extra.neighborhoodstringGénero del usuario (H para hombre, M para mujer).
extra.citystringCiudad de residencia.
extra.statestringEntidad estatal de residencia.

Objeto content.data.document

CampoTipoDescripción
typestringTipo de documento. Ver lista
sidestringLados del documento procesados (BOTH para ambos lados).
countryObjectInformación del país emisor
numberstringNúmero del documento de identidad.
personalIdNumberstringNúmero de identificación personal asociado al usuario.Se usa para el servicio de listas negras
additionalNumberstringNúmero de identificación adicional del documento(puede estar vacío).Se usa para el servicio de listas negras
dateOfIssuestringFecha de emisión del documento.
expirationObjectDatos de expiración del documento
issuingAuthoritystringAutoridad emisora del documento (puede estar vacío).
extraObjectInformación adicional obtenida del documento(puede estar vacía).

Objeto content.data.document.country

CampoTipoDescripción
namestringNombre del país emisor.
isoAlpha3CodestringCódigo ISO Alpha-3 del país
isoAlpha2CodestringCódigo ISO Alpha-2 del país
icaoCodestringCódigo ICAO del documento

Objeto content.data.document.expiration

CampoTipoDescripción
datestringFecha de vencimiento del documento.
isPermanentbooleanIndica si el documento es permanente

El objeto state, ubicado dentro del Response, muestra el estado de la extracción del documento. Este objeto incluye un grupo de propiedades que indican si el documento cumple o no con los requisitos de la extracción.

JAAK recomienda que todas las propiedades de extracción se completen con éxito para una mayor seguridad, aunque esto no es obligatorio por lo tanto puedes seleccionar solo un conjunto de propiedades según sus necesidades. Algunos ejemplos incluyen:

  • Pedir la captura del lado faltante o contraparte del documento en caso de ser requerido.
  • Solicitar una nueva captura si existe un error dentro la extracción de los datos del documento.

De los datos extraídos del documento en esta etapa, hay algunos que serán utilizados en los siguientes pasos del proceso. En la sección Verificación en listas negras los datos que se necesitan son:

Verificación del servicio INE en listas negras

  • content.data.document.additionalNumber (CIC)
  • content.data.personal.extra.ocr (OCR)

Verificación del servicio INTERPOL en listas negras

  • content.data.personal.name
  • content.data.personal.secondName
  • content.data.personal.sureName
  • content.data.personal.motherSurname

Verificación del servicio OFAC en listas negras

  • content.data.personal.name
  • content.data.personal.secondName
  • content.data.personal.sureName
  • content.data.personal.motherSurname

Verificación del servicio RENAPO en listas negras

  • content.data.document.personalIdNumber (CURP)

Verificación del servicio SAT en listas negras

  • content.data.personal.name
  • content.data.personal.secondName
  • content.data.personal.sureName
  • content.data.personal.motherSurname
  • content.data.personal.extra.rfc

En la sección Verificación de la titularidad del documento, el dato necesario obtenido de esta extracción es:

  • content.data.personal.face

Una vez extraídos e identificados los datos del documento los utilizaremos en los siguientes pasos.


4. Verificación de datos en listas negras

Una vez extraídos los datos del documento en el paso anterior, procedemos a verificar esta información contra diversos servicios de listas negras como: Interpol y OFAC. Este paso es crucial para asegurar que el cliente no esté relacionado con actividades ilícitas ni vinculado a personas o entidades de alto riesgo. A su vez, hay información que sí deben ser encontrados en otras listas, que no necesariamente son catalogadas como listas negras, como: INE, RENAPO y SAT.

Los servicios de listas negras a los que se tiene acceso en este paso son: INE, Interpol, OFAC, RENAPO y SAT.

En esta etapa, puedes buscar en diferentes servicios de listas negras, pero solo uno a la vez. Cada servicio requiere información específica. La firma para usar estos servicios es la misma para todos, pero los datos que debes enviar varían según la lista que consultes. Después de la explicación de la URL y sus parámetros que se muestra a continuación, encontrarás una serie de tablas que aclaran qué campos debes enviar por servicio y cómo relacionarlos con la información obtenida en el paso anterior.


URL

POST https://sandbox.api.jaak.ai/api/v2/blacklist/investigate

Header

Authorization: Bearer token-session-kyc
CampoTipoRequeridoDescripción
AuthorizationstringEn esta cabecera se debe enviar el Token de Sesión KYC que se ha obtenido del intercambiado con de Short Key

Request

{
    "services": {
        "ine": Boolean,
        "interpol": Boolean,
        "ofac": Boolean,
        "renapo": {
            "curp": Boolean
        },
        "sat": {
            "sat69b": Boolean
        },
        "cdc": {
            "rccFico": Boolean
        }
    },
    "payload": {
        "person": {
            "name": String,
            "secondName": String,
            "lastName": String,
            "secondLastName": String,
            "birthDate": String,
            "nationality": String,
            "additionalLastName": String
        },
        "address": {
            "address": String,
            "neighborhood": String,
            "municipality": String,
            "city": String,
            "state": String,
            "postalCode": String
        },
        "identifications": {
            "curp": String,
            "rfc": String,
            "socialSecurityNumber": String,
            "electorKey": String,
            "ine": {
                "cic": String,
                "ocr": String
            }
        },
        "extras": {
            "commonId": String,
            "wantedIn": String
        }
    }
}
CampoTipoDescripción
servicesObjetoContiene los distintos servicios de listas negras en los que es posible realizar una verificación (ver sub-tablas)
payloadObjetoContiene la información a buscar del servicio elegido (ver sub-tablas)

Objeto services

CampotipoDescripción
inebooleanRealiza verificación en Instituto Nacional Electoral (INE).
interpolbooleanRealiza verificación en Interpol.
ofacbooleanRealiza verificación en Oficina de Control de Activos Extranjeros (OFAC).
renapo.curpbooleanRealiza verificación en Registro Nacional de Población (RENAPO).
sat.sat69bbooleanRealiza verificación en Servicio de Administración Tributaria (SAT).
cdc.rccFicobooleanRealiza verificación en Centro de Datos de Crédito (CDC).

Objeto payload

CampoTipoDescripción
payload.personObjetoContiene la información de respuesta (ver sub-tablas)
payload.addressObjetoContiene la información de respuesta (ver sub-tablas)
payload.identificationsObjetoContiene la información de respuesta (ver sub-tablas)
payload.extrasObjetoContiene la información de respuesta (ver sub-tablas)

Objeto payload.person

CampotipoDescripción
namestringPrimer nombre de la persona a buscar.
secondNamestringSegundo nombre de la persona a buscar.
lastNamestringPrimer apellido de la persona a buscar.
secondLastNamestringSegundo apellido de la persona a buscar.
birthDatestringFecha de nacimiento de la persona a buscar (Formato: YYYY-MM-DD).
nationalitystringNacionalidad del la persona a buscar.
additionalLastNamestringApellido adicional de la persona a buscar.

Objeto payload.address

CampotipoDescripción
addressstringCalle y número de la dirección de la persona a buscar.
neighborhoodstringColonia o barrio del usuario de la persona a buscar.
municipalitystringMunicipio o delegación de la persona a buscar.
citystringCiudad de residencia de la persona a buscar.
statestringEstado de residencia de la persona a buscar.
postalCodestringCódigo postal de la dirección de la persona a buscar.

Objeto payload.identifications

CampotipoDescripción
curpstringClave Única de Registro de Población (CURP) de la persona a buscar.
rfcstringRegistro Federal de Contribuyentes (RFC) de la persona a buscar.
socialSecurityNumberstringNúmero de Seguridad Social (NSS) de la persona a buscar.
electorKeystringClave de Elector del INE de la persona a buscar.
ineObjectObjeto con datos de la credencial del INE de la persona a buscar. (ver sub-tablas)

Objeto payload.identifications.ine

CampoTipoDescripción
cicstringCódigo de Identificación de la Credencial INE del documento a buscar.
ocrstringNúmero Oficial de Identificación (OCR) del documento a buscar.

Objeto payload.extras

CampotipoDescripción
commonIdstringIdentificador común del usuario (puede ser ID interno del sistema) de la persona a buscar.
wantedInstringCódigo del país donde se busca al usuario ("MEX" para México) de la persona a buscar.

Response

{
    "eventId": String,
    "responseId": String,
    "processTime": Double,
    "organization": String,
    "service": String,
    "result": {},
    "state": {
        "foundInService": Bolean,
        "mustBeFound": Boolean,
        "message": String
    }
}
CampoTipoDescripción
eventIdstringID para trazabilidad de los detalles del evento.
responseIdstringID de la respuesta.
organizationstringLa entidad gubernamental en la cual se apoya la consulta
servicestringEs el servicio de la entidad en el cual se realiza la consulta
processTimedoubleTiempo de procesamiento de la consulta del servicio
resultobjectObjeto con los datos de la persona encontrada si fuera el caso
stateobjectSon estados en el que te puedes apoyar para saber si fue encontrado la persona

Objeto state

Campo

Tipo

Descripción

foundInService

boolean

Indica si la persona fue encontrada en el servicio o no.

mustBeFound

boolean

Define si se espera encontrar la persona en el servicio para que el proceso sea exitoso o no. Por ejemplo: para OFAC el no encontrar a una persona en el servicio es un caso exitoso, por el contrario en INE si se encuentra a una persona es considerado como un caso exitoso.

message

string

Mensaje referente a la búsqueda de la persona en servicio


A continuación, se exhibirán una serie de tablas organizadas por servicio de listas. En estas tablas, se detallarán los campos necesarios para cada lista y su correspondencia con los datos extraídos del paso anterior.


Para hacer la verificación mediante el servicio INE deberás enviar los siguientes datos:

Campo enviado en la llamada APIRequeridoDato extraído del documento en el paso anterior
payload.identifications.ine.cicSicontent.data.document.additionalNumber
payload.identifications.ine.ocrSicontent.data.personal.extra.ocr

Para hacer la verificación mediante el servicio INTERPOL deberás enviar los siguientes datos:

Campo enviado en la llamada APIRequeridoDato extraído del documento en el paso anterior
payload.person.nameSicontent.data.personal.name
payload.person.secondNameNocontent.data.personal.secondName
payload.person.lastNameSicontent.data.personal.sureName
payload.person.secondLastNameNocontent.data.personal.motherSurname

Para hacer la verificación mediante el servicio OFAC deberás enviar los siguientes datos:

Campo enviado en la llamada APIRequeridoDato extraído del documento en el paso anterior
payload.person.nameSicontent.data.personal.name
payload.person.secondNameNocontent.data.personal.secondName
payload.person.lastNameSicontent.data.personal.sureName
payload.person.secondLastNameNocontent.data.personal.motherSurname

Para hacer la verificación mediante el servicio RENAPO deberás enviar los siguientes datos:

Campo enviado en la llamada APIRequeridoDato extraído del documento en el paso anterior
payload.identifications.curpSicontent.data.document.personalIdNumber

Para hacer la verificación mediante el servicio SAT deberás enviar los siguientes datos:

Campo enviado en la llamada APIRequeridoDato extraído del documento en el paso anterior
payload.person.nameSicontent.data.personal.name
payload.person.secondNameNocontent.data.personal.secondName
payload.person.lastNameSicontent.data.personal.sureName
payload.person.secondLastNameNocontent.data.personal.motherSurname
payload.identifications.rfcSicontent.data.personal.extra.rfc

A continuación, te mostraremos un ejemplo de una consulta al servicio de RENAPO

Request

{
    "services": {
        "ine": false,
        "interpool": false,
        "ofac": false,
        "renapo": {
            "curp": true
        },
        "sat": {
            "sat69b": false
        },
        "cdc": {
            "rccFico": false
        }
    },
    "payload": {
        "identifications": {
            "curp": "aqui va la curp"
        }
    }
}

Response

{
    "eventId": "749f88b9-ecce-4f4c-920a-f8ece706501a",
    "responseId": "",
    "processTime": 0.23123526573181152,
    "organization": "curp",
    "service": "validaCurp",
    "result": null,
    "state": {
        "message": "Investigation completed successfully",
        "foundInService": false,
        "mustBeFound": true
    }
}

Como se muestra en el ejemplo anterior, se realizó una consulta al servicio de RENAPO. En la solicitud, podemos observar que solo se activó un servicio, services.renapo.curp, y que únicamente se enviaron los campos necesarios para llevar a cabo la búsqueda de dicho servicio.

El campo state dentro del Response debería haber indicado que se encontró a una persona para que la búsqueda se considere exitosa. Sin embargo, el campo foundInService muestra que no se encontró a la persona.

En resumen, al contrastar los datos extraídos del documento con diversas listas negras, garantizamos la protección tanto de la empresa como de los usuarios. Este proceso asegura la integridad y el cumplimiento del sistema, ayudando a prevenir fraudes.

Una vez verificado los datos del documento en las listas negras continuemos con los siguientes pasos.


5. Verificación de vida

El objetivo de la verificación de vida o liveness es garantizar que la persona que está realizando el proceso de verificación de identidad es un ser humano real y no una imagen, un video o un intento de fraude. Esta etapa se realiza para prevenir el uso de fotografías o videos falsificados y proteger la integridad del proceso KYC.

Durante esta etapa, se lleva a cabo una validación biométrica para confirmar que la persona que está interactuando con el sistema es realmente quien dice ser. Utilizando tecnologías avanzadas de detección facial, esta verificación asegura que solo personas reales puedan completar el proceso de identificación.

Para utilizar este paso, se requiere un video de 5 segundos con el rostro de la persona a validar. Es esencial que la persona no lleve accesorios y que el video tenga buena iluminación.

Este video debe ser convertido a Base64 antes de ser enviado al servicio. Por lo tanto, es fundamental realizar el proceso de codificación de video para asegurar su correcta transmisión y procesamiento.

Realiza la siguiente llamada API para realizar el proceso de verificación de vida.

URL

POST https://sandbox.api.jaak.ai/api/v1/liveness/verify-and-bestframe

Header

Authorization: Bearer token-session-kyc
CampoTipoRequeridoDescripción
AuthorizationstringEn esta cabecera se debe enviar el Token de Sesión KYC que se ha obtenido del intercambiado con de Short Key

Request

{
  "video": String
}
CampoTipoDescipción
videostringVideo de la persona enviado en formato Base64

Response

{
    "eventId": String,
    "requestId": String,
    "processTime": String,
    "score": Double,
    "bestFrame": String,
    "state": {
        "isRealPerson": Boolean,
        "message": String
    }
}
CampoTipoDescripción
eventIdstringID para trazabilidad de los detalles del evento.
requestIdstringID para trazabilidad de la petición.
processTimestringTiempo de procesamiento de la verificación en milisegundos.
scoredoubleResultados de diferentes verificaciones sobre el procesamiento del video.
bestFramestringDetecta el mejor fotograma del video y genera una imagen en formato Base64
stateObjectoEstado detallado del procesamiento de verificación de vida.

Objeto state

CampoTipoDescripción
isRealPersonbooleanEsta bandera representa si la persona en el video es real y aprueba la verificación de vida.
messagestringProporciona detalles adicionales en caso de errores o discrepancias con los resultados esperados.

El valor true de la propiedad state.isRealPerson, dentro del Response de la llamada de prueba de vida, confirma que la verificación fue exitosa y no hubo ningún ataque.

Además, la misma respuesta nos devuelve una propiedad llamada bestFrame, que se utiliza para obtener el mejor fotograma del video, es decir, en el que aparece la persona con mejor posición, iluminación, etc. Este fotograma se utilizará en el siguiente paso.


6. Verificación de la titularidad del documento

La etapa final requiere una comparación entre dos imágenes para verificar que la persona que realiza el proceso KYC es la titular del documento. Se comparará la imagen del obtenida (bestFrame) durante el paso de verificación de vida con la imagen del rostro extraída del documento (content.data.personal.face) durante el paso de extracción de datos.

Así como en pasos anteriores, las imágenes deben estar en Base64 antes de ser enviadas al servicio. Por lo tanto, es fundamental realizar la verificación de las imagenes para asegurar su correcta transmisión y procesamiento.


URL

POST https://sandbox.api.jaak.ai/api/v2/oto/verify

Request

{
    "eventId": String,
    "image1": String,
    "image2": String
}
CampoTipoDescripción
eventIdstring(opcional) es la posibilidad de enviar un identificador unico para poder realizar un seguimiento de esta llamada
image1stringLa imagen 1 en Base64 para la comparación
image2stringLa imagen 2 en Base64 para la comparación

Response

{
    "eventId": String,
    "requestId": String,
    "score": Double,
    "distance": Double,
    "process_time": Integer,
    "metadata": {
        "image1": {
            "accessories": {
                "glass": Boolean,
                "sunGlass": Boolean,
                "hat": Boolean,
                "mask": Boolean
            },
            "image_quality": {
                "isCorrectBrightness": Boolean,
                "isCorrectBlur": Boolean,
                "isCorrectHeight": Boolean,
                "isCorrectWidth": Boolean,
                "isCorrectResolution": Boolean,
                "isCorrectVerticalRotation": Boolean,
                "isCorrectHorizontalRotation": Boolean,
                "isCorrectRotation": Boolean,
                "isCorrectSizeFace": Boolean,
                "isCorrectNumberFaces": Boolean
            }
        },
        "image2": {
            "accessories": {
                "glass": Boolean,
                "sunGlass": Boolean,
                "hat": Boolean,
                "mask": Boolean
            },
            "image_quality": {
                "isCorrectBrightness": Boolean,
                "isCorrectBlur": Boolean,
                "isCorrectHeight": Boolean,
                "isCorrectWidth": Boolean,
                "isCorrectResolution": Boolean,
                "isCorrectVerticalRotation": Boolean,
                "isCorrectHorizontalRotation": Boolean,
                "isCorrectRotation": Boolean,
                "isCorrectSizeFace": Boolean,
                "isCorrectNumberFaces": Boolean
            }
        }
    },
    "codes": null,
    "state": {
        "rejectedBadQuality": Boolean,
        "rejectedAccessories": Boolean,
        "isSamePerson": Boolean,
        "message": String
    }
}
CampoTipoDescripción
eventIdstringID para trazabilidad de los detalles del evento.
requestIdstringID para trazabilidad de la petición.
scoredoubleResultado de la evaluación del prueba de vida.
distancedoubleResultado de la evaluación normalizada del prueba de vida.
process_timeintegerTiempo de procesamiento de la verificación en milisegundos.
metadataobjectDatos adicionales sobre el análisis de la prueba de vida, como la búsqueda de accesorios y calidad de la imagen dentro de las imágenes comparadas
codesobjectLista de código de errores referente a calidad de imagen y accesorios encontrados dentro de las imagenes comparadas
stateobjectResultados de diferentes verificaciones sobre la prueba de vida.

Objeto state

CampoTipoDescripción
rejectedBadQualitybooleanBandera que determina si las imagenes no cumple con los minimos estándares de calidad
rejectedAccessoriesbooleanBandera que determina si las imagenes comparadas detectan accesorios
isSamePersonbooleanBandera que determina si ambas personas en las imagenes son la misma
messagestringMensaje que proporciona información adicional en caso de discrepancia en la comparación.

La propiedad state.isSamePerson nos permite asegurar que la persona que se está identificando en la verificación de vida sea la misma que la del documento proporcionado.

En resumen, si la propiedad state.isSamePerson es aceptada, entonces podemos considerar que la verificación de la titularidad del documento ha sido exitoso.

Es importante que finalices las sesiones KYC. Te explicaremos cómo hacerlo en el siguiente paso.


Finalización de la Sesión KYC

Una vez ejecutados los Servicios JAAK, se debe finalizar la Sesión KYC de manera adecuada mediante la API, esto garantiza la seguridad y un correcto funcionamiento del KYC JAAK.

El proceso de finalización se lleva a cabo mediante una llamada a la siguiente URL. Es esencial incluir el Token de Sesión KYC para informar la Sesión KYC que queremos finalizar.


URL

POST https://sandbox.api.jaak.ai/api/v1/kyc/session/finish

Header

Authorization: Bearer token-session-kyc
CampoTipoRequeridoDescripción
AuthorizationstringEn esta cabecera se debe enviar el Token de Sesión KYC que se ha obtenido del intercambiado con de Short Key

Request

{}

Response

{}

El estado HTTP 200 confirma que una sesión KYC se ha finalizado con éxito. Cualquier otro código de estado HTTP recibido de la llamada indicaría un error.

¡Excelente!

Si has llegado hasta aquí, ya tienes todo el conocimiento necesario para implementar correctamente un KYC JAAK.

Para poder ver el estado de tus sesiones y visualizarlas, continua con la guía en KYC JAAK donde te explicamos cómo hacerlo.