Saltar al contenido principal

Referencia de Mensajes

Detalle completo de todos los mensajes que podés enviar y recibir del iframe.

Resumen

MensajeDirecciónDescripción
lakaut.initTu app → IframeInicializar sesión
lakaut.load.fileTu app → IframeEnviar documento para firmar
lakaut.readyIframe → Tu appIframe listo para recibir init
lakaut.handshake.ackIframe → Tu appConfirma conexión establecida
lakaut.signature.completedIframe → Tu appNotifica firma exitosa
lakaut.errorIframe → Tu appNotifica error

Mensajes que enviás al iframe

lakaut.init

Inicializá la sesión de firma. Debe enviarse después de recibir lakaut.ready o cuando el iframe haya cargado.

iframe.contentWindow.postMessage({
type: 'lakaut.init',
payload: {
nonce: 'uuid-unico-sesion',
idemKey: 'uuid-idempotencia',
integratorId: 'tu-integrator-id',
userData: {
dni: '12345678',
cuil: '20-12345678-9',
email: 'usuario@empresa.com',
gender: 'M',
phone: '1122334455',
name: 'Juan Pérez',
address: 'Av. Corrientes 1234, CABA'
},
// Opcional: cargar documento en el init
autoLoadFile: {
fileName: 'contrato.pdf',
mime: 'application/pdf',
base64: 'JVBERi0xLjcK...'
}
}
}, 'https://www.lakautac.com.ar');

Campos del payload

CampoTipoRequeridoDescripción
noncestringUUID único para esta sesión. Usar crypto.randomUUID()
idemKeystringClave de idempotencia. Previene firmas duplicadas si se reintenta
integratorIdstringTu identificador de integrador (proporcionado por Lakaut)
userDataobjectDatos del usuario firmante
userData.dnistringDNI del firmante (8 dígitos). Alternativa a CUIL
userData.cuilstringCUIL del firmante (formato: XX-XXXXXXXX-X)
userData.emailstringEmail del firmante
userData.genderstringGénero: 'M' (masculino), 'F' (femenino) o 'X' (otro)
userData.phonestringNúmero de teléfono del firmante (10 dígitos)
userData.namestringNombre completo del firmante
userData.addressstringDomicilio del firmante
autoLoadFileobjectDocumento a cargar automáticamente
autoLoadFile.fileNamestring✅*Nombre del archivo
autoLoadFile.mimestring✅*Tipo MIME ('application/pdf')
autoLoadFile.base64string✅*Contenido en Base64 sin prefijo

*Requerido si se incluye autoLoadFile

DNI vs CUIL

Podés enviar dni o cuil (o ambos). Si enviás solo el DNI, el sistema puede derivar el CUIL automáticamente junto con el género.


lakaut.load.file

Enviá un documento para que el usuario lo firme. Debe enviarse después de recibir lakaut.handshake.ack.

iframe.contentWindow.postMessage({
type: 'lakaut.load.file',
payload: {
fileName: 'contrato.pdf',
mime: 'application/pdf',
base64: 'JVBERi0xLjcK...'
}
}, 'https://www.lakautac.com.ar');

Campos del payload

CampoTipoRequeridoDescripción
fileNamestringNombre del archivo a mostrar al usuario
mimestringTipo MIME. Debe ser 'application/pdf'
base64stringContenido del PDF en Base64 (sin prefijo data:...)
tip

El fileName se muestra al usuario durante el proceso de firma. Usá un nombre descriptivo como "Contrato de Servicios - Cliente ABC.pdf".

Alternativa

También podés enviar el documento directamente en lakaut.init usando el campo autoLoadFile, evitando la necesidad de enviar este mensaje por separado.


Mensajes que recibís del iframe

lakaut.ready

Notifica que el iframe cargó y está listo para recibir la inicialización.

window.addEventListener('message', (event) => {
if (event.origin !== 'https://www.lakautac.com.ar') return;

if (event.data.type === 'lakaut.ready') {
console.log('Iframe listo, enviando init...');
enviarInit();
}
});

Payload

Este mensaje no incluye payload adicional.

Mejor práctica

Usá lakaut.ready en lugar de iframe.onload para saber cuándo enviar el init. Es más confiable porque confirma que el código del iframe está ejecutándose.


lakaut.handshake.ack

Confirma que el iframe recibió la inicialización y está listo para operar.

window.addEventListener('message', (event) => {
if (event.origin !== 'https://www.lakautac.com.ar') return;

if (event.data.type === 'lakaut.handshake.ack') {
console.log('Conexión establecida, iframe listo');
// Ahora podés enviar lakaut.load.file si querés
}
});

Payload

Este mensaje no incluye payload adicional.


lakaut.signature.completed

Notifica que el usuario completó la firma exitosamente. Incluye el documento firmado.

