Guía de integración vía API
Genera un flujo de verificación de identidad KYC a la medida de tu negocio
⏱️ Tiempo estimado: 2-3 horas para integración completa
¿Qué lograrás con esta guía?
Al finalizar esta integración habrás implementado un sistema completo de verificación de identidad KYC mediante API, con control total sobre la experiencia de usuario y flujo personalizado.
Antes de Empezar - Requisitos Técnicos
Conocimientos Necesarios:
- API REST básico (GET, POST, Headers)
- Formato JSON
- Manejo de tokens de autenticación
- Codificación Base64 para imágenes
Herramientas Requeridas:
- Cliente HTTP (Postman, Insomnia, cURL)
- Acceso a la Plataforma JAAK
- API Key de JAAK
- Entorno de desarrollo configurado
Información de la Empresa:
- Países donde opera (configurados en JAAK)
- URL de webhook (opcional pero recomendado)
- URL de redirección para usuarios
Índice de Contenidos
Sección | Actividad | Tiempo |
---|---|---|
Configuración | Obtener credenciales y configurar endpoints | 30 min |
Flujo Básico | Implementar verificación completa | 90 min |
Servicios Avanzados | Configurar validaciones adicionales | 45 min |
Pruebas | Validar funcionamiento completo | 15 min |
CONFIGURACIÓN INICIAL
Paso 1: Obtener API Key
Objetivo
Generar las credenciales necesarias para autenticar las llamadas API.
Navegación en Plataforma
Dashboard → Ajustes → API Keys → Generar nueva API key
Configuración de API Key
1.1 Crear API Key
Información requerida:
Campo | Valor recomendado | Propósito |
---|---|---|
Nombre | "API-KYC-[Ambiente]" | Identificación clara |
Expira en | 1 año o sin vencimiento | Según política de seguridad |
IMPORTANTE: Guarda la API Key inmediatamente, no podrás recuperarla después.
1.2 Configurar Endpoints
URLs de API según ambiente:
Ambiente | Base URL |
---|---|
Sandbox | https://sandbox.api.jaak.ai |
Producción | https://services.jaak.ai |
Paso 2: Configurar Headers Base
Headers requeridos para todas las llamadas:
Content-Type: application/json
Authorization: Bearer [TU-API-KEY]
FLUJO DE INTEGRACIÓN COMPLETO
Paso 3: Crear Sesión KYC
Objetivo
Inicializar una nueva sesión de verificación para un cliente.
Endpoint
POST /api/v1/kyc/flow
Implementación
3.1 Request Body
{
"name": "María González Pérez",
"flow": "Cliente-001-Onboarding",
"redirectUrl": "https://tu-empresa.com/kyc-completado",
"countryDocument": "MEX",
"flowType": "KYC",
"verificationType": "email",
"verification": {
"SMS": "",
"EMAIL": "[email protected]",
"WHATSAPP": ""
}
}
3.2 Parámetros Detallados
Campo | Tipo | Requerido | Descripción | Ejemplo |
---|---|---|---|---|
name | string | ✅ | Nombre completo del cliente | "María González Pérez" |
flow | string | ✅ | Identificador único de la sesión | "Cliente-001-Onboarding" |
redirectUrl | string | ❌ | URL donde redirigir al finalizar | "https://tu-empresa.com/success" |
countryDocument | string | ✅ | País del documento (código Alpha-3) | "MEX", "USA", "COL" |
flowType | string | ✅ | Tipo de verificación | "KYC" |
verificationType | string | ❌ | Método de notificación | "email", "whatsapp", "sms", "" |
verification | object | ❌ | Datos de contacto según método elegido | Ver tabla abajo |
3.3 Opciones de notificación
Método | Campo requerido | Formato | Ejemplo |
---|---|---|---|
| email válido | ||
| +[código país][número] | "+525551234567" | |
SMS |
| +[código país][número] | "+525551234567" |
Manual | Dejar |
3.4 Response Esperado
{
"sessionUrl": "https://sandbox.kyc.jaak.ai/session/ABC123X"
}
El shortKey es: ABC123X
(últimos 7 caracteres de la URL)
Paso 4: Intercambiar ShortKey por Token de Sesión
Objetivo
Obtener un token de acceso para realizar operaciones en la sesión KYC.
Endpoint
POST /api/v1/kyc/session
Implementación
4.1 Headers Específicos
Content-Type: application/json
Short-Key: ABC123X
Origin-Device: API
4.2 Request Body
{}
4.3 Response Esperado
{
"accessToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"step": 1,
"sessionId": "uuid-sesion-id",
"assets": {
"document": null,
"liveness": null
},
"document": "MEX"
}
IMPORTANTE: ElaccessToken
debe usarse en todas las siguientes llamadas con el header:
Authorization: Bearer [ACCESS-TOKEN]
SERVICIOS DE VERIFICACIÓN
Paso 5: Registrar Geolocalización
Objetivo
Registrar la ubicación desde donde se realiza la verificación.
Endpoint
POST /api/v1/kyc/session/location
mplementación
5.1 Headers
Content-Type: application/json
Authorization: Bearer [ACCESS-TOKEN]
5.2 Request Body
{
"latitude": 19.432608,
"longitude": -99.133209
}
5.3 Response Esperado
{}
Status Code: 200 OK
indica éxito.
Paso 6: Verificar Documento
Objetivo
Validar la autenticidad del documento de identidad.
Endpoint
POST /api/v3/document/verify
Implementación
6.1 Headers
Content-Type: application/json
Authorization: Bearer [ACCESS-TOKEN]
6.2 Request Body
{
"imageFront": "[BASE64-IMAGE-FRONT]",
"imageBack": "[BASE64-IMAGE-BACK]",
"dataVerification": true
}
6.3 Parámetros
Campo | Tipo | Requerido | Descripción |
---|---|---|---|
imageFront | string | ✅ | Imagen frontal del documento en Base64 |
imageBack | string | ❌ | Imagen trasera del documento en Base64 |
dataVerification | boolean | ❌ | Validación con RENAPO (solo México) |
6.4 Response de Ejemplo
{
"eventId": "evento-123",
"requestId": "request-456",
"evaluation": "APPROVED",
"document": {
"type": "INE",
"side": "BOTH",
"country": "México",
"icaoCode": "MEX"
},
"state": {
"documentCompleteSides": true,
"dataConsistent": true,
"documentLiveness": true,
"securityFeatures": true,
"documentValidity": true,
"imageQuality": true,
"handPresence": false,
"photoForgery": false,
"message": "Document verification successful",
"validations": {
"namesMatch": true,
"lastNameMatch": true,
"birthDateMatch": true,
"personalIdNumberMatch": true,
"message": "All validations passed"
}
},
"processTime": 1250
}
6.5 Estados de Validación
Campo | Descripción | ✅ Ideal |
---|---|---|
documentCompleteSides | Documento capturado completamente | true |
dataConsistent | Información coherente | true |
documentLiveness | Documento físico (no fotocopia) | true |
securityFeatures | Elementos de seguridad válidos | true |
documentValidity | Documento vigente | true |
imageQuality | Calidad de imagen adecuada | true |
handPresence | No hay manos en la imagen | false |
photoForgery | Sin manipulación digital | false |
Paso 7: Extraer Datos (OCR)
Objetivo
Extraer información del documento para validaciones posteriores.
Endpoint
POST /api/v4/document/extract
Implementación
7.1 Headers
Content-Type: application/json
Authorization: Bearer [ACCESS-TOKEN]
7.2 Request Body
{
"imageFront": "[BASE64-IMAGE-FRONT]",
"imageBack": "[BASE64-IMAGE-BACK]",
"documentSessionSelected": {
"country": "MEX"
}
}
Tip: Usa las mismas imágenes del paso anterior.
7.3 Response de Ejemplo
{
"eventId": "extract-123",
"requestId": "extract-456",
"status": "SUCCESS",
"processingTime": 1500,
"state": {
"message": "Extraction completed successfully",
"documentCompleteSides": true
},
"content": {
"data": {
"personal": {
"firstName": "María",
"secondName": "",
"surname": "González",
"motherSurname": "Pérez",
"fullName": "María González Pérez",
"sex": "M",
"dateOfBirth": "15/03/1990",
"face": "[BASE64-FACE-IMAGE]",
"placeOfBirth": "Ciudad de México",
"nationality": "MEXICANA",
"maritalStatus": "",
"extra": {
"ocr": "1234567890123",
"registerYear": "2018",
"rfc": "GOPM900315XXX"
}
},
"address": {
"fullAddress": "Av. Reforma 123, Col. Centro, 06000 Ciudad de México",
"postalCode": "06000",
"extra": {
"street": "Av. Reforma",
"externalNumber": "123",
"internalNumber": "",
"neighborhood": "Centro",
"city": "Ciudad de México",
"state": "CDMX"
}
},
"document": {
"type": "INE",
"side": "BOTH",
"country": {
"name": "México",
"isoAlpha3Code": "MEX",
"isoAlpha2Code": "MX",
"icaoCode": "MEX"
},
"number": "1234567890123",
"personalIdNumber": "GOPM900315MDFNRR02",
"additionalNumber": "0123",
"dateOfIssue": "01/01/2018",
"expiration": {
"date": "01/01/2028",
"isPermanent": false
},
"issuingAuthority": "INE",
"extra": {}
}
}
}
}
7.4 Datos Importantes para Siguientes Pasos
Para validaciones en listas:
content.data.personal.firstName
→ Nombrescontent.data.personal.surname
→ Apellidoscontent.data.document.personalIdNumber
→ CURPcontent.data.personal.extra.rfc
→ RFCcontent.data.personal.extra.ocr
→ OCRcontent.data.document.number
→ CIC
Para comparación facial:
content.data.personal.face
→ Imagen del rostro del documento
Paso 8: Verificar en Listas Oficiales
Objetivo
Validar datos contra listas oficiales (RENAPO, OFAC, Interpol, INE, SAT).
Endpoint
POST /api/v2/blacklist/investigate
Implementación
IMPORTANTE: Solo puedes consultar una lista por llamada.
8.1 Headers
Content-Type: application/json
Authorization: Bearer [ACCESS-TOKEN]
8.2 Ejemplo: Verificación RENAPO (CURP)
{
"services": {
"ine": false,
"interpol": false,
"ofac": false,
"renapo": {
"curp": true
},
"sat": {
"sat69b": false
},
"cdc": {
"rccFico": false
}
},
"payload": {
"identifications": {
"curp": "GOPM900315MDFNRR02"
}
}
}
8.3 Ejemplo: Verificación OFAC
{
"services": {
"ine": false,
"interpol": false,
"ofac": true,
"renapo": {
"curp": false
},
"sat": {
"sat69b": false
},
"cdc": {
"rccFico": false
}
},
"payload": {
"person": {
"name": "María",
"secondName": "",
"lastName": "González",
"secondLastName": "Pérez"
}
}
}
8.4 Configuraciones por Servicio
RENAPO (Validación positiva)
{
"services": { "renapo": { "curp": true } },
"payload": {
"identifications": {
"curp": "CURP_EXTRAIDA"
}
}
}
OFAC (Validación negativa)
{
"services": { "ofac": true },
"payload": {
"person": {
"name": "NOMBRE_EXTRAIDO",
"lastName": "APELLIDO_EXTRAIDO"
}
}
}
INE (Validación positiva)
{
"services": { "ine": true },
"payload": {
"identifications": {
"ine": {
"cic": "CIC_EXTRAIDO",
"ocr": "OCR_EXTRAIDO"
}
}
}
}
8.5 Response de Ejemplo
{
"eventId": "blacklist-123",
"responseId": "response-456",
"processTime": 0.5,
"organization": "renapo",
"service": "validaCurp",
"result": {
"curp": "GOPM900315MDFNRR02",
"nombres": "MARIA",
"apellidos": "GONZALEZ PEREZ"
},
"state": {
"foundInService": true,
"mustBeFound": true,
"message": "Person found in RENAPO database"
}
}
8.6 Interpretación de Resultados
Servicio | mustBeFound | foundInService | Resultado |
---|---|---|---|
RENAPO | true | true | ✅ Válido (persona existe) |
RENAPO | true | false | ❌ Inválido (persona no existe) |
OFAC | false | false | ✅ Válido (persona no está sancionada) |
OFAC | false | true | ❌ Inválido (persona está sancionada) |
Paso 9: Verificación de Vida (Liveness)
Objetivo
Validar que el usuario es una persona real presente en el momento.
Endpoint
POST /api/v3/liveness/verify
Implementación
9.1 Headers
Content-Type: application/json
Authorization: Bearer [ACCESS-TOKEN]
9.2 Request Body
{
"video": "[BASE64-VIDEO]",
"returnBestFrame": true
}
9.3 Response de Ejemplo
{
"eventId": "liveness-123",
"requestId": "liveness-456",
"evaluation": "APPROVED",
"score": 0.95,
"bestFrame": "[BASE64-BEST-FRAME]",
"state": {
"liveness": true,
"facesDetected": 1,
"isRealPerson": true,
"message": "Liveness verification successful"
},
"processTime": 2000
}
Tip: GuardabestFrame
para el siguiente paso.
Paso 10: Comparación Facial (One-to-One)
Objetivo
Verificar que la persona del documento es la misma que realizó la prueba de vida.
Endpoint
POST /api/v2/oto/verify
Implementación
10.1 Headers
Content-Type: application/json
Authorization: Bearer [ACCESS-TOKEN]
10.2 Request Body
{
"eventId": "oto-comparison-001",
"image1": "[BASE64-BEST-FRAME-FROM-LIVENESS]",
"image2": "[BASE64-FACE-FROM-DOCUMENT]"
}
10.3 Response de Ejemplo
{
"eventId": "oto-comparison-001",
"requestId": "oto-456",
"score": 0.89,
"distance": 0.11,
"process_time": 800,
"metadata": {
"image1": {
"accessories": {
"glass": false,
"sunGlass": false,
"hat": false,
"mask": false
},
"image_quality": {
"isCorrectBrightness": true,
"isCorrectBlur": true,
"isCorrectHeight": true,
"isCorrectWidth": true,
"isCorrectResolution": true,
"isCorrectVerticalRotation": true,
"isCorrectHorizontalRotation": true,
"isCorrectRotation": true,
"isCorrectSizeFace": true,
"isCorrectNumberFaces": true
}
},
"image2": {
"accessories": {
"glass": false,
"sunGlass": false,
"hat": false,
"mask": false
},
"image_quality": {
"isCorrectBrightness": true,
"isCorrectBlur": true,
"isCorrectHeight": true,
"isCorrectWidth": true,
"isCorrectResolution": true,
"isCorrectVerticalRotation": true,
"isCorrectHorizontalRotation": true,
"isCorrectRotation": true,
"isCorrectSizeFace": true,
"isCorrectNumberFaces": true
}
}
},
"codes": null,
"state": {
"rejectedBadQuality": false,
"rejectedAccessories": false,
"isSamePerson": true,
"message": "Face comparison successful"
}
}
10.4 Criterios de Evaluación
Campo | Descripción | ✅ Ideal |
---|---|---|
| Misma persona en ambas imágenes |
|
| Calidad de imagen insuficiente |
|
| Accesorios que interfieren |
|
| Puntuación de similitud (0-1) |
|
Paso 11: Finalizar Sesión KYC
Objetivo
Cerrar la sesión y consolidar todos los resultados.
Endpoint
POST /api/v1/kyc/session/finish
Implementación
11.1 Headers
Content-Type: application/json
Authorization: Bearer [ACCESS-TOKEN]
11.2 Request Body
{}
11.3 Response Esperado
{}
Status Code: 200 OK
confirma finalización exitosa.
AUTOMATIZACIÓN Y FLUJO COMPLETO
Secuencia Recomendada de Llamadas
Flujo Básico (Orden obligatorio)
- Crear Sesión → Obtener
shortKey
- Intercambiar Token → Obtener
accessToken
- Registrar Geolocalización → Ubicación del usuario
- Verificar Documento → Validar autenticidad
- Extraer Datos (OCR) → Obtener información
- Verificar Listas → Validar contra bases oficiales
- Verificación de Vida → Confirmar presencia real
- Comparación Facial → Verificar titularidad
- Finalizar Sesión → Consolidar resultados
Consideraciones de Implementación
Manejo de Errores
{
"error": {
"code": "INVALID_TOKEN",
"message": "Access token has expired",
"details": "Please obtain a new access token"
}
}
Códigos de Error Comunes:
Código HTTP | Significado | Acción |
---|---|---|
400 | Request inválido | Verificar formato JSON |
401 | Token inválido/expirado | Renovar accessToken |
404 | Sesión no encontrada | Verificar shortKey |
422 | Datos de validación erróneos | Revisar parámetros |
500 | Error interno | Reintentar o contactar soporte |
Timeout y Reintentos
Servicio | Timeout recomendado | Reintentos |
---|---|---|
Crear Sesión | 30 segundos | 3 |
Document Verify | 60 segundos | 2 |
OCR Extract | 60 segundos | 2 |
Liveness | 90 segundos | 1 |
One-to-One | 30 segundos | 2 |
Blacklist | 45 segundos | 3 |
CONFIGURACIÓN DE WEBHOOK
Recibir Resultados Automáticamente
Objetivo
Configurar endpoint para recibir resultados finales automáticamente.
Configuración
Configurar en Plataforma JAAK:
Dashboard → Ajustes → Mi Compañía → KYC Webhook
Estructura del Webhook
{
"sessionId": "uuid-session",
"shortKey": "ABC123X",
"status": "COMPLETED",
"evaluation": "APPROVED",
"timestamp": "2024-01-15T10:30:00Z",
"results": {
"document": {
"verification": "APPROVED",
"extraction": "SUCCESS"
},
"liveness": {
"status": "APPROVED",
"score": 0.95
},
"faceComparison": {
"status": "APPROVED",
"isSamePerson": true
},
"blacklists": {
"renapo": "FOUND",
"ofac": "NOT_FOUND"
}
},
"extractedData": {
"name": "María González Pérez",
"curp": "GOPM900315MDFNRR02",
"dateOfBirth": "15/03/1990"
}
}
PRUEBAS Y VALIDACIÓN
Lista de Verificación
Pruebas Obligatorias
- Crear sesión con datos válidos
- Intercambiar shortKey correctamente
- Verificar documento con imágenes de buena calidad
- Extraer datos correctamente del documento
- Validar al menos en RENAPO y OFAC
- Realizar prueba de vida exitosa
- Comparar rostros con resultado positivo
- Finalizar sesión sin errores
- Recibir webhook (si configurado)
Casos de Prueba
Documento Válido (Caso Positivo)
- Documento mexicano vigente
- Imágenes nítidas, bien iluminadas
- Sin reflejos ni obstrucciones
- Resultado esperado: Todos los pasos
APPROVED
Documento Inválido (Caso Negativo)
- Documento vencido o alterado
- Imágenes borrosas o mal iluminadas
- Resultado esperado: Fallas en verificación
Persona No Encontrada en RENAPO
- CURP inexistente o incorrecto
- Resultado esperado:
foundInService: false
SOLUCIÓN DE PROBLEMAS
Errores Frecuentes
Token Expirado
{
"error": "Access token expired"
}
Solución: Intercambiar nuevamente el shortKey por un nuevo accessToken
Imagen Base64 Inválida
{
"error": "Invalid image format"
}
Solución: Verificar que la imagen esté correctamente codificada en Base64
País No Configurado
{
"error": "Country not supported for this company"
}
Solución: Configurar el país en la Plataforma JAAK
Webhook No Se Recibe
Causas posibles:
- URL incorrecta en configuración
- Servidor no responde con 200 OK
- Firewall bloqueando conexiones
RECURSOS ADICIONALES
Documentación Complementaria
- Conceptos Básicos en JAAK - Terminología y arquitectura
- Lista de Países Soportados - Códigos Alpha-3 disponibles
- Códigos de Error Completos - Referencia de todos los errores posibles
Herramientas de Desarrollo
Collection de Postman
{
"info": {
"_postman_id": "3e6504a2-f998-4118-b3a4-e0a98818793c",
"name": "Flujo KYC JAAK",
"description": "Colección de Postman para probar el flujo completo de KYC de JAAK a través de la API.\n\n**Instrucciones de Inicio Rápido:**\n\n1. **Configura tu API Key:** Ve a la pestaña 'Variables' de esta colección y pega tu `API Key` generada desde la Plataforma JAAK en el valor actual de la variable `apiKey`.\n \n2. **Ejecuta las Peticiones en Orden:** Comienza con \"1. Crear Sesión KYC\". El `shortKey` y el `accessToken` se guardarán automáticamente para las siguientes llamadas.\n \n3. **Reemplaza Datos de Prueba:** En los cuerpos (Body) de las peticiones que envían imágenes o videos (`Verificación de Documento`, `Extracción de Datos`, `Verificación de Vida`), deberás reemplazar los placeholders \"TU_BASE64_AQUI\" con datos reales en formato Base64.",
"schema": "https://schema.getpostman.com/json/collection/v2.0.0/collection.json",
"_exporter_id": "19991051"
},
"item": [
{
"name": "Paso 1: Crear Sesión KYC",
"event": [
{
"listen": "test",
"script": {
"exec": [
"// Extrae el shortKey de la respuesta y lo guarda como una variable de la colección.",
"var jsonData = pm.response.json();",
"var sessionUrl = jsonData.sessionUrl;",
"if (sessionUrl) {",
" var shortKey = sessionUrl.substring(sessionUrl.lastIndexOf('/') + 1);",
" pm.collectionVariables.set(\"shortKey\", shortKey);",
" console.log(\"Short Key guardado: \" + shortKey);",
"}"
],
"type": "text/javascript",
"packages": {}
}
}
],
"request": {
"method": "POST",
"header": [],
"body": {
"mode": "raw",
"raw": "{\n \"name\": \"Juan Perez Perez\", // Nombre de la persona a autenticar\n \"flow\": \"My-First-KYC\",\n \"redirectUrl\": \"\", // Si estás implementando con Kyc Web Marca Blanca llena este campo\n \"countryDocument\": \"MEX\", // País dónde se validara la persona\n \"flowType\": \"KYC\", // Siempre usar 'KYC'\n \"verificationType\": \"\", // Si estás implementando con Kyc Web Marca Blanca llena este campo: Usa WHATSAPP,SMS, EMAIL para hacer llegar la url por el canal seleccionado, \n \"verification\": {\n \"EMAIL\":\"\", // Llena con el valor del destinatario, ejemplo: [email protected]\n \"SMS\":\"\", // Llena con el valor del destinatario, ejemplo: +524661000000\n \"WHATSAPP\":\"\"// Llena con el valor del destinatario, ejemplo: +524661000000\n }\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": "{{baseURL}}/v1/kyc/flow",
"description": "Inicia un nuevo flujo de verificación de identidad (KYC). \n\nEsta llamada requiere tu `API Key` para autenticación y devuelve una `sessionUrl` que contiene el `shortKey` necesario para el siguiente paso. \n\nUn script automático se encargará de extraer y guardar el `shortKey` para que no tengas que hacerlo manualmente."
},
"response": []
},
{
"name": "Paso 2: Intercambiar Short Key por Token de Sesión",
"event": [
{
"listen": "test",
"script": {
"exec": [
"// Extrae el accessToken y el sessionId de la respuesta y los guarda como variables.",
"var jsonData = pm.response.json();",
"if (jsonData.accessToken) {",
" pm.collectionVariables.set(\"accessToken\", jsonData.accessToken);",
" console.log(\"Access Token guardado.\");",
"}",
"if (jsonData.sessionId) {",
" pm.collectionVariables.set(\"sessionID\", jsonData.sessionId);",
" console.log(\"Session ID guardado: \" + jsonData.sessionId);",
"}"
],
"type": "text/javascript"
}
}
],
"request": {
"method": "POST",
"header": [
{
"key": "Short-Key",
"value": "{{shortKey}}",
"type": "text"
},
{
"key": "Origin-Device",
"value": "API",
"type": "text"
}
],
"body": {
"mode": "raw",
"raw": "{}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": "{{baseURL}}/v1/kyc/session",
"description": "Usa el `shortKey` obtenido en el paso anterior para generar un `accessToken`. \n\nEste token es el que se usará para autenticar todas las llamadas a los servicios JAAK dentro de esta sesión específica. \n\nUn script automático guardará el `accessToken` y el `sessionID` para los siguientes pasos."
},
"response": []
},
{
"name": "Paso 3.1: Geolocalización",
"request": {
"auth": {
"type": "bearer",
"bearer": {
"token": "{{accessToken}}"
}
},
"method": "POST",
"header": [],
"body": {
"mode": "raw",
"raw": "{\n \"latitude\": 19.4326077,// Coloca la latitud obtenida desde el dispositivo del usuario final\n \"longitude\": -99.133208 // // Coloca la longitud obtenidad desde el dispositivo del usuario final\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": "{{baseURL}}/v1/kyc/session/location",
"description": "Registra la ubicación geográfica (latitud y longitud) desde donde se está realizando la sesión de KYC. \n\nEsta llamada se autentica con el `accessToken` de la sesión."
},
"response": []
},
{
"name": "Paso 3.2: Verificación de Documento",
"request": {
"auth": {
"type": "bearer",
"bearer": {
"token": "{{accessToken}}"
}
},
"method": "POST",
"header": [],
"body": {
"mode": "raw",
"raw": "{\n \"imageFront\": \"TU_BASE64_AQUI\", // Coloca aqui la fotografía en Base64 de la cara frontal del documento\n \"imageBack\": \"TU_BASE64_AQUI\", // Coloca aqui la fotografía en Base64 de la cara trasera del documento\n \"dataVerification\": false // // Coloca en true si requieres validar datos ante entidades Mexicanas(Sólo México)\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": "{{baseURL}}/v3/document/verify",
"description": "Valida la autenticidad de un documento de identidad. \n\n**Importante:** Debes reemplazar los valores `TU_BASE64_..._AQUI` con las imágenes reales de un documento codificadas en Base64. "
},
"response": []
},
{
"name": "Paso 3.3: Extracción de Datos (OCR)",
"event": [
{
"listen": "test",
"script": {
"exec": [
"// Extrae la imagen del rostro del documento y la guarda como una variable.",
"var jsonData = pm.response.json();",
"if (jsonData.content && jsonData.content.data && jsonData.content.data.personal && jsonData.content.data.personal.face) {",
" pm.collectionVariables.set(\"face_from_document\", jsonData.content.data.personal.face);",
" console.log(\"Imagen del rostro (del documento) guardada.\");",
"}"
],
"type": "text/javascript",
"packages": {}
}
}
],
"request": {
"auth": {
"type": "bearer",
"bearer": {
"token": "{{accessToken}}"
}
},
"method": "POST",
"header": [],
"body": {
"mode": "raw",
"raw": "{\n \"imageFront\": \"TU_BASE64_AQUI\", // Coloca aqui la fotografía en Base64 de la cara frontal del documento\n \"imageBack\": \"TU_BASE64_AQUI\" // Coloca aqui la fotografía en Base64 de la cara trasera del documento\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": "{{baseURL}}/v4/document/extract",
"description": "Extrae la información de un documento usando tecnología OCR.\n\n**Importante:** Debes usar las mismas imágenes en Base64 que en el paso anterior para mantener la coherencia.\n\nUn script automático guardará la imagen del rostro extraída del documento para usarla en el paso de comparación (OTO)."
},
"response": []
},
{
"name": "Paso 3.4: Verificación en Listas Negras (RENAPO)",
"request": {
"auth": {
"type": "bearer",
"bearer": {
"token": "{{accessToken}}"
}
},
"method": "POST",
"header": [],
"body": {
"mode": "raw",
"raw": "{\n \"services\": {\n \"renapo\": {\n \"curp\": true // Coloca el servicio que deseas utilizar\n }\n },\n \"payload\": {\n \"identifications\": {\n \"curp\": \"TU_CURP_AQUI\" //Coloca el valor a evaluar\n }\n }\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": "{{baseURL}}/v2/blacklist/investigate",
"description": "Verifica la información del usuario contra diversas listas. Este ejemplo consulta el servicio de RENAPO.\n\n**Importante:** Debes reemplazar `TU_CURP_..._AQUI` con la CURP obtenida en el paso de extracción de datos (`content.data.document.personalIdNumber`).\n\nUtiliza este mismo servicio para realizar búsquedas en otras entidades como OFAC, INTERPOL, SAT69B, INE."
},
"response": []
},
{
"name": "Paso 3.5: Verificación de Vida (Liveness)",
"event": [
{
"listen": "test",
"script": {
"exec": [
"// Extrae el bestFrame (mejor imagen del video) y lo guarda como variable.",
"var jsonData = pm.response.json();",
"if (jsonData.bestFrame) {",
" pm.collectionVariables.set(\"bestFrame_from_liveness\", jsonData.bestFrame);",
" console.log(\"Best Frame (de prueba de vida) guardado.\");",
"}"
],
"type": "text/javascript",
"packages": {}
}
}
],
"request": {
"auth": {
"type": "bearer",
"bearer": {
"token": "{{accessToken}}"
}
},
"method": "POST",
"header": [],
"body": {
"mode": "raw",
"raw": "{\n \"video\": \"GkXfo5...\" // Coloca aquí el video en Base64 del rostro del usuario\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": "{{baseURL}}/v1/liveness/verify-and-bestframe",
"description": "Garantiza que el usuario es una persona real y presente. \n\n**Importante:** Debes reemplazar `TU_VIDEO_EN_BASE64_AQUI` con un video de 5 segundos del rostro del usuario, codificado en Base64. \n\nUn script automático guardará la imagen `bestFrame` para usarla en el siguiente paso."
},
"response": []
},
{
"name": "Paso 3.6: Verificación de Titularidad (OTO)",
"request": {
"auth": {
"type": "bearer",
"bearer": {
"token": "{{accessToken}}"
}
},
"method": "POST",
"header": [],
"body": {
"mode": "raw",
"raw": "{\n \"image1\": \"{{bestFrame_from_liveness}}\", //Imagen del rostro 1 (Colocamos el obtenido del servicio Liveness)\n \"image2\": \"{{face_from_document}}\" // Imagen del rostro 2 (Colocamos el obtenido del servicio OCR)\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": "{{baseURL}}/v2/oto/verify",
"description": "Compara biométricamente el rostro extraído del documento contra el rostro capturado en la prueba de vida para confirmar que son la misma persona. \n\nLas variables `{{bestFrame_from_liveness}}` y `{{face_from_document}}` se rellenan automáticamente gracias a los scripts de los pasos anteriores."
},
"response": []
},
{
"name": "Paso 4: Finalizar Sesión KYC",
"request": {
"auth": {
"type": "bearer",
"bearer": {
"token": "{{accessToken}}"
}
},
"method": "POST",
"header": [],
"body": {
"mode": "raw",
"raw": "{}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": "{{baseURL}}/v1/kyc/session/finish",
"description": "Cierra la sesión de KYC una vez que todos los pasos de verificación han sido completados. \n\nEs un paso crucial para asegurar la integridad del proceso."
},
"response": []
},
{
"name": "Paso 5: Consultar Detalle de una Sesión",
"request": {
"method": "GET",
"header": [],
"url": "{{baseURL}}/v1/kyc/session/{{sessionID}}",
"description": "Obtiene la información completa y detallada de una sesión específica usando su `sessionID`. \n\nEl `sessionID` se captura automáticamente del paso 2."
},
"response": []
}
],
"auth": {
"type": "bearer",
"bearer": {
"token": "{{apiKey}}"
}
},
"event": [
{
"listen": "prerequest",
"script": {
"type": "text/javascript",
"packages": {},
"exec": [
""
]
}
},
{
"listen": "test",
"script": {
"type": "text/javascript",
"packages": {},
"exec": [
""
]
}
}
],
"variable": [
{
"key": "baseURL",
"value": "https://sandbox.api.jaak.ai/api",
"type": "string"
},
{
"key": "apiKey",
"value": "TU_API_KEY_AQUI",
"type": "string"
},
{
"key": "shortKey",
"value": "",
"type": "string"
},
{
"key": "accessToken",
"value": "",
"type": "string"
},
{
"key": "sessionID",
"value": "",
"type": "string"
},
{
"key": "face_from_document",
"value": "",
"type": "string"
},
{
"key": "bestFrame_from_liveness",
"value": "",
"type": "string"
}
]
}
SDKs Web Recomendados
Para simplificar la captura de imágenes en el frontend:
- @jaak.ai/face-detector - Captura optimizada de rostros
- @jaak.ai/stamps - Captura de documentos de identidad
Soporte Técnico
Información necesaria para soporte:
- ShortKey
Updated 4 days ago