Guía de Integración API
Guía para implementar un flujo de firma electrónica usando la API de Legaldoc.io y el widget embebido.
Requisitos Previos
Sección titulada «Requisitos Previos»- API Key: Token de autenticación para la API
- Plantilla configurada: Una plantilla creada en el portal de Legaldoc.io
Autenticación
Sección titulada «Autenticación»Todas las peticiones deben incluir:
Authorization: {API_KEY}Content-Type: application/jsonFlujo de Integración
Sección titulada «Flujo de Integración»Paso 1: Obtener el ID de la Plantilla
Sección titulada «Paso 1: Obtener el ID de la Plantilla»El ID se obtiene desde la URL al editar una plantilla:
https://app.legaldoc.io/t/mi-equipo/templates/18 ↑ Template ID = 18Configuración de Opciones de Email
Sección titulada «Configuración de Opciones de Email»Si no deseas que se envíen correos automáticos a los firmantes, debes configurar las Opciones de Email en la edición de la plantilla:
- En el editor de plantilla, en General
- En la sección Opciones de Email, desactivar todos los checkboxes de envío de correo:
- ❌ Enviar correo electrónico firma completa del destinatario
- ❌ Enviar correo electrónico de solicitud de firma del destinatario
- ❌ Enviar correo electrónico de destinatario eliminado
- ❌ Enviar correo electrónico de documento pendiente
- ❌ Enviar correo electrónico de documento completado
- ❌ Enviar correo electrónico de documento borrado
- ❌ Enviar correo electrónico de documento completado al propietario
Nota: Con estas opciones desactivadas, deberás distribuir manualmente los enlaces de firma usando la API o el widget embebido.
Paso 2: Consultar la Plantilla
Sección titulada «Paso 2: Consultar la Plantilla»Obtener el ID del firmante configurado en la plantilla.
Request
Sección titulada «Request»GET https://app.legaldoc.io/api/v1/templates/18Response (simplificado)
Sección titulada «Response (simplificado)»{ "id": 18, "title": "Mi Contrato.pdf", "recipients": [ { "id": 52, "name": "Destinatario", "role": "SIGNER" } ]}Importante: Guardar el
recipients[].id(en este ejemplo: 52) para el siguiente paso.
Paso 3: Generar el Documento
Sección titulada «Paso 3: Generar el Documento»Crear un documento a partir de la plantilla con los datos reales del firmante.
Request
Sección titulada «Request»POST https://app.legaldoc.io/api/v1/templates/18/generate-document{ "title": "Contrato - Cliente ABC", "recipients": [ { "id": 52, "name": "Juan Pérez", } ]}Response
Sección titulada «Response»{ "documentId": 153, "recipients": [ { "recipientId": 174, "name": "Juan Pérez", "token": "abc123XYZ", "role": "SIGNER", "signingUrl": "https://app.legaldoc.io/sign/abc123XYZ" } ]}Importante: Guardar el
token(abc123XYZ) para usar en el widget embebido.
3.1 Pre-llenar Campos del Documento (Opcional)
Sección titulada «3.1 Pre-llenar Campos del Documento (Opcional)»Si necesitas que ciertos campos aparezcan con valores predeterminados, puedes usar prefillFields.
Ejemplo: Pre-llenar un campo de texto con número de cuenta corriente.
Paso previo: Identificar el campo
Sección titulada «Paso previo: Identificar el campo»Del response del Paso 2 (Consultar Plantilla), busca el campo que deseas prellenar en el array fields:
{ "id": 526, "type": "TEXT", "recipientId": 144, "fieldMeta": { "label": "Cta Corriente", "type": "text", "required": true }}Nota: Guarda el
iddel campo (en este ejemplo: 526).
Request con campos prellenados
Sección titulada «Request con campos prellenados»POST https://app.legaldoc.io/api/v1/templates/19/generate-document{ "title": "Contrato Boletín Comercial", "recipients": [ { "id": 144, "name": "Juan Pérez", } ], "prefillFields": [ { "id": 526, "type": "text", "label": "Cta Corriente", "value": "12323123" } ]}El documento generado tendrá el campo “Cta Corriente” ya completado con el valor 12323123.
Hacer el campo de solo lectura
Sección titulada «Hacer el campo de solo lectura»Si deseas que el firmante no pueda modificar el valor prellenado:
- En el editor de plantilla de app.legaldoc.io, selecciona el campo, ingresa a ajustes avanzados
- Activa la opción “Sólo lectura” en las propiedades del campo
- Guarda la plantilla
De esta forma, el campo aparecerá prellenado y bloqueado para edición.
Paso 4: Enviar el Documento
Sección titulada «Paso 4: Enviar el Documento»Activar el documento para firma.
Request
Sección titulada «Request»POST https://app.legaldoc.io/api/v1/documents/153/sendResponse
Sección titulada «Response»{ "message": "Document sent for signing successfully", "id": 153, "status": "PENDING", "recipients": [ { "id": 174, "name": "Juan Pérez", "token": "abc123XYZ", "signingUrl": "https://app.legaldoc.io/sign/abc123XYZ" } ]}Paso 5: Widget Embebido
Sección titulada «Paso 5: Widget Embebido»5.1 Incluir el Script
Sección titulada «5.1 Incluir el Script»<script src="https://cdn.legaldoc.io/v1.0/embed.js"></script>5.2 Agregar el Componente
Sección titulada «5.2 Agregar el Componente»<legaldoc-embed-sign-document token="abc123XYZ" host="https://app.legaldoc.io" css="width: 100%; height: 890px; border: none; border-radius: 8px;"></legaldoc-embed-sign-document>Atributos Disponibles
Sección titulada «Atributos Disponibles»| Atributo | Tipo | Descripción |
|---|---|---|
token |
string | Requerido. Token del firmante |
host |
string | URL de Legaldoc.io |
lockName |
boolean | Bloquea el campo nombre |
lockEmail |
boolean | Bloquea el campo email |
darkModeDisabled |
boolean | Deshabilita modo oscuro |
css |
string | Estilos CSS del iframe |
5.3 Ejemplo en Angular
Sección titulada «5.3 Ejemplo en Angular»Template:
<legaldoc-embed-sign-document *ngIf="legaldocToken" id="legaldoc-component" [attr.token]="legaldocToken" host="https://app.legaldoc.io" css="width: 100%; height: 890px; border: none; border-radius: 8px;"></legaldoc-embed-sign-document>Componente:
@Component({ selector: "app-firma-documento", templateUrl: "./firma-documento.component.html",})export class FirmaDocumentoComponent implements OnChanges, AfterViewInit { @Input() empresaData: any; legaldocToken: string = "";
constructor(private _cdr: ChangeDetectorRef) {}
ngOnChanges(changes: SimpleChanges): void { if (changes["empresaData"]?.currentValue?.token) { this.legaldocToken = changes["empresaData"].currentValue.token; this._cdr.detectChanges(); setTimeout(() => this.configureLegaldocComponent(), 200); } }
ngAfterViewInit(): void { if (this.empresaData?.token) { this.legaldocToken = this.empresaData.token; setTimeout(() => this.configureLegaldocComponent(), 100); } }
private configureLegaldocComponent(): void { const element = document.getElementById("legaldoc-component") as any; if (element) { element.darkModeDisabled = true; element.lockName = true; element.lockEmail = true; element.cssVars = { background: "#ffffff", foreground: "#2c3e50", primary: "#60B22E", }; } }}5.4 Ejemplo en React
Sección titulada «5.4 Ejemplo en React»import { useEffect, useRef } from 'react';
export const FirmaDocumento = ({ token }) => { const widgetRef = useRef(null);
useEffect(() => { // Cargar script de Legaldoc const script = document.createElement('script'); script.src = 'https://cdn.legaldoc.io/v1.0/embed.js'; script.async = true; document.body.appendChild(script);
return () => document.body.removeChild(script); }, []);
useEffect(() => { if (!token || !widgetRef.current) return;
const element = widgetRef.current; element.darkModeDisabled = true; element.lockName = true; element.lockEmail = true; element.cssVars = { background: '#ffffff', foreground: '#2c3e50', primary: '#60B22E', };
element.onDocumentCompleted = () => { console.log('Documento firmado exitosamente'); }; }, [token]);
if (!token) return <div>Cargando...</div>;
return ( <legaldoc-embed-sign-document ref={widgetRef} token={token} host="https://app.legaldoc.io" style={{ width: '100%', height: '890px', border: 'none', borderRadius: '8px' }} /> );};Personalización del Widget
Sección titulada «Personalización del Widget»Variables CSS
Sección titulada «Variables CSS»element.cssVars = { background: "#ffffff", // Fondo foreground: "#2c3e50", // Texto primary: "#60B22E", // Color principal (botones)};Eventos
Sección titulada «Eventos»| Evento | Descripción |
|---|---|
onDocumentReady |
Documento listo para firmar |
onDocumentCompleted |
Firma completada |
onDocumentError |
Error en el proceso |