JAAK KYC Mosaic Web

1. Introducción

JAAK KYC Mosaic Web es una solución completa de verificación de identidad que permite integrar procesos de KYC (Know Your Customer) en aplicaciones web de manera rápida y segura. Esta guía está diseñada para ayudarle a elegir e implementar la modalidad de integración que mejor se adapte a sus necesidades.

¿Qué es JAAK KYC Mosaic?

JAAK KYC Mosaic es una plataforma de verificación de identidad que ofrece:

  • Extracción automática de datos de documentos de identidad
  • Verificación de autenticidad de documentos
  • Verificación de identidad facial en vivo
  • Comparación facial One-to-One (OTO)
  • Verificación contra listas negras

Beneficios principales

  • Integración flexible: 3 modalidades para diferentes casos de uso
  • Implementación rápida: Desde minutos hasta horas según la modalidad
  • Alta precisión: 99% de exactitud en verificaciones
  • Seguridad robusta: Autenticación con Short Keys y comunicación HTTPS
  • Soporte completo: Documentación detallada y equipo de soporte técnico

2. Modalidades de Integración

JAAK KYC Mosaic ofrece tres modalidades de integración para adaptarse a diferentes necesidades y casos de uso. A continuación se presenta una comparación para ayudarle a elegir la mejor opción:

ModalidadCasos de UsoComplejidad
Embed (iframe)Integración rápida sin salir del sitio. Control total del layout.⭐⭐ Media
Direct (nueva pestaña)Experiencia pantalla completa. Apps móviles nativas.⭐⭐ Media
Link (URLs)Campañas email/SMS. Enlaces compartidos. Cero código.⭐ Baja

2.1 Modalidad Embed (iframe)

La modalidad Embed integra el flujo KYC completo dentro de un iframe en su página web, manteniendo al usuario en su dominio durante todo el proceso.

Ventajas

  • Integración rápida (minutos a horas)
  • Usuario permanece en su sitio web
  • Comunicación bidireccional en tiempo real
  • Control total del posicionamiento y diseño

Cuándo usar Embed

  • Necesita mantener al usuario en su dominio
  • Requiere control del flujo de usuario
  • Quiere personalizar el contenedor del iframe

2.2 Modalidad Direct (nueva pestaña)

La modalidad Direct abre el flujo KYC en una ventana separada o nueva pestaña, ofreciendo una experiencia de pantalla completa optimizada.

Ventajas

  • Máximo rendimiento (sin overhead de iframe)
  • Experiencia de usuario fluida
  • Perfecto para aplicaciones móviles (WebView)
  • Soporte completo de todos los pasos KYC

Cuándo usar Direct

  • Necesita máximo rendimiento
  • Integra en aplicaciones móviles nativas
  • Prefiere flujo independiente sin embedding

2.3 Modalidad Link (URLs)

La modalidad Link permite generar URLs autocontenidas que incluyen toda la configuración necesaria. Es la opción más simple y no requiere código del lado del cliente.

Ventajas

  • Cero código del lado del cliente
  • Perfecto para campañas de email/SMS
  • URLs compartibles y autocontenidas
  • Implementación inmediata

Cuándo usar Link

  • Campañas automatizadas de verificación
  • Envío de enlaces por email, SMS o WhatsApp
  • Códigos QR para verificación
  • No tiene recursos de desarrollo

🚀 Proceso para Crear una Sesión KYC

El flujo básico para generar un enlace de verificación KYC es muy simple:

1. Crear Sesión

Realiza una llamada POST a la API de JAAK para crear una nueva sesión de verificación.

Ver documentación completa: Crear Sesión KYC →

curl -X POST https://sandbox.kyc.jaak.ai/api/v1/sessions \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "kyc",
    "metadata": {
      "user_id": "12345",
      "campaign": "onboarding"
    }
  }'

2. Obtener shortKey

La respuesta incluye una URL de sesión de la cual extraes el shortKey:

{
  "session_id": "sess_abc123",
  "session_url": "https://sandbox.kyc.jaak.ai/session/jsi8lPd",
  "status": "pending",
  "created_at": "2025-01-15T10:30:00Z"
}

Ejemplo de URL de sesión:

