Document

"Document" de JAAK facilita la autenticación y extracción de datos de documentos de identificación oficiales utilizando tecnología de Reconocimiento Óptico de Caracteres (OCR). Esta funcionalidad está diseñada para mejorar los procesos de verificación de identidad, proporcionando una solución eficiente y segura para las necesidades de autenticación digital.


Empezando


Para proceder, es indispensable generar una clave API con un tiempo de expiración definido.

Este proceso puede completarse fácilmente mediante el panel de administrado. Esto garantiza un acceso seguro y gestionado a los recursos necesarios durante el tiempo estipulado.

Para más detalles, consulta la documentación específica de cada método disponible a través de los siguientes enlaces:


Proceso OCR y Verificación con el Servicio de Documentos

Para utilizar el servicio de OCR y autenticar un documento de identificación oficial, sigue estos pasos:

  1. Captura la Imagen: Obtén una foto o imagen del documento.
  2. Codifica en Base64: Convierte la imagen a una cadena en formato Base64. Para mas informacion sobre que es el formato Base64 ve a Base64.
  3. Endpoint de Extracción: Usa el endpoint /api/v4/document/extract para procesar la imagen y obtener detalles del documento.
  4. Endpoint de Verificación: Con los detalles obtenidos, usa el endpoint /api/v3/document/verify para verificar la autenticidad del documento.

Requisitos


  • Debes tener una fotografía del documento de identificación oficial, tanto delantera como trasera. Para pasaportes, la fotografía trasera no es necesaria.
  • Asegúrate de que la fotografía esté disponible en el dispositivo desde el cual se realizará la prueba.
    Necesitas una clave API válida de una empresa activa y configurarla como Bearer Token en el encabezado de tu solicitud.

Verify


POST basePath/api/v3/document/verify

Este endpoint verifica la veracidad de un documento, validando si una imagen es real o falsa. Sus resultados son de 0 a 1.

Descripción de la Solicitud

Petición

curl --request POST \
     --url https://sandbox.api.jaak.ai/api/v3/document/verify \
     --header 'Authorization: <token-de-acceso>' \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --data '{
     			"imageBack":"base64Image",
          "imageFront":"base64Image"
        }'
{
    "document": "imagenBase64",
    "documentType": 4,
    "eventId": "string"
}

Agrega localización

Si deseas agregar localización a la ejecución del evento agrega las cabeceras Longitude y Latitude con los valores numericos de la ubicación de la cual se esta ejecutando tu petición.

curl -X POST "https://sandbox.api.jaak.ai/api/v2/document/verify" \
     -H 'accept: application/json' \
     -H 'content-type: application/json' \
     -H 'Authorization: Bearer <api_key>' \
     -H 'Longitude: -70' \
     -H 'Latitude: 100' \
     -d '{...}'

Descripción de los parámetros

ParámetroDescripción
documentCadena codificada en Base64 que representa la imagen del documento.
documentTypeTipo de documento a validar.
eventIdIdentificador del evento.

Respuesta

{
  "document": {
    "country": "string",
    "icaoCode": "string",
    "side": "string",
    "type": "string",
    "evaluation": "SUCCESS | WARNING | REJECTED"
  },
  "eventId": "string",
  "processTime": "number",
  "requestId": "string",
  "state": {
    "dataConsistent": "boolean",
    "documentCompleteSides": "boolean",
    "documentLiveness": "boolean",
    "documentValidity": "boolean",
    "handPresence": "boolean",
    "imageQuality": "boolean",
    "message": "string",
    "securityFeatures": "boolean"
  }
} 

Descripción de los parámetros de respuesta.

