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).


POST/v2/templates

Subir template

Sube un archivo .docx o .pdf y crea un nuevo template. El backend:

  1. Valida que el archivo sea un DOCX o PDF válido (máx. 50 MB).
  2. Auto-detecta todas las variables {{ ... }} en el documento (solo DOCX).
  3. Infiere el tipo de cada variable (text, date, currency, etc.) a partir del nombre.
  4. Almacena el archivo original en S3 para reutilizarlo.
  5. Retorna la lista de variables detectadas con metadata.

El request es multipart/form-data, no JSON.

Form fields

  • Name
    file
    Type
    file
    Description

    Archivo .docx o .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

StatusCuándo ocurre
400 Bad RequestExtensión no soportada, archivo vacío, o > 50 MB
401 UnauthorizedAPI key inválida o sin scope document:write

GET/v2/templates

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 docx o pdf.

  • 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
}

GET/v2/templates/{id}

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"
}

Errores

StatusCuándo ocurre
404 Not FoundEl 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 DOCXRol inferidoCampo mostrado
arrendador__nombreArrendadorNombre
arrendador__rfcArrendadorRfc
parte_reveladora__domicilioParte ReveladoraDomicilio
receptor__representante_legalReceptorRepresentante Legal
fecha_firmanullFecha Firma
vigencia_mesesnullVigencia 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 campoTipo inferidoInput en el dashboard
fecha, nacimiento, vencimientodateDate picker
monto, precio, salario, rentacurrencyInput numérico con formato
direccion, domicilio, descripciontextareaTextarea multi-línea
numero, cantidad, plazo, edadnumberInput numérico
Cualquier otrotextInput de texto

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:

VariableRolLabelTipo
revelador__nombreReveladorNombretext
revelador__rfcReveladorRfctext
revelador__domicilioReveladorDomiciliotextarea
revelador__representanteReveladorRepresentantetext
receptor__nombreReceptorNombretext
receptor__rfcReceptorRfctext
ciudad_firmaCiudad Firmatext
fecha_firmaFecha Firmadate
vigencia_mesesVigencia Mesesnumber

POST/v2/templates/{id}/recompute-roles

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"

POST/v2/templates/backfill-roles

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"

PATCH/v2/templates/{id}

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, opcionalmente defaultValue, y role (inferido automáticamente al subir, puede ser null para variables generales).

Response — 200 OK

Devuelve el mismo payload que GET /v2/templates/{id}.

Errores

StatusCuándo ocurre
403 ForbiddenEl caller no es propietario del template
404 Not FoundEl template no existe

DELETE/v2/templates/{id}

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

StatusCuándo ocurre
403 ForbiddenEl caller no es propietario del template
404 Not FoundEl template no existe
409 ConflictEl 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
    }
  }
}

Was this page helpful?