https://sandbox.kyc.jaak.ai/session/jsi8lPd

ShortKey 👉 jsi8lPd

Nota: Identificador único de 7 caracteres. Este shortKey se genera automáticamente y no es personalizable.

3. Configurar Flujo KYC

Define qué pasos de verificación quieres incluir en tu flujo personalizado.

const config = {
    steps: [
        { key: 'DOCUMENT_EXTRACT' },
        { key: 'DOCUMENT_VERIFY' },
        { key: 'IVERIFICATION' }
    ],
    shortKey: 'jsi8lPd'  // El shortKey obtenido en el paso 2
};

Formato de pasos para URL (modalidad Link):

steps=DOCUMENT_EXTRACT,DOCUMENT_VERIFY,IVERIFICATION

Ejemplo de URL completa:

https://mosaic.sandbox.jaak.ai/link?shortKey=jsi8lPd&steps=DOCUMENT_EXTRACT,DOCUMENT_VERIFY,IVERIFICATION

Flujo completo de integración

// Paso 1: Crear sesión en tu backend
async function createKYCSession(userId) {
    const response = await fetch('https://sandbox.kyc.jaak.ai/api/v1/sessions', {
        method: 'POST',
        headers: {
            'Authorization': 'Bearer YOUR_API_TOKEN',
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({
            type: 'kyc',
            metadata: { user_id: userId }
        })
    });
    
    const data = await response.json();
    return data;
}

// Paso 2: Extraer shortKey de la URL
function extractShortKey(sessionUrl) {
    // sessionUrl: "https://sandbox.kyc.jaak.ai/session/jsi8lPd"
    const parts = sessionUrl.split('/');
    return parts[parts.length - 1]; // "jsi8lPd"
}

// Paso 3: Usar shortKey en tu integración
async function initializeKYC(userId) {
    // Crear sesión
    const session = await createKYCSession(userId);
    
    // Extraer shortKey
    const shortKey = extractShortKey(session.session_url);
    
    // Opción A: Usar con Embed
    const embedConfig = {
        steps: [
            { key: 'DOCUMENT_EXTRACT' },
            { key: 'DOCUMENT_VERIFY' },
            { key: 'IVERIFICATION' }
        ],
        shortKey: shortKey
    };
    
    // Enviar al iframe
    document.getElementById('kycMosaic').contentWindow.postMessage({
        type: 'CONFIG',
        data: embedConfig
    }, '*');
    
    // Opción B: Generar Link
    const kycLink = `https://mosaic.qa.jaak.ai/link?shortKey=${shortKey}&steps=DOCUMENT_EXTRACT,DOCUMENT_VERIFY,IVERIFICATION`;
    
    return { shortKey, kycLink };
}

Ambientes disponibles

AmbienteURL BaseUso
Sandboxhttps://sandbox.kyc.jaak.aiDesarrollo y pruebas
Producciónhttps://kyc.jaak.aiAplicaciones en vivo

Importante: Siempre pruebe en ambiente Sandbox antes de migrar a producción.


3. Prerrequisitos

3.1 Requisitos técnicos

RequisitoEspecificación
NavegadorChrome 80+, Firefox 75+, Safari 13+, Edge 80+
HTTPSObligatorio en producción (requerido para cámara)
JavaScriptES6+ (para Embed y Direct)
Short KeyProporcionado por JAAK (requerido para todas las modalidades)

3.2 Obtener su Short Key

El Short Key es un código de acceso único que autentica su aplicación con JAAK KYC Mosaic. Para obtener su Short Key:

  1. Contacte al equipo de ventas de JAAK
  2. Complete el proceso de registro
  3. Recibirá su Short Key por email

Nota: Mantenga su Short Key seguro. No lo comparta públicamente ni lo incluya en repositorios de código abierto.


4. Guías de Implementación

4.1 Implementación Embed (iframe)

Paso 1: Agregar el iframe a su página

<iframe 
    id="kycMosaic" 
    src="https://mosaic.sandbox.jaak.ai/"
    width="100%" 
    height="600"
    allow="camera; geolocation">
</iframe>

Paso 2: Configurar y enviar configuración

const config = {
    steps: [
        { key: 'DOCUMENT_EXTRACT' },
        { key: 'DOCUMENT_VERIFY' },
        { key: 'IVERIFICATION' }
    ],
    shortKey: 'SU_SHORT_KEY_AQUI'
};

document.getElementById('kycMosaic')
    .contentWindow.postMessage({
        type: 'CONFIG',
        data: config
    }, '*');

Paso 3: Escuchar eventos

window.addEventListener('message', function(event) {
    switch(event.data.type) {
        case 'FLOW_COMPLETE':
            console.log('KYC completado', event.data);
            // Procesar resultados
            break;
            
        case 'ERROR':
            console.error('Error', event.data);
            // Manejar error
            break;
    }
});

4.2 Implementación Direct (nueva pestaña)

Paso 1: Abrir ventana Direct

let directWindow = null;

function openDirectKYC() {
    const url = 'https://mosaic.sandbox.jaak.ai/direct';
    const features = 'width=800,height=600';
    
    directWindow = window.open(url, 'kyc', features);
}

Paso 2: Esperar señal READY y enviar configuración

window.addEventListener('message', function(event) {
    if (event.data.type === 'READY') {
        const config = {
            steps: [
                { key: 'DOCUMENT_EXTRACT' },
                { key: 'IVERIFICATION' }
            ],
            shortKey: 'SU_SHORT_KEY_AQUI'
        };
        
        directWindow.postMessage({
            type: 'CONFIG',
            data: config
        }, '*');
    }
});

Paso 3: Manejar eventos

window.addEventListener('message', function(event) {
    switch(event.data.type) {
        case 'FLOW_COMPLETE':
            console.log('KYC completado en Direct', event.data);
            break;
            
        case 'ERROR':
            console.error('Error en Direct', event.data);
            break;
    }
});

4.3 Implementación Link (URLs)

La modalidad Link es la más simple: solo necesita generar una URL con los parámetros adecuados.

Formato de URL

https://mosaic.sandbox.jaak.ai/link?shortKey=SU_KEY&steps=DOCUMENT_EXTRACT,IVERIFICATION

Parámetros disponibles

ParámetroDescripción
shortKeySu código de acceso (requerido)
stepsPasos separados por comas en orden de ejecución
redirectUrlURL donde redirigir al completar (opcional)

Ejemplo completo

https://mosaic.sandbox.jaak.ai/link?shortKey=ABC123&steps=DOCUMENT_EXTRACT,DOCUMENT_VERIFY,IVERIFICATION,OTO&redirectUrl=https://mi-app.com/success

Generación programática (opcional)

function generateKYCLink(shortKey, steps, redirectUrl) {
    const baseUrl = 'https://mosaic.sandbox.jaak.ai/link';
    const params = new URLSearchParams({
        shortKey: shortKey,
        steps: steps.join(',')
    });
    
    if (redirectUrl) {
        params.append('redirectUrl', redirectUrl);
    }
    
    return `${baseUrl}?${params.toString()}`;
}

// Uso
const link = generateKYCLink(
    'ABC123',
    ['DOCUMENT_EXTRACT', 'IVERIFICATION', 'OTO'],
    'https://mi-app.com/success'
);

console.log(link);

5. Pasos del Flujo KYC

JAAK KYC Mosaic ofrece diferentes pasos que puede configurar según sus necesidades. Los pasos se ejecutan en el orden que usted especifique.

PasoDescripción
WELCOMEPantalla de bienvenida con instrucciones
DOCUMENT_EXTRACTCaptura y extracción de datos del documento de identidad
DOCUMENT_VERIFYVerificación de autenticidad del documento
BLACKLISTVerificación contra listas negras de seguridad
IVERIFICATIONVerificación de identidad facial en vivo (liveness)
LOCATION_PERMISSIONSSolicitud de permisos de geolocalización
OTOComparación facial One-to-One (documento vs. rostro en vivo)
FINISHPantalla de finalización exitosa

Importante: El paso OTO requiere que se hayan ejecutado previamente DOCUMENT_EXTRACT (para la foto del documento) e IVERIFICATION (para la foto en vivo). Si estos pasos se ejecutaron en sesiones anteriores, Mosaic obtiene las imágenes automáticamente.

Ejemplo de configuración de pasos

const config = {
    steps: [
        { key: 'WELCOME' },
        { key: 'DOCUMENT_EXTRACT' },
        { key: 'DOCUMENT_VERIFY' },
        { key: 'IVERIFICATION' },
        { key: 'OTO' },
        { key: 'FINISH' }
    ],
    shortKey: 'SU_SHORT_KEY_AQUI'
};

6. Eventos y Respuestas

Las modalidades Embed y Direct envían eventos mediante postMessage para informar sobre el progreso del flujo KYC.

6.1 Eventos principales

EventoDescripción
READYMosaic está listo para recibir configuración
STEP_COMPLETEUn paso individual fue completado exitosamente
FLOW_COMPLETEEl flujo KYC completo fue finalizado exitosamente
ERROROcurrió un error durante el proceso
SESSION_EXPIREDLa sesión expiró por inactividad (14 minutos)

6.2 Ejemplo de manejo de eventos

window.addEventListener('message', function(event) {
    const message = event.data;
    
    switch(message.type) {
        case 'READY':
            // Enviar configuración
            console.log('Mosaic listo');
            break;
            
        case 'STEP_COMPLETE':
            console.log('Paso completado:', message.data.stepKey);
            console.log('Datos del paso:', message.data.data);
            // Guardar datos del paso si es necesario
            break;
            
        case 'FLOW_COMPLETE':
            console.log('KYC completado exitosamente');
            console.log('Datos finales:', message.data);
            // Procesar resultados finales y continuar con su flujo
            break;
            
        case 'ERROR':
            console.error('Error en KYC:', message.data.error);
            console.error('Mensaje:', message.data.message);
            // Mostrar mensaje de error al usuario
            break;
            
        case 'SESSION_EXPIRED':
            console.warn('Sesión expirada');
            // Reiniciar flujo o mostrar mensaje al usuario
            break;
    }
});

Estructura de datos en eventos

STEP_COMPLETE

{
    type: 'STEP_COMPLETE',
    data: {
        stepKey: 'DOCUMENT_EXTRACT',
        data: {
            // Datos específicos del paso
            face: 'data:image/jpeg;base64,...'
        }
    }
}

FLOW_COMPLETE

{
    type: 'FLOW_COMPLETE',
    data: {
        completedSteps: ['DOCUMENT_EXTRACT', 'IVERIFICATION', 'OTO'],
        allData: {
            DOCUMENT_EXTRACT: { /* datos */ },
            IVERIFICATION: { /* datos */ },
            OTO: { /* datos */ }
        }
    }
}

ERROR

{
    type: 'ERROR',
    data: {
        error: 'AUTHENTICATION_FAILED',
        message: 'Invalid shortKey provided'
    }
}

7. Solución de Problemas

7.1 Problemas comunes

El iframe no carga

  • Verifique que el atributo allow incluya camera y geolocation
  • Confirme que está usando HTTPS en producción
  • Revise la consola del navegador para errores CORS
<!-- Configuración correcta del iframe -->
<iframe 
    id="kycMosaic" 
    src="https://mosaic.sandbox.jaak.ai/"
    allow="camera; geolocation"
    width="100%" 
    height="600">
</iframe>

Error de autenticación

  • Verifique que su Short Key sea correcto
  • Confirme que el Short Key no haya expirado
  • Contacte a soporte si el problema persiste

OTO falla por imágenes faltantes

  • Asegúrese de ejecutar DOCUMENT_EXTRACT antes de OTO
  • Asegúrese de ejecutar IVERIFICATION antes de OTO
  • Alternativamente, proporcione las imágenes manualmente en la configuración:
const config = {
    steps: [
        { 
            key: 'OTO',
            data: {
                face: 'data:image/jpeg;base64,...',        // Imagen del documento
                bestFrame: 'data:image/jpeg;base64,...'   // Imagen de liveness
            }
        }
    ],
    shortKey: 'SU_SHORT_KEY_AQUI'
};

Ventana Direct bloqueada

  • Asegúrese de que la apertura ocurra por interacción del usuario (click)
  • Verifique la configuración de bloqueador de popups
  • Agregue instrucciones al usuario para permitir popups
// Buena práctica: abrir desde un evento de click
button.addEventListener('click', function() {
    openDirectKYC();
});

PostMessage no funciona

  • Verifique que está escuchando eventos en la ventana correcta
  • Confirme que el origen del mensaje es el esperado
  • Revise la consola para mensajes de error
window.addEventListener('message', function(event) {
    // Validar origen si es necesario (producción)
    // if (event.origin !== 'https://mosaic.sandbox.jaak.ai') return;
    
    console.log('Mensaje recibido:', event.data);
});

7.2 Sesión expirada

Las sesiones de JAAK KYC Mosaic expiran después de 14 minutos de inactividad. Cuando esto ocurre:

  • Se envía un evento SESSION_EXPIRED
  • Se muestra un mensaje al usuario en la interfaz
  • Puede reiniciar el flujo enviando una nueva configuración

Manejo recomendado

window.addEventListener('message', function(event) {
    if (event.data.type === 'SESSION_EXPIRED') {
        console.warn('Sesión expirada');
        
        // Opción 1: Reiniciar automáticamente
        setTimeout(() => {
            sendConfiguration();
        }, 2000);
        
        // Opción 2: Mostrar mensaje y esperar acción del usuario
        // showModal('Su sesión ha expirado. ¿Desea reiniciar?');
    }
});

Recomendación: Implemente un reinicio automático del flujo al recibir SESSION_EXPIRED para mejorar la experiencia del usuario.


8. Soporte y Recursos

Contacto

Para soporte técnico, consultas o reportar problemas:

ContactoInformación
Email de soporte[email protected]
Sitio webwww.jaak.ai
Horario de atenciónLunes a Viernes, 9:00 - 18:00 (Hora de México)

Información requerida para soporte

Al contactar soporte, incluya la siguiente información:

  • Modalidad de integración utilizada (Embed, Direct, o Link)
  • Navegador y versión utilizada
  • Logs de la consola del navegador
  • Pasos para reproducir el problema
  • Mensajes de error específicos

Recursos adicionales

  • Documentación técnica detallada disponible bajo petición
  • Ejemplos de código y casos de uso en nuestro repositorio
  • Webinars y sesiones de capacitación disponibles

Ejemplos de Casos de Uso

Caso 1: Onboarding de clientes (Embed)

<!DOCTYPE html>
<html>
<head>
    <title>Onboarding - Mi App</title>
    <style>
        #kycContainer {
            max-width: 800px;
            margin: 0 auto;
            padding: 20px;
        }
    </style>
