Extracción de datos del documento

Integración del Servicio Extracción de datos del documento en KYC JAAK para Android

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
   @POST("api/v3/document/extract-both")
    suspend fun documentExtraBothApi(@Header("Authorization") auth: String,
                                     @Body request: DocumentExtraBothRequest): Response<DocumentExtraBothResponse>

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
  }
}
data class DocumentExtraBothRequest(
    @SerializedName("imageFront") val documentFront: String, //base64
    @SerializedName("imageBack") val documentBack: String //base64
    @SerializedName("documentSessionSelected") val documentSessionSelected: DocumentSessionSelected
)

data class DocumentSessionSelected(
    @SerializedName("country") val 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": {}
            }
        }
    }
}
data class DocumentExtraBothResponse(
    @SerializedName("eventId") val eventId: String,
    @SerializedName("requestId") val requestId: String,
    @SerializedName("status") val status: Boolean,
    @SerializedName("message") val message: String,
    @SerializedName("documentType") val documentType: DocumentTypeExtraBoth,
    @SerializedName("documentData") val documentData: DocumentDataExtraBoth,
    @SerializedName("documentMetadata") val documentMetadata: String,
    @SerializedName("processingTime") val processingTime: String, // milliseconds
    @SerializedName("state") val state: DocumentStateExtraBoth
)
    data class DocumentTypeExtraBoth(
    @SerializedName("type") val type: String,
    @SerializedName("side") val side: String,
    @SerializedName("country") val country: String,
    @SerializedName("icaoCode") val icaoCode: String
)
data class DocumentDataExtraBoth(
    @SerializedName("generalData") val generalData: GeneralDataExtraBoth,
    @SerializedName("mechanicalReadingZone") val mechanicalReadingZone: String,
    @SerializedName("specificData") val specificData: List<SpecificDataExtraBoth>
)
data class GeneralDataExtraBoth(
    @SerializedName("name") val name: String,
    @SerializedName("birthdate") val birthdate: String, // yyyy-mm-dd
    @SerializedName("gender") val gender: String,
    @SerializedName("nationality") val nationality: String,
    @SerializedName("documentNumber") val documentNumber: String
)
data class SpecificDataExtraBoth(
    @SerializedName("field") val field: String?,
    @SerializedName("value") val value: String?
)
data class DocumentStateExtraBoth(
    @SerializedName("message") val message: String,
    @SerializedName("isExpired") val isExpired: Boolean,
    @SerializedName("isUnderAge") val isUnderAge: Boolean,
    @SerializedName("supportedDocument") val supportedDocument: Boolean
)
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
typestringPrimer nombre del usuario
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.