Verificación de datos en listas oficiales

Integración del Servicio Verificación de datos en listas oficiales en KYC JAAK para Android

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
@POST("api/v2/blacklist/investigate")
    suspend fun livenessVerifyApi(@Header("Authorization") auth: String,
                                  @Body request: InvestigateRequest): Response<InvestigateResponse>

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
        }
    }
}
 data class InvestigateRequest(
    @SerializedName("services") val services: Services,
    @SerializedName("payload") val payload: Payload
)

data class Services(
    @SerializedName("ine") val ine: Boolean,
    @SerializedName("interpol") val interpol: Boolean,
    @SerializedName("ofac") val ofac: Boolean,
    @SerializedName("renapo") val renapo: Renapo,
    @SerializedName("sat") val sat: Sat,
    @SerializedName("cdc") val cdc: Cdc
)

data class Renapo(
    @SerializedName("curp") val curp: Boolean
)

data class Sat(
    @SerializedName("sat69b") val sat69b: Boolean
)

data class Cdc(
    @SerializedName("rccFico") val rccFico: Boolean
)

data class Payload(
    @SerializedName("person") val person: Person,
    @SerializedName("address") val address: Address,
    @SerializedName("identifications") val identifications: Identifications,
    @SerializedName("extras") val extras: Extras
)

data class Person(
    @SerializedName("name") val name: String,
    @SerializedName("secondName") val secondName: String,
    @SerializedName("lastName") val lastName: String,
    @SerializedName("secondLastName") val secondLastName: String,
    @SerializedName("birthDate") val birthDate: String,
    @SerializedName("nationality") val nationality: String,
    @SerializedName("additionalLastName") val additionalLastName: String
)

data class Address(
    @SerializedName("address") val address: String,
    @SerializedName("neighborhood") val neighborhood: String,
    @SerializedName("municipality") val municipality: String,
    @SerializedName("city") val city: String,
    @SerializedName("state") val state: String,
    @SerializedName("postalCode") val postalCode: String
)

data class Identifications(
    @SerializedName("curp") val curp: String,
    @SerializedName("rfc") val rfc: String,
    @SerializedName("socialSecurityNumber") val socialSecurityNumber: String,
    @SerializedName("electorKey") val electorKey: String,
    @SerializedName("ine") val ine: Ine
)

data class Ine(
    @SerializedName("cic") val cic: String,
    @SerializedName("ocr") val ocr: String
)

data class Extras(
    @SerializedName("commonId") val commonId: String,
    @SerializedName("wantedIn") val 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
    }
}
data class InvestigateResponse(
    @SerializedName("eventId") val eventId: String,
    @SerializedName("responseId") val responseId: String,
    @SerializedName("processTime") val processTime: Double,
    @SerializedName("organization") val organization: String,
    @SerializedName("service") val service: String,
    @SerializedName("result") val result: Any?, // Puede ser null o un objeto, depende del uso
    @SerializedName("state") val state: InvestigationState
)

data class InvestigationState(
    @SerializedName("message") val message: String,
    @SerializedName("foundInService") val foundInService: Boolean,
    @SerializedName("mustBeFound") val mustBeFound: Boolean
)
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.