</head>
<body>
    <div id="kycContainer">
        <h1>Verificación de Identidad</h1>
        <p>Complete el proceso de verificación para activar su cuenta</p>
        
        <iframe 
            id="kycMosaic" 
            src="https://mosaic.sandbox.jaak.ai/"
            width="100%" 
            height="600"
            allow="camera; geolocation">
        </iframe>
    </div>

    <script>
        // Configuración
        const config = {
            steps: [
                { key: 'WELCOME' },
                { key: 'DOCUMENT_EXTRACT' },
                { key: 'DOCUMENT_VERIFY' },
                { key: 'IVERIFICATION' },
                { key: 'OTO' }
            ],
            shortKey: 'ONBOARDING_KEY_123'
        };

        // Enviar configuración cuando cargue el iframe
        window.addEventListener('load', function() {
            setTimeout(() => {
                document.getElementById('kycMosaic')
                    .contentWindow.postMessage({
                        type: 'CONFIG',
                        data: config
                    }, '*');
            }, 1000);
        });

        // Manejar eventos
        window.addEventListener('message', function(event) {
            if (event.data.type === 'FLOW_COMPLETE') {
                // Redirigir a dashboard
                window.location.href = '/dashboard?verified=true';
            }
        });
    </script>
</body>
</html>

Caso 2: Verificación móvil (Direct)

