Cómo generar documentos personalizados con Templates y Variables en AllSign
Tienes un contrato que envías a 50 clientes al mes. Cada vez cambias el nombre, RFC, monto y fecha a mano. Lo copias, lo pegas, lo revisas, lo vuelves a revisar.
¿Y si pudieras subir ese contrato una sola vez y generar las 50 versiones personalizadas con un API call cada una?
Eso son los Templates de AllSign.
Cómo funciona (en 30 segundos)
DOCX con variables {{ }}
│
▼
POST /v2/templates ← subes el archivo una vez
│
▼
AllSign detecta variables ← automático, no configuras nada
│
▼
POST /v2/documents ← creas documentos con datos reales
│
▼
PDF generado + firmantes listos
Un template se sube una vez. Se usa mil veces.
Paso 1 — Prepara tu DOCX
Abre Word. Escribe tu contrato normal. Donde irían datos variables, usa doble llave:
La empresa {{ arrendador__nombre }}, con RFC {{ arrendador__rfc }},
con domicilio en {{ arrendador__domicilio }}, arrienda el inmueble
ubicado en {{ direccion_inmueble }} al C. {{ arrendatario__nombre }},
con RFC {{ arrendatario__rfc }}, por un monto mensual de
${{ monto_renta }} MXN, con vigencia de {{ vigencia_meses }} meses.
Firmado en {{ ciudad_firma }} el {{ fecha_firma }}.
La convención que hace la magia
El doble guion bajo (__) separa el rol del campo:
| Variable en el DOCX | Rol detectado | Campo |
|---|---|---|
arrendador__nombre |
Arrendador | Nombre |
arrendador__rfc |
Arrendador | RFC |
arrendatario__nombre |
Arrendatario | Nombre |
monto_renta |
(general) | Monto Renta |
fecha_firma |
(general) | Fecha Firma |
¿Por qué importa? Porque AllSign agrupa automáticamente las variables por rol. En el dashboard, cada firmante ve solo las variables que le corresponden. Y si tienes contactos en el CRM, se auto-llenan.
Las variables sin __ son generales del documento — no pertenecen a ningún firmante.
Inferencia automática de tipos
AllSign también infiere el tipo de input a partir del nombre:
| Palabra en el nombre | Tipo de input |
|---|---|
fecha, nacimiento, vencimiento |
Date picker |
monto, precio, salario, renta |
Input numérico con formato moneda |
direccion, domicilio, descripcion |
Textarea multi-línea |
numero, cantidad, plazo |
Input numérico |
| Cualquier otro | Input de texto |
No configuras nada. Solo nombra bien tus variables.
Paso 2 — Sube el Template
Un solo curl. Solo mandas el archivo y un nombre — AllSign hace el resto:
curl -X POST https://api.allsign.io/v2/templates/ \
-H "Authorization: Bearer allsign_live_sk_TU_API_KEY" \
-F "file=@./contrato_arrendamiento.docx" \
-F "name=Contrato de arrendamiento" \
-F "tags=legal,renta" \
-F "category=contratos"
AllSign analiza el DOCX, detecta todas las {{ variables }} y te devuelve su configuración completa — tipos, labels y roles inferidos automáticamente:
Response (201):
{
"id": "c8dcfe72-f07a-46f4-8d79-54d75685c66f",
"name": "Contrato de arrendamiento",
"originalFilename": "contrato_arrendamiento.docx",
"fileType": "docx",
"variables": [
"arrendador__domicilio",
"arrendador__nombre",
"arrendador__rfc",
"arrendatario__nombre",
"arrendatario__rfc",
"ciudad_firma",
"direccion_inmueble",
"fecha_firma",
"monto_renta",
"vigencia_meses"
],
"variableConfig": [
{
"name": "arrendador__domicilio",
"label": "Domicilio",
"type": "textarea",
"required": true,
"role": "Arrendador"
},
{
"name": "arrendador__nombre",
"label": "Nombre",
"type": "text",
"required": true,
"role": "Arrendador"
},
{
"name": "arrendador__rfc",
"label": "Rfc",
"type": "text",
"required": true,
"role": "Arrendador"
},
{
"name": "arrendatario__nombre",
"label": "Nombre",
"type": "text",
"required": true,
"role": "Arrendatario"
},
{
"name": "arrendatario__rfc",
"label": "Rfc",
"type": "text",
"required": true,
"role": "Arrendatario"
},
{
"name": "monto_renta",
"label": "Monto Renta",
"type": "currency",
"required": true,
"role": null
},
{
"name": "fecha_firma",
"label": "Fecha Firma",
"type": "date",
"required": true,
"role": null
}
],
"tags": ["legal", "renta"],
"category": "contratos",
"aiEditable": true,
"createdAt": "2026-04-13T19:15:51Z"
}
Subiste un .docx con texto plano y AllSign te devolvió un variableConfig completo. No configuraste nada. Mira cómo arrendador__domicilio se infirió como textarea y fecha_firma como date — todo por el nombre.
Guarda el id — lo necesitas para el siguiente paso.
Paso 3 — Crea un documento con datos reales
Ahora usas ese template para generar un documento personalizado. Envías el templateId, los valores de las variables y los firmantes:
curl -X POST "https://api.allsign.io/v2/documents?mode=async" \
-H "Authorization: Bearer allsign_live_sk_TU_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"templateId": "c8dcfe72-f07a-46f4-8d79-54d75685c66f",
"templateValues": {
"arrendador__nombre": "María López García",
"arrendador__rfc": "LOPM800101ABC",
"arrendador__domicilio": "Av. Reforma 250, Col. Juárez, CDMX",
"arrendatario__nombre": "Juan Pérez Hernández",
"arrendatario__rfc": "PEHJ900515XYZ",
"direccion_inmueble": "Calle Durango 45, Col. Roma, CDMX",
"monto_renta": "15,000.00",
"vigencia_meses": "12",
"ciudad_firma": "Ciudad de México",
"fecha_firma": "13 de abril de 2026"
},
"participants": [
{"name": "María López García", "email": "maria@tuempresa.com"},
{"name": "Juan Pérez Hernández", "email": "juan@cliente.com"}
]
}'
¿Qué pasa internamente?
- AllSign toma el DOCX original
- Sustituye cada
{{ variable }}por el valor que enviaste - Genera el PDF final
- Crea el documento con los firmantes asignados
Como la generación del PDF toma unos segundos, el modo async te devuelve de inmediato un workflowId y una URL para seguir el progreso:
Response (202):
{
"status": "processing",
"workflowId": "doc-create-715d9e01-5abd-4e65-bbaf-9be67f9512ca",
"progressUrl": "/v2/documents/workflows/doc-create-715d9e01-.../progress"
}
Consulta el progreso
curl https://api.allsign.io/v2/documents/workflows/WORKFLOW_ID/status \
-H "Authorization: Bearer allsign_live_sk_TU_API_KEY"
El response te da progreso en tiempo real:
{
"status": "processing",
"step": "relations",
"progress": 65,
"message": "Configurando acceso...",
"documentId": "c2095713-0586-4bed-866a-c326c4b182a5",
"creditsConsumed": null,
"error": null
}
Haz polling cada 2-3 segundos. Cuando status sea completed y progress sea 100, tu documento está listo:
{
"status": "completed",
"step": "complete",
"progress": 100,
"message": "¡Documento listo!",
"documentId": "c2095713-0586-4bed-866a-c326c4b182a5",
"creditsConsumed": 0,
"error": null
}
El documentId es lo que usas de aquí en adelante.
Paso 4 — Envía a firmar
Un solo call que envía las invitaciones por correo y activa el flujo de firma:
curl -X POST https://api.allsign.io/v2/documents/DOCUMENT_ID/invite-bulk \
-H "Authorization: Bearer allsign_live_sk_TU_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"participants": [
{"name": "María López García", "email": "maria@tuempresa.com"},
{"name": "Juan Pérez Hernández", "email": "juan@cliente.com"}
],
"config": {
"invitedByEmail": "tu@tuempresa.com",
"invitedByName": "Tu Empresa"
}
}'
Response (200):
{
"success": true,
"message": "Processed 2 invitations via Temporal. Sent: 2, Failed: 0",
"sentCount": 2,
"failedCount": 0,
"details": [
{
"participant": "maria@tuempresa.com",
"success": true
},
{
"participant": "juan@cliente.com",
"success": true
}
]
}
Cada firmante recibe un correo con un link seguro. Abren, revisan el documento y firman.
invite-bulk activa el flujo de firma internamente — no necesitas llamar a start-signing por separado.
Paso 5 — Consulta el estado
curl https://api.allsign.io/v2/documents/DOCUMENT_ID \
-H "Authorization: Bearer allsign_live_sk_TU_API_KEY"
El estado del documento vive dentro de signersData:
{
"id": "c2095713-0586-4bed-866a-c326c4b182a5",
"name": "Contrato de arrendamiento.pdf",
"signersData": {
"status": "ESPERANDO_FIRMAS",
"signatures": [
{
"status": "WAITING FOR SIGNATURE",
"signer": {
"email": "maria@tuempresa.com"
}
},
{
"status": "WAITING FOR SIGNATURE",
"signer": {
"email": "juan@cliente.com"
}
}
]
}
}
| signersData.status | Qué significa |
|---|---|
RECOLECTANDO_FIRMANTES |
Creado, configurando firmantes |
ESPERANDO_FIRMAS |
Invitaciones enviadas, esperando |
COMPLETADO |
Todos firmaron |
ANULADO |
Cancelado |
EXPIRADO |
Expiró sin completarse |
El flujo completo en un vistazo
1. Prepara tu DOCX con {{ variables }}
2. POST /v2/templates ← sube una vez
3. POST /v2/documents?mode=async ← genera con datos reales
4. GET /v2/documents/workflows/{id}/status ← espera el PDF
5. POST /v2/documents/{id}/invite-bulk ← envía a firmar
6. GET /v2/documents/{id} ← consulta el estado
Del paso 2 en adelante, todo es automatizable. Un cron, un webhook, una integración con tu CRM — lo que necesites.
Tres cosas que hacen la diferencia
1. La convención rol__campo es tu mejor amiga
No es solo una convención de nombres — es lo que habilita el auto-agrupamiento por firmante, el auto-llenado desde contactos del CRM, y la asignación automática de variables en chains multi-documento.
2. Reutiliza, no dupliques
Un template se sube una vez y genera miles de documentos. Si necesitas una versión diferente del contrato, sube un template nuevo — no modifiques el existente que ya tiene documentos generados.
3. Webhooks para cerrar el loop
Configura un webhook en el evento document.completed para recibir una notificación cuando todos firmen. Así puedes disparar tu lógica post-firma automáticamente: actualizar tu CRM, enviar una confirmación, archivar el documento.
Importa los endpoints en Postman
Tenemos una especificación OpenAPI con los 71 endpoints públicos documentados, lista para importar:
https://developers.allsign.io/openapi-public.json
En Postman: Import → Upload Files → selecciona el JSON. Configura baseUrl como https://api.allsign.io/v2 y agrega tu API key como Bearer token.
Recursos
- Templates: https://developers.allsign.io/endpoints/templates
- Documents: https://developers.allsign.io/endpoints/documents
- Inicio rápido: https://developers.allsign.io/quickstart
- OpenAPI para Postman: https://developers.allsign.io/openapi-public.json