ParámetroTipoDescripción
documentobjectInformación del documento procesado.
document.countrystringCódigo del país asociado al documento.
document.icaoCodestringCódigo ICAO del documento.
document.sidestringLado del documento (por ejemplo, "front" o "back").
document.typestringTipo de documento (por ejemplo, "passport" o "ID card").
document.evaluationstringResultado de la evaluación: SUCCESS, WARNING, o REJECTED.
eventIdstringIdentificador único del evento.
processTimenumberTiempo de procesamiento en milisegundos.
requestIdstringIdentificador único de la solicitud.
stateobjectEstado general de la validación del documento.
state.dataConsistentbooleanIndica si los datos son consistentes.
state.documentCompleteSidesbooleanIndica si el documento tiene ambos lados completos.
state.documentLivenessbooleanIndica si el documento pasó la validación de "liveness".
state.documentValiditybooleanIndica si el documento es válido.
state.handPresencebooleanIndica si se detectó la presencia de manos en el escaneo del documento.
state.imageQualitybooleanIndica si la calidad de la imagen es adecuada.
state.messagestringMensaje adicional sobre el estado del documento.
state.securityFeaturesbooleanIndica si se validaron las características de seguridad del documento.
Ejemplos de Solicitudes
{
    "document": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAYGBgYHBgcICAcKCwoLCg",
    "documentType": 4,
    "eventId": "69c0b6be-18aa-4ac7-89e4-32611ea498cf"
  }
{
    "eventId": "cfcd7ad3-508d-4a69-bfab-47112260295c",
    "requestId": "cfcd7ad3-508d-4a69-bfab-47112260295c",
    "status": true,
    "evaluation": 1,
    "message": "",
    "processTime": 340
}


OCR (Deprecado)


POST basePath/api/v3/document/extract-both

Este endpoint hace la extraccion de la informacion de un documento.

Descripción de la Solicitud

Petición

curl --request POST \
     --url https://sandbox.api.jaak.ai/api/v4/document/extract \
     --header 'Authorization: <token-de-acceso>' \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --data '{
     					"documentFront": "base_64_document_back",
     					"documentBack": "base_64_document_back" // documento trasero opcional
          }'
Agrega localización

Si deseas agregar localización a la ejecución del evento agrega las cabeceras Longitude y Latitude con los valores numericos de la ubicación de la cual se esta ejecutando tu petición.

curl -X POST "https://sandbox.api.jaak.ai/api/v3/document/extract-both" \
     -H 'accept: application/json' \
     -H 'content-type: application/json' \
     -H 'Authorization: Bearer <api_key>' \
     -H 'Longitude: -70' \
     -H 'Latitude: 100' \
     -d '{...}'

Descripción de los parámetros

ParámetroDescripción
documentFrontCadena codificada en Base64 que representa la imagen del documento.
documentBackCadena codificada en Base64 que representa la imagen del documento.

Respuesta

{
  "eventId": "d99fe2d2-c0c3-4396-bd97-a502b4c30fa3",
  "requestId": "d99fe2d2-c0c3-4396-bd97-a502b4c30fa3",
  "status": true,
  "message": "Document: context deadline exceeded",
  "documentType": {
    "type": "INE",
    "side": "front",
    "country": "Mexico",
    "icaoCode": "MEX"
  },
  "documentData": {
    "generalData": {
      "name": "John Doe",
      "birthdate": "1990-01-01",
      "gender": "Male",
      "nationality": "Mexican",
      "documentNumber": "ID123456789"
    },
    "mechanicalReadingZone": "IDMEX1836577170",
    "specificData": [
      {
        "field": "address",
        "value": "123 Main St"
      },
      {
        "field": "city",
        "value": "Mexico City"
      }
    ]
  },
  "documentMetadata": "NOMBRE SEXO...",
  "processingTime": "40848",
  "state": {
    "message": "Document is valid",
    "isExpired": false,
    "isUnderAge": false,
    "supportedDocument": true
  }
}
Descripción de los parámetros de respuesta.
ParámetroDescripción
eventIdIdentificador único del evento que originó la respuesta.
requestIdIdentificador de la solicitud asociada con este evento. Generalmente es el mismo que el eventId.
statusIndica si la operación fue exitosa (true) o si hubo un error (false).
messageMensaje que proporciona detalles sobre el estado del procesamiento o posibles errores que ocurrieron.
documentTypeInformación sobre el tipo de documento procesado, incluyendo el tipo, lado, país de emisión y código ICAO.
documentDataDatos extraídos del documento mediante OCR, que incluyen datos generales, zona de lectura mecánica y datos específicos.
documentMetadataDatos crudos del OCR procesados. Contiene la información completa extraída del documento antes de ser formateada.
processingTimeTiempo de procesamiento del documento en milisegundos.
stateEstado del documento tras el procesamiento, que indica si está expirado, si el titular es menor de edad y si el documento es compatible con el sistema.
Ejemplos de Solicitudes
{
    "documentFront": "base_64_document_back",
    "documentBack": "base_64_document_back" // documento trasero opcional
}
{
  "eventId": "d99fe2d2-c0c3-4396-bd97-a502b4c30fa3",
  "requestId": "d99fe2d2-c0c3-4396-bd97-a502b4c30fa3",
  "status": true,
  "message": "Document: context deadline exceeded",
  "documentType": {
    "type": "INE",
    "side": "front",
    "country": "Mexico",
    "icaoCode": "MEX"
  },
  "documentData": {
    "generalData": {
      "name": "John Doe",
      "birthdate": "1990-01-01",
      "gender": "Male",
      "nationality": "Mexican",
      "documentNumber": "ID123456789"
    },
    "mechanicalReadingZone": "IDMEX1836577170",
    "specificData": [
      {
        "field": "address",
        "value": "123 Main St"
      },
      {
        "field": "city",
        "value": "Mexico City"
      }
    ]
  },
  "documentMetadata": "NOMBRE SEXO...",
  "processingTime": "40848",
  "state": {
    "message": "Document is valid",
    "isExpired": false,
    "isUnderAge": false,
    "supportedDocument": true
  }
}