// En una aplicación móvil o web app
class KYCVerification {
    constructor(shortKey) {
        this.shortKey = shortKey;
        this.directWindow = null;
        this.setupMessageListener();
    }

    setupMessageListener() {
        window.addEventListener('message', (event) => {
            this.handleMessage(event.data);
        });
    }

    open() {
        const url = 'https://mosaic.sandbox.jaak.ai/direct';
        const features = 'width=800,height=600,scrollbars=yes,resizable=yes';
        
        this.directWindow = window.open(url, 'kycVerification', features);
        
        if (!this.directWindow) {
            alert('Por favor permita ventanas emergentes para continuar');
            return false;
        }
        
        return true;
    }

    handleMessage(message) {
        switch(message.type) {
            case 'READY':
                this.sendConfiguration();
                break;
                
            case 'FLOW_COMPLETE':
                this.onComplete(message.data);
                break;
                
            case 'ERROR':
                this.onError(message.data);
                break;
        }
    }

    sendConfiguration() {
        if (this.directWindow && !this.directWindow.closed) {
            this.directWindow.postMessage({
                type: 'CONFIG',
                data: {
                    steps: [
                        { key: 'DOCUMENT_EXTRACT' },
                        { key: 'IVERIFICATION' },
                        { key: 'OTO' }
                    ],
                    shortKey: this.shortKey
                }
            }, '*');
        }
    }

