Templates
Los endpoints de Templates te permiten subir archivos .docx (o .pdf) reutilizables que contienen variables tipo Jinja2 ({{ nombre_cliente }}). AllSign detecta automáticamente esas variables, infiere su tipo, y las deja listas para que las uses al crear documentos individuales o chains (paquetes multi-documento).
Los templates son la fuente del flujo "documento desde plantilla" y son obligatorios cuando creas un Chain — cada documento del chain referencia un templateId.
Subir template
Sube un archivo .docx o .pdf y crea un nuevo template. El backend:
- Valida que el archivo sea un DOCX o PDF válido (máx. 50 MB).
- Auto-detecta todas las variables
{{ ... }}en el documento (solo DOCX). - Infiere el tipo de cada variable (text, date, currency, etc.) a partir del nombre.
- Almacena el archivo original en S3 para reutilizarlo.
- Retorna la lista de variables detectadas con metadata.
El request es multipart/form-data, no JSON.
Form fields
- Name
file- Type
- file
- Description
Archivo
.docxo.pdf. Tamaño máximo: 50 MB. Solo se aceptan estas dos extensiones.
- Name
name- Type
- string
- Description
Nombre visible del template (1–255 caracteres).
- Name
description- Type
- string
- Description
Descripción opcional.
- Name
tags- Type
- string
- Description
Tags separados por coma. Ejemplo:
legal,nda,ventas.
- Name
category- Type
- string
- Description
Categoría libre para organizar templates.
- Name
aiEditable- Type
- boolean
- Description
Si
true(default), el template puede editarse con el endpoint de AI edit.
Response — 201 Created
Response (201)
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Contrato de arrendamiento",
"description": null,
"originalFilename": "contrato_arrendamiento.docx",
"fileType": "docx",
"variables": ["arrendador__nombre", "arrendatario__nombre", "monto_renta"],
"variableConfig": [
{ "name": "arrendador__nombre", "label": "Nombre", "type": "text", "required": true, "role": "Arrendador" },
{ "name": "arrendatario__nombre", "label": "Nombre", "type": "text", "required": true, "role": "Arrendatario" },
{ "name": "monto_renta", "label": "Monto Renta", "type": "currency", "required": true, "role": null }
],
"tags": ["legal", "renta"],
"category": "contratos",
"aiEditable": true,
"createdAt": "2026-04-07T20:00:00Z"
}
curl — subir template
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"
Errores
| Status | Cuándo ocurre |
|---|---|
400 Bad Request | Extensión no soportada, archivo vacío, o > 50 MB |
401 Unauthorized | API key inválida o sin scope document:write |
Listar templates
Devuelve todos los templates activos del usuario u organización autenticados. Soporta filtros por tipo de archivo, tags, categoría y búsqueda de texto.
Query parameters
- Name
fileType- Type
- string
- Description
Filtra por
docxopdf.
- Name
tags- Type
- string
- Description
Tags separados por coma. Coincide si el template tiene al menos uno de los tags listados.
- Name
category- Type
- string
- Description
Filtra por categoría exacta.
- Name
q- Type
- string
- Description
Búsqueda de texto sobre nombre y descripción.
Response — 200 OK
Response (200)
{
"success": true,
"data": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Contrato de arrendamiento",
"fileType": "docx",
"tags": ["legal", "renta"],
"category": "contratos",
"usageCount": 12,
"lastUsedAt": "2026-04-05T15:30:00Z",
"createdAt": "2026-03-01T10:00:00Z"
}
],
"total": 1
}
Obtener template
Devuelve el detalle completo de un template, incluyendo variables, variableConfig, testDataSets y metadata de uso.
Path parameters
- Name
id- Type
- string
- Description
UUID del template.
Response — 200 OK
Response (200)
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Contrato de arrendamiento",
"description": null,
"originalFilename": "contrato_arrendamiento.docx",
"fileType": "docx",
"variables": ["arrendador__nombre", "arrendatario__nombre", "monto_renta"],
"variableConfig": [
{ "name": "arrendador__nombre", "label": "Nombre", "type": "text", "required": true, "role": "Arrendador" }
],
"tags": ["legal", "renta"],
"category": "contratos",
"aiEditable": true,
"usageCount": 12,
"lastUsedAt": "2026-04-05T15:30:00Z",
"currentVersion": 1,
"testDataSets": [],
"createdAt": "2026-03-01T10:00:00Z",
"updatedAt": "2026-03-01T10:00:00Z"
}
Para obtener únicamente la lista de variables (sin el resto del detalle), usa GET /v2/templates/{id}/variables.
Errores
| Status | Cuándo ocurre |
|---|---|
404 Not Found | El template no existe o no pertenece al caller |
Inferencia de roles
Al subir un template DOCX, AllSign analiza los nombres de las variables para inferir automáticamente un rol de firmante por cada variable. Esto permite agrupar variables por rol en el dashboard y habilitar el auto-llenado desde contactos del CRM.
Convención __ (doble guion bajo)
La inferencia usa una convención simple: el doble guion bajo (__) separa el rol del campo.
{{ rol__campo }}
Todo lo que está antes de __ es el nombre del rol. Todo lo que está después es el nombre del campo. Las variables sin __ son variables generales del documento (sin rol).
| Variable en el DOCX | Rol inferido | Campo mostrado |
|---|---|---|
arrendador__nombre | Arrendador | Nombre |
arrendador__rfc | Arrendador | Rfc |
parte_reveladora__domicilio | Parte Reveladora | Domicilio |
receptor__representante_legal | Receptor | Representante Legal |
fecha_firma | null | Fecha Firma |
vigencia_meses | null | Vigencia Meses |
Roles ilimitados
No hay un diccionario fijo de roles. Cualquier texto antes de __ se convierte en un rol:
{{ comprador__nombre }} → Rol: "Comprador"
{{ empresa_contratante__rfc }} → Rol: "Empresa Contratante"
{{ testigo_1__nombre }} → Rol: "Testigo 1"
{{ notario__numero }} → Rol: "Notario"
Los guiones bajos simples (_) dentro del rol se convierten en espacios y se capitalizan: parte_reveladora → "Parte Reveladora".
Inferencia de tipo
AllSign infiere el tipo de input a partir del nombre del campo (la parte después de __):
| Palabras en el campo | Tipo inferido | Input en el dashboard |
|---|---|---|
fecha, nacimiento, vencimiento | date | Date picker |
monto, precio, salario, renta | currency | Input numérico con formato |
direccion, domicilio, descripcion | textarea | Textarea multi-línea |
numero, cantidad, plazo, edad | number | Input numérico |
| Cualquier otro | text | Input de texto |
El campo role en variableConfig es null cuando la variable no contiene __. Estas variables se consideran "generales" del documento (ej. fecha_firma, vigencia_meses).
Auto-llenado con contactos
Cuando un template tiene variables con roles inferidos, el dashboard permite seleccionar un contacto del CRM para cada rol. Las variables se auto-llenan usando los customFields del contacto seleccionado, comparando por nombre exacto de variable.
Los customFields se persisten automáticamente cada vez que un firmante llena variables en un Chain, creando un ciclo de enriquecimiento progresivo.
Ejemplo completo — NDA
Un archivo DOCX de NDA con estas variables:
La empresa {{ revelador__nombre }}, con RFC {{ revelador__rfc }},
con domicilio en {{ revelador__domicilio }}, representada por
{{ revelador__representante }}, en adelante "La Parte Reveladora"...
...y {{ receptor__nombre }}, con RFC {{ receptor__rfc }}...
Firmado en {{ ciudad_firma }} el {{ fecha_firma }},
con vigencia de {{ vigencia_meses }} meses.
Produce este variableConfig:
| Variable | Rol | Label | Tipo |
|---|---|---|---|
revelador__nombre | Revelador | Nombre | text |
revelador__rfc | Revelador | Rfc | text |
revelador__domicilio | Revelador | Domicilio | textarea |
revelador__representante | Revelador | Representante | text |
receptor__nombre | Receptor | Nombre | text |
receptor__rfc | Receptor | Rfc | text |
ciudad_firma | — | Ciudad Firma | text |
fecha_firma | — | Fecha Firma | date |
vigencia_meses | — | Vigencia Meses | number |
Recomputar roles
Re-ejecuta la inferencia de roles sobre el variableConfig de un template existente. Esto es necesario para templates que se subieron antes de que la detección de roles estuviera habilitada.
Path parameters
- Name
id- Type
- string
- Description
UUID del template.
Response — 200 OK
Response (200)
{
"updated": 1,
"variableConfig": [
{ "name": "arrendador__nombre", "label": "Nombre", "type": "text", "required": true, "role": "Arrendador" },
{ "name": "monto_renta", "label": "Monto Renta", "type": "currency", "required": true, "role": null }
]
}
curl
curl -X POST https://api.allsign.io/v2/templates/550e8400-e29b-41d4-a716-446655440000/recompute-roles \
-H "Authorization: Bearer ALLSIGN_LIVE_SK"
El dashboard ejecuta este endpoint automáticamente al abrir un template que no tiene roles inferidos.
Backfill de roles
Re-ejecuta la inferencia de roles sobre todos los templates activos del tenant. Operación masiva para migrar templates existentes.
Response — 200 OK
Response (200)
{
"updated": 15
}
curl
curl -X POST https://api.allsign.io/v2/templates/backfill-roles \
-H "Authorization: Bearer ALLSIGN_LIVE_SK"
Actualizar template
Actualiza la metadata editable de un template: nombre, descripción, tags, categoría, flag aiEditable y variableConfig. No reemplaza el archivo subido — para eso usa POST /v2/templates/{id}/duplicate y vuelve a subir.
Request body
- Name
name- Type
- string
- Description
Nuevo nombre visible.
- Name
description- Type
- string
- Description
Nueva descripción.
- Name
tags- Type
- array
- Description
Lista de tags (reemplaza la existente).
- Name
category- Type
- string
- Description
Nueva categoría.
- Name
aiEditable- Type
- boolean
- Description
Habilita o deshabilita la edición con AI.
- Name
variableConfig- Type
- array
- Description
Configuración por variable. Cada item incluye
name,label,type,required, opcionalmentedefaultValue, yrole(inferido automáticamente al subir, puede sernullpara variables generales).
Response — 200 OK
Devuelve el mismo payload que GET /v2/templates/{id}.
Errores
| Status | Cuándo ocurre |
|---|---|
403 Forbidden | El caller no es propietario del template |
404 Not Found | El template no existe |
Eliminar template
Elimina un template. Por defecto realiza un soft-delete (marca el template inactivo y conserva el archivo en S3 para auditoría). Pasa ?hard=true para eliminar de forma permanente la fila y el objeto S3.
La eliminación se rechaza con 409 Conflict si el template está en uso por documentos o chains activos. Archiva o completa esos primero.
Path parameters
- Name
id- Type
- string
- Description
UUID del template.
Query parameters
- Name
hard- Type
- boolean
- Description
Si es
true, elimina permanentemente la fila y el objeto S3. Default:false.
Response — 200 OK
Response (200)
{
"success": true,
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Contrato de arrendamiento",
"message": "Template 'Contrato de arrendamiento' archived.",
"softDelete": true,
"s3Deleted": false,
"inUseBy": {
"documents": 0,
"chains": 0
}
}
Errores
| Status | Cuándo ocurre |
|---|---|
403 Forbidden | El caller no es propietario del template |
404 Not Found | El template no existe |
409 Conflict | El template está en uso por documentos o chains. La respuesta incluye inUseBy.documents y inUseBy.chains |
Response (409) — Template en uso
{
"detail": {
"code": "TEMPLATE_IN_USE",
"message": "Template is referenced by 2 active document(s) and 1 active chain(s).",
"inUseBy": {
"documents": 2,
"chains": 1
}
}
}