OCR V4 (Nuevo)


POST basePath/api/v4/document/extract

Este endpoint hace la extraccion de la informacion de un documento.

Descripción de la Solicitud

Petición

curl --request POST \
     --url https://sandbox.api.jaak.ai/api/v4/document/extract \
     --header 'Authorization: <token-de-acceso>' \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --data '{
     					"imageFront": "<documento_frontal_en_b64>",
     					"imageBack": "<documento_posterior_en_b64>" // documento trasero opcional
          }'

Descripción de los parámetros

ParámetroDescripción
imageFrontCadena codificada en Base64 que representa la imagen del documento frontal.
imageBackCadena codificada en Base64 que representa la imagen del documento trasera.
Agrega localización

Si deseas agregar localización a la ejecución del evento agrega las cabeceras Longitude y Latitude con los valores numericos de la ubicación de la cual se esta ejecutando tu petición.

curl -X POST "https://sandbox.api.jaak.ai/api/v4/document/extract" \
     -H 'accept: application/json' \
     -H 'content-type: application/json' \
     -H 'Authorization: Bearer <api_key>' \
     -H 'Longitude: -70' \
     -H 'Latitude: 100' \
     -d '{...}'

Respuesta

{
  "eventId": <valor_string_eventId>,
  "requestId": <valor_string_requestId>,
  "status": <valor_string_status>,
  "content": {
    "data": {
      "personal": {
        "firstName": <valor_string_firstName>,
        "secondName": <valor_string_secondName>,
        "surname": <valor_string_surname>,
        "motherSurname": <valor_string_motherSurname>,
        "fullName": <valor_string_fullName>,
        "sex": <valor_string_sex>,
        "dateOfBirth": <valor_string_dateOfBirth>,
        "face": <valor_string_face>,
        "placeOfBirth": <valor_string_placeOfBirth>,
        "nationality": <valor_string_nationality>,
        "maritalStatus": <valor_string_maritalStatus>,
        "extra": {
          "ocr": <valor_string_ocr>,
          "registerYear": <valor_string_registerYear>,
          "rfc": <valor_string_rfc>
        }
      },
      "address": {
        "fullAddress": <valor_string_fullAddress>,
        "postalCode": <valor_string_postalCode>,
        "extra": {
          "street": <valor_string_street>,
          "externalNumber": <valor_string_externalNumber>,
          "internalNumber": <valor_string_internalNumber>,
          "neighborhood": <valor_string_neighborhood>,
          "city": <valor_string_city>,
          "state": <valor_string_state>
        }
      },
      "document": {
        "type": <valor_string_type>,
        "side": <valor_string_side>,
        "country": {
          "name": <valor_string_country_name>,
          "isoAlpha3Code": <valor_string_isoAlpha3Code>,
          "isoAlpha2Code": <valor_string_isoAlpha2Code>,
          "icaoCode": <valor_string_icaoCode>
        },
        "number": <valor_string_number>,
        "personalIdNumber": <valor_string_personalIdNumber>,
        "additionalNumber": <valor_string_additionalNumber>,
        "dateOfIssue": <valor_string_dateOfIssue>,
        "expiration": {
          "date": <valor_string_expiration_date>,
          "isPermanent": <valor_boolean_isPermanent>
        },
        "issuingAuthority": <valor_string_issuingAuthority>,
        "extra": {}
      }
    }
  },
  "processingTime": <valor_string_processingTime>,
  "state": {
    "message": <valor_string_message>,
    "documentCompleteSides": <valor_boolean_documentCompleteSides>
  }
}
Descripción de los parámetros de respuesta.
ParámetroDescripciónTipo de Dato
eventIdIdentificador único del evento.string
requestIdIdentificador único de la solicitud.string
statusEstado de la operación (SUCCESS, FAILURE).string
contentContenedor de los datos principales.object
content.dataDatos detallados de la respuesta.object
content.data.personalInformación personal del individuo.object
content.data.personal.firstNamePrimer nombre.string
content.data.personal.secondNameSegundo nombre.string
content.data.personal.surnameApellido paterno.string
content.data.personal.motherSurnameApellido materno.string
content.data.personal.fullNameNombre completo.string
content.data.personal.sexSexo (H para hombre, M para mujer).string
content.data.personal.dateOfBirthFecha de nacimiento (DD/MM/YYYY).string
content.data.personal.faceImagen del rostro (si aplica).string
content.data.personal.placeOfBirthLugar de nacimiento.string
content.data.personal.nationalityNacionalidad.string
content.data.personal.maritalStatusEstado civil.string
content.data.personal.extraInformación adicional.object
content.data.personal.extra.ocrCódigo OCR del documento.string
content.data.personal.extra.registerYearAño de registro del documento.string
content.data.personal.extra.rfcRegistro Federal de Contribuyentes (RFC).string
content.data.addressDirección del individuo.object
content.data.address.fullAddressDirección completa.string
content.data.address.postalCodeCódigo postal.string
content.data.address.extraInformación adicional de la dirección.object
content.data.address.extra.streetCalle.string
content.data.address.extra.externalNumberNúmero exterior.string
content.data.address.extra.internalNumberNúmero interior.string
content.data.address.extra.neighborhoodColonia o barrio.string
content.data.address.extra.cityCiudad.string
content.data.address.extra.stateEstado.string
content.data.documentInformación del documento de identificación.object
content.data.document.typeTipo de documento (TYPE_VOTER_ID, etc.).string
content.data.document.sideLado del documento (FRONT, BACK).string
content.data.document.countryInformación del país de emisión.object
content.data.document.country.nameNombre del país.string
content.data.document.country.isoAlpha3CodeCódigo ISO Alpha-3 del país.string
content.data.document.country.isoAlpha2CodeCódigo ISO Alpha-2 del país.string
content.data.document.country.icaoCodeCódigo ICAO del país.string
content.data.document.numberNúmero de documento.string
content.data.document.personalIdNumberNúmero de identificación personal.string
content.data.document.additionalNumberNúmero adicional.string
content.data.document.dateOfIssueFecha de emisión del documento.string
content.data.document.expirationInformación sobre la expiración.object
content.data.document.expiration.dateFecha de expiración.string
content.data.document.expiration.isPermanentIndica si el documento es permanente.boolean
content.data.document.issuingAuthorityAutoridad emisora del documento.string
content.data.document.extraInformación adicional del documento.object
processingTimeTiempo de procesamiento en milisegundos.string
stateEstado de la respuesta.object
state.messageMensaje de estado.string
state.documentCompleteSidesIndica si el documento tiene ambos lados.boolean
Ejemplos de Solicitudes
{
    "documentFront": "base_64_document_back",
    "documentBack": "base_64_document_back" // documento trasero opcional
}
      {
  "eventId": "9ef67e72-0895-4fcb-a5dd-eba8c9088f9f",
  "requestId": "9ef67e72-0895-4fcb-a5dd-eba8c9088f9f",
  "status": "SUCCESS",
  "content": {
    "data": {
      "personal": {
        "firstName": "JESUS",
        "secondName": "FRANCISCO",
        "surname": "SERRANO",
        "motherSurname": "CAMPOS",
        "fullName": "JESUS FRANCISCO SERRANO CAMPOS",
        "sex": "H",
        "dateOfBirth": "09/05/1996",
        "face": "",
        "placeOfBirth": "",
        "nationality": "MEXICAN",
        "maritalStatus": "",
        "extra": {
          "ocr": "2270097833499",
          "registerYear": "2014 01",
          "rfc": "SECJ960509SF9"
        }
      },
      "address": {
        "fullAddress": "C GUILLERMO PRIETO 328 C\nCOL CENTRO 38900\nSALVATIERRA, GTO.",
        "postalCode": "38900",
        "extra": {
          "street": "C GUILLERMO PRIETO",
          "externalNumber": "328 C",
          "internalNumber": "Not provided",
          "neighborhood": "COL CENTRO",
          "city": "SALVATIERRA,",
          "state": "GTO."
        }
      },
      "document": {
        "type": "TYPE_VOTER_ID",
        "side": "FRONT",
        "country": {
          "name": "MEXICO",
          "isoAlpha3Code": "MEX",
          "isoAlpha2Code": "MX",
          "icaoCode": "ID"
        },
        "number": "169834708",
        "personalIdNumber": "SECJ960509HGTRMS00",
        "additionalNumber": "SRCMJS96050911H700",
        "dateOfIssue": "01/01/2018",
        "expiration": {
          "date": "31/12/2028",
          "isPermanent": false
        },
        "issuingAuthority": "",
        "extra": {}
      }
    }
  },
  "processingTime": "3887",
  "state": {
    "message": "",
    "documentCompleteSides": true
  }
}