    onComplete(data) {
        console.log('Verificación completada', data);
        // Guardar resultados en tu backend
        this.saveResults(data);
    }

    onError(error) {
        console.error('Error en verificación', error);
        alert('Hubo un error en la verificación. Por favor intente nuevamente.');
    }

    async saveResults(data) {
        try {
            const response = await fetch('/api/kyc/save', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify(data)
            });
            
            if (response.ok) {
                window.location.href = '/verification-success';
            }
        } catch (error) {
            console.error('Error guardando resultados', error);
        }
    }
}

// Uso
const kycBtn = document.getElementById('startKYC');
kycBtn.addEventListener('click', function() {
    const kyc = new KYCVerification('MOBILE_KEY_456');
    kyc.open();
});

Caso 3: Campaña de email (Link)

// Script para generar enlaces de campaña
function generateCampaignLinks(campaign, recipients) {
    const baseUrl = 'https://mosaic.sandbox.jaak.ai/link';
    const campaignShortKey = 'CAMPAIGN_2025_001';
    
    const links = recipients.map(recipient => {
        const params = new URLSearchParams({
            shortKey: campaignShortKey,
            steps: 'DOCUMENT_EXTRACT,DOCUMENT_VERIFY,IVERIFICATION',
            redirectUrl: `https://mi-app.com/campaign-complete?user=${recipient.id}&campaign=${campaign.id}`
        });
        
        return {
            recipient: recipient.email,
            link: `${baseUrl}?${params.toString()}`
        };
    });
    
    return links;
}

