Ir al contenido

Guía de Integración API

Ver MarkdownAbrir en ClaudeAbrir en ChatGPT

Guía para implementar un flujo de firma electrónica usando la API de Legaldoc.io y el widget embebido.


  • API Key: Token de autenticación para la API
  • Plantilla configurada: Una plantilla creada en el portal de Legaldoc.io

Todas las peticiones deben incluir:

Authorization: {API_KEY}
Content-Type: application/json

  1. Obtener IDde la Plantilla
  2. Consultarla Plantilla
  3. Generarel Documento
  4. Enviara firma
  5. Widgeto URL de firma

El ID se obtiene desde la URL al editar una plantilla:

https://app.legaldoc.io/t/mi-equipo/templates/18
Template ID = 18

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:

  1. En el editor de plantilla, en General
  2. 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.


Obtener el ID del firmante configurado en la plantilla.

GET https://app.legaldoc.io/api/v1/templates/18
{
"id": 18,
"title": "Mi Contrato.pdf",
"recipients": [
{
"id": 52,
"name": "Destinatario",
"email": "[email protected]",
"role": "SIGNER"
}
]
}

Importante: Guardar el recipients[].id (en este ejemplo: 52) para el siguiente paso.


Crear un documento a partir de la plantilla con los datos reales del firmante.

POST https://app.legaldoc.io/api/v1/templates/18/generate-document
{
"title": "Contrato - Cliente ABC",
"recipients": [
{
"id": 52,
"name": "Juan Pérez",
"email": "[email protected]"
}
]
}
{
"documentId": 153,
"recipients": [
{
"recipientId": 174,
"name": "Juan Pérez",
"email": "[email protected]",
"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.

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 id del campo (en este ejemplo: 526).

POST https://app.legaldoc.io/api/v1/templates/19/generate-document
{
"title": "Contrato Boletín Comercial",
"recipients": [
{
"id": 144,
"name": "Juan Pérez",
"email": "[email protected]"
}
],
"prefillFields": [
{
"id": 526,
"type": "text",
"label": "Cta Corriente",
"value": "12323123"
}
]
}

El documento generado tendrá el campo “Cta Corriente” ya completado con el valor 12323123.

Si deseas que el firmante no pueda modificar el valor prellenado:

  1. En el editor de plantilla de app.legaldoc.io, selecciona el campo, ingresa a ajustes avanzados
  2. Activa la opción “Sólo lectura” en las propiedades del campo
  3. Guarda la plantilla

De esta forma, el campo aparecerá prellenado y bloqueado para edición.


Activar el documento para firma.

POST https://app.legaldoc.io/api/v1/documents/153/send
{
"message": "Document sent for signing successfully",
"id": 153,
"status": "PENDING",
"recipients": [
{
"id": 174,
"name": "Juan Pérez",
"email": "[email protected]",
"token": "abc123XYZ",
"signingUrl": "https://app.legaldoc.io/sign/abc123XYZ"
}
]
}

<script src="https://cdn.legaldoc.io/v1.0/embed.js"></script>
<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>
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

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",
};
}
}
}
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' }}
/>
);
};

element.cssVars = {
background: "#ffffff", // Fondo
foreground: "#2c3e50", // Texto
primary: "#60B22E", // Color principal (botones)
};
Evento Descripción
onDocumentReady Documento listo para firmar
onDocumentCompleted Firma completada
onDocumentError Error en el proceso