Integraciones


Ejemplo HTML y JS

Utilizando el Servicio de Documentos

Paso 1: Configura la Interfaz Web

  • Implementa el HTML y JavaScript como se proporciona para crear una interfaz de usuario simple para capturar imágenes de documentos directamente desde la cámara del dispositivo o el sistema de archivos.

Paso 2: Captura y Convierte el Documento

  • Los usuarios seleccionan o capturan una imagen del documento utilizando la entrada de archivo. Luego, la imagen se convierte en una cadena base64 utilizando JavaScript, facilitando la transmisión de datos de imagen a través de solicitudes de red.

Paso 3: Envía la Imagen para Procesamiento OCR

  • La cadena codificada en base64 se envía al endpoint /api/v2/document/extract utilizando una solicitud POST fetch. Asegúrate de manejar la solicitud en el servidor para extraer datos textuales de la imagen y posiblemente verificarla contra formatos conocidos.

Paso 4: Analiza la Respuesta

  • El servidor procesa la imagen y devuelve los resultados de OCR, que pueden incluir datos de texto extraídos del documento y cualquier otro metadato relevante. Estos resultados luego se muestran o registran para acciones adicionales.

Paso 5: Procesamiento Adicional

  • Dependiendo de las necesidades de la aplicación, los pasos adicionales podrían incluir la verificación de la autenticidad del documento, almacenar los resultados o integrarlos en flujos de trabajo de procesamiento de datos más grandes.

Para obtener documentación detallada de los endpoints de API y funcionalidades adicionales, consulta la Documentación de API.

document.getElementById('uploadButton').addEventListener('click', function() {
    const fileInput = document.getElementById('documentInput');
    if (fileInput.files.length > 0) {
        const file = fileInput.files[0];
        const reader = new FileReader();

        reader.onload = () => {
            const base64String = reader.result;
            console.log('Base64 String of Image:', base64String);

            // Optionally, send this base64String to the server
            fetch('https://sandbox.api.jaak.ai/api/v2/document/extract', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                    'Authorization': 'Bearer <your_token>'
                },
                body: JSON.stringify({ document: base64String })
            })
            .then(response => response.json())
            .then(data => {
                console.log('OCR Results:', data);
                
              const documentType = data.documentType;
              
              //You can use Verify Document API here!
            })
            .catch(error => {
                console.error('Error sending image to server:', error);
            });
        };

        reader.readAsDataURL(file);
    } else {
        console.log('Please select a file to upload.');
    }
});
 
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document Capture and OCR</title>
</head>
<body>
<input type="file" id="documentInput" accept="image/*" capture="environment">
<button id="uploadButton">Upload and Analyze</button>
<script src="app.js"></script>
</body>
</html>