// Generar enlaces para campaña
const campaign = {
    id: 'onboarding-q1-2025',
    name: 'Onboarding Q1 2025'
};

const recipients = [
    { id: 'user123', email: '[email protected]' },
    { id: 'user456', email: '[email protected]' }
];

const campaignLinks = generateCampaignLinks(campaign, recipients);

// Enviar emails
campaignLinks.forEach(item => {
    sendEmail({
        to: item.recipient,
        subject: 'Complete su verificación de identidad',
        body: `
            Hola,
            
            Para completar su registro, por favor complete el proceso de verificación
            haciendo clic en el siguiente enlace:
            
            ${item.link}
            
            Este enlace es válido por 30 días.
            
            Saludos,
            Equipo de Mi App
        `
    });
});

console.log('Enlaces de campaña generados:', campaignLinks);

Mejores Prácticas

Seguridad

  1. Proteja su Short Key

    • No lo incluya en código del lado del cliente en producción
    • Use variables de entorno o servicios de backend
    • Rote las claves periódicamente
  2. Valide el origen de mensajes (producción)

    window.addEventListener('message', function(event) {
        // Validar origen en producción
        if (event.origin !== 'https://mosaic.jaak.ai') {
            console.warn('Mensaje de origen no confiable');
            return;
        }
        // Procesar mensaje
    });
  3. Use HTTPS siempre

    • Obligatorio para acceso a cámara
    • Protege la transmisión de datos sensibles