{
type: 'lakaut.signature.completed',
payload: {
eventId: 'uuid-del-evento',
idemKey: 'uuid-original-que-enviaste',
signedDocId: 'signed_abc123',
document: {
fileName: 'contrato.pdf',
mime: 'application/pdf',
size: 248950,
sha256: 'a1b2c3d4e5f6...',
objectKey: 's3-key-interno'
},
consumption: 'FIRMA_SIMPLE',
delivery: {
mode: 'binary',
fileBase64: 'JVBERi0xLjcK...'
}
}
}

Campos del payload

CampoTipoDescripción
eventIdstringIdentificador único de este evento
idemKeystringLa misma idemKey que enviaste en lakaut.init
signedDocIdstringID único del documento firmado (para referencia futura)
document.fileNamestringNombre del archivo firmado
document.mimestringTipo MIME del documento ('application/pdf')
document.sizenumberTamaño en bytes del documento firmado
document.sha256stringHash SHA256 del documento para verificación de integridad
document.objectKeystringReferencia interna (no usar)
consumptionstringTipo de firma aplicada (ej: 'FIRMA_SIMPLE')
delivery.modestringModo de entrega: 'binary' o 'url'
delivery.fileBase64stringDocumento firmado en Base64 (cuando mode es 'binary')
delivery.urlstringURL de descarga (cuando mode es 'url')

Descargar el documento firmado

function descargarDocumentoFirmado(payload) {
const { signedDocId, document, delivery } = payload;

if (delivery.mode === 'binary') {
// Decodificar Base64
const byteCharacters = atob(delivery.fileBase64);
const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
const blob = new Blob([byteArray], { type: document.mime });

// Crear link de descarga
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = document.fileName || `firmado-${signedDocId}.pdf`;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
}
}

lakaut.error

Notifica que ocurrió un error durante el proceso.

{
type: 'lakaut.error',
code: 'INSUFFICIENT_BALANCE',
message: 'No hay créditos disponibles para realizar la firma'
}
Estructura del mensaje

A diferencia de otros mensajes, lakaut.error tiene los campos code y message en el nivel raíz del mensaje, no dentro de un payload.

Campos del mensaje

CampoTipoDescripción
typestringSiempre 'lakaut.error'
codestringCódigo de error
messagestringMensaje descriptivo del error

Códigos de error comunes

CódigoDescripciónAcción sugerida
INVALID_REQUESTDatos incorrectos o faltantesVerificá los datos enviados
SESSION_EXPIREDEl token JWT expiróRecargá el iframe
INSUFFICIENT_BALANCESin créditos para firmarContactá al administrador
INTERNAL_ERRORError del servidorReintentá más tarde
ORIGIN_NOT_ALLOWEDDominio no autorizadoContactá a Lakaut para registrar tu dominio

Manejo de errores

window.addEventListener('message', (event) => {
if (event.origin !== 'https://www.lakautac.com.ar') return;

if (event.data.type === 'lakaut.error') {
const { code, message } = event.data;
console.error(`Error [${code}]: ${message}`);

// Mostrar al usuario
mostrarError(message);
}
});

Validación de origen

Importante

Siempre validá el origen de los mensajes recibidos para evitar problemas de seguridad.

window.addEventListener('message', (event) => {
// SIEMPRE validar el origen
if (event.origin !== 'https://www.lakautac.com.ar') {
console.warn('Mensaje de origen no autorizado:', event.origin);
return;
}

// Procesar mensaje...
});

Ejemplo completo

const LAKAUT_ORIGIN = 'https://www.lakautac.com.ar';
const iframe = document.getElementById('lakaut-firma');

// Estado
let isReady = false;
let pendingDocument = null;

// Escuchar eventos
window.addEventListener('message', (event) => {
if (event.origin !== LAKAUT_ORIGIN) return;

const { type } = event.data;

switch (type) {
case 'lakaut.ready':
// Iframe listo, enviar init
iframe.contentWindow.postMessage({
type: 'lakaut.init',
payload: {
nonce: crypto.randomUUID(),
idemKey: crypto.randomUUID(),
integratorId: 'mi-empresa',
userData: {
dni: '12345678',
cuil: '20-12345678-9',
email: 'usuario@empresa.com',
gender: 'M',
phone: '1122334455'
}
}
}, LAKAUT_ORIGIN);
break;

case 'lakaut.handshake.ack':
isReady = true;
// Si hay documento pendiente, enviarlo
if (pendingDocument) {
enviarDocumento(pendingDocument);
pendingDocument = null;
}
break;

case 'lakaut.signature.completed':
handleFirmaCompletada(event.data.payload);
break;

case 'lakaut.error':
handleError(event.data);
break;
}
});

function enviarDocumento(doc) {
if (!isReady) {
pendingDocument = doc;
return;
}

iframe.contentWindow.postMessage({
type: 'lakaut.load.file',
payload: doc
}, LAKAUT_ORIGIN);
}

function handleFirmaCompletada(payload) {
console.log('Documento firmado:', payload.signedDocId);
console.log('Hash SHA256:', payload.document.sha256);
// Guardar, descargar, etc.
}

function handleError({ code, message }) {
console.error(`Error [${code}]: ${message}`);
alert(`Error: ${message}`);
}