Experiencia de Usuario

  1. Proporcione instrucciones claras

    • Explique qué documentos se necesitan
    • Indique los pasos del proceso
    • Muestre tiempo estimado
  2. Manejo de errores amigable

    function handleKYCError(error) {
        const friendlyMessages = {
            'AUTHENTICATION_FAILED': 'No pudimos verificar su sesión. Por favor intente nuevamente.',
            'CAMERA_ACCESS_DENIED': 'Necesitamos acceso a su cámara para continuar.',
            'DOCUMENT_NOT_DETECTED': 'No pudimos detectar el documento. Por favor intente de nuevo.'
        };
        
        const message = friendlyMessages[error.error] || 'Ocurrió un error. Por favor intente nuevamente.';
        showUserMessage(message);
    }
  3. Indicadores de progreso

    window.addEventListener('message', function(event) {
        if (event.data.type === 'STEP_COMPLETE') {
            updateProgressBar(event.data.stepKey);
        }
    });

Rendimiento

  1. Precargue el iframe (Embed)

    <!-- Precargar en el head -->
    <link rel="preconnect" href="https://mosaic.sandbox.jaak.ai">
  2. Maneje timeout de carga

    let iframeLoaded = false;
    
    setTimeout(() => {
        if (!iframeLoaded) {
            showError('El servicio está tardando más de lo usual. Por favor recargue la página.');
        }
    }, 10000); // 10 segundos

Testing

  1. Ambiente de pruebas

    • Use https://mosaic.sandbox.jaak.ai/ para pruebas
    • Solicite Short Keys de prueba
    • Pruebe todos los flujos antes de producción
  2. Casos de prueba recomendados

    • Flujo completo exitoso
    • Cancelación por usuario
    • Pérdida de conexión
    • Timeout de sesión
    • Diferentes navegadores y dispositivos

Migración a Producción

Checklist pre-producción

  • Short Key de producción obtenido
  • URL actualizada a https://mosaic.jaak.ai/
  • HTTPS configurado en su dominio
  • Validación de origen implementada
  • Manejo de errores completo
  • Testing en navegadores principales
  • Testing en dispositivos móviles
  • Documentación de integración revisada
  • Plan de rollback preparado
  • Monitoreo y logs configurados

Configuración de producción

// Configuración de producción recomendada
const PRODUCTION_CONFIG = {
    mosaicUrl: 'https://mosaic.jaak.ai/',
    shortKey: process.env.JAAK_SHORT_KEY, // Desde variable de entorno
    allowedOrigins: ['https://mosaic.jaak.ai'],
    timeout: 900000, // 15 minutos
    retryAttempts: 3
};

// Uso seguro en producción
function initKYC() {
    if (!PRODUCTION_CONFIG.shortKey) {
        console.error('Short Key no configurado');
        return;
    }
    
    // Continuar con inicialización...
}

FAQ - Preguntas Frecuentes

¿Cuánto tiempo dura una sesión de KYC? Las sesiones tienen una duración de 14 minutos de inactividad. Después de este tiempo, la sesión expira y debe reiniciarse.

¿Puedo personalizar la apariencia de Mosaic? La modalidad Embed permite controlar el contenedor del iframe. El contenido interno de Mosaic no es personalizable para mantener consistencia y seguridad.

¿Qué documentos son soportados? JAAK KYC Mosaic soporta INE, pasaportes mexicanos, y otros documentos de identidad oficiales. Contacte a soporte para la lista completa.

¿Funciona en todos los navegadores? Sí, funciona en navegadores modernos (Chrome 80+, Firefox 75+, Safari 13+, Edge 80+) que soporten acceso a cámara.

¿Puedo usar Mosaic sin internet? No, Mosaic requiere conexión a internet activa para funcionar correctamente.

¿Los datos están seguros? Sí, todas las comunicaciones utilizan HTTPS y los datos son procesados siguiendo estándares de seguridad internacionales.

¿Puedo ejecutar pasos de forma independiente? Sí, puede configurar cualquier combinación de pasos. Algunos pasos como OTO requieren datos de pasos anteriores.

¿Qué pasa si el usuario cierra el navegador? Si el usuario cierra el navegador antes de completar, puede reiniciar el proceso. Los pasos completados se guardan durante la duración de la sesión (14 minutos).


Para más información, visite www.jaak.ai o contacte a [email protected]