---
title: "Templates — Endpoints API v3 de AllSign"
type: reference
canonical_url: "https://allsign.io/developers/docs/endpoints/templates"
api_version: "2026-07-11"
---

# Templates

Una plantilla es un PDF (o DOCX) que reutilizas para emitir documentos. Si el PDF trae un **formulario** (AcroForm), sus widgets entran como **campos** con nombre, tipo y posición; tú les pones **rol** y, al crear cada documento, el firmante que toma ese rol hereda sus campos. Los campos también se dibujan por API (`POST …/fields`), se copian desde un documento ya armado (`fields:from-document`) y se versionan como un layout declarativo (`PUT …/fields`). La emisión vive en `POST /v3/documents` con `templateId`; la guía [Formularios PDF](https://allsign.io/developers/docs/guides/pdf-forms) recorre el proceso completo.

`readiness` resume el estado de la plantilla: `empty` (sin campos ni variables), `pending` (algún campo sin rol) o `ready` (todo asignado, lista para emitir).

`GET …/file?format=form` devuelve el PDF con los widgets vivos para revisarlo en Acrobat; `format=flat` lo hornea.

Las plantillas DOCX con variables `{{ }}` siguen funcionando (`/variables`, `validate-values`, `templateValues` al crear); las plantillas PDF con formulario usan campos y `values`.

Los ejemplos usan `$ALLSIGN_API_KEY`. Defínela una vez con tu key de sandbox: `export ALLSIGN_API_KEY="allsign_test_sk_…"` (en PowerShell: `$env:ALLSIGN_API_KEY="allsign_test_sk_…"`).

[Descargar OpenAPI](https://allsign.io/developers/docs/openapi.public.json)[Colección de Postman](https://allsign.io/developers/docs/allsign-api-v3.postman_collection.json)

Endpoints

-   [GET`/templates`](#list-templates)
-   [POST`/templates`](#create-template)
-   [GET`/templates/{template_id}`](#retrieve-template)
-   [PATCH`/templates/{template_id}`](#update-template)
-   [DELETE`/templates/{template_id}`](#delete-template)
-   [POST`/templates/{template_id}:duplicate`](#duplicate-template)
-   [POST`/templates/{template_id}/documents`](#create-a-document-from-a-template)
-   [GET`/templates/{template_id}/versions`](#list-template-versions)
-   [GET`/templates/facets`](#list-template-facets)
-   [GET`/templates/catalog`](#list-catalog-templates)
-   [POST`/templates/catalog/{slug}:copy`](#copy-catalog-template)
-   [GET`/templates/{template_id}/fields`](#list-template-fields)
-   [POST`/templates/{template_id}/fields`](#create-template-field)
-   [PATCH`/templates/{template_id}/fields/{name}`](#update-template-field)
-   [DELETE`/templates/{template_id}/fields/{name}`](#delete-template-field)
-   [PUT`/templates/{template_id}/fields`](#replace-template-fields)
-   [POST`/templates/{template_id}/fields:from-document`](#import-fields-from-a-document)
-   [GET`/templates/{template_id}/roles`](#list-template-roles)
-   [PUT`/templates/{template_id}/roles`](#replace-template-roles)
-   [GET`/templates/{template_id}/file`](#download-template-file)
-   [POST`/templates/{template_id}/file`](#replace-a-pdf-template-s-file)
-   [GET`/templates/{template_id}/download`](#download-original-file)
-   [GET`/templates/{template_id}/preview`](#get-template-preview)
-   [GET`/templates/{template_id}/pages/{page_number}`](#get-template-page-image)
-   [GET`/templates/{template_id}/layout`](#get-template-layout)
-   [GET`/templates/{template_id}/marked.docx`](#download-marked-word-file)
-   [GET`/templates/{template_id}/variables`](#list-template-variables)
-   [POST`/templates/{template_id}/variables`](#create-template-variable)
-   [PATCH`/templates/{template_id}/variables`](#update-template-variable)
-   [DELETE`/templates/{template_id}/variables`](#delete-template-variable)
-   [POST`/templates/{template_id}/variables:confirm`](#confirm-variable-candidates)
-   [GET`/templates/{template_id}/analysis`](#get-template-analysis)
-   [POST`/templates/{template_id}/validate-values`](#validate-template-values)
-   [GET`/templates/{template_id}/signing`](#get-signing-layout-legacy)
-   [PUT`/templates/{template_id}/signing`](#replace-signing-layout-legacy)
-   [GET`/templates/{template_id}/signing/documents`](#list-documents-to-seed-the-signing-layout-legacy)
-   [POST`/templates/{template_id}/signing:from-document`](#import-signing-layout-from-a-document-legacy)

## El objeto Template

#### Atributos

-   `livemode` boolean requerido
    
    `true` en entorno `live`, `false` en `test`/`dev` (marca de agua, sin validez legal).
    
-   `id` string requerido
    
    ID de la plantilla (`tmpl_…`).
    
-   `object` string, siempre "template"
    
    Siempre `"template"`.
    
-   `name` string requerido
    
    Nombre de la plantilla.
    
-   `description` string puede ser null
    
    Descripción de la plantilla.
    
-   `fileType` string requerido
    
    Tipo de archivo fuente (ej. `docx`, `pdf`).
    
-   `originalFilename` string puede ser null
    
    Nombre del archivo original subido.
    
-   `aiEditable` boolean
    
    Si la edición asistida por IA está habilitada.
    
    default true
    
-   `variableCount` integer requerido
    
    Número de variables detectadas en la plantilla.
    
-   `fieldCount` integer
    
    Número de campos del formulario PDF (nombres distintos).
    
    default 0
    
-   `unassignedFieldCount` integer
    
    Campos del formulario sin rol; `readiness` es `pending` mientras haya alguno.
    
    default 0
    
-   `roleCount` integer
    
    Número de roles de la plantilla.
    
    default 0
    
-   `pendingCandidates` integer
    
    Candidatos del análisis vigente que aún no se confirmaron como variable (`0` si no hay análisis).
    
    default 0
    
-   `readiness` enum requerido
    
    `ready` (≥1 variable y 0 pendientes, o ≥1 campo y todos con rol), `pending` (≥1 candidato sin confirmar o ≥1 campo sin rol) o `empty` (0 variables y 0 campos).
    
    Valores: `ready` `pending` `empty`
    
-   `tags` array de string
    
    Etiquetas de la plantilla (arreglo vacío por default).
    
    default \[\]
    
-   `category` string puede ser null
    
    Categoría de la plantilla.
    
-   `usageCount` integer requerido
    
    Cuántas veces se ha usado la plantilla.
    
-   `lastUsedAt` string (fecha-hora ISO 8601) puede ser null
    
    Último uso (ISO 8601).
    
-   `currentVersion` integer requerido
    
    Versión actual de la plantilla.
    
-   `previewUrl` string puede ser null
    
    Ruta v3 relativa (`/templates/{id}/preview`) del PNG de la primera página. `null` si la plantilla no tiene una fuente renderizable (p.ej. DOCX).
    
-   `downloadUrl` string requerido
    
    Ruta v3 relativa (`/templates/{id}/download`) del archivo original.
    
-   `createdAt` string (fecha-hora ISO 8601) requerido
    
    Fecha de creación (ISO 8601).
    
-   `updatedAt` string (fecha-hora ISO 8601) requerido
    
    Última actualización (ISO 8601).
    

**El objeto Template**

```
{
  "livemode": false,
  "id": "tmpl_39701d80589b412dbd39e02b48679840",
  "object": "template",
  "name": "Solicitud de alta de cliente",
  "description": null,
  "fileType": "pdf",
  "originalFilename": "formulario.pdf",
  "aiEditable": true,
  "variableCount": 0,
  "fieldCount": 5,
  "unassignedFieldCount": 0,
  "roleCount": 1,
  "pendingCandidates": 0,
  "readiness": "ready",
  "tags": [],
  "category": null,
  "usageCount": 0,
  "lastUsedAt": null,
  "currentVersion": 1,
  "previewUrl": "/templates/tmpl_39701d80589b412dbd39e02b48679840/preview",
  "downloadUrl": "/templates/tmpl_39701d80589b412dbd39e02b48679840/download",
  "createdAt": "2026-07-11T18:00:00.000000Z",
  "updatedAt": "2026-07-11T18:00:00.000000Z"
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:18 (hora CDMX) · test `docs-checks-v3/tests/recetas/formulario-pdf-acroform.receta.spec.ts`

## List templates

GET `/templates`

Lista tus plantillas con paginación por cursor y filtros por tipo de archivo, categoría y texto libre.

#### Parámetros

-   `limit` integer query
    
    Resultados por página (1–100, default `20`).
    
    default 20 · entre 1 y 100
    
-   `startingAfter` string query
    
    Cursor: plantillas después de este `id` (`tmpl_…`).
    
-   `endingBefore` string query
    
    Cursor: plantillas antes de este `id` (`tmpl_…`).
    
-   `sort` enum query
    
    Orden por fecha de creación: `createdAt` o `-createdAt` (default `-createdAt`).
    
    Valores: `createdAt` `-createdAt` `updatedAt` `-updatedAt` `name` `-name` `usageCount` `-usageCount`
    
-   `fileType` string query
    
    Filtra por tipo de archivo (ej. `docx`, `pdf`).
    
-   `category` string query
    
    Filtra por categoría.
    
-   `tags` string query
    
    CSV de etiquetas — la plantilla debe tener TODAS.
    
-   `search` string query
    
    Búsqueda por texto libre en el nombre (1–255 caracteres).
    
    de 1 a 255 caracteres
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Devuelve

**200** Sobre de paginación por cursor (`object: "list"`) con objetos Template.

Ver los 6 atributos de la respuesta

-   `object` string, siempre "list"
    
    Siempre `"list"`.
    
-   `data` array de objetos requerido
    
    Arreglo de objetos Template.
    
    Ver 23 atributos hijos
    
    -   `data[].livemode` boolean requerido
        
        `true` en entorno `live`, `false` en `test`/`dev` (marca de agua, sin validez legal).
        
    -   `data[].id` string requerido
        
        ID de la plantilla (`tmpl_…`).
        
    -   `data[].object` string, siempre "template"
        
        Siempre `"template"`.
        
    -   `data[].name` string requerido
        
        Nombre de la plantilla.
        
    -   `data[].description` string puede ser null
        
        Descripción de la plantilla.
        
    -   `data[].fileType` string requerido
        
        Tipo de archivo fuente (ej. `docx`, `pdf`).
        
    -   `data[].originalFilename` string puede ser null
        
        Nombre del archivo original subido.
        
    -   `data[].aiEditable` boolean
        
        Si la edición asistida por IA está habilitada.
        
        default true
        
    -   `data[].variableCount` integer requerido
        
        Número de variables detectadas en la plantilla.
        
    -   `data[].fieldCount` integer
        
        Número de campos del formulario PDF (nombres distintos).
        
        default 0
        
    -   `data[].unassignedFieldCount` integer
        
        Campos del formulario sin rol; `readiness` es `pending` mientras haya alguno.
        
        default 0
        
    -   `data[].roleCount` integer
        
        Número de roles de la plantilla.
        
        default 0
        
    -   `data[].pendingCandidates` integer
        
        Candidatos del análisis vigente que aún no se confirmaron como variable (`0` si no hay análisis).
        
        default 0
        
    -   `data[].readiness` enum requerido
        
        `ready` (≥1 variable y 0 pendientes, o ≥1 campo y todos con rol), `pending` (≥1 candidato sin confirmar o ≥1 campo sin rol) o `empty` (0 variables y 0 campos).
        
        Valores: `ready` `pending` `empty`
        
    -   `data[].tags` array de string
        
        Etiquetas de la plantilla (arreglo vacío por default).
        
        default \[\]
        
    -   `data[].category` string puede ser null
        
        Categoría de la plantilla.
        
    -   `data[].usageCount` integer requerido
        
        Cuántas veces se ha usado la plantilla.
        
    -   `data[].lastUsedAt` string (fecha-hora ISO 8601) puede ser null
        
        Último uso (ISO 8601).
        
    -   `data[].currentVersion` integer requerido
        
        Versión actual de la plantilla.
        
    -   `data[].previewUrl` string puede ser null
        
        Ruta v3 relativa (`/templates/{id}/preview`) del PNG de la primera página. `null` si la plantilla no tiene una fuente renderizable (p.ej. DOCX).
        
    -   `data[].downloadUrl` string requerido
        
        Ruta v3 relativa (`/templates/{id}/download`) del archivo original.
        
    -   `data[].createdAt` string (fecha-hora ISO 8601) requerido
        
        Fecha de creación (ISO 8601).
        
    -   `data[].updatedAt` string (fecha-hora ISO 8601) requerido
        
        Última actualización (ISO 8601).
        
    
-   `hasMore` boolean requerido
    
    `true` si hay más resultados después de esta página.
    
-   `nextCursor` string puede ser null
    
    Cursor para la siguiente página (pásalo como `startingAfter`).
    
-   `previousCursor` string puede ser null
    
    Cursor para la página anterior (pásalo como `endingBefore`).
    
-   `limit` integer requerido
    
    El límite aplicado a esta página.
    

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl 'https://api.allsign.io/v3/templates?limit=2&fileType=docx' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11"
```

**Node**

```
const respuesta = await fetch('https://api.allsign.io/v3/templates?limit=2&fileType=docx', {
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
    },
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os

import requests

respuesta = requests.get(
    "https://api.allsign.io/v3/templates?limit=2&fileType=docx",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 200**

```
{
  "object": "list",
  "data": [
    {
      "livemode": false,
      "id": "tmpl_2a1bc982e2f04c979ff8d8c2a6468539",
      "object": "template",
      "name": "v3audit-ejemplos Compraventa",
      "description": null,
      "fileType": "docx",
      "originalFilename": "contrato.docx",
      "aiEditable": true,
      "variableCount": 5,
      "fieldCount": 0,
      "unassignedFieldCount": 0,
      "roleCount": 0,
      "pendingCandidates": 0,
      "readiness": "ready",
      "tags": [],
      "category": null,
      "usageCount": 0,
      "lastUsedAt": null,
      "currentVersion": 1,
      "previewUrl": null,
      "downloadUrl": "/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539/download",
      "createdAt": "2026-07-11T18:00:00.000000Z",
      "updatedAt": "2026-07-11T18:00:00.000000Z"
    },
    {
      "livemode": false,
      "id": "tmpl_31bbe670e5184ce4ac02a705ea963ee2",
      "object": "template",
      "name": "v3audit-ejemplos Compraventa",
      "description": "Contrato de compraventa",
      "fileType": "docx",
      "originalFilename": "contrato.docx",
      "aiEditable": true,
      "variableCount": 5,
      "fieldCount": 0,
      "unassignedFieldCount": 0,
      "roleCount": 0,
      "pendingCandidates": 0,
      "readiness": "ready",
      "tags": [
        "compraventa"
      ],
      "category": "ventas",
      "usageCount": 1,
      "lastUsedAt": "2026-07-07T09:41:56.383000Z",
      "currentVersion": 4,
      "previewUrl": null,
      "downloadUrl": "/templates/tmpl_31bbe670e5184ce4ac02a705ea963ee2/download",
      "createdAt": "2026-07-07T09:41:50.156000Z",
      "updatedAt": "2026-07-07T09:41:52.767000Z"
    }
  ],
  "hasMore": true,
  "nextCursor": "<cursor>",
  "previousCursor": null,
  "limit": 2
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:16 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/plantillas.ejemplos.spec.ts`

## Create template

POST `/templates`

Da de alta una plantilla a partir de un **PDF** o un **DOCX** en base64 (máximo 10 MB decodificados). Es el arranque del dominio: si el PDF trae formulario, sus widgets entran como campos (`GET …/fields`, guía [Formularios PDF](https://allsign.io/developers/docs/guides/pdf-forms)); si es un DOCX con `{{ variables }}`, se detectan en el mismo paso (`GET …/variables`). La respuesta trae `fieldCount`, `variableCount` y `readiness`. `Idempotency-Key` es opcional pero se honra: un reintento devuelve la misma plantilla.

#### Parámetros

-   `Idempotency-Key` string header
    
    Clave única (UUID v4) que vuelve idempotente el POST: un reintento con la misma clave repite la respuesta original en lugar de volver a crear, cobrar o notificar.
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Cuerpo de la petición

application/json

-   `name` string requerido
    
    Nombre visible de la plantilla.
    
    de 1 a 255 caracteres
    
-   `file` objeto requerido
    
    Archivo DOCX o PDF en base64. Máximo 10 MB decodificados. `fileType` es `docx` o `pdf`.
    
    Ver 3 atributos hijos
    
    -   `file.content` string requerido
        
        Contenido del archivo codificado en Base64. Máximo 10 MB decodificados.
        
    -   `file.fileType` enum
        
        Tipo de archivo fuente: `docx` o `pdf`.
        
        Valores: `docx` `pdf`
        
        default "docx"
        
    -   `file.name` string puede ser null
        
        Nombre del archivo (ej. `contrato.pdf`). Se valida contra path traversal.
        
    
-   `description` string puede ser null
    
    Descripción libre de la plantilla.
    
    máx. 2000 caracteres
    
-   `category` string puede ser null
    
    Categoría de la plantilla (ej. `legal`).
    
    máx. 100 caracteres
    
-   `tags` array de string puede ser null
    
    Etiquetas de la plantilla.
    

#### Devuelve

**201** La plantilla recién creada. — [el objeto Template](#objeto-template)

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [413](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl -X POST 'https://api.allsign.io/v3/templates' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Acuerdo de confidencialidad",
  "file": {
    "content": "'"$(base64 < acuerdo.docx | tr -d '\n')"'",
    "fileType": "docx",
    "name": "acuerdo.docx"
  }
}'
```

**Node**

```
import { randomUUID } from 'node:crypto';
import { readFileSync } from 'node:fs';

const respuesta = await fetch('https://api.allsign.io/v3/templates', {
    method: 'POST',
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
        'Idempotency-Key': randomUUID(),
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        name: 'Acuerdo de confidencialidad',
        file: {
            content: readFileSync('acuerdo.docx').toString('base64'),
            fileType: 'docx',
            name: 'acuerdo.docx',
        },
    }),
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import base64
import os
import uuid
from pathlib import Path

import requests

respuesta = requests.post(
    "https://api.allsign.io/v3/templates",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
        "Idempotency-Key": str(uuid.uuid4()),
    },
    json={
        "name": "Acuerdo de confidencialidad",
        "file": {
            "content": base64.b64encode(Path("acuerdo.docx").read_bytes()).decode(),
            "fileType": "docx",
            "name": "acuerdo.docx",
        },
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 201**

```
{
  "livemode": false,
  "id": "tmpl_67fb98658fe548d3a71eae28087d7060",
  "object": "template",
  "name": "Acuerdo de confidencialidad",
  "description": null,
  "fileType": "docx",
  "originalFilename": "acuerdo.docx",
  "aiEditable": true,
  "variableCount": 22,
  "fieldCount": 0,
  "unassignedFieldCount": 0,
  "roleCount": 0,
  "pendingCandidates": 38,
  "readiness": "pending",
  "tags": [],
  "category": null,
  "usageCount": 0,
  "lastUsedAt": null,
  "currentVersion": 1,
  "previewUrl": null,
  "downloadUrl": "/templates/tmpl_67fb98658fe548d3a71eae28087d7060/download",
  "createdAt": "2026-07-11T18:00:00.000000Z",
  "updatedAt": "2026-07-11T18:00:00.000000Z"
}
```

**Respuesta · 422 · UNSUPPORTED_FORM_XFA**

```
{
  "type": "https://allsign.io/developers/docs/errors#UNSUPPORTED_FORM_XFA",
  "title": "Unsupported XFA form",
  "status": 422,
  "detail": "This PDF uses an XFA (LiveCycle) form, which is not supported. Export it as a standard AcroForm PDF and try again.",
  "instance": "/v3/templates",
  "code": "UNSUPPORTED_FORM_XFA",
  "requestId": "req_fdd1b0f5006646e5a3a2894a39851d3f"
}
```

**Respuesta · 422 · PDF_ALREADY_SIGNED**

```
{
  "type": "https://allsign.io/developers/docs/errors#PDF_ALREADY_SIGNED",
  "title": "PDF already signed",
  "status": 422,
  "detail": "This PDF already carries a digital signature, and editing it would invalidate it. Upload the unsigned version or a flat PDF.",
  "instance": "/v3/templates",
  "code": "PDF_ALREADY_SIGNED",
  "requestId": "req_7ce35e2fb6a24801a7f2dcd25b07db59"
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:14 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/errores.ejemplos.spec.ts`

## Retrieve template

GET `/templates/{template_id}`

Consulta una plantilla por su `id`. Un `id` inexistente responde **404** (no 500).

#### Parámetros

-   `template_id` string ruta requerido
    
    ID de la plantilla (`tmpl_…`).
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Devuelve

**200** El objeto Template. — [el objeto Template](#objeto-template)

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl 'https://api.allsign.io/v3/templates/tmpl_39701d80589b412dbd39e02b48679840' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11"
```

**Node**

```
const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_39701d80589b412dbd39e02b48679840', {
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
    },
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os

import requests

respuesta = requests.get(
    "https://api.allsign.io/v3/templates/tmpl_39701d80589b412dbd39e02b48679840",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 200**

```
{
  "livemode": false,
  "id": "tmpl_39701d80589b412dbd39e02b48679840",
  "object": "template",
  "name": "Solicitud de alta de cliente",
  "description": null,
  "fileType": "pdf",
  "originalFilename": "formulario.pdf",
  "aiEditable": true,
  "variableCount": 0,
  "fieldCount": 5,
  "unassignedFieldCount": 0,
  "roleCount": 1,
  "pendingCandidates": 0,
  "readiness": "ready",
  "tags": [],
  "category": null,
  "usageCount": 0,
  "lastUsedAt": null,
  "currentVersion": 1,
  "previewUrl": "/templates/tmpl_39701d80589b412dbd39e02b48679840/preview",
  "downloadUrl": "/templates/tmpl_39701d80589b412dbd39e02b48679840/download",
  "createdAt": "2026-07-11T18:00:00.000000Z",
  "updatedAt": "2026-07-11T18:00:00.000000Z"
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:18 (hora CDMX) · test `docs-checks-v3/tests/recetas/formulario-pdf-acroform.receta.spec.ts`

## Update template

PATCH `/templates/{template_id}`

Merge-patch de los metadatos: `name`, `description`, `category`, `tags`. Nunca cambia el archivo ni los campos/variables (para eso están `…/fields` y `…/variables`).

#### Parámetros

-   `template_id` string ruta requerido
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Cuerpo de la petición

application/json

-   `name` string puede ser null
    
    Nuevo nombre de la plantilla.
    
    de 1 a 255 caracteres
    
-   `description` string puede ser null
    
    Nueva descripción.
    
    máx. 2000 caracteres
    
-   `category` string puede ser null
    
    Nueva categoría.
    
    máx. 100 caracteres
    
-   `tags` array de string puede ser null
    
    Nuevo arreglo de etiquetas — reemplaza al anterior por completo.
    

#### Devuelve

**200** La plantilla ya actualizada. — [el objeto Template](#objeto-template)

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl -X PATCH 'https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11" \
  -H "Content-Type: application/json" \
  -d '{
  "description": "Contrato de compraventa",
  "category": "ventas",
  "tags": [
    "compraventa"
  ]
}'
```

**Node**

```
const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539', {
    method: 'PATCH',
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        description: 'Contrato de compraventa',
        category: 'ventas',
        tags: [
            'compraventa',
        ],
    }),
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os

import requests

respuesta = requests.patch(
    "https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
    json={
        "description": "Contrato de compraventa",
        "category": "ventas",
        "tags": [
            "compraventa",
        ],
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 200**

```
{
  "livemode": false,
  "id": "tmpl_2a1bc982e2f04c979ff8d8c2a6468539",
  "object": "template",
  "name": "v3audit-ejemplos Compraventa",
  "description": "Contrato de compraventa",
  "fileType": "docx",
  "originalFilename": "contrato.docx",
  "aiEditable": true,
  "variableCount": 5,
  "fieldCount": 0,
  "unassignedFieldCount": 0,
  "roleCount": 0,
  "pendingCandidates": 0,
  "readiness": "ready",
  "tags": [
    "compraventa"
  ],
  "category": "ventas",
  "usageCount": 0,
  "lastUsedAt": null,
  "currentVersion": 4,
  "previewUrl": null,
  "downloadUrl": "/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539/download",
  "createdAt": "2026-07-11T18:00:00.000000Z",
  "updatedAt": "2026-07-11T18:01:03.667000Z"
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:16 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/plantillas.ejemplos.spec.ts`

## Delete template

DELETE `/templates/{template_id}`

Borrado suave: la plantilla desaparece de las listas pero se conserva para auditoría. Responde 409 `TEMPLATE_IN_USE` si algún documento activo todavía la referencia; el `detail` trae el conteo.

#### Parámetros

-   `template_id` string ruta requerido
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Devuelve

**204** Plantilla eliminada.

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [409](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl -X DELETE 'https://api.allsign.io/v3/templates/tmpl_ca5ee5e61a714916bca98df0dc97598f' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11"
```

**Node**

```
const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_ca5ee5e61a714916bca98df0dc97598f', {
    method: 'DELETE',
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
    },
});
console.log(respuesta.status);
```

**Python**

```
import os

import requests

respuesta = requests.delete(
    "https://api.allsign.io/v3/templates/tmpl_ca5ee5e61a714916bca98df0dc97598f",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
)
print(respuesta.status_code)
```

**Respuesta · 204**

*Sin cuerpo.*

**Respuesta · 409 · TEMPLATE_IN_USE**

```
{
  "type": "https://allsign.io/developers/docs/errors#TEMPLATE_IN_USE",
  "title": "Conflict",
  "status": 409,
  "detail": "Template 2a1bc982-e2f0-4c97-9ff8-d8c2a6468539 is in use by 1 document(s) and 0 chain(s). Archive or complete them before deleting.",
  "instance": "/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539",
  "code": "TEMPLATE_IN_USE",
  "requestId": "req_b63edfb7b1c9427f8ea3e6ac34f145b3"
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:16 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/plantillas.ejemplos.spec.ts`

## Duplicate template

POST `/templates/{template_id}:duplicate`

Crea una copia independiente (`"{name} (copia)"`) con el mismo archivo, campos, roles y variables. `Idempotency-Key` opcional: un reintento devuelve la primera copia.

#### Parámetros

-   `template_id` string ruta requerido
    
-   `Idempotency-Key` string header
    
    Clave única (UUID v4) que vuelve idempotente el POST: un reintento con la misma clave repite la respuesta original en lugar de volver a crear, cobrar o notificar.
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Devuelve

**201** La copia recién creada. — [el objeto Template](#objeto-template)

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl -X POST 'https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539:duplicate' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11" \
  -H "Idempotency-Key: $(uuidgen)"
```

**Node**

```
import { randomUUID } from 'node:crypto';

const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539:duplicate', {
    method: 'POST',
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
        'Idempotency-Key': randomUUID(),
    },
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os
import uuid

import requests

respuesta = requests.post(
    "https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539:duplicate",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
        "Idempotency-Key": str(uuid.uuid4()),
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 201**

```
{
  "livemode": false,
  "id": "tmpl_ca5ee5e61a714916bca98df0dc97598f",
  "object": "template",
  "name": "v3audit-ejemplos Compraventa (copia)",
  "description": "Contrato de compraventa",
  "fileType": "docx",
  "originalFilename": "contrato.docx",
  "aiEditable": true,
  "variableCount": 5,
  "fieldCount": 0,
  "unassignedFieldCount": 0,
  "roleCount": 0,
  "pendingCandidates": 0,
  "readiness": "ready",
  "tags": [
    "compraventa"
  ],
  "category": "ventas",
  "usageCount": 0,
  "lastUsedAt": null,
  "currentVersion": 1,
  "previewUrl": null,
  "downloadUrl": "/templates/tmpl_ca5ee5e61a714916bca98df0dc97598f/download",
  "createdAt": "2026-07-11T18:01:05.574000Z",
  "updatedAt": "2026-07-11T18:01:05.574000Z"
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:16 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/plantillas.ejemplos.spec.ts`

## Create a document from a template

POST `/templates/{template_id}/documents`

Crea un **borrador** a partir de la plantilla y, opcionalmente, lo deja listo en la misma llamada: fija `values`, adjunta `signers` y, con `send: true`, lo manda a firma. `{}` basta para obtener el borrador. Equivale a `POST /documents` con `templateId` y `mode: draft`, seguido de `PATCH /documents/{id}/values` y, si se pide, de `POST /documents/{id}/send` — el mismo documento que devuelve `GET /documents/{id}`. Con `send: true`, un valor obligatorio que llena el dueño y no viene en `values` es un 422 `VALIDATION_ERROR` con la lista en `missingVariables`, y no se crea nada: los valores quedan fijos al enviar. Las variables de un firmante y las opcionales no cuentan. Si con `values` el PDF queda con menos páginas y alguna de las que se pierden tiene campos colocados, el borrador se crea con los valores pero su PDF no cambia, igual que en `PATCH /documents/{id}/values`, y `POST /documents/{id}/send` responde 409 `DOCUMENT_NOT_SENDABLE` hasta que muevas esos campos o cambies los valores. Con `send: true` ese 409 llega en esta misma llamada, con `documentId`, sin cobrar ni invitar. `values` se valida contra la plantilla **antes** de crear nada. Si algo falla después de creado el borrador (un envío sin saldo, por ejemplo), el problem+json trae `documentId`: retómalo con `POST /documents/{id}/send`, no repitiendo esta llamada. `Idempotency-Key` es obligatoria, igual que en `POST /documents`: un reintento con la misma clave repite la respuesta original (el 201 o un 4xx) en lugar de crear otro borrador. Un 402, un 429 o un 5xx liberan la clave, así que repetir esta llamada después de ellos crea otro borrador.

#### Parámetros

-   `template_id` string ruta requerido
    
    ID de la plantilla desde la que se emite (`tmpl_…`).
    
-   `Idempotency-Key` string header requerido
    
    Clave única (UUID v4) que vuelve idempotente el POST: un reintento con la misma clave repite la respuesta original en lugar de volver a crear, cobrar o notificar.
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Cuerpo de la petición

application/json

-   `name` string puede ser null
    
    Nombre visible del documento. Si se omite, se toma el de la plantilla.
    
-   `signers` array de objetos puede ser null
    
    Firmantes a adjuntar al borrador. Pueden venir solo con `roleName` (sin contacto) y completarse después; para `send: true` al menos uno necesita `email` o `phone`.
    
    Ver 10 atributos hijos
    
    -   `signers[].email` string puede ser null
        
        Correo del firmante. Manda `email` o `phone`, no los dos: cada firmante recibe su invitación por un solo canal (422 `VALIDATION_ERROR` si llegan ambos).
        
    -   `signers[].phone` string puede ser null
        
        Teléfono del firmante (para invitación por WhatsApp). Excluye a `email`: un firmante lleva un solo canal.
        
        máx. 32 caracteres
        
    -   `signers[].name` string puede ser null
        
        Nombre del firmante.
        
        máx. 255 caracteres
        
    -   `signers[].roleName` string puede ser null
        
        Rol semántico del firmante (ej. `proveedor`), usado para auto-asignar variables de plantilla marcadas con ese rol. Opcional — si se omite, las variables deben asignarse manualmente.
        
        máx. 255 caracteres
        
    -   `signers[].values` objeto (llave → valor) puede ser null
        
        Prellenado de campos del formulario PDF por nombre de campo (texto o casilla). Sólo aplica a plantillas PDF con campos; las llaves nunca se camelizan.
        
    -   `signers[].readOnly` array de string puede ser null
        
        Nombres de campos prellenados que el firmante no puede cambiar.
        
    -   `signers[].routingOrder` integer puede ser null
        
        Etapa de firma (1 = primera). Firmantes con el mismo número firman en paralelo. Solo aplica con `signingOrder: "sequential"`. Con `signingOrder: "sequential"` es **obligatorio en todos** los firmantes: si le falta a alguno, la creación se rechaza con 422 `VALIDATION_ERROR` diciendo en cuál falta, en vez de repartir etapas por su cuenta. Dentro del producto un firmante sin número cuenta como etapa 1, pero la API v3 no asume ese default: un `sequential` a medio numerar sería un documento que firma todo el mundo a la vez sin decirlo. Después de crear, la etapa se cambia con `PATCH /v3/documents/{documentId}/signers/{signerId}`. Disponible sólo si el orden de firma está habilitado en el entorno; si no, pedir `sequential` responde 403 `SEQUENTIAL_NOT_AVAILABLE` y todo documento firma en paralelo.
        
        mín. 1
        
    -   `signers[].kind` enum
        
        `signer` (default) firma. `carbon_copy` es un observador: nunca firma ni recibe campos, solo los avisos de `events` y, con `capability: notify_and_view`, un enlace de solo lectura. Un observador necesita `email` y no lleva `roleName`, `routingOrder`, `values` ni `readOnly`. Después de crear se administran con `/v3/documents/{documentId}/observers`.
        
        Valores: `signer` `carbon_copy`
        
        default "signer"
        
    -   `signers[].capability` enum puede ser null
        
        Solo observadores: `notify` (default) o `notify_and_view`.
        
        Valores: `notify` `notify_and_view`
        
    -   `signers[].events` array de string puede ser null
        
        Solo observadores: avisos que recibe. `document.completed` (default), `document.expired`, `document.voided`.
        
        máx. 10 elementos
        
    
-   `values` objeto (llave → valor)
    
    Mapa nombre→valor de las variables de la plantilla que fija el remitente. Las llaves conservan su forma natural (`nombre_completo`): nunca se camelizan.
    
-   `send` boolean
    
    Si es `true`, tras crear el borrador lo manda a firma como `POST /documents/{id}/send` (cobra créditos e invita a los firmantes pendientes). Exige al menos un firmante con `email` o `phone`.
    
    default false
    

#### Devuelve

**201** El documento creado (borrador, o ya enviado si pediste `send: true`).

Ver los 20 atributos de la respuesta

-   `livemode` boolean requerido
    
    `true` en entorno `live`, `false` en `test`/`dev` (marca de agua, sin validez legal).
    
-   `id` string requerido
    
    ID del documento (`doc_…`).
    
-   `object` string, siempre "document"
    
    Siempre `"document"`.
    
-   `name` string requerido
    
    Nombre visible del documento.
    
-   `status` enum requerido
    
    Estado del ciclo de vida: `draft`, `collecting_data`, `awaiting_signatures`, `correcting`, `processing`, `completed`, `expired`, `voided`, `error`.
    
    Valores: `draft` `collecting_data` `awaiting_signatures` `correcting` `processing` `completed` `expired` `voided` `error`
    
-   `documentType` string requerido
    
    Token opaco del tipo de documento.
    
-   `signerCount` integer requerido
    
    Número total de firmantes.
    
-   `signedCount` integer requerido
    
    Cuántos firmantes ya firmaron.
    
-   `ownerId` string requerido
    
    Dueño del documento (`usr_…`).
    
-   `orgId` string puede ser null
    
    Organización del documento (`org_…`).
    
-   `folderId` string puede ser null
    
    Carpeta que contiene el documento (`fld_…`). Es `null` si el documento no está en ninguna carpeta que esta credencial pueda abrir con `GET /v3/folders/{id}`.
    
-   `expiresAt` string (fecha-hora ISO 8601) puede ser null
    
    Fecha límite de firma (ISO 8601).
    
-   `signingOrder` enum
    
    `parallel` o `sequential` (firmantes por etapas con `routingOrder`). Disponible sólo si el orden de firma está habilitado en el entorno; si no, pedir `sequential` responde 403 `SEQUENTIAL_NOT_AVAILABLE` y todo documento firma en paralelo.
    
    Valores: `parallel` `sequential`
    
-   `currentStage` integer puede ser null
    
    Etapa activa en un documento `sequential` mientras espera firmas; `null` en paralelo o al terminar. Disponible sólo si el orden de firma está habilitado en el entorno; si no, pedir `sequential` responde 403 `SEQUENTIAL_NOT_AVAILABLE` y todo documento firma en paralelo.
    
-   `expirationReminders` array de integer puede ser null
    
    Horas antes del vencimiento en las que se envían recordatorios.
    
-   `templateId` string puede ser null
    
    Plantilla de la que nació el documento (`tmpl_…`), o `null`.
    
-   `templateVersionId` string puede ser null
    
    Versión de esa plantilla cuyo layout se aplicó (`tv_…`), o `null`.
    
-   `parentDocumentId` string puede ser null
    
    Documento del que este es un anexo (`doc_…`). `null` si es un documento raíz. Ver `POST /documents/{id}/annexes` y `GET /documents/{id}/family`.
    
-   `createdAt` string (fecha-hora ISO 8601) requerido
    
    Fecha de creación (ISO 8601).
    
-   `updatedAt` string (fecha-hora ISO 8601) requerido
    
    Última actualización (ISO 8601).
    

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [402](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [409](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl -X POST 'https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539/documents' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "v3audit-ejemplos Compraventa Luis Pérez",
  "values": {
    "vendedor_nombre": "Ana Martínez"
  }
}'
```

**Node**

```
import { randomUUID } from 'node:crypto';

const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539/documents', {
    method: 'POST',
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
        'Idempotency-Key': randomUUID(),
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        name: 'v3audit-ejemplos Compraventa Luis Pérez',
        values: {
            vendedor_nombre: 'Ana Martínez',
        },
    }),
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os
import uuid

import requests

respuesta = requests.post(
    "https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539/documents",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
        "Idempotency-Key": str(uuid.uuid4()),
    },
    json={
        "name": "v3audit-ejemplos Compraventa Luis Pérez",
        "values": {
            "vendedor_nombre": "Ana Martínez",
        },
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 201**

```
{
  "livemode": false,
  "id": "doc_1ce40ec34cf7454e83862318509bef29",
  "object": "document",
  "name": "v3audit-ejemplos Compraventa Luis Pérez",
  "status": "draft",
  "documentType": "EDITABLE",
  "signerCount": 0,
  "signedCount": 0,
  "ownerId": "usr_0f1644c205794549ad7dac61379cf5d9",
  "orgId": "ee0b53c7-80bc-41bd-a9e2-08c594411381",
  "folderId": null,
  "expiresAt": null,
  "signingOrder": "parallel",
  "currentStage": null,
  "expirationReminders": null,
  "templateId": "tmpl_2a1bc982e2f04c979ff8d8c2a6468539",
  "templateVersionId": null,
  "parentDocumentId": null,
  "createdAt": "2026-07-11T18:01:08.922000Z",
  "updatedAt": "2026-07-11T18:01:08.922000Z"
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:16 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/plantillas.ejemplos.spec.ts`

## List template versions

GET `/templates/{template_id}/versions`

Las versiones guardadas de la plantilla, de la más reciente a la más antigua. Cada una trae su `layout` —orden de firma, roles con su etapa, firmantes habituales y ajustes del documento— y un `summary` para comparar dos versiones de un vistazo sin bajar el archivo. `summary.fields` cuenta los campos de firma de la **plantilla** (nombres distintos): los campos no se versionan, así que ese número es el mismo en todas las filas.

#### Parámetros

-   `template_id` string ruta requerido
    
    ID de la plantilla (`tmpl_…`).
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Devuelve

**200** Las versiones, de la más reciente a la más antigua.

Ver los 3 atributos de la respuesta

-   `object` string, siempre "list"
    
    Siempre `"list"`.
    
-   `templateId` string requerido
    
    La plantilla a la que pertenecen (`tmpl_…`).
    
-   `data` array de objetos requerido
    
    Versiones, de la más reciente a la más antigua.
    
    Ver 6 atributos hijos
    
    -   `data[].id` string requerido
        
        ID de la versión (`tv_…`).
        
    -   `data[].versionNumber` integer requerido
        
        Número de versión (1, 2, 3…).
        
        mín. 1
        
    -   `data[].createdAt` string (fecha-hora ISO 8601) requerido
        
        Cuándo se guardó la versión (ISO 8601).
        
    -   `data[].createdBy` string requerido
        
        Quién la creó: `user`, `ai` o `system`.
        
    -   `data[].summary` objeto requerido
        
        Conteos de un vistazo.
        
        Ver 4 atributos hijos
        
        -   `data[].summary.roles` integer requerido
            
            Roles que trae el layout de esta versión.
            
            mín. 0
            
        -   `data[].summary.fields` integer requerido
            
            Campos de firma de la plantilla (nombres distintos).
            
            mín. 0
            
        -   `data[].summary.variables` integer requerido
            
            Variables de esta versión.
            
            mín. 0
            
        -   `data[].summary.proposals` integer requerido
            
            Cuántas de esas variables traen valor por defecto (`defaultValue`).
            
            mín. 0
            
        
    -   `data[].layout` objeto puede ser null
        
        Layout guardado, o `null` en versiones anteriores a plt\_0001.
        
        Ver 3 atributos hijos
        
        -   `data[].layout.signingOrderMode` enum
            
            `parallel` o `sequential`. Disponible sólo si el orden de firma está habilitado en el entorno; si no, pedir `sequential` responde 403 `SEQUENTIAL_NOT_AVAILABLE` y todo documento firma en paralelo.
            
            Valores: `parallel` `sequential`
            
        -   `data[].layout.roles` array de objetos
            
            Roles del documento, en orden.
            
            Ver 4 atributos hijos
            
            -   `data[].layout.roles[].name` string requerido
                
                Nombre del rol tal como lo verá el siguiente documento.
                
            -   `data[].layout.roles[].kind` string
                
                Papel del participante (token opaco): `signer`, `witness`, `notary`, `carbon_copy`, `approver` o `in_person_signer`.
                
                default "signer"
                
            -   `data[].layout.roles[].stage` integer puede ser null
                
                Etapa de firma (1 = primera). `null` en orden paralelo. Disponible sólo si el orden de firma está habilitado en el entorno; si no, pedir `sequential` responde 403 `SEQUENTIAL_NOT_AVAILABLE` y todo documento firma en paralelo.
                
                mín. 1
                
            -   `data[].layout.roles[].habitualSigner` objeto puede ser null
                
                Persona que suele tomar el rol, o `null`.
                
                Ver 3 atributos hijos
                
                -   `data[].layout.roles[].habitualSigner.name` string puede ser null
                    
                    Nombre de la persona habitual.
                    
                -   `data[].layout.roles[].habitualSigner.email` string puede ser null
                    
                    Correo de la persona habitual.
                    
                -   `data[].layout.roles[].habitualSigner.phone` string puede ser null
                    
                    Teléfono de la persona habitual.
                    
                
            
        -   `data[].layout.settings` objeto
            
            Vigencia, recordatorios, mensaje y vista del formulario del documento.
            
            Ver 4 atributos hijos
            
            -   `data[].layout.settings.expiresInDays` integer puede ser null
                
                Días de vigencia desde que se crea el documento, o `null` si no vence.
                
                mín. 1
                
            -   `data[].layout.settings.reminders` objeto puede ser null
                
                Configuración de recordatorios, o `null`.
                
                Ver 2 atributos hijos
                
                -   `data[].layout.settings.reminders.enabled` boolean
                    
                    Si el documento manda recordatorios.
                    
                    default false
                    
                -   `data[].layout.settings.reminders.everyDays` integer puede ser null
                    
                    Cada cuántos días se recuerda.
                    
                    entre 1 y 365
                    
                
            -   `data[].layout.settings.message` string puede ser null
                
                Mensaje del remitente que acompaña la invitación.
                
            -   `data[].layout.settings.formView` enum puede ser null
                
                Vista con la que abre el formulario de los documentos que nacen de esta versión: `fill` (Llenar) o `edit` (Editar campos). `null` se trata como `edit`.
                
                Valores: `fill` `edit`
                
            
        
    

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl 'https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539/versions' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11"
```

**Node**

```
const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539/versions', {
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
    },
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os

import requests

respuesta = requests.get(
    "https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539/versions",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 200**

```
{
  "object": "list",
  "templateId": "tmpl_2a1bc982e2f04c979ff8d8c2a6468539",
  "data": [
    {
      "id": "tv_4e5665043f5b4d95808a4160146a73aa",
      "versionNumber": 4,
      "createdAt": "2026-07-11T18:01:02.952000Z",
      "createdBy": "user",
      "summary": {
        "roles": 0,
        "fields": 0,
        "variables": 5,
        "proposals": 0
      },
      "layout": null
    },
    {
      "id": "tv_971e4eb6dfb34922ac38ff9e4272f108",
      "versionNumber": 3,
      "createdAt": "2026-07-11T18:00:01.893000Z",
      "createdBy": "user",
      "summary": {
        "roles": 0,
        "fields": 0,
        "variables": 6,
        "proposals": 0
      },
      "layout": null
    },
    {
      "id": "tv_c870330f1d6f42bdae87f2e0d6812bd1",
      "versionNumber": 2,
      "createdAt": "2026-07-11T18:00:01.655000Z",
      "createdBy": "user",
      "summary": {
        "roles": 0,
        "fields": 0,
        "variables": 6,
        "proposals": 0
      },
      "layout": null
    },
    {
      "id": "tv_4a34e8bd75df4f77939c1227da7c4df6",
      "versionNumber": 1,
      "createdAt": "2026-07-11T18:00:00.536000Z",
      "createdBy": "user",
      "summary": {
        "roles": 0,
        "fields": 0,
        "variables": 5,
        "proposals": 0
      },
      "layout": null
    }
  ]
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:16 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/plantillas.ejemplos.spec.ts`

## List template facets

GET `/templates/facets`

Las categorías y etiquetas que usan tus plantillas, con conteos, para construir filtros en tu propia UI (`GET /templates?category=…`).

#### Parámetros

-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Devuelve

**200** Colección acotada de facetas con su conteo.

Ver los 2 atributos de la respuesta

-   `categories` array de objetos requerido
    
    Categorías presentes.
    
    Ver 2 atributos hijos
    
    -   `categories[].name` string requerido
        
        Nombre de la categoría o etiqueta.
        
    -   `categories[].count` integer requerido
        
        Cuántas plantillas visibles tienen este valor.
        
    
-   `tags` array de objetos requerido
    
    Etiquetas presentes.
    
    Ver 2 atributos hijos
    
    -   `tags[].name` string requerido
        
        Nombre de la categoría o etiqueta.
        
    -   `tags[].count` integer requerido
        
        Cuántas plantillas visibles tienen este valor.
        
    

Errores posibles (problem+json): [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl 'https://api.allsign.io/v3/templates/facets' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11"
```

**Node**

```
const respuesta = await fetch('https://api.allsign.io/v3/templates/facets', {
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
    },
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os

import requests

respuesta = requests.get(
    "https://api.allsign.io/v3/templates/facets",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 200**

```
{
  "categories": [
    {
      "name": "ventas",
      "count": 11
    }
  ],
  "tags": [
    {
      "name": "compraventa",
      "count": 11
    }
  ]
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:16 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/plantillas.ejemplos.spec.ts`

## List catalog templates

GET `/templates/catalog`

El catálogo curado por AllSign (contratos y formatos mexicanos listos para usar). Cada entrada trae un `slug` estable y los planes que la incluyen; copia una a tu tenant con `POST /templates/catalog/{slug}:copy`.

#### Parámetros

-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Devuelve

**200** Colección acotada del catálogo publicado.

Ver los 2 atributos de la respuesta

-   `object` string, siempre "list"
    
    Siempre `"list"`.
    
-   `data` array de objetos requerido
    
    Arreglo de objetos CatalogTemplate.
    
    Ver 10 atributos hijos
    
    -   `data[].slug` string requerido
        
        Identificador URL-friendly, único.
        
    -   `data[].displayName` string requerido
        
        Nombre público en la galería.
        
    -   `data[].description` string puede ser null
        
        Descripción pública.
        
    -   `data[].category` string requerido
        
        Categoría: legal, admin, rrhh, inmobiliaria, financiero.
        
    -   `data[].icon` string puede ser null
        
        Emoji o clave de ícono para la galería.
        
    -   `data[].isFeatured` boolean requerido
        
        `true` si se destaca en la galería.
        
    -   `data[].variableCount` integer requerido
        
        Número de variables detectadas en la plantilla fuente.
        
    -   `data[].includedInPlans` array de string
        
        Slugs de los planes que incluyen esta plantilla.
        
    -   `data[].templateId` string requerido
        
        La plantilla fuente (`tmpl_…`).
        
    -   `data[].displayOrder` integer requerido
        
        Orden de despliegue en la galería.
        
    

Errores posibles (problem+json): [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl 'https://api.allsign.io/v3/templates/catalog' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11"
```

**Node**

```
const respuesta = await fetch('https://api.allsign.io/v3/templates/catalog', {
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
    },
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os

import requests

respuesta = requests.get(
    "https://api.allsign.io/v3/templates/catalog",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 200**

```
{
  "object": "list",
  "data": [
    {
      "slug": "acuse-de-recibo",
      "displayName": "Acuse de recibo",
      "description": "Cada documento entregado merece dejar huella. Este Acuse de Recibo te da la constancia formal que necesitas — con folio, fecha, descripción detallada y firmas — para que cada intercambio quede registrado limpio y sin ambigüedad.\r\nRedactado conforme al Código Civil Federal mexicano. Solo llena las variables {{nombre}}, {{folio}}, {{descripción}} y tienes un documento listo para firmar en segundos. Formato .docx editable, entrega inmediata.",
      "category": "comercial",
      "icon": null,
      "isFeatured": false,
      "variableCount": 19,
      "includedInPlans": [
        "basic"
      ],
      "templateId": "tmpl_9319df0c7ee444269cef0493fcd2314b",
      "displayOrder": 0
    },
    {
      "slug": "nda-acuerdo-confidencialidad",
      "displayName": "NDA Acuerdo Confidencialidad",
      "description": "Las mejores alianzas empiezan con confianza — y la confianza necesita estructura. Esta plantilla NDA bilateral te da exactamente eso: un acuerdo listo para firmar, redactado conforme al Código Civil Federal, la Ley Federal de Protección a la Propiedad Industrial y la Ley de Protección de Datos Personales, para que puedas avanzar con cualquier socio, cliente o colaborador sin frenar el momentum.\r\nSolo personaliza las variables {{nombre}}, {{RFC}}, {{propósito}} y listo — de idea a contrato firmado en minutos. Formato .docx editable, entrega inmediata.",
      "category": "general",
      "icon": null,
      "isFeatured": true,
      "variableCount": 12,
      "includedInPlans": [
        "basic"
      ],
      "templateId": "tmpl_113e53a0f5f749789277aab40a3db75e",
      "displayOrder": 0
    }
  ]
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:16 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/plantillas.ejemplos.spec.ts`

## Copy catalog template

POST `/templates/catalog/{slug}:copy`

Materializa una copia de la plantilla del catálogo dentro de tu tenant, con sus campos, roles y variables. A partir de ahí es tuya: edítala y emite documentos con su `id`.

#### Parámetros

-   `slug` string ruta requerido
    
-   `Idempotency-Key` string header
    
    Clave única (UUID v4) que vuelve idempotente el POST: un reintento con la misma clave repite la respuesta original en lugar de volver a crear, cobrar o notificar.
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Devuelve

**201** Tu copia, ya como plantilla del tenant. — [el objeto Template](#objeto-template)

Errores posibles (problem+json): [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl -X POST 'https://api.allsign.io/v3/templates/catalog/acuse-de-recibo:copy' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11" \
  -H "Idempotency-Key: $(uuidgen)"
```

**Node**

```
import { randomUUID } from 'node:crypto';

const respuesta = await fetch('https://api.allsign.io/v3/templates/catalog/acuse-de-recibo:copy', {
    method: 'POST',
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
        'Idempotency-Key': randomUUID(),
    },
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os
import uuid

import requests

respuesta = requests.post(
    "https://api.allsign.io/v3/templates/catalog/acuse-de-recibo:copy",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
        "Idempotency-Key": str(uuid.uuid4()),
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 201**

```
{
  "livemode": false,
  "id": "tmpl_eb3e151f0a094b0abc31c69eb9bb1b6e",
  "object": "template",
  "name": "Acuse de recibo",
  "description": "Cada documento entregado merece dejar huella. Este Acuse de Recibo te da la constancia formal que necesitas — con folio, fecha, descripción detallada y firmas — para que cada intercambio quede registrado limpio y sin ambigüedad.\r\nRedactado conforme al Código Civil Federal mexicano. Solo llena las variables {{nombre}}, {{folio}}, {{descripción}} y tienes un documento listo para firmar en segundos. Formato .docx editable, entrega inmediata.",
  "fileType": "docx",
  "originalFilename": "Acuse_de_Recibo.docx",
  "aiEditable": true,
  "variableCount": 19,
  "fieldCount": 0,
  "unassignedFieldCount": 0,
  "roleCount": 0,
  "pendingCandidates": 0,
  "readiness": "ready",
  "tags": [],
  "category": "comercial",
  "usageCount": 0,
  "lastUsedAt": null,
  "currentVersion": 1,
  "previewUrl": null,
  "downloadUrl": "/templates/tmpl_eb3e151f0a094b0abc31c69eb9bb1b6e/download",
  "createdAt": "2026-07-11T18:00:00.000000Z",
  "updatedAt": "2026-07-11T18:00:00.000000Z"
}
```

**Respuesta · 404 · CATALOG_TEMPLATE_NOT_FOUND**

```
{
  "type": "https://allsign.io/developers/docs/errors#CATALOG_TEMPLATE_NOT_FOUND",
  "title": "Not Found",
  "status": 404,
  "detail": "No published catalog template was found with slug 'no-existe'.",
  "instance": "/v3/templates/catalog/no-existe:copy",
  "code": "CATALOG_TEMPLATE_NOT_FOUND",
  "requestId": "req_97a848684ace46d8bb72f456f96c237b"
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:16 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/plantillas.ejemplos.spec.ts`

## List template fields

GET `/templates/{template_id}/fields`

Los campos del formulario de una plantilla PDF: los que trajo el AcroForm al subirla (`source: acroform`), los que dibujaste por API (`drawn`) y los que copiaste de un documento (`template`). Cada campo tiene un `name` estable (el del widget del PDF), un `type` (`text`, `date`, `checkbox`, `radio`, `select`, `signature`, `initials` o `stamp`), sus `areas` (una o varias por página, en % del papel) y el `role` que lo llena — o `null` si nadie lo ha reclamado. `unassignedCount` dice cuántos siguen sin rol; mientras haya uno, la plantilla queda en `readiness: "pending"`.

#### Parámetros

-   `template_id` string ruta requerido
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Devuelve

**200** Colección acotada (`object: "list"`, `hasMore` siempre `false`) con todos los campos.

Ver los 7 atributos de la respuesta

-   `livemode` boolean requerido
    
    `true` en entorno `live`, `false` en `test`/`dev` (marca de agua, sin validez legal).
    
-   `object` string, siempre "list"
    
    Siempre `"list"`.
    
-   `templateId` string requerido
    
    La plantilla dueña de los campos (`tmpl_…`).
    
-   `pageCount` integer requerido
    
    Páginas del PDF de la plantilla.
    
    mín. 0
    
-   `data` array de objetos requerido
    
    Campos de la plantilla.
    
    Ver 15 atributos hijos
    
    -   `data[].object` string, siempre "template\_field"
        
        Siempre `"template_field"`.
        
    -   `data[].name` string requerido
        
        Nombre del campo (clave estable, igual al widget del PDF).
        
    -   `data[].type` enum requerido
        
        Tipo de campo.
        
        Valores: `text` `date` `checkbox` `radio` `select` `signature` `initials` `stamp`
        
    -   `data[].role` string puede ser null
        
        Rol dueño del campo, o `null` si nadie lo ha reclamado.
        
    -   `data[].required` boolean
        
        Si el firmante debe llenarlo antes de firmar.
        
        default true
        
    -   `data[].label` string puede ser null
        
        Etiqueta que ve el firmante.
        
    -   `data[].options` array de string puede ser null
        
        Opciones de `select` / `radio`.
        
    -   `data[].group` string puede ser null
        
        Grupo de exclusión mutua (`radio`).
        
    -   `data[].source` enum puede ser null
        
        De dónde nació el campo.
        
        Valores: `acroform` `drawn` `template`
        
    -   `data[].value` string puede ser null
        
        Valor que el emisor dejó puesto, o `null`. En casillas, `"true"` o `"false"`.
        
    -   `data[].readOnly` boolean
        
        Si el valor queda fijo: el firmante lo ve y no lo puede cambiar. Sin `value` siempre es `false`.
        
        default false
        
    -   `data[].fixedWidth` boolean
        
        Ancho fijo: si el texto no cabe, el campo no se alarga y se encoge la letra (mínimo 6 pt).
        
        default false
        
    -   `data[].placeholder` string puede ser null
        
        Texto de ejemplo que ve el firmante en el campo vacío, o `null` si no tiene.
        
    -   `data[].maxLength` integer puede ser null
        
        Cuántos caracteres admite el campo, o `null` si no tiene límite.
        
    -   `data[].areas` array de objetos requerido
        
        Huecos donde aparece el campo (uno o varios).
        
        Ver 2 atributos hijos
        
        -   `data[].areas[].page` integer requerido
            
            Página 1-based.
            
            mín. 1
            
        -   `data[].areas[].rect` objeto requerido
            
            Rectángulo del hueco, en % del papel.
            
            Ver 4 atributos hijos
            
            -   `data[].areas[].rect.x` number requerido
                
                X izquierdo, porcentaje del ancho de la página.
                
                entre 0 y 100
                
            -   `data[].areas[].rect.y` number requerido
                
                Y superior, porcentaje del alto de la página.
                
                entre 0 y 100
                
            -   `data[].areas[].rect.width` number requerido
                
                Ancho en porcentaje de la página.
                
                entre 0 y 100
                
            -   `data[].areas[].rect.height` number requerido
                
                Alto en porcentaje de la página.
                
                entre 0 y 100
                
            
        
    
-   `unassignedCount` integer requerido
    
    Cuántos campos no tienen rol todavía.
    
    mín. 0
    
-   `hasMore` boolean
    
    Siempre `false` en esta colección acotada.
    
    default false
    

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl 'https://api.allsign.io/v3/templates/tmpl_2ef548a7f8414f9abf8e0d75ca9a71df/fields' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11"
```

**Node**

```
const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_2ef548a7f8414f9abf8e0d75ca9a71df/fields', {
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
    },
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os

import requests

respuesta = requests.get(
    "https://api.allsign.io/v3/templates/tmpl_2ef548a7f8414f9abf8e0d75ca9a71df/fields",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 200**

```
{
  "livemode": false,
  "object": "list",
  "templateId": "tmpl_2ef548a7f8414f9abf8e0d75ca9a71df",
  "pageCount": 1,
  "data": [
    {
      "object": "template_field",
      "name": "nombre",
      "type": "text",
      "role": null,
      "required": true,
      "label": "Nombre",
      "options": null,
      "group": null,
      "source": "acroform",
      "value": null,
      "readOnly": false,
      "fixedWidth": false,
      "placeholder": null,
      "maxLength": null,
      "areas": [
        {
          "page": 1,
          "rect": {
            "x": 8.1699,
            "y": 10.101,
            "width": 40.8497,
            "height": 3.0303
          }
        }
      ]
    },
    {
      "object": "template_field",
      "name": "rfc",
      "type": "text",
      "role": null,
      "required": true,
      "label": "Rfc",
      "options": null,
      "group": null,
      "source": "acroform",
      "value": null,
      "readOnly": false,
      "fixedWidth": false,
      "placeholder": null,
      "maxLength": null,
      "areas": [
        {
          "page": 1,
          "rect": {
            "x": 8.1699,
            "y": 15.1515,
            "width": 40.8497,
            "height": 3.0303
          }
        }
      ]
    },
    {
      "object": "template_field",
      "name": "fecha",
      "type": "date",
      "role": null,
      "required": true,
      "label": "Fecha",
      "options": null,
      "group": null,
      "source": "acroform",
      "value": null,
      "readOnly": false,
      "fixedWidth": false,
      "placeholder": null,
      "maxLength": null,
      "areas": [
        {
          "page": 1,
          "rect": {
            "x": 8.1699,
            "y": 20.202,
            "width": 40.8497,
            "height": 3.0303
          }
        }
      ]
    },
    {
      "object": "template_field",
      "name": "acepta",
      "type": "checkbox",
      "role": null,
      "required": false,
      "label": "Acepta",
      "options": null,
      "group": null,
      "source": "acroform",
      "value": null,
      "readOnly": false,
      "fixedWidth": false,
      "placeholder": null,
      "maxLength": null,
      "areas": [
        {
          "page": 1,
          "rect": {
            "x": 8.1699,
            "y": 25.2525,
            "width": 3.5948,
            "height": 2.7778
          }
        }
      ]
    },
    {
      "object": "template_field",
      "name": "firma_cliente",
      "type": "signature",
      "role": "Cliente",
      "required": true,
      "label": null,
      "options": null,
      "group": null,
      "source": "acroform",
      "value": null,
      "readOnly": false,
      "fixedWidth": false,
      "placeholder": null,
      "maxLength": null,
      "areas": [
        {
          "page": 1,
          "rect": {
            "x": 8.1699,
            "y": 39.1414,
            "width": 40.8497,
            "height": 7.5758
          }
        }
      ]
    }
  ],
  "unassignedCount": 4,
  "hasMore": false
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:12 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/campos.ejemplos.spec.ts`

## Create template field

POST `/templates/{template_id}/fields`

Dibuja un campo nuevo sobre el PDF de la plantilla. Indica `type`, `name` (único en la plantilla) y al menos un área `{page, rect}`; opcionalmente el `role` que lo llenará (se crea si no existe), `required`, `label` para el firmante, `options` para `select`/`radio` y `group` para casillas excluyentes. Nace con `source: "drawn"`.

#### Parámetros

-   `template_id` string ruta requerido
    
-   `Idempotency-Key` string header
    
    Clave única (UUID v4) que vuelve idempotente el POST: un reintento con la misma clave repite la respuesta original en lugar de volver a crear, cobrar o notificar.
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Cuerpo de la petición

application/json

-   `name` string requerido
    
    Nombre del campo.
    
    de 1 a 120 caracteres
    
-   `type` enum requerido
    
    Tipo de campo.
    
    Valores: `text` `date` `checkbox` `radio` `select` `signature` `initials` `stamp`
    
-   `role` string puede ser null
    
    Rol dueño (se crea si no existe).
    
    máx. 120 caracteres
    
-   `required` boolean
    
    Si es obligatorio.
    
    default true
    
-   `label` string puede ser null
    
    Etiqueta para el firmante.
    
    máx. 200 caracteres
    
-   `options` array de string puede ser null
    
    Opciones de `select` / `radio`.
    
-   `group` string puede ser null
    
    Grupo de exclusión mutua.
    
    máx. 120 caracteres
    
-   `value` string puede ser null
    
    Valor que ya va puesto. En casillas, `"true"` o `"false"`.
    
    máx. 4000 caracteres
    
-   `readOnly` boolean
    
    Deja el valor fijo. Se ignora si no mandas `value`.
    
    default false
    
-   `fixedWidth` boolean puede ser null
    
    Ancho fijo: si el texto no cabe, el campo no se alarga y se encoge la letra. Solo `text`, `select` y `date`.
    
-   `placeholder` string puede ser null
    
    Texto de ejemplo para el firmante. Solo campos de texto (`text` y `select`); en otros tipos se ignora.
    
    máx. 200 caracteres
    
-   `maxLength` integer puede ser null
    
    Cuántos caracteres admite el campo (1 a 500). Solo campos de texto (`text` y `select`); en otros tipos se ignora.
    
    entre 1 y 500
    
-   `areas` array de objetos requerido
    
    Huecos del campo en % del papel.
    
    mín. 1 elementos
    
    Ver 2 atributos hijos
    
    -   `areas[].page` integer requerido
        
        Página 1-based.
        
        mín. 1
        
    -   `areas[].rect` objeto requerido
        
        Rectángulo del hueco, en % del papel.
        
        Ver 4 atributos hijos
        
        -   `areas[].rect.x` number requerido
            
            X izquierdo, porcentaje del ancho de la página.
            
            entre 0 y 100
            
        -   `areas[].rect.y` number requerido
            
            Y superior, porcentaje del alto de la página.
            
            entre 0 y 100
            
        -   `areas[].rect.width` number requerido
            
            Ancho en porcentaje de la página.
            
            entre 0 y 100
            
        -   `areas[].rect.height` number requerido
            
            Alto en porcentaje de la página.
            
            entre 0 y 100
            
        
    

#### Devuelve

**201** El campo creado, con sus áreas normalizadas.

Ver los 15 atributos de la respuesta

-   `object` string, siempre "template\_field"
    
    Siempre `"template_field"`.
    
-   `name` string requerido
    
    Nombre del campo (clave estable, igual al widget del PDF).
    
-   `type` enum requerido
    
    Tipo de campo.
    
    Valores: `text` `date` `checkbox` `radio` `select` `signature` `initials` `stamp`
    
-   `role` string puede ser null
    
    Rol dueño del campo, o `null` si nadie lo ha reclamado.
    
-   `required` boolean
    
    Si el firmante debe llenarlo antes de firmar.
    
    default true
    
-   `label` string puede ser null
    
    Etiqueta que ve el firmante.
    
-   `options` array de string puede ser null
    
    Opciones de `select` / `radio`.
    
-   `group` string puede ser null
    
    Grupo de exclusión mutua (`radio`).
    
-   `source` enum puede ser null
    
    De dónde nació el campo.
    
    Valores: `acroform` `drawn` `template`
    
-   `value` string puede ser null
    
    Valor que el emisor dejó puesto, o `null`. En casillas, `"true"` o `"false"`.
    
-   `readOnly` boolean
    
    Si el valor queda fijo: el firmante lo ve y no lo puede cambiar. Sin `value` siempre es `false`.
    
    default false
    
-   `fixedWidth` boolean
    
    Ancho fijo: si el texto no cabe, el campo no se alarga y se encoge la letra (mínimo 6 pt).
    
    default false
    
-   `placeholder` string puede ser null
    
    Texto de ejemplo que ve el firmante en el campo vacío, o `null` si no tiene.
    
-   `maxLength` integer puede ser null
    
    Cuántos caracteres admite el campo, o `null` si no tiene límite.
    
-   `areas` array de objetos requerido
    
    Huecos donde aparece el campo (uno o varios).
    
    Ver 2 atributos hijos
    
    -   `areas[].page` integer requerido
        
        Página 1-based.
        
        mín. 1
        
    -   `areas[].rect` objeto requerido
        
        Rectángulo del hueco, en % del papel.
        
        Ver 4 atributos hijos
        
        -   `areas[].rect.x` number requerido
            
            X izquierdo, porcentaje del ancho de la página.
            
            entre 0 y 100
            
        -   `areas[].rect.y` number requerido
            
            Y superior, porcentaje del alto de la página.
            
            entre 0 y 100
            
        -   `areas[].rect.width` number requerido
            
            Ancho en porcentaje de la página.
            
            entre 0 y 100
            
        -   `areas[].rect.height` number requerido
            
            Alto en porcentaje de la página.
            
            entre 0 y 100
            
        
    

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [409](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl -X POST 'https://api.allsign.io/v3/templates/tmpl_2ef548a7f8414f9abf8e0d75ca9a71df/fields' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "telefono",
  "type": "text",
  "areas": [
    {
      "page": 1,
      "rect": {
        "x": 10,
        "y": 80,
        "width": 30,
        "height": 4
      }
    }
  ],
  "role": "Cliente",
  "required": false
}'
```

**Node**

```
import { randomUUID } from 'node:crypto';

const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_2ef548a7f8414f9abf8e0d75ca9a71df/fields', {
    method: 'POST',
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
        'Idempotency-Key': randomUUID(),
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        name: 'telefono',
        type: 'text',
        areas: [
            {
                page: 1,
                rect: {
                    x: 10,
                    y: 80,
                    width: 30,
                    height: 4,
                },
            },
        ],
        role: 'Cliente',
        required: false,
    }),
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os
import uuid

import requests

respuesta = requests.post(
    "https://api.allsign.io/v3/templates/tmpl_2ef548a7f8414f9abf8e0d75ca9a71df/fields",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
        "Idempotency-Key": str(uuid.uuid4()),
    },
    json={
        "name": "telefono",
        "type": "text",
        "areas": [
            {
                "page": 1,
                "rect": {
                    "x": 10,
                    "y": 80,
                    "width": 30,
                    "height": 4,
                },
            },
        ],
        "role": "Cliente",
        "required": False,
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 201**

```
{
  "object": "template_field",
  "name": "telefono",
  "type": "text",
  "role": "Cliente",
  "required": false,
  "label": null,
  "options": null,
  "group": null,
  "source": "drawn",
  "value": null,
  "readOnly": false,
  "fixedWidth": false,
  "placeholder": null,
  "maxLength": null,
  "areas": [
    {
      "page": 1,
      "rect": {
        "x": 10,
        "y": 80,
        "width": 30,
        "height": 4
      }
    }
  ]
}
```

**Respuesta · 409 · FIELD_CONFLICT**

```
{
  "type": "https://allsign.io/developers/docs/errors#FIELD_CONFLICT",
  "title": "Conflict",
  "status": 409,
  "detail": "A field named 'nombre' already exists in this template.",
  "instance": "/v3/templates/tmpl_4a870c692ac14e2d81be7f9c134d527a/fields",
  "code": "FIELD_CONFLICT",
  "requestId": "req_c1f5a7de743a4edb8e6969784838bc7e",
  "errors": [
    {
      "field": "name",
      "code": "DUPLICATE",
      "detail": "Field name already exists."
    }
  ]
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:12 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/campos.ejemplos.spec.ts`

## Update template field

PATCH `/templates/{template_id}/fields/{name}`

Cambia una o varias cosas de un campo por su `name`: moverlo o redistribuir sus `areas`, renombrarlo (`name`, renombra todas sus áreas), cambiar su `type`, asignarle un `role` (o `null` para dejarlo sin rol), `required`, `label`, `options` o `group`. Es la llamada con la que asignas los campos importados del PDF a un rol antes de emitir.

#### Parámetros

-   `template_id` string ruta requerido
    
-   `name` string ruta requerido
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Cuerpo de la petición

application/json

-   `name` string puede ser null
    
    Nuevo nombre (renombra todas sus áreas).
    
    de 1 a 120 caracteres
    
-   `type` enum puede ser null
    
    Nuevo tipo.
    
    Valores: `text` `date` `checkbox` `radio` `select` `signature` `initials` `stamp`
    
-   `role` string puede ser null
    
    Nuevo rol (`null` lo deja sin rol).
    
    máx. 120 caracteres
    
-   `required` boolean puede ser null
    
    Si es obligatorio.
    
-   `label` string puede ser null
    
    Etiqueta para el firmante.
    
    máx. 200 caracteres
    
-   `options` array de string puede ser null
    
    Opciones de `select` / `radio`.
    
-   `group` string puede ser null
    
    Grupo de exclusión mutua.
    
    máx. 120 caracteres
    
-   `value` string puede ser null
    
    Nuevo valor (`null` lo vacía y suelta el candado).
    
    máx. 4000 caracteres
    
-   `readOnly` boolean puede ser null
    
    Deja el valor fijo. Se ignora si el campo queda sin `value`.
    
-   `fixedWidth` boolean puede ser null
    
    Ancho fijo (`true`); `false` o `null` lo quita. Solo `text`, `select` y `date`.
    
-   `placeholder` string puede ser null
    
    Texto de ejemplo, solo en campos de texto (`text` y `select`). Vacío o `null` lo quita.
    
    máx. 200 caracteres
    
-   `maxLength` integer puede ser null
    
    Cuántos caracteres admite (1 a 500), solo en campos de texto (`text` y `select`). `null` quita el límite.
    
    entre 1 y 500
    
-   `areas` array de objetos puede ser null
    
    Reemplaza todos los huecos.
    
    mín. 1 elementos
    
    Ver 2 atributos hijos
    
    -   `areas[].page` integer requerido
        
        Página 1-based.
        
        mín. 1
        
    -   `areas[].rect` objeto requerido
        
        Rectángulo del hueco, en % del papel.
        
        Ver 4 atributos hijos
        
        -   `areas[].rect.x` number requerido
            
            X izquierdo, porcentaje del ancho de la página.
            
            entre 0 y 100
            
        -   `areas[].rect.y` number requerido
            
            Y superior, porcentaje del alto de la página.
            
            entre 0 y 100
            
        -   `areas[].rect.width` number requerido
            
            Ancho en porcentaje de la página.
            
            entre 0 y 100
            
        -   `areas[].rect.height` number requerido
            
            Alto en porcentaje de la página.
            
            entre 0 y 100
            
        
    

#### Devuelve

**200** El campo ya actualizado.

Ver los 15 atributos de la respuesta

-   `object` string, siempre "template\_field"
    
    Siempre `"template_field"`.
    
-   `name` string requerido
    
    Nombre del campo (clave estable, igual al widget del PDF).
    
-   `type` enum requerido
    
    Tipo de campo.
    
    Valores: `text` `date` `checkbox` `radio` `select` `signature` `initials` `stamp`
    
-   `role` string puede ser null
    
    Rol dueño del campo, o `null` si nadie lo ha reclamado.
    
-   `required` boolean
    
    Si el firmante debe llenarlo antes de firmar.
    
    default true
    
-   `label` string puede ser null
    
    Etiqueta que ve el firmante.
    
-   `options` array de string puede ser null
    
    Opciones de `select` / `radio`.
    
-   `group` string puede ser null
    
    Grupo de exclusión mutua (`radio`).
    
-   `source` enum puede ser null
    
    De dónde nació el campo.
    
    Valores: `acroform` `drawn` `template`
    
-   `value` string puede ser null
    
    Valor que el emisor dejó puesto, o `null`. En casillas, `"true"` o `"false"`.
    
-   `readOnly` boolean
    
    Si el valor queda fijo: el firmante lo ve y no lo puede cambiar. Sin `value` siempre es `false`.
    
    default false
    
-   `fixedWidth` boolean
    
    Ancho fijo: si el texto no cabe, el campo no se alarga y se encoge la letra (mínimo 6 pt).
    
    default false
    
-   `placeholder` string puede ser null
    
    Texto de ejemplo que ve el firmante en el campo vacío, o `null` si no tiene.
    
-   `maxLength` integer puede ser null
    
    Cuántos caracteres admite el campo, o `null` si no tiene límite.
    
-   `areas` array de objetos requerido
    
    Huecos donde aparece el campo (uno o varios).
    
    Ver 2 atributos hijos
    
    -   `areas[].page` integer requerido
        
        Página 1-based.
        
        mín. 1
        
    -   `areas[].rect` objeto requerido
        
        Rectángulo del hueco, en % del papel.
        
        Ver 4 atributos hijos
        
        -   `areas[].rect.x` number requerido
            
            X izquierdo, porcentaje del ancho de la página.
            
            entre 0 y 100
            
        -   `areas[].rect.y` number requerido
            
            Y superior, porcentaje del alto de la página.
            
            entre 0 y 100
            
        -   `areas[].rect.width` number requerido
            
            Ancho en porcentaje de la página.
            
            entre 0 y 100
            
        -   `areas[].rect.height` number requerido
            
            Alto en porcentaje de la página.
            
            entre 0 y 100
            
        
    

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [409](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl -X PATCH 'https://api.allsign.io/v3/templates/tmpl_2ef548a7f8414f9abf8e0d75ca9a71df/fields/nombre' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11" \
  -H "Content-Type: application/json" \
  -d '{
  "role": "Cliente",
  "required": true
}'
```

**Node**

```
const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_2ef548a7f8414f9abf8e0d75ca9a71df/fields/nombre', {
    method: 'PATCH',
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        role: 'Cliente',
        required: true,
    }),
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os

import requests

respuesta = requests.patch(
    "https://api.allsign.io/v3/templates/tmpl_2ef548a7f8414f9abf8e0d75ca9a71df/fields/nombre",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
    json={
        "role": "Cliente",
        "required": True,
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 200**

```
{
  "object": "template_field",
  "name": "nombre",
  "type": "text",
  "role": "Cliente",
  "required": true,
  "label": "Nombre",
  "options": null,
  "group": null,
  "source": "acroform",
  "value": null,
  "readOnly": false,
  "fixedWidth": false,
  "placeholder": null,
  "maxLength": null,
  "areas": [
    {
      "page": 1,
      "rect": {
        "x": 8.1699,
        "y": 10.101,
        "width": 40.8497,
        "height": 3.0303
      }
    }
  ]
}
```

**Respuesta · 404 · FIELD_NOT_FOUND**

```
{
  "type": "https://allsign.io/developers/docs/errors#FIELD_NOT_FOUND",
  "title": "Not Found",
  "status": 404,
  "detail": "Field 'telefono_movil' not found in this template.",
  "instance": "/v3/templates/tmpl_24c55a589976432da1a168e3c4859ce6/fields/telefono_movil",
  "code": "FIELD_NOT_FOUND",
  "requestId": "req_06aa3c8f7ed843d0afa10acac48240e5"
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:12 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/campos.ejemplos.spec.ts`

## Delete template field

DELETE `/templates/{template_id}/fields/{name}`

Quita el campo y todas sus áreas de la plantilla. Los documentos ya emitidos no cambian.

#### Parámetros

-   `template_id` string ruta requerido
    
-   `name` string ruta requerido
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Devuelve

**204** Campo eliminado.

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [409](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl -X DELETE 'https://api.allsign.io/v3/templates/tmpl_2ef548a7f8414f9abf8e0d75ca9a71df/fields/rfc' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11"
```

**Node**

```
const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_2ef548a7f8414f9abf8e0d75ca9a71df/fields/rfc', {
    method: 'DELETE',
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
    },
});
console.log(respuesta.status);
```

**Python**

```
import os

import requests

respuesta = requests.delete(
    "https://api.allsign.io/v3/templates/tmpl_2ef548a7f8414f9abf8e0d75ca9a71df/fields/rfc",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
)
print(respuesta.status_code)
```

**Respuesta · 204**

*Sin cuerpo.*

**Respuesta · 404 · FIELD_NOT_FOUND**

```
{
  "type": "https://allsign.io/developers/docs/errors#FIELD_NOT_FOUND",
  "title": "Not Found",
  "status": 404,
  "detail": "Field 'rfc' not found in this template.",
  "instance": "/v3/templates/tmpl_2ef548a7f8414f9abf8e0d75ca9a71df/fields/rfc",
  "code": "FIELD_NOT_FOUND",
  "requestId": "req_dc07200411324e03b6bbce3cca2ea6de"
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:12 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/campos.ejemplos.spec.ts`

## Replace template fields

PUT `/templates/{template_id}/fields`

Reemplaza el layout completo de una vez (declarativo e idempotente): mandas la lista final de campos y AllSign crea, mueve, reasigna y borra lo que haga falta para que la plantilla quede exactamente así. Útil para versionar el layout en tu repositorio o para sincronizarlo desde tu propio editor.

#### Parámetros

-   `template_id` string ruta requerido
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Cuerpo de la petición

application/json

-   `fields` array de objetos requerido
    
    Layout completo; reemplaza el anterior.
    
    Ver 13 atributos hijos
    
    -   `fields[].name` string requerido
        
        Nombre del campo.
        
        de 1 a 120 caracteres
        
    -   `fields[].type` enum requerido
        
        Tipo de campo.
        
        Valores: `text` `date` `checkbox` `radio` `select` `signature` `initials` `stamp`
        
    -   `fields[].role` string puede ser null
        
        Rol dueño (se crea si no existe).
        
        máx. 120 caracteres
        
    -   `fields[].required` boolean
        
        Si es obligatorio.
        
        default true
        
    -   `fields[].label` string puede ser null
        
        Etiqueta para el firmante.
        
        máx. 200 caracteres
        
    -   `fields[].options` array de string puede ser null
        
        Opciones de `select` / `radio`.
        
    -   `fields[].group` string puede ser null
        
        Grupo de exclusión mutua.
        
        máx. 120 caracteres
        
    -   `fields[].value` string puede ser null
        
        Valor que ya va puesto. En casillas, `"true"` o `"false"`.
        
        máx. 4000 caracteres
        
    -   `fields[].readOnly` boolean
        
        Deja el valor fijo. Se ignora si no mandas `value`.
        
        default false
        
    -   `fields[].fixedWidth` boolean puede ser null
        
        Ancho fijo: si el texto no cabe, el campo no se alarga y se encoge la letra. Solo `text`, `select` y `date`.
        
    -   `fields[].placeholder` string puede ser null
        
        Texto de ejemplo para el firmante. Solo campos de texto (`text` y `select`); en otros tipos se ignora.
        
        máx. 200 caracteres
        
    -   `fields[].maxLength` integer puede ser null
        
        Cuántos caracteres admite el campo (1 a 500). Solo campos de texto (`text` y `select`); en otros tipos se ignora.
        
        entre 1 y 500
        
    -   `fields[].areas` array de objetos requerido
        
        Huecos del campo en % del papel.
        
        mín. 1 elementos
        
        Ver 2 atributos hijos
        
        -   `fields[].areas[].page` integer requerido
            
            Página 1-based.
            
            mín. 1
            
        -   `fields[].areas[].rect` objeto requerido
            
            Rectángulo del hueco, en % del papel.
            
            Ver 4 atributos hijos
            
            -   `fields[].areas[].rect.x` number requerido
                
                X izquierdo, porcentaje del ancho de la página.
                
                entre 0 y 100
                
            -   `fields[].areas[].rect.y` number requerido
                
                Y superior, porcentaje del alto de la página.
                
                entre 0 y 100
                
            -   `fields[].areas[].rect.width` number requerido
                
                Ancho en porcentaje de la página.
                
                entre 0 y 100
                
            -   `fields[].areas[].rect.height` number requerido
                
                Alto en porcentaje de la página.
                
                entre 0 y 100
                
            
        
    

#### Devuelve

**200** La lista completa de campos tal como quedó.

Ver los 7 atributos de la respuesta

-   `livemode` boolean requerido
    
    `true` en entorno `live`, `false` en `test`/`dev` (marca de agua, sin validez legal).
    
-   `object` string, siempre "list"
    
    Siempre `"list"`.
    
-   `templateId` string requerido
    
    La plantilla dueña de los campos (`tmpl_…`).
    
-   `pageCount` integer requerido
    
    Páginas del PDF de la plantilla.
    
    mín. 0
    
-   `data` array de objetos requerido
    
    Campos de la plantilla.
    
    Ver 15 atributos hijos
    
    -   `data[].object` string, siempre "template\_field"
        
        Siempre `"template_field"`.
        
    -   `data[].name` string requerido
        
        Nombre del campo (clave estable, igual al widget del PDF).
        
    -   `data[].type` enum requerido
        
        Tipo de campo.
        
        Valores: `text` `date` `checkbox` `radio` `select` `signature` `initials` `stamp`
        
    -   `data[].role` string puede ser null
        
        Rol dueño del campo, o `null` si nadie lo ha reclamado.
        
    -   `data[].required` boolean
        
        Si el firmante debe llenarlo antes de firmar.
        
        default true
        
    -   `data[].label` string puede ser null
        
        Etiqueta que ve el firmante.
        
    -   `data[].options` array de string puede ser null
        
        Opciones de `select` / `radio`.
        
    -   `data[].group` string puede ser null
        
        Grupo de exclusión mutua (`radio`).
        
    -   `data[].source` enum puede ser null
        
        De dónde nació el campo.
        
        Valores: `acroform` `drawn` `template`
        
    -   `data[].value` string puede ser null
        
        Valor que el emisor dejó puesto, o `null`. En casillas, `"true"` o `"false"`.
        
    -   `data[].readOnly` boolean
        
        Si el valor queda fijo: el firmante lo ve y no lo puede cambiar. Sin `value` siempre es `false`.
        
        default false
        
    -   `data[].fixedWidth` boolean
        
        Ancho fijo: si el texto no cabe, el campo no se alarga y se encoge la letra (mínimo 6 pt).
        
        default false
        
    -   `data[].placeholder` string puede ser null
        
        Texto de ejemplo que ve el firmante en el campo vacío, o `null` si no tiene.
        
    -   `data[].maxLength` integer puede ser null
        
        Cuántos caracteres admite el campo, o `null` si no tiene límite.
        
    -   `data[].areas` array de objetos requerido
        
        Huecos donde aparece el campo (uno o varios).
        
        Ver 2 atributos hijos
        
        -   `data[].areas[].page` integer requerido
            
            Página 1-based.
            
            mín. 1
            
        -   `data[].areas[].rect` objeto requerido
            
            Rectángulo del hueco, en % del papel.
            
            Ver 4 atributos hijos
            
            -   `data[].areas[].rect.x` number requerido
                
                X izquierdo, porcentaje del ancho de la página.
                
                entre 0 y 100
                
            -   `data[].areas[].rect.y` number requerido
                
                Y superior, porcentaje del alto de la página.
                
                entre 0 y 100
                
            -   `data[].areas[].rect.width` number requerido
                
                Ancho en porcentaje de la página.
                
                entre 0 y 100
                
            -   `data[].areas[].rect.height` number requerido
                
                Alto en porcentaje de la página.
                
                entre 0 y 100
                
            
        
    
-   `unassignedCount` integer requerido
    
    Cuántos campos no tienen rol todavía.
    
    mín. 0
    
-   `hasMore` boolean
    
    Siempre `false` en esta colección acotada.
    
    default false
    

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl -X PUT 'https://api.allsign.io/v3/templates/tmpl_2ef548a7f8414f9abf8e0d75ca9a71df/fields' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11" \
  -H "Content-Type: application/json" \
  -d '{
  "fields": [
    {
      "name": "nombre",
      "type": "text",
      "areas": [
        {
          "page": 1,
          "rect": {
            "x": 8.1699,
            "y": 10.101,
            "width": 40.8497,
            "height": 3.0303
          }
        }
      ],
      "role": "Cliente",
      "required": true
    },
    {
      "name": "rfc",
      "type": "text",
      "areas": [
        {
          "page": 1,
          "rect": {
            "x": 8.1699,
            "y": 15.1515,
            "width": 40.8497,
            "height": 3.0303
          }
        }
      ],
      "role": null,
      "required": true
    },
    {
      "name": "fecha",
      "type": "date",
      "areas": [
        {
          "page": 1,
          "rect": {
            "x": 8.1699,
            "y": 20.202,
            "width": 40.8497,
            "height": 3.0303
          }
        }
      ],
      "role": null,
      "required": true
    },
    {
      "name": "acepta",
      "type": "checkbox",
      "areas": [
        {
          "page": 1,
          "rect": {
            "x": 8.1699,
            "y": 25.2525,
            "width": 3.5948,
            "height": 2.7778
          }
        }
      ],
      "role": null,
      "required": false
    },
    {
      "name": "firma_cliente",
      "type": "signature",
      "areas": [
        {
          "page": 1,
          "rect": {
            "x": 8.1699,
            "y": 39.1414,
            "width": 40.8497,
            "height": 7.5758
          }
        }
      ],
      "role": "Cliente",
      "required": true
    }
  ]
}'
```

**Node**

```
const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_2ef548a7f8414f9abf8e0d75ca9a71df/fields', {
    method: 'PUT',
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        fields: [
            {
                name: 'nombre',
                type: 'text',
                areas: [
                    {
                        page: 1,
                        rect: {
                            x: 8.1699,
                            y: 10.101,
                            width: 40.8497,
                            height: 3.0303,
                        },
                    },
                ],
                role: 'Cliente',
                required: true,
            },
            {
                name: 'rfc',
                type: 'text',
                areas: [
                    {
                        page: 1,
                        rect: {
                            x: 8.1699,
                            y: 15.1515,
                            width: 40.8497,
                            height: 3.0303,
                        },
                    },
                ],
                role: null,
                required: true,
            },
            {
                name: 'fecha',
                type: 'date',
                areas: [
                    {
                        page: 1,
                        rect: {
                            x: 8.1699,
                            y: 20.202,
                            width: 40.8497,
                            height: 3.0303,
                        },
                    },
                ],
                role: null,
                required: true,
            },
            {
                name: 'acepta',
                type: 'checkbox',
                areas: [
                    {
                        page: 1,
                        rect: {
                            x: 8.1699,
                            y: 25.2525,
                            width: 3.5948,
                            height: 2.7778,
                        },
                    },
                ],
                role: null,
                required: false,
            },
            {
                name: 'firma_cliente',
                type: 'signature',
                areas: [
                    {
                        page: 1,
                        rect: {
                            x: 8.1699,
                            y: 39.1414,
                            width: 40.8497,
                            height: 7.5758,
                        },
                    },
                ],
                role: 'Cliente',
                required: true,
            },
        ],
    }),
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os

import requests

respuesta = requests.put(
    "https://api.allsign.io/v3/templates/tmpl_2ef548a7f8414f9abf8e0d75ca9a71df/fields",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
    json={
        "fields": [
            {
                "name": "nombre",
                "type": "text",
                "areas": [
                    {
                        "page": 1,
                        "rect": {
                            "x": 8.1699,
                            "y": 10.101,
                            "width": 40.8497,
                            "height": 3.0303,
                        },
                    },
                ],
                "role": "Cliente",
                "required": True,
            },
            {
                "name": "rfc",
                "type": "text",
                "areas": [
                    {
                        "page": 1,
                        "rect": {
                            "x": 8.1699,
                            "y": 15.1515,
                            "width": 40.8497,
                            "height": 3.0303,
                        },
                    },
                ],
                "role": None,
                "required": True,
            },
            {
                "name": "fecha",
                "type": "date",
                "areas": [
                    {
                        "page": 1,
                        "rect": {
                            "x": 8.1699,
                            "y": 20.202,
                            "width": 40.8497,
                            "height": 3.0303,
                        },
                    },
                ],
                "role": None,
                "required": True,
            },
            {
                "name": "acepta",
                "type": "checkbox",
                "areas": [
                    {
                        "page": 1,
                        "rect": {
                            "x": 8.1699,
                            "y": 25.2525,
                            "width": 3.5948,
                            "height": 2.7778,
                        },
                    },
                ],
                "role": None,
                "required": False,
            },
            {
                "name": "firma_cliente",
                "type": "signature",
                "areas": [
                    {
                        "page": 1,
                        "rect": {
                            "x": 8.1699,
                            "y": 39.1414,
                            "width": 40.8497,
                            "height": 7.5758,
                        },
                    },
                ],
                "role": "Cliente",
                "required": True,
            },
        ],
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 200**

```
{
  "livemode": false,
  "object": "list",
  "templateId": "tmpl_2ef548a7f8414f9abf8e0d75ca9a71df",
  "pageCount": 1,
  "data": [
    {
      "object": "template_field",
      "name": "nombre",
      "type": "text",
      "role": "Cliente",
      "required": true,
      "label": null,
      "options": null,
      "group": null,
      "source": "drawn",
      "value": null,
      "readOnly": false,
      "fixedWidth": false,
      "placeholder": null,
      "maxLength": null,
      "areas": [
        {
          "page": 1,
          "rect": {
            "x": 8.1699,
            "y": 10.101,
            "width": 40.8497,
            "height": 3.0303
          }
        }
      ]
    },
    {
      "object": "template_field",
      "name": "rfc",
      "type": "text",
      "role": null,
      "required": true,
      "label": null,
      "options": null,
      "group": null,
      "source": "drawn",
      "value": null,
      "readOnly": false,
      "fixedWidth": false,
      "placeholder": null,
      "maxLength": null,
      "areas": [
        {
          "page": 1,
          "rect": {
            "x": 8.1699,
            "y": 15.1515,
            "width": 40.8497,
            "height": 3.0303
          }
        }
      ]
    },
    {
      "object": "template_field",
      "name": "fecha",
      "type": "date",
      "role": null,
      "required": true,
      "label": null,
      "options": null,
      "group": null,
      "source": "drawn",
      "value": null,
      "readOnly": false,
      "fixedWidth": false,
      "placeholder": null,
      "maxLength": null,
      "areas": [
        {
          "page": 1,
          "rect": {
            "x": 8.1699,
            "y": 20.202,
            "width": 40.8497,
            "height": 3.0303
          }
        }
      ]
    },
    {
      "object": "template_field",
      "name": "acepta",
      "type": "checkbox",
      "role": null,
      "required": false,
      "label": null,
      "options": null,
      "group": null,
      "source": "drawn",
      "value": null,
      "readOnly": false,
      "fixedWidth": false,
      "placeholder": null,
      "maxLength": null,
      "areas": [
        {
          "page": 1,
          "rect": {
            "x": 8.1699,
            "y": 25.2525,
            "width": 3.5948,
            "height": 2.7778
          }
        }
      ]
    },
    {
      "object": "template_field",
      "name": "firma_cliente",
      "type": "signature",
      "role": "Cliente",
      "required": true,
      "label": null,
      "options": null,
      "group": null,
      "source": "drawn",
      "value": null,
      "readOnly": false,
      "fixedWidth": false,
      "placeholder": null,
      "maxLength": null,
      "areas": [
        {
          "page": 1,
          "rect": {
            "x": 8.1699,
            "y": 39.1414,
            "width": 40.8497,
            "height": 7.5758
          }
        }
      ]
    }
  ],
  "unassignedCount": 3,
  "hasMore": false
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:12 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/campos.ejemplos.spec.ts`

## Import fields from a document

POST `/templates/{template_id}/fields:from-document`

Copia los campos y los roles de un documento a la plantilla: es el "guardar como plantilla" del super editor, por API. Los firmantes del documento **no** viajan — la plantilla guarda estructura (campos + roles), nunca personas. Tampoco viajan los datos: de cada campo se copian nombre, tipo, rol, posición (convertida a % de la hoja), requerido, etiqueta, opciones y grupo, **nunca** el valor que tenía en el documento origen ni su candado (`readOnly`). Los campos existentes de la plantilla se reemplazan por los del documento.

#### Parámetros

-   `template_id` string ruta requerido
    
-   `Idempotency-Key` string header
    
    Clave única (UUID v4) que vuelve idempotente el POST: un reintento con la misma clave repite la respuesta original en lugar de volver a crear, cobrar o notificar.
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Cuerpo de la petición

application/json

-   `documentId` string requerido
    
    Documento (`doc_…`) del que se copian campos y roles.
    

#### Devuelve

**200** La lista de campos de la plantilla después de la importación.

Ver los 7 atributos de la respuesta

-   `livemode` boolean requerido
    
    `true` en entorno `live`, `false` en `test`/`dev` (marca de agua, sin validez legal).
    
-   `object` string, siempre "list"
    
    Siempre `"list"`.
    
-   `templateId` string requerido
    
    La plantilla dueña de los campos (`tmpl_…`).
    
-   `pageCount` integer requerido
    
    Páginas del PDF de la plantilla.
    
    mín. 0
    
-   `data` array de objetos requerido
    
    Campos de la plantilla.
    
    Ver 15 atributos hijos
    
    -   `data[].object` string, siempre "template\_field"
        
        Siempre `"template_field"`.
        
    -   `data[].name` string requerido
        
        Nombre del campo (clave estable, igual al widget del PDF).
        
    -   `data[].type` enum requerido
        
        Tipo de campo.
        
        Valores: `text` `date` `checkbox` `radio` `select` `signature` `initials` `stamp`
        
    -   `data[].role` string puede ser null
        
        Rol dueño del campo, o `null` si nadie lo ha reclamado.
        
    -   `data[].required` boolean
        
        Si el firmante debe llenarlo antes de firmar.
        
        default true
        
    -   `data[].label` string puede ser null
        
        Etiqueta que ve el firmante.
        
    -   `data[].options` array de string puede ser null
        
        Opciones de `select` / `radio`.
        
    -   `data[].group` string puede ser null
        
        Grupo de exclusión mutua (`radio`).
        
    -   `data[].source` enum puede ser null
        
        De dónde nació el campo.
        
        Valores: `acroform` `drawn` `template`
        
    -   `data[].value` string puede ser null
        
        Valor que el emisor dejó puesto, o `null`. En casillas, `"true"` o `"false"`.
        
    -   `data[].readOnly` boolean
        
        Si el valor queda fijo: el firmante lo ve y no lo puede cambiar. Sin `value` siempre es `false`.
        
        default false
        
    -   `data[].fixedWidth` boolean
        
        Ancho fijo: si el texto no cabe, el campo no se alarga y se encoge la letra (mínimo 6 pt).
        
        default false
        
    -   `data[].placeholder` string puede ser null
        
        Texto de ejemplo que ve el firmante en el campo vacío, o `null` si no tiene.
        
    -   `data[].maxLength` integer puede ser null
        
        Cuántos caracteres admite el campo, o `null` si no tiene límite.
        
    -   `data[].areas` array de objetos requerido
        
        Huecos donde aparece el campo (uno o varios).
        
        Ver 2 atributos hijos
        
        -   `data[].areas[].page` integer requerido
            
            Página 1-based.
            
            mín. 1
            
        -   `data[].areas[].rect` objeto requerido
            
            Rectángulo del hueco, en % del papel.
            
            Ver 4 atributos hijos
            
            -   `data[].areas[].rect.x` number requerido
                
                X izquierdo, porcentaje del ancho de la página.
                
                entre 0 y 100
                
            -   `data[].areas[].rect.y` number requerido
                
                Y superior, porcentaje del alto de la página.
                
                entre 0 y 100
                
            -   `data[].areas[].rect.width` number requerido
                
                Ancho en porcentaje de la página.
                
                entre 0 y 100
                
            -   `data[].areas[].rect.height` number requerido
                
                Alto en porcentaje de la página.
                
                entre 0 y 100
                
            
        
    
-   `unassignedCount` integer requerido
    
    Cuántos campos no tienen rol todavía.
    
    mín. 0
    
-   `hasMore` boolean
    
    Siempre `false` en esta colección acotada.
    
    default false
    

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl -X POST 'https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/fields:from-document' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "documentId": "doc_c9b39590d09645c9b9ebc28f4b3a5349"
}'
```

**Node**

```
import { randomUUID } from 'node:crypto';

const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/fields:from-document', {
    method: 'POST',
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
        'Idempotency-Key': randomUUID(),
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        documentId: 'doc_c9b39590d09645c9b9ebc28f4b3a5349',
    }),
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os
import uuid

import requests

respuesta = requests.post(
    "https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/fields:from-document",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
        "Idempotency-Key": str(uuid.uuid4()),
    },
    json={
        "documentId": "doc_c9b39590d09645c9b9ebc28f4b3a5349",
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 200**

```
{
  "livemode": false,
  "object": "list",
  "templateId": "tmpl_c405a9544678416a9b2e29dfa4a7f331",
  "pageCount": 1,
  "data": [
    {
      "object": "template_field",
      "name": "signature_24f9dec1",
      "type": "signature",
      "role": "Cliente",
      "required": true,
      "label": null,
      "options": null,
      "group": null,
      "source": "drawn",
      "value": null,
      "readOnly": false,
      "fixedWidth": false,
      "placeholder": null,
      "maxLength": null,
      "areas": [
        {
          "page": 1,
          "rect": {
            "x": 13.0719,
            "y": 78.2828,
            "width": 32.6797,
            "height": 7.5758
          }
        }
      ]
    }
  ],
  "unassignedCount": 0,
  "hasMore": false
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:16 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/plantillas.ejemplos.spec.ts`

## List template roles

GET `/templates/{template_id}/roles`

Los roles de la plantilla en orden, con cuántos campos tiene cada uno. Al crear un documento desde la plantilla, cada firmante toma un rol por `roleName` y hereda todos sus campos.

#### Parámetros

-   `template_id` string ruta requerido
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Devuelve

**200** Colección acotada con los roles en orden.

Ver los 5 atributos de la respuesta

-   `livemode` boolean requerido
    
    `true` en entorno `live`, `false` en `test`/`dev` (marca de agua, sin validez legal).
    
-   `object` string, siempre "list"
    
    Siempre `"list"`.
    
-   `templateId` string requerido
    
    La plantilla dueña de los roles (`tmpl_…`).
    
-   `data` array de objetos requerido
    
    Roles de la plantilla, en orden.
    
    Ver 4 atributos hijos
    
    -   `data[].object` string, siempre "template\_role"
        
        Siempre `"template_role"`.
        
    -   `data[].name` string requerido
        
        Nombre del rol (ej. `Cliente`).
        
    -   `data[].order` integer requerido
        
        Orden de presentación, 0-based.
        
        mín. 0
        
    -   `data[].fieldCount` integer requerido
        
        Cuántos campos tiene asignados.
        
        mín. 0
        
    
-   `hasMore` boolean
    
    Siempre `false` en esta colección acotada.
    
    default false
    

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl 'https://api.allsign.io/v3/templates/tmpl_2ef548a7f8414f9abf8e0d75ca9a71df/roles' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11"
```

**Node**

```
const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_2ef548a7f8414f9abf8e0d75ca9a71df/roles', {
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
    },
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os

import requests

respuesta = requests.get(
    "https://api.allsign.io/v3/templates/tmpl_2ef548a7f8414f9abf8e0d75ca9a71df/roles",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 200**

```
{
  "livemode": false,
  "object": "list",
  "templateId": "tmpl_2ef548a7f8414f9abf8e0d75ca9a71df",
  "data": [
    {
      "object": "template_role",
      "name": "Cliente",
      "order": 0,
      "fieldCount": 1
    }
  ],
  "hasMore": false
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:12 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/campos.ejemplos.spec.ts`

## Replace template roles

PUT `/templates/{template_id}/roles`

Fija la lista de roles (nombre y orden). Los roles que ya no estén en la lista se quitan y sus campos quedan sin rol (`unassignedCount` sube); los nombres nuevos se crean vacíos, listos para asignarles campos con `PATCH …/fields/{name}`.

#### Parámetros

-   `template_id` string ruta requerido
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Cuerpo de la petición

application/json

-   `roles` array de string requerido
    
    Nombres de rol en orden; los que falten se quitan (sus campos quedan sin rol).
    

#### Devuelve

**200** Los roles tal como quedaron.

Ver los 5 atributos de la respuesta

-   `livemode` boolean requerido
    
    `true` en entorno `live`, `false` en `test`/`dev` (marca de agua, sin validez legal).
    
-   `object` string, siempre "list"
    
    Siempre `"list"`.
    
-   `templateId` string requerido
    
    La plantilla dueña de los roles (`tmpl_…`).
    
-   `data` array de objetos requerido
    
    Roles de la plantilla, en orden.
    
    Ver 4 atributos hijos
    
    -   `data[].object` string, siempre "template\_role"
        
        Siempre `"template_role"`.
        
    -   `data[].name` string requerido
        
        Nombre del rol (ej. `Cliente`).
        
    -   `data[].order` integer requerido
        
        Orden de presentación, 0-based.
        
        mín. 0
        
    -   `data[].fieldCount` integer requerido
        
        Cuántos campos tiene asignados.
        
        mín. 0
        
    
-   `hasMore` boolean
    
    Siempre `false` en esta colección acotada.
    
    default false
    

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl -X PUT 'https://api.allsign.io/v3/templates/tmpl_2ef548a7f8414f9abf8e0d75ca9a71df/roles' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11" \
  -H "Content-Type: application/json" \
  -d '{
  "roles": [
    "Cliente"
  ]
}'
```

**Node**

```
const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_2ef548a7f8414f9abf8e0d75ca9a71df/roles', {
    method: 'PUT',
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        roles: [
            'Cliente',
        ],
    }),
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os

import requests

respuesta = requests.put(
    "https://api.allsign.io/v3/templates/tmpl_2ef548a7f8414f9abf8e0d75ca9a71df/roles",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
    json={
        "roles": [
            "Cliente",
        ],
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 200**

```
{
  "livemode": false,
  "object": "list",
  "templateId": "tmpl_2ef548a7f8414f9abf8e0d75ca9a71df",
  "data": [
    {
      "object": "template_role",
      "name": "Cliente",
      "order": 0,
      "fieldCount": 1
    }
  ],
  "hasMore": false
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:12 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/campos.ejemplos.spec.ts`

## Download template file

GET `/templates/{template_id}/file`

El PDF de la plantilla. Con `format=form` conserva los widgets del formulario **vivos** (para revisarlo en Acrobat o en tu propio visor); con `format=flat` los hornea (aplanado, sin campos editables). Solo plantillas PDF: una plantilla DOCX responde 422.

#### Parámetros

-   `template_id` string ruta requerido
    
-   `format` enum query
    
    `form` (default) conserva los widgets; `flat` los hornea.
    
    Valores: `form` `flat`
    
    default "form"
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Devuelve

**200** El PDF (`application/pdf`, `Content-Disposition: attachment`).

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl 'https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/file?format=flat' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11"
```

**Node**

```
import { writeFileSync } from 'node:fs';

const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/file?format=flat', {
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
    },
});
writeFileSync('descarga.pdf', Buffer.from(await respuesta.arrayBuffer()));
```

**Python**

```
import os
from pathlib import Path

import requests

respuesta = requests.get(
    "https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/file?format=flat",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
)
Path("descarga.pdf").write_bytes(respuesta.content)
```

**Respuesta · 200**

```
<archivo application/pdf>
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:16 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/plantillas.ejemplos.spec.ts`

## Replace a PDF template's file

POST `/templates/{template_id}/file`

Sustituye el PDF de la plantilla —una cláusula nueva, otro logo— **sin rehacer los campos que ya colocaste**: sus áreas se guardan en porcentaje de página, así que un archivo con otro tamaño de hoja no las mueve. Lo único que sí puede romperse es el **número de páginas**: un campo que vivía en una página que el archivo nuevo ya no tiene se poda —se borra esa área, nunca la plantilla ni el resto de sus áreas— y la respuesta lo dice en `prunedFields`, con el nombre del campo, las páginas que perdió y `removed` en `true` si se quedó sin ninguna. Revísalo siempre después de reemplazar. Solo plantillas PDF (`fileType: "pdf"`) y el reemplazo también debe ser PDF: este endpoint no convierte DOCX↔PDF. El archivo viaja en base64, máximo 10 MB decodificados, igual que al crear la plantilla.

#### Parámetros

-   `template_id` string ruta requerido
    
    ID de la plantilla PDF cuyo archivo se reemplaza (`tmpl_…`).
    
-   `Idempotency-Key` string header
    
    Clave única (UUID v4) que vuelve idempotente el POST: un reintento con la misma clave repite la respuesta original en lugar de volver a crear, cobrar o notificar.
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Cuerpo de la petición

application/json

-   `file` objeto requerido
    
    El PDF nuevo en base64. Máximo 10 MB decodificados.
    
    Ver 3 atributos hijos
    
    -   `file.content` string requerido
        
        Contenido del archivo codificado en Base64. Máximo 10 MB decodificados.
        
    -   `file.fileType` enum
        
        Tipo de archivo fuente: `docx` o `pdf`.
        
        Valores: `docx` `pdf`
        
        default "docx"
        
    -   `file.name` string puede ser null
        
        Nombre del archivo (ej. `contrato.pdf`). Se valida contra path traversal.
        
    

#### Devuelve

**200** La plantilla con el archivo ya reemplazado, las páginas del archivo nuevo y `prunedFields`.

Ver los 5 atributos de la respuesta

-   `livemode` boolean requerido
    
    `true` en entorno `live`, `false` en `test`/`dev` (marca de agua, sin validez legal).
    
-   `object` string, siempre "template\_file\_replace"
    
    Siempre `"template_file_replace"`.
    
-   `template` objeto requerido
    
    La plantilla con el archivo ya reemplazado.
    
    Ver 23 atributos hijos
    
    -   `template.livemode` boolean requerido
        
        `true` en entorno `live`, `false` en `test`/`dev` (marca de agua, sin validez legal).
        
    -   `template.id` string requerido
        
        ID de la plantilla (`tmpl_…`).
        
    -   `template.object` string, siempre "template"
        
        Siempre `"template"`.
        
    -   `template.name` string requerido
        
        Nombre de la plantilla.
        
    -   `template.description` string puede ser null
        
        Descripción de la plantilla.
        
    -   `template.fileType` string requerido
        
        Tipo de archivo fuente (ej. `docx`, `pdf`).
        
    -   `template.originalFilename` string puede ser null
        
        Nombre del archivo original subido.
        
    -   `template.aiEditable` boolean
        
        Si la edición asistida por IA está habilitada.
        
        default true
        
    -   `template.variableCount` integer requerido
        
        Número de variables detectadas en la plantilla.
        
    -   `template.fieldCount` integer
        
        Número de campos del formulario PDF (nombres distintos).
        
        default 0
        
    -   `template.unassignedFieldCount` integer
        
        Campos del formulario sin rol; `readiness` es `pending` mientras haya alguno.
        
        default 0
        
    -   `template.roleCount` integer
        
        Número de roles de la plantilla.
        
        default 0
        
    -   `template.pendingCandidates` integer
        
        Candidatos del análisis vigente que aún no se confirmaron como variable (`0` si no hay análisis).
        
        default 0
        
    -   `template.readiness` enum requerido
        
        `ready` (≥1 variable y 0 pendientes, o ≥1 campo y todos con rol), `pending` (≥1 candidato sin confirmar o ≥1 campo sin rol) o `empty` (0 variables y 0 campos).
        
        Valores: `ready` `pending` `empty`
        
    -   `template.tags` array de string
        
        Etiquetas de la plantilla (arreglo vacío por default).
        
        default \[\]
        
    -   `template.category` string puede ser null
        
        Categoría de la plantilla.
        
    -   `template.usageCount` integer requerido
        
        Cuántas veces se ha usado la plantilla.
        
    -   `template.lastUsedAt` string (fecha-hora ISO 8601) puede ser null
        
        Último uso (ISO 8601).
        
    -   `template.currentVersion` integer requerido
        
        Versión actual de la plantilla.
        
    -   `template.previewUrl` string puede ser null
        
        Ruta v3 relativa (`/templates/{id}/preview`) del PNG de la primera página. `null` si la plantilla no tiene una fuente renderizable (p.ej. DOCX).
        
    -   `template.downloadUrl` string requerido
        
        Ruta v3 relativa (`/templates/{id}/download`) del archivo original.
        
    -   `template.createdAt` string (fecha-hora ISO 8601) requerido
        
        Fecha de creación (ISO 8601).
        
    -   `template.updatedAt` string (fecha-hora ISO 8601) requerido
        
        Última actualización (ISO 8601).
        
    
-   `pageCount` integer requerido
    
    Páginas del archivo nuevo.
    
-   `prunedFields` array de objetos
    
    Campos que perdieron área(s) al reemplazar el archivo.
    
    Ver 3 atributos hijos
    
    -   `prunedFields[].name` string requerido
        
        Nombre del campo.
        
    -   `prunedFields[].pages` array de integer requerido
        
        Páginas que ocupaba y que el archivo nuevo ya no tiene.
        
    -   `prunedFields[].removed` boolean requerido
        
        `true` si el campo se eliminó por completo (ninguna de sus áreas cupo en el archivo nuevo); `false` si sólo perdió algunas de varias áreas.
        
    

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [413](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl -X POST 'https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/file' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "file": {
    "content": "'"$(base64 < formulario-v2.pdf | tr -d '\n')"'",
    "fileType": "pdf",
    "name": "formulario-v2.pdf"
  }
}'
```

**Node**

```
import { randomUUID } from 'node:crypto';
import { readFileSync } from 'node:fs';

const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/file', {
    method: 'POST',
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
        'Idempotency-Key': randomUUID(),
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        file: {
            content: readFileSync('formulario-v2.pdf').toString('base64'),
            fileType: 'pdf',
            name: 'formulario-v2.pdf',
        },
    }),
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import base64
import os
import uuid
from pathlib import Path

import requests

respuesta = requests.post(
    "https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/file",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
        "Idempotency-Key": str(uuid.uuid4()),
    },
    json={
        "file": {
            "content": base64.b64encode(Path("formulario-v2.pdf").read_bytes()).decode(),
            "fileType": "pdf",
            "name": "formulario-v2.pdf",
        },
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 200**

```
{
  "livemode": false,
  "object": "template_file_replace",
  "template": {
    "livemode": false,
    "id": "tmpl_c405a9544678416a9b2e29dfa4a7f331",
    "object": "template",
    "name": "v3audit-ejemplos Formulario PDF",
    "description": null,
    "fileType": "pdf",
    "originalFilename": "formulario-v2.pdf",
    "aiEditable": true,
    "variableCount": 0,
    "fieldCount": 4,
    "unassignedFieldCount": 3,
    "roleCount": 1,
    "pendingCandidates": 0,
    "readiness": "pending",
    "tags": [],
    "category": null,
    "usageCount": 0,
    "lastUsedAt": null,
    "currentVersion": 2,
    "previewUrl": "/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/preview",
    "downloadUrl": "/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/download",
    "createdAt": "2026-07-11T18:00:00.000000Z",
    "updatedAt": "2026-07-11T18:00:10.214000Z"
  },
  "pageCount": 1,
  "prunedFields": []
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:16 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/plantillas.ejemplos.spec.ts`

## Download original file

GET `/templates/{template_id}/download`

El archivo original tal como se subió (PDF o DOCX), sin marcar ni convertir. Se transmite directo, nunca por redirect. Para el PDF con widgets o aplanado usa `GET …/file?format=form|flat`.

#### Parámetros

-   `template_id` string ruta requerido
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Devuelve

**200** El archivo (`Content-Disposition: attachment`).

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl 'https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539/download' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11"
```

**Node**

```
import { writeFileSync } from 'node:fs';

const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539/download', {
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
    },
});
writeFileSync('descarga.docx', Buffer.from(await respuesta.arrayBuffer()));
```

**Python**

```
import os
from pathlib import Path

import requests

respuesta = requests.get(
    "https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539/download",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
)
Path("descarga.docx").write_bytes(respuesta.content)
```

**Respuesta · 200**

```
<archivo application/vnd.openxmlformats-officedocument.wordprocessingml.document>
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:16 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/plantillas.ejemplos.spec.ts`

## Get template preview

GET `/templates/{template_id}/preview`

PNG de la primera página, para mostrar la plantilla en tu propia lista. Solo plantillas PDF; un DOCX responde 404 `PREVIEW_UNAVAILABLE`. `width` reduce la imagen (nunca la agranda).

#### Parámetros

-   `template_id` string ruta requerido
    
-   `width` integer query
    
    Ancho máximo en píxeles; la imagen se reduce, nunca se agranda.
    
    default 400 · entre 200 y 1200
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Devuelve

**200** La imagen (`image/png`).

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl 'https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/preview?width=400' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11"
```

**Node**

```
import { writeFileSync } from 'node:fs';

const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/preview?width=400', {
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
    },
});
writeFileSync('vista.png', Buffer.from(await respuesta.arrayBuffer()));
```

**Python**

```
import os
from pathlib import Path

import requests

respuesta = requests.get(
    "https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/preview?width=400",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
)
Path("vista.png").write_bytes(respuesta.content)
```

**Respuesta · 200**

```
<archivo image/png>
```

**Respuesta · 404 · PREVIEW_UNAVAILABLE**

```
{
  "type": "https://allsign.io/developers/docs/errors#PREVIEW_UNAVAILABLE",
  "title": "Not Found",
  "status": 404,
  "detail": "This template has no renderable page image.",
  "instance": "/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539/preview",
  "code": "PREVIEW_UNAVAILABLE",
  "requestId": "req_b9de17df65f64abb9601e36d7b31625a"
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:16 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/plantillas.ejemplos.spec.ts`

## Get template page image

GET `/templates/{template_id}/pages/{page_number}`

Imagen limpia de una página del PDF (sin widgets ni anotaciones), para pintar tu propio editor de campos encima; las coordenadas de `areas` son porcentajes de esta página.

#### Parámetros

-   `template_id` string ruta requerido
    
-   `page_number` integer ruta requerido
    
    mín. 1
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Devuelve

**200** La imagen (`image/png`).

Ver los 7 atributos de la respuesta

-   `livemode` boolean requerido
    
    `true` en entorno `live`, `false` en `test`/`dev` (marca de agua, sin validez legal).
    
-   `object` string, siempre "template\_page"
    
    Siempre `"template_page"`.
    
-   `templateId` string requerido
    
    La plantilla (`tmpl_…`).
    
-   `pageNumber` integer requerido
    
    Página 1-based.
    
    mín. 1
    
-   `imageUrl` string requerido
    
    URL firmada de la imagen PNG de la página, con los widgets vacíos.
    
-   `width` integer requerido
    
    Ancho de la imagen en píxeles.
    
    mín. 0
    
-   `height` integer requerido
    
    Alto de la imagen en píxeles.
    
    mín. 0
    

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl 'https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/pages/1' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11"
```

**Node**

```
const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/pages/1', {
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
    },
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os

import requests

respuesta = requests.get(
    "https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/pages/1",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 200**

```
{
  "livemode": false,
  "object": "template_page",
  "templateId": "tmpl_c405a9544678416a9b2e29dfa4a7f331",
  "pageNumber": 1,
  "imageUrl": "<url-firmada>",
  "width": 816,
  "height": 1056
}
```

**Respuesta · 422 · VALIDATION_ERROR**

```
{
  "type": "https://allsign.io/developers/docs/errors#VALIDATION_ERROR",
  "title": "Validation failed",
  "status": 422,
  "detail": "Page images are only available for PDF templates.",
  "instance": "/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539/pages/1",
  "code": "VALIDATION_ERROR",
  "requestId": "req_91a0c07a012a4302a795c2ea00e54da7",
  "errors": [
    {
      "field": "pageNumber",
      "code": "UNSUPPORTED_FILE_TYPE",
      "detail": "DOCX templates do not expose page images."
    }
  ]
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:16 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/plantillas.ejemplos.spec.ts`

## Get template layout

GET `/templates/{template_id}/layout`

Vista de solo lectura del layout completo: páginas con su tamaño y cada campo o variable con su posición. Útil para dibujar el editor; para cambiar campos usa `…/fields`.

#### Parámetros

-   `template_id` string ruta requerido
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Devuelve

**200** El layout por página.

Ver los 5 atributos de la respuesta

-   `livemode` boolean requerido
    
    `true` en entorno `live`, `false` en `test`/`dev` (marca de agua, sin validez legal).
    
-   `object` string, siempre "template\_layout"
    
    Siempre `"template_layout"`.
    
-   `templateId` string requerido
    
    La plantilla (`tmpl_…`).
    
-   `pageCount` integer requerido
    
    Número de páginas.
    
    mín. 0
    
-   `items` array de objetos
    
    Datos, decisiones y firmas posicionados.
    
    Ver 3 atributos hijos
    
    -   `items[].name` string requerido
        
        Nombre del dato, decisión o campo de firma.
        
    -   `items[].kind` enum requerido
        
        Tipo de ítem: `data`, `decision` o `signature`.
        
        Valores: `data` `decision` `signature`
        
    -   `items[].slots` array de objetos requerido
        
        Huecos en el papel, en % de la página.
        
        Ver 2 atributos hijos
        
        -   `items[].slots[].page` integer requerido
            
            Página 1-based.
            
            mín. 1
            
        -   `items[].slots[].rect` objeto requerido
            
            Rectángulo del hueco, en % del papel.
            
            Ver 4 atributos hijos
            
            -   `items[].slots[].rect.x` number requerido
                
                X izquierdo, porcentaje del ancho de la página.
                
                entre 0 y 100
                
            -   `items[].slots[].rect.y` number requerido
                
                Y superior, porcentaje del alto de la página.
                
                entre 0 y 100
                
            -   `items[].slots[].rect.width` number requerido
                
                Ancho en porcentaje de la página.
                
                entre 0 y 100
                
            -   `items[].slots[].rect.height` number requerido
                
                Alto en porcentaje de la página.
                
                entre 0 y 100
                
            
        
    

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl 'https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539/layout' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11"
```

**Node**

```
const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539/layout', {
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
    },
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os

import requests

respuesta = requests.get(
    "https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539/layout",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 200**

```
{
  "livemode": false,
  "object": "template_layout",
  "templateId": "tmpl_2a1bc982e2f04c979ff8d8c2a6468539",
  "pageCount": 0,
  "items": []
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:16 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/plantillas.ejemplos.spec.ts`

## Download marked Word file

GET `/templates/{template_id}/marked.docx`

Solo plantillas DOCX: el Word original con `{{nombre}}` en cada dato ya confirmado, conservando los estilos. Sirve para revisar en Word qué detectó el análisis. Un PDF responde 422.

#### Parámetros

-   `template_id` string ruta requerido
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Devuelve

**200** El DOCX marcado (`Content-Disposition: attachment`).

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl 'https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539/marked.docx' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11"
```

**Node**

```
import { writeFileSync } from 'node:fs';

const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539/marked.docx', {
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
    },
});
writeFileSync('descarga.docx', Buffer.from(await respuesta.arrayBuffer()));
```

**Python**

```
import os
from pathlib import Path

import requests

respuesta = requests.get(
    "https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539/marked.docx",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
)
Path("descarga.docx").write_bytes(respuesta.content)
```

**Respuesta · 200**

```
<archivo application/vnd.openxmlformats-officedocument.wordprocessingml.document>
```

**Respuesta · 422 · VALIDATION_ERROR**

```
{
  "type": "https://allsign.io/developers/docs/errors#VALIDATION_ERROR",
  "title": "Validation failed",
  "status": 422,
  "detail": "Marked Word download is only available for DOCX templates.",
  "instance": "/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/marked.docx",
  "code": "VALIDATION_ERROR",
  "requestId": "req_314cdc1074994765a3deacf1907b0c60",
  "errors": [
    {
      "field": "fileType",
      "code": "UNSUPPORTED_FILE_TYPE",
      "detail": "PDF templates do not expose a marked Word file."
    }
  ]
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:16 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/plantillas.ejemplos.spec.ts`

## List template variables

GET `/templates/{template_id}/variables`

Lista las variables de una plantilla — justo lo que necesitas para armar el mapa `templateValues` de Create document. Es una colección acotada (no paginada por cursor): el número de variables lo limita el propio archivo.

#### Parámetros

-   `template_id` string ruta requerido
    
    ID de la plantilla (`tmpl_…`).
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Devuelve

**200** Colección acotada (`object: "list"`, `hasMore` siempre `false`) con las variables de la plantilla.

Ver los 4 atributos de la respuesta

-   `object` string, siempre "list"
    
    Siempre `"list"`.
    
-   `templateId` string requerido
    
    La plantilla a la que pertenecen las variables (`tmpl_…`).
    
-   `data` array de objetos requerido
    
    Arreglo de variables de la plantilla.
    
    Ver 14 atributos hijos
    
    -   `data[].name` string requerido
        
        Nombre de la variable — es la llave que usas en `templateValues`. Se mantiene en `snake_case` natural, nunca se cameliza.
        
    -   `data[].label` string requerido
        
        Etiqueta legible para mostrar.
        
    -   `data[].type` string
        
        Tipo de dato (token opaco `snake_case`): `text`, `date`, `currency`, `textarea`, `select`, `number`.
        
        default "text"
        
    -   `data[].required` boolean
        
        Si la variable es obligatoria.
        
        default true
        
    -   `data[].defaultValue` string puede ser null
        
        Valor por default sugerido.
        
    -   `data[].options` array de string puede ser null
        
        Opciones válidas cuando `type` es `select`.
        
    -   `data[].role` string puede ser null
        
        Rol del firmante inferido del prefijo con doble guion bajo, o `null` si la variable no está ligada a un rol.
        
    -   `data[].source` string puede ser null
        
        Origen del dato (token opaco): `form_field`, `jinja`, `signal` o `manual`.
        
    -   `data[].page` integer puede ser null
        
        Página 1-based del hueco principal.
        
        mín. 1
        
    -   `data[].rect` objeto puede ser null
        
        Rectángulo del hueco principal, en % del papel.
        
        Ver 4 atributos hijos
        
        -   `data[].rect.x` number requerido
            
            X izquierdo, porcentaje del ancho de la página.
            
            entre 0 y 100
            
        -   `data[].rect.y` number requerido
            
            Y superior, porcentaje del alto de la página.
            
            entre 0 y 100
            
        -   `data[].rect.width` number requerido
            
            Ancho en porcentaje de la página.
            
            entre 0 y 100
            
        -   `data[].rect.height` number requerido
            
            Alto en porcentaje de la página.
            
            entre 0 y 100
            
        
    -   `data[].slots` array de objetos puede ser null
        
        Huecos adicionales cuando el mismo dato aparece más de una vez.
        
        Ver 2 atributos hijos
        
        -   `data[].slots[].page` integer requerido
            
            Página 1-based.
            
            mín. 1
            
        -   `data[].slots[].rect` objeto requerido
            
            Rectángulo del hueco, en % del papel.
            
            Ver 4 atributos hijos
            
            -   `data[].slots[].rect.x` number requerido
                
                X izquierdo, porcentaje del ancho de la página.
                
                entre 0 y 100
                
            -   `data[].slots[].rect.y` number requerido
                
                Y superior, porcentaje del alto de la página.
                
                entre 0 y 100
                
            -   `data[].slots[].rect.width` number requerido
                
                Ancho en porcentaje de la página.
                
                entre 0 y 100
                
            -   `data[].slots[].rect.height` number requerido
                
                Alto en porcentaje de la página.
                
                entre 0 y 100
                
            
        
    -   `data[].filledBy` string puede ser null
        
        Quién llena el dato: `owner` (el remitente) o `null`. Por compatibilidad puede traer `signer` o el nombre de un rol; esos valores ya no se aceptan en el body de crear, editar ni confirmar.
        
    -   `data[].snippet` string puede ser null
        
        Texto exacto del hueco detectado en el análisis (`______`, `[CIUDAD]`), o `null`.
        
    -   `data[].analysisIndex` integer puede ser null
        
        Índice del candidato del análisis del que se confirmó esta variable, o `null` si se creó a mano.
        
        mín. 1
        
    
-   `hasMore` boolean
    
    Siempre `false` en esta colección acotada.
    
    default false
    

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl 'https://api.allsign.io/v3/templates/tmpl_67fb98658fe548d3a71eae28087d7060/variables' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11"
```

**Node**

```
const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_67fb98658fe548d3a71eae28087d7060/variables', {
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
    },
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os

import requests

respuesta = requests.get(
    "https://api.allsign.io/v3/templates/tmpl_67fb98658fe548d3a71eae28087d7060/variables",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 200**

```
{
  "object": "list",
  "templateId": "tmpl_67fb98658fe548d3a71eae28087d7060",
  "data": [
    {
      "name": "ciudad_celebracion",
      "label": "Ciudad Celebracion",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "fecha_celebracion",
      "label": "Fecha Celebracion",
      "type": "date",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "folio_acuerdo",
      "label": "Folio Acuerdo",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "jurisdiccion",
      "label": "Jurisdiccion",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "monto_pena",
      "label": "Monto Pena",
      "type": "currency",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "monto_pena_letra",
      "label": "Monto Pena Letra",
      "type": "currency",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "objeto_relacion",
      "label": "Objeto Relacion",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "parte_a__domicilio",
      "label": "Domicilio",
      "type": "textarea",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": "Parte A",
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "parte_a__email",
      "label": "Email",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": "Parte A",
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "parte_a__nombre",
      "label": "Nombre",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": "Parte A",
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "parte_a__representante",
      "label": "Representante",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": "Parte A",
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "parte_a__rfc",
      "label": "Rfc",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": "Parte A",
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "parte_a__telefono",
      "label": "Telefono",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": "Parte A",
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "parte_b__domicilio",
      "label": "Domicilio",
      "type": "textarea",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": "Parte B",
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "parte_b__email",
      "label": "Email",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": "Parte B",
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "parte_b__nombre",
      "label": "Nombre",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": "Parte B",
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "parte_b__representante",
      "label": "Representante",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": "Parte B",
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "parte_b__rfc",
      "label": "Rfc",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": "Parte B",
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "parte_b__telefono",
      "label": "Telefono",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": "Parte B",
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "tipo_informacion_confidencial",
      "label": "Tipo Informacion Confidencial",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "vigencia",
      "label": "Vigencia",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "vigencia_post_terminacion",
      "label": "Vigencia Post Terminacion",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    }
  ],
  "hasMore": false
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:17 (hora CDMX) · test `docs-checks-v3/tests/recetas/documento-desde-plantilla-docx.receta.spec.ts`

## Create template variable

POST `/templates/{template_id}/variables`

Agrega una variable `{{ }}` a mano a una plantilla DOCX: nombre, etiqueta, tipo y, opcionalmente, su posición (`page`, `rect`, `slots`). `mergeInto` la une a una variable existente como hueco adicional. Todas las variables las llena el remitente: `filledBy` solo acepta `owner`, y `signer` responde `422`. Lo que captura el firmante va en un campo del formulario PDF (guía [Formularios PDF](https://allsign.io/developers/docs/guides/pdf-forms)).

#### Parámetros

-   `template_id` string ruta requerido
    
-   `Idempotency-Key` string header
    
    Clave única (UUID v4) que vuelve idempotente el POST: un reintento con la misma clave repite la respuesta original en lugar de volver a crear, cobrar o notificar.
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Cuerpo de la petición

application/json

-   `name` string requerido
    
    Nombre de la variable — llave de `templateValues`, en `snake_case` natural.
    
    de 1 a 255 caracteres
    
-   `label` string puede ser null
    
    Etiqueta legible. Si se omite, se deriva del nombre.
    
-   `type` string
    
    Tipo de dato (token opaco): `text`, `date`, `currency`, `textarea`, `select`, `number`.
    
    default "text"
    
-   `required` boolean
    
    Si la variable es obligatoria.
    
    default true
    
-   `defaultValue` string puede ser null
    
    Valor por default sugerido.
    
-   `options` array de string puede ser null
    
    Opciones válidas cuando `type` es `select`.
    
-   `role` string puede ser null
    
    Rol del firmante al que se asigna, o `null`.
    
-   `page` integer puede ser null
    
    Página 1-based del hueco.
    
    mín. 1
    
-   `rect` objeto puede ser null
    
    Rectángulo del hueco, en % del papel.
    
    Ver 4 atributos hijos
    
    -   `rect.x` number requerido
        
        X izquierdo, porcentaje del ancho de la página.
        
        entre 0 y 100
        
    -   `rect.y` number requerido
        
        Y superior, porcentaje del alto de la página.
        
        entre 0 y 100
        
    -   `rect.width` number requerido
        
        Ancho en porcentaje de la página.
        
        entre 0 y 100
        
    -   `rect.height` number requerido
        
        Alto en porcentaje de la página.
        
        entre 0 y 100
        
    
-   `slots` array de objetos puede ser null
    
    Huecos adicionales del mismo dato.
    
    Ver 2 atributos hijos
    
    -   `slots[].page` integer requerido
        
        Página 1-based.
        
        mín. 1
        
    -   `slots[].rect` objeto requerido
        
        Rectángulo del hueco, en % del papel.
        
        Ver 4 atributos hijos
        
        -   `slots[].rect.x` number requerido
            
            X izquierdo, porcentaje del ancho de la página.
            
            entre 0 y 100
            
        -   `slots[].rect.y` number requerido
            
            Y superior, porcentaje del alto de la página.
            
            entre 0 y 100
            
        -   `slots[].rect.width` number requerido
            
            Ancho en porcentaje de la página.
            
            entre 0 y 100
            
        -   `slots[].rect.height` number requerido
            
            Alto en porcentaje de la página.
            
            entre 0 y 100
            
        
    
-   `mergeInto` string puede ser null
    
    Nombre de una variable existente. Si se envía, este dato se une a ella como `slots`.
    
-   `filledBy` enum puede ser null
    
    Quién llena el dato: `owner` (el remitente) u omítelo. `signer` responde 422 `SIGNER_VARIABLE_NOT_SUPPORTED`: lo que llena el firmante va en un campo del formulario PDF asignado a su rol (`role` en los campos de la plantilla; `role` o `signer` en los del documento).
    
    Valores: `owner` `signer`
    

#### Devuelve

**201** La variable creada.

Ver los 4 atributos de la respuesta

-   `object` string, siempre "list"
    
    Siempre `"list"`.
    
-   `templateId` string requerido
    
    La plantilla a la que pertenecen las variables (`tmpl_…`).
    
-   `data` array de objetos requerido
    
    Arreglo de variables de la plantilla.
    
    Ver 14 atributos hijos
    
    -   `data[].name` string requerido
        
        Nombre de la variable — es la llave que usas en `templateValues`. Se mantiene en `snake_case` natural, nunca se cameliza.
        
    -   `data[].label` string requerido
        
        Etiqueta legible para mostrar.
        
    -   `data[].type` string
        
        Tipo de dato (token opaco `snake_case`): `text`, `date`, `currency`, `textarea`, `select`, `number`.
        
        default "text"
        
    -   `data[].required` boolean
        
        Si la variable es obligatoria.
        
        default true
        
    -   `data[].defaultValue` string puede ser null
        
        Valor por default sugerido.
        
    -   `data[].options` array de string puede ser null
        
        Opciones válidas cuando `type` es `select`.
        
    -   `data[].role` string puede ser null
        
        Rol del firmante inferido del prefijo con doble guion bajo, o `null` si la variable no está ligada a un rol.
        
    -   `data[].source` string puede ser null
        
        Origen del dato (token opaco): `form_field`, `jinja`, `signal` o `manual`.
        
    -   `data[].page` integer puede ser null
        
        Página 1-based del hueco principal.
        
        mín. 1
        
    -   `data[].rect` objeto puede ser null
        
        Rectángulo del hueco principal, en % del papel.
        
        Ver 4 atributos hijos
        
        -   `data[].rect.x` number requerido
            
            X izquierdo, porcentaje del ancho de la página.
            
            entre 0 y 100
            
        -   `data[].rect.y` number requerido
            
            Y superior, porcentaje del alto de la página.
            
            entre 0 y 100
            
        -   `data[].rect.width` number requerido
            
            Ancho en porcentaje de la página.
            
            entre 0 y 100
            
        -   `data[].rect.height` number requerido
            
            Alto en porcentaje de la página.
            
            entre 0 y 100
            
        
    -   `data[].slots` array de objetos puede ser null
        
        Huecos adicionales cuando el mismo dato aparece más de una vez.
        
        Ver 2 atributos hijos
        
        -   `data[].slots[].page` integer requerido
            
            Página 1-based.
            
            mín. 1
            
        -   `data[].slots[].rect` objeto requerido
            
            Rectángulo del hueco, en % del papel.
            
            Ver 4 atributos hijos
            
            -   `data[].slots[].rect.x` number requerido
                
                X izquierdo, porcentaje del ancho de la página.
                
                entre 0 y 100
                
            -   `data[].slots[].rect.y` number requerido
                
                Y superior, porcentaje del alto de la página.
                
                entre 0 y 100
                
            -   `data[].slots[].rect.width` number requerido
                
                Ancho en porcentaje de la página.
                
                entre 0 y 100
                
            -   `data[].slots[].rect.height` number requerido
                
                Alto en porcentaje de la página.
                
                entre 0 y 100
                
            
        
    -   `data[].filledBy` string puede ser null
        
        Quién llena el dato: `owner` (el remitente) o `null`. Por compatibilidad puede traer `signer` o el nombre de un rol; esos valores ya no se aceptan en el body de crear, editar ni confirmar.
        
    -   `data[].snippet` string puede ser null
        
        Texto exacto del hueco detectado en el análisis (`______`, `[CIUDAD]`), o `null`.
        
    -   `data[].analysisIndex` integer puede ser null
        
        Índice del candidato del análisis del que se confirmó esta variable, o `null` si se creó a mano.
        
        mín. 1
        
    
-   `hasMore` boolean
    
    Siempre `false` en esta colección acotada.
    
    default false
    

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl -X POST 'https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539/variables' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "plazo_meses",
  "label": "Plazo en meses",
  "type": "number",
  "required": false
}'
```

**Node**

```
import { randomUUID } from 'node:crypto';

const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539/variables', {
    method: 'POST',
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
        'Idempotency-Key': randomUUID(),
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        name: 'plazo_meses',
        label: 'Plazo en meses',
        type: 'number',
        required: false,
    }),
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os
import uuid

import requests

respuesta = requests.post(
    "https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539/variables",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
        "Idempotency-Key": str(uuid.uuid4()),
    },
    json={
        "name": "plazo_meses",
        "label": "Plazo en meses",
        "type": "number",
        "required": False,
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 201**

```
{
  "object": "list",
  "templateId": "tmpl_2a1bc982e2f04c979ff8d8c2a6468539",
  "data": [
    {
      "name": "comprador_nombre",
      "label": "Comprador Nombre",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "comprador_rfc",
      "label": "Comprador Rfc",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "fecha",
      "label": "Fecha",
      "type": "date",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "monto",
      "label": "Monto",
      "type": "currency",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "vendedor_nombre",
      "label": "Vendedor Nombre",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "plazo_meses",
      "label": "Plazo en meses",
      "type": "number",
      "required": false,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": "manual",
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    }
  ],
  "hasMore": false
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:16 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/plantillas.ejemplos.spec.ts`

## Update template variable

PATCH `/templates/{template_id}/variables`

Cambia una variable por su `name`: renombrarla (`newName`), su etiqueta, tipo o su posición. Los documentos ya creados no cambian. `filledBy` solo acepta `owner`: todas las variables las llena el remitente, y `signer` responde `422`.

#### Parámetros

-   `template_id` string ruta requerido
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Cuerpo de la petición

application/json

-   `name` string requerido
    
    Nombre actual de la variable a modificar.
    
-   `newName` string puede ser null
    
    Nuevo nombre. Conserva el slot original.
    
-   `label` string puede ser null
    
    Nueva etiqueta legible.
    
-   `type` string puede ser null
    
    Nuevo tipo de dato (token opaco).
    
-   `required` boolean puede ser null
    
    Si la variable es obligatoria.
    
-   `defaultValue` string puede ser null
    
    Nuevo valor por default.
    
-   `options` array de string puede ser null
    
    Nuevas opciones cuando `type` es `select`.
    
-   `role` string puede ser null
    
    Nuevo rol, o `null` para desligarlo.
    
-   `page` integer puede ser null
    
    Nueva página 1-based del hueco.
    
    mín. 1
    
-   `rect` objeto puede ser null
    
    Nuevo rectángulo, en % del papel.
    
    Ver 4 atributos hijos
    
    -   `rect.x` number requerido
        
        X izquierdo, porcentaje del ancho de la página.
        
        entre 0 y 100
        
    -   `rect.y` number requerido
        
        Y superior, porcentaje del alto de la página.
        
        entre 0 y 100
        
    -   `rect.width` number requerido
        
        Ancho en porcentaje de la página.
        
        entre 0 y 100
        
    -   `rect.height` number requerido
        
        Alto en porcentaje de la página.
        
        entre 0 y 100
        
    
-   `slots` array de objetos puede ser null
    
    Reemplaza los huecos adicionales.
    
    Ver 2 atributos hijos
    
    -   `slots[].page` integer requerido
        
        Página 1-based.
        
        mín. 1
        
    -   `slots[].rect` objeto requerido
        
        Rectángulo del hueco, en % del papel.
        
        Ver 4 atributos hijos
        
        -   `slots[].rect.x` number requerido
            
            X izquierdo, porcentaje del ancho de la página.
            
            entre 0 y 100
            
        -   `slots[].rect.y` number requerido
            
            Y superior, porcentaje del alto de la página.
            
            entre 0 y 100
            
        -   `slots[].rect.width` number requerido
            
            Ancho en porcentaje de la página.
            
            entre 0 y 100
            
        -   `slots[].rect.height` number requerido
            
            Alto en porcentaje de la página.
            
            entre 0 y 100
            
        
    
-   `mergeInto` string puede ser null
    
    Nombre de otra variable. Si se envía, esta se une a ella como `slots`.
    
-   `filledBy` enum puede ser null
    
    Quién llena el dato: `owner` (el remitente) u omítelo. `signer` responde 422 `SIGNER_VARIABLE_NOT_SUPPORTED`: lo que llena el firmante va en un campo del formulario PDF asignado a su rol (`role` en los campos de la plantilla; `role` o `signer` en los del documento).
    
    Valores: `owner` `signer`
    

#### Devuelve

**200** La variable ya actualizada.

Ver los 4 atributos de la respuesta

-   `object` string, siempre "list"
    
    Siempre `"list"`.
    
-   `templateId` string requerido
    
    La plantilla a la que pertenecen las variables (`tmpl_…`).
    
-   `data` array de objetos requerido
    
    Arreglo de variables de la plantilla.
    
    Ver 14 atributos hijos
    
    -   `data[].name` string requerido
        
        Nombre de la variable — es la llave que usas en `templateValues`. Se mantiene en `snake_case` natural, nunca se cameliza.
        
    -   `data[].label` string requerido
        
        Etiqueta legible para mostrar.
        
    -   `data[].type` string
        
        Tipo de dato (token opaco `snake_case`): `text`, `date`, `currency`, `textarea`, `select`, `number`.
        
        default "text"
        
    -   `data[].required` boolean
        
        Si la variable es obligatoria.
        
        default true
        
    -   `data[].defaultValue` string puede ser null
        
        Valor por default sugerido.
        
    -   `data[].options` array de string puede ser null
        
        Opciones válidas cuando `type` es `select`.
        
    -   `data[].role` string puede ser null
        
        Rol del firmante inferido del prefijo con doble guion bajo, o `null` si la variable no está ligada a un rol.
        
    -   `data[].source` string puede ser null
        
        Origen del dato (token opaco): `form_field`, `jinja`, `signal` o `manual`.
        
    -   `data[].page` integer puede ser null
        
        Página 1-based del hueco principal.
        
        mín. 1
        
    -   `data[].rect` objeto puede ser null
        
        Rectángulo del hueco principal, en % del papel.
        
        Ver 4 atributos hijos
        
        -   `data[].rect.x` number requerido
            
            X izquierdo, porcentaje del ancho de la página.
            
            entre 0 y 100
            
        -   `data[].rect.y` number requerido
            
            Y superior, porcentaje del alto de la página.
            
            entre 0 y 100
            
        -   `data[].rect.width` number requerido
            
            Ancho en porcentaje de la página.
            
            entre 0 y 100
            
        -   `data[].rect.height` number requerido
            
            Alto en porcentaje de la página.
            
            entre 0 y 100
            
        
    -   `data[].slots` array de objetos puede ser null
        
        Huecos adicionales cuando el mismo dato aparece más de una vez.
        
        Ver 2 atributos hijos
        
        -   `data[].slots[].page` integer requerido
            
            Página 1-based.
            
            mín. 1
            
        -   `data[].slots[].rect` objeto requerido
            
            Rectángulo del hueco, en % del papel.
            
            Ver 4 atributos hijos
            
            -   `data[].slots[].rect.x` number requerido
                
                X izquierdo, porcentaje del ancho de la página.
                
                entre 0 y 100
                
            -   `data[].slots[].rect.y` number requerido
                
                Y superior, porcentaje del alto de la página.
                
                entre 0 y 100
                
            -   `data[].slots[].rect.width` number requerido
                
                Ancho en porcentaje de la página.
                
                entre 0 y 100
                
            -   `data[].slots[].rect.height` number requerido
                
                Alto en porcentaje de la página.
                
                entre 0 y 100
                
            
        
    -   `data[].filledBy` string puede ser null
        
        Quién llena el dato: `owner` (el remitente) o `null`. Por compatibilidad puede traer `signer` o el nombre de un rol; esos valores ya no se aceptan en el body de crear, editar ni confirmar.
        
    -   `data[].snippet` string puede ser null
        
        Texto exacto del hueco detectado en el análisis (`______`, `[CIUDAD]`), o `null`.
        
    -   `data[].analysisIndex` integer puede ser null
        
        Índice del candidato del análisis del que se confirmó esta variable, o `null` si se creó a mano.
        
        mín. 1
        
    
-   `hasMore` boolean
    
    Siempre `false` en esta colección acotada.
    
    default false
    

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl -X PATCH 'https://api.allsign.io/v3/templates/tmpl_67fb98658fe548d3a71eae28087d7060/variables' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "monto_pena_letra",
  "type": "text"
}'
```

**Node**

```
const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_67fb98658fe548d3a71eae28087d7060/variables', {
    method: 'PATCH',
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        name: 'monto_pena_letra',
        type: 'text',
    }),
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os

import requests

respuesta = requests.patch(
    "https://api.allsign.io/v3/templates/tmpl_67fb98658fe548d3a71eae28087d7060/variables",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
    json={
        "name": "monto_pena_letra",
        "type": "text",
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 200**

```
{
  "object": "list",
  "templateId": "tmpl_67fb98658fe548d3a71eae28087d7060",
  "data": [
    {
      "name": "ciudad_celebracion",
      "label": "Ciudad Celebracion",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "fecha_celebracion",
      "label": "Fecha Celebracion",
      "type": "date",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "folio_acuerdo",
      "label": "Folio Acuerdo",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "jurisdiccion",
      "label": "Jurisdiccion",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "monto_pena",
      "label": "Monto Pena",
      "type": "currency",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "monto_pena_letra",
      "label": "Monto Pena Letra",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "objeto_relacion",
      "label": "Objeto Relacion",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "parte_a__domicilio",
      "label": "Domicilio",
      "type": "textarea",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": "Parte A",
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "parte_a__email",
      "label": "Email",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": "Parte A",
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "parte_a__nombre",
      "label": "Nombre",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": "Parte A",
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "parte_a__representante",
      "label": "Representante",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": "Parte A",
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "parte_a__rfc",
      "label": "Rfc",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": "Parte A",
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "parte_a__telefono",
      "label": "Telefono",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": "Parte A",
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "parte_b__domicilio",
      "label": "Domicilio",
      "type": "textarea",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": "Parte B",
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "parte_b__email",
      "label": "Email",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": "Parte B",
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "parte_b__nombre",
      "label": "Nombre",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": "Parte B",
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "parte_b__representante",
      "label": "Representante",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": "Parte B",
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "parte_b__rfc",
      "label": "Rfc",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": "Parte B",
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "parte_b__telefono",
      "label": "Telefono",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": "Parte B",
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "tipo_informacion_confidencial",
      "label": "Tipo Informacion Confidencial",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "vigencia",
      "label": "Vigencia",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    },
    {
      "name": "vigencia_post_terminacion",
      "label": "Vigencia Post Terminacion",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": null,
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": null,
      "analysisIndex": null
    }
  ],
  "hasMore": false
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:17 (hora CDMX) · test `docs-checks-v3/tests/recetas/documento-desde-plantilla-docx.receta.spec.ts`

## Delete template variable

DELETE `/templates/{template_id}/variables`

Quita una variable de la plantilla (por `name`). Los documentos ya creados conservan sus valores.

#### Parámetros

-   `template_id` string ruta requerido
    
-   `name` string query requerido
    
    Nombre de la variable a quitar.
    
    mín. 1 caracteres
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Devuelve

**204** Variable eliminada.

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl -X DELETE 'https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539/variables?name=plazo_meses' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11"
```

**Node**

```
const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539/variables?name=plazo_meses', {
    method: 'DELETE',
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
    },
});
console.log(respuesta.status);
```

**Python**

```
import os

import requests

respuesta = requests.delete(
    "https://api.allsign.io/v3/templates/tmpl_2a1bc982e2f04c979ff8d8c2a6468539/variables?name=plazo_meses",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
)
print(respuesta.status_code)
```

**Respuesta · 204**

*Sin cuerpo.*

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:16 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/plantillas.ejemplos.spec.ts`

## Confirm variable candidates

POST `/templates/{template_id}/variables:confirm`

Convierte candidatos del análisis en variables de la plantilla, con nombre final y etiqueta. Todas las variables las llena el remitente: `filledBy` solo acepta `owner`, y `signer` responde `422`. Lo que captura el firmante va en un campo del formulario PDF (guía [Formularios PDF](https://allsign.io/developers/docs/guides/pdf-forms)). Cuando no quedan candidatos pendientes la plantilla pasa a `readiness: "ready"`.

#### Parámetros

-   `template_id` string ruta requerido
    
-   `Idempotency-Key` string header
    
    Clave única (UUID v4) que vuelve idempotente el POST: un reintento con la misma clave repite la respuesta original en lugar de volver a crear, cobrar o notificar.
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Cuerpo de la petición

application/json

-   `all` boolean puede ser null
    
    `true` para confirmar todos los candidatos no-firma del análisis vigente.
    
-   `items` array de objetos puede ser null
    
    Candidatos puntuales a confirmar, por índice.
    
    Ver 6 atributos hijos
    
    -   `items[].index` integer requerido
        
        Índice (1-based) del candidato del análisis a confirmar.
        
        mín. 1
        
    -   `items[].name` string puede ser null
        
        Nombre a usar en vez del propuesto por el análisis.
        
    -   `items[].label` string puede ser null
        
        Etiqueta legible a usar en vez de la propuesta.
        
    -   `items[].type` string puede ser null
        
        Tipo de dato (token opaco) a usar en vez del propuesto.
        
    -   `items[].kind` enum puede ser null
        
        `data` o `decision`. Un candidato `signature` nunca puede confirmarse aquí.
        
        Valores: `data` `decision`
        
    -   `items[].filledBy` string puede ser null
        
        Quién llena el dato: `owner` (el remitente) o `null`. `signer` o el nombre de un rol responden 422 `SIGNER_VARIABLE_NOT_SUPPORTED`: lo que llena el firmante va en un campo del formulario PDF asignado a su rol (`role` en los campos de la plantilla; `role` o `signer` en los del documento).
        
    

#### Devuelve

**200** Las variables de la plantilla después de confirmar.

Ver los 4 atributos de la respuesta

-   `object` string, siempre "list"
    
    Siempre `"list"`.
    
-   `templateId` string requerido
    
    La plantilla a la que pertenecen las variables (`tmpl_…`).
    
-   `data` array de objetos requerido
    
    Arreglo de variables de la plantilla.
    
    Ver 14 atributos hijos
    
    -   `data[].name` string requerido
        
        Nombre de la variable — es la llave que usas en `templateValues`. Se mantiene en `snake_case` natural, nunca se cameliza.
        
    -   `data[].label` string requerido
        
        Etiqueta legible para mostrar.
        
    -   `data[].type` string
        
        Tipo de dato (token opaco `snake_case`): `text`, `date`, `currency`, `textarea`, `select`, `number`.
        
        default "text"
        
    -   `data[].required` boolean
        
        Si la variable es obligatoria.
        
        default true
        
    -   `data[].defaultValue` string puede ser null
        
        Valor por default sugerido.
        
    -   `data[].options` array de string puede ser null
        
        Opciones válidas cuando `type` es `select`.
        
    -   `data[].role` string puede ser null
        
        Rol del firmante inferido del prefijo con doble guion bajo, o `null` si la variable no está ligada a un rol.
        
    -   `data[].source` string puede ser null
        
        Origen del dato (token opaco): `form_field`, `jinja`, `signal` o `manual`.
        
    -   `data[].page` integer puede ser null
        
        Página 1-based del hueco principal.
        
        mín. 1
        
    -   `data[].rect` objeto puede ser null
        
        Rectángulo del hueco principal, en % del papel.
        
        Ver 4 atributos hijos
        
        -   `data[].rect.x` number requerido
            
            X izquierdo, porcentaje del ancho de la página.
            
            entre 0 y 100
            
        -   `data[].rect.y` number requerido
            
            Y superior, porcentaje del alto de la página.
            
            entre 0 y 100
            
        -   `data[].rect.width` number requerido
            
            Ancho en porcentaje de la página.
            
            entre 0 y 100
            
        -   `data[].rect.height` number requerido
            
            Alto en porcentaje de la página.
            
            entre 0 y 100
            
        
    -   `data[].slots` array de objetos puede ser null
        
        Huecos adicionales cuando el mismo dato aparece más de una vez.
        
        Ver 2 atributos hijos
        
        -   `data[].slots[].page` integer requerido
            
            Página 1-based.
            
            mín. 1
            
        -   `data[].slots[].rect` objeto requerido
            
            Rectángulo del hueco, en % del papel.
            
            Ver 4 atributos hijos
            
            -   `data[].slots[].rect.x` number requerido
                
                X izquierdo, porcentaje del ancho de la página.
                
                entre 0 y 100
                
            -   `data[].slots[].rect.y` number requerido
                
                Y superior, porcentaje del alto de la página.
                
                entre 0 y 100
                
            -   `data[].slots[].rect.width` number requerido
                
                Ancho en porcentaje de la página.
                
                entre 0 y 100
                
            -   `data[].slots[].rect.height` number requerido
                
                Alto en porcentaje de la página.
                
                entre 0 y 100
                
            
        
    -   `data[].filledBy` string puede ser null
        
        Quién llena el dato: `owner` (el remitente) o `null`. Por compatibilidad puede traer `signer` o el nombre de un rol; esos valores ya no se aceptan en el body de crear, editar ni confirmar.
        
    -   `data[].snippet` string puede ser null
        
        Texto exacto del hueco detectado en el análisis (`______`, `[CIUDAD]`), o `null`.
        
    -   `data[].analysisIndex` integer puede ser null
        
        Índice del candidato del análisis del que se confirmó esta variable, o `null` si se creó a mano.
        
        mín. 1
        
    
-   `hasMore` boolean
    
    Siempre `false` en esta colección acotada.
    
    default false
    

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl -X POST 'https://api.allsign.io/v3/templates/tmpl_efb8ab79423a4955b7989e3807fa749e/variables:confirm' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "items": [
    {
      "index": 1,
      "name": "numero_contrato"
    },
    {
      "index": 2
    }
  ]
}'
```

**Node**

```
import { randomUUID } from 'node:crypto';

const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_efb8ab79423a4955b7989e3807fa749e/variables:confirm', {
    method: 'POST',
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
        'Idempotency-Key': randomUUID(),
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        items: [
            {
                index: 1,
                name: 'numero_contrato',
            },
            {
                index: 2,
            },
        ],
    }),
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os
import uuid

import requests

respuesta = requests.post(
    "https://api.allsign.io/v3/templates/tmpl_efb8ab79423a4955b7989e3807fa749e/variables:confirm",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
        "Idempotency-Key": str(uuid.uuid4()),
    },
    json={
        "items": [
            {
                "index": 1,
                "name": "numero_contrato",
            },
            {
                "index": 2,
            },
        ],
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 200**

```
{
  "object": "list",
  "templateId": "tmpl_efb8ab79423a4955b7989e3807fa749e",
  "data": [
    {
      "name": "numero_contrato",
      "label": "Contrato número",
      "type": "number",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": "signal",
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": "______________",
      "analysisIndex": 1
    },
    {
      "name": "ciudad",
      "label": "Ciudad",
      "type": "text",
      "required": true,
      "defaultValue": null,
      "options": null,
      "role": null,
      "source": "placeholder",
      "page": null,
      "rect": null,
      "slots": null,
      "filledBy": null,
      "snippet": "[CIUDAD]",
      "analysisIndex": 2
    }
  ],
  "hasMore": false
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:15 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/plantillas.ejemplos.spec.ts`

## Get template analysis

GET `/templates/{template_id}/analysis`

Solo plantillas DOCX: el análisis vigente de huecos (`______`, `[CIUDAD]`, `{{ }}`) con sus candidatos a variable. Los candidatos no son variables hasta que los confirmas con `POST …/variables:confirm`; `pendingCandidates` en la plantilla dice cuántos faltan.

#### Parámetros

-   `template_id` string ruta requerido
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Devuelve

**200** El análisis con sus candidatos.

Ver los 8 atributos de la respuesta

-   `livemode` boolean requerido
    
    `true` en entorno `live`, `false` en `test`/`dev` (marca de agua, sin validez legal).
    
-   `object` string, siempre "template\_analysis"
    
    Siempre `"template_analysis"`.
    
-   `templateId` string requerido
    
    La plantilla analizada (`tmpl_…`).
    
-   `status` enum requerido
    
    Estado de la lectura: `reading`, `done` o `failed`.
    
    Valores: `reading` `done` `failed`
    
-   `stages` array de objetos
    
    Etapas de la lectura, para polling.
    
    Ver 3 atributos hijos
    
    -   `stages[].name` string requerido
        
        Nombre de la etapa de lectura.
        
    -   `stages[].status` string requerido
        
        Estado de la etapa: `pending`, `running`, `done` o `failed`.
        
    -   `stages[].detail` string puede ser null
        
        Detalle legible de la etapa, o `null`.
        
    
-   `candidates` array de objetos
    
    Candidatos detectados.
    
    Ver 17 atributos hijos
    
    -   `candidates[].name` string puede ser null
        
        Nombre propuesto, o `null` si aún no se nombra.
        
    -   `candidates[].label` string puede ser null
        
        Etiqueta humana tal como aparece en el documento, o `null`.
        
    -   `candidates[].kind` string requerido
        
        Tipo de candidato (token opaco): `data`, `decision` o `signature`.
        
    -   `candidates[].type` string puede ser null
        
        Tipo de dato inferido: `text`, `date`, `amount`, `rfc`, `email`, `phone`, `number`, `boolean` o `choice`, o `null`.
        
    -   `candidates[].confidence` number puede ser null
        
        Confianza 0–1, o `null`.
        
        entre 0 y 1
        
    -   `candidates[].why` string puede ser null
        
        Por qué se propuso este candidato.
        
    -   `candidates[].slots` array de objetos
        
        Huecos donde aparece el candidato.
        
        Ver 2 atributos hijos
        
        -   `candidates[].slots[].page` integer requerido
            
            Página 1-based.
            
            mín. 1
            
        -   `candidates[].slots[].rect` objeto requerido
            
            Rectángulo del hueco, en % del papel.
            
            Ver 4 atributos hijos
            
            -   `candidates[].slots[].rect.x` number requerido
                
                X izquierdo, porcentaje del ancho de la página.
                
                entre 0 y 100
                
            -   `candidates[].slots[].rect.y` number requerido
                
                Y superior, porcentaje del alto de la página.
                
                entre 0 y 100
                
            -   `candidates[].slots[].rect.width` number requerido
                
                Ancho en porcentaje de la página.
                
                entre 0 y 100
                
            -   `candidates[].slots[].rect.height` number requerido
                
                Alto en porcentaje de la página.
                
                entre 0 y 100
                
            
        
    -   `candidates[].index` integer puede ser null
        
        Índice estable del candidato dentro del análisis, o `null`.
        
        mín. 1
        
    -   `candidates[].paragraph` integer puede ser null
        
        Párrafo (0-based) del DOCX fuente, o `null` si no aplica.
        
        mín. 0
        
    -   `candidates[].run` integer puede ser null
        
        Run (0-based) dentro del párrafo, o `null` si no aplica.
        
        mín. 0
        
    -   `candidates[].start` integer puede ser null
        
        Offset de inicio (0-based) dentro del párrafo del DOCX fuente, o `null`.
        
        mín. 0
        
    -   `candidates[].end` integer puede ser null
        
        Offset final (0-based) dentro del párrafo del DOCX fuente, o `null`.
        
        mín. 0
        
    -   `candidates[].neighborText` string puede ser null
        
        Texto vecino o de párrafo alrededor de la señal detectada, o `null`.
        
    -   `candidates[].snippet` string puede ser null
        
        Texto exacto del hueco detectado (p.ej. `______`, `[CIUDAD]`, `( X )`), o `null`.
        
    -   `candidates[].options` array de string puede ser null
        
        Opciones válidas cuando `kind` es `decision`, o `null`.
        
    -   `candidates[].filledBy` string puede ser null
        
        Quién lo llena según el análisis: `owner` o `null`. Si trae otro valor, no lo reenvíes en `filledBy` al confirmar: las variables son solo del remitente.
        
    -   `candidates[].labeledBy` string puede ser null
        
        `llm` cuando el etiquetador IA ajustó nombre/tipo/parte; `null` si sólo el lector determinista.
        
    
-   `parts` array de objetos
    
    Partes detectadas de las líneas de firma.
    
    Ver 4 atributos hijos
    
    -   `parts[].index` integer puede ser null
        
        Índice estable de la parte, o `null`.
        
        mín. 1
        
    -   `parts[].text` string requerido
        
        Texto de la parte detectada en una línea de firma.
        
    -   `parts[].paragraph` integer puede ser null
        
        Párrafo (0-based) del DOCX fuente, o `null` si no aplica.
        
        mín. 0
        
    -   `parts[].run` integer puede ser null
        
        Run (0-based) dentro del párrafo, o `null` si no aplica.
        
        mín. 0
        
    
-   `pageCount` integer
    
    Número de páginas del documento fuente.
    
    default 0 · mín. 0
    

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl 'https://api.allsign.io/v3/templates/tmpl_efb8ab79423a4955b7989e3807fa749e/analysis' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11"
```

**Node**

```
const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_efb8ab79423a4955b7989e3807fa749e/analysis', {
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
    },
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os

import requests

respuesta = requests.get(
    "https://api.allsign.io/v3/templates/tmpl_efb8ab79423a4955b7989e3807fa749e/analysis",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 200**

```
{
  "livemode": false,
  "object": "template_analysis",
  "templateId": "tmpl_efb8ab79423a4955b7989e3807fa749e",
  "status": "done",
  "stages": [
    {
      "name": "read_form",
      "status": "done",
      "detail": "leyendo 0 páginas"
    },
    {
      "name": "detect_candidates",
      "status": "done",
      "detail": "28 candidatos"
    },
    {
      "name": "detect_parts",
      "status": "done",
      "detail": "3 partes"
    }
  ],
  "candidates": [
    {
      "name": "contrato_numero",
      "label": "Contrato número",
      "kind": "data",
      "type": "number",
      "confidence": 0.7,
      "why": "raya en el contrato",
      "slots": [],
      "index": 1,
      "paragraph": 1,
      "run": 0,
      "start": 16,
      "end": 30,
      "neighborText": "Contrato número ______________, celebrado en [CIUDAD], el ____ de ____________ de 20____.",
      "snippet": "______________",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "ciudad",
      "label": "Ciudad",
      "kind": "data",
      "type": "text",
      "confidence": 1,
      "why": "entre corchetes",
      "slots": [],
      "index": 2,
      "paragraph": 1,
      "run": 0,
      "start": 45,
      "end": 53,
      "neighborText": "Contrato número ______________, celebrado en [CIUDAD], el ____ de ____________ de 20____.",
      "snippet": "[CIUDAD]",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "celebrado",
      "label": "Celebrado",
      "kind": "data",
      "type": "text",
      "confidence": 0.7,
      "why": "raya en el contrato",
      "slots": [],
      "index": 3,
      "paragraph": 1,
      "run": 0,
      "start": 58,
      "end": 62,
      "neighborText": "Contrato número ______________, celebrado en [CIUDAD], el ____ de ____________ de 20____.",
      "snippet": "____",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "celebrado_2",
      "label": "Celebrado",
      "kind": "data",
      "type": "text",
      "confidence": 0.7,
      "why": "raya en el contrato",
      "slots": [],
      "index": 4,
      "paragraph": 1,
      "run": 0,
      "start": 66,
      "end": 78,
      "neighborText": "Contrato número ______________, celebrado en [CIUDAD], el ____ de ____________ de 20____.",
      "snippet": "____________",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "dato_20",
      "label": "20",
      "kind": "data",
      "type": "text",
      "confidence": 0.7,
      "why": "raya en el contrato",
      "slots": [],
      "index": 5,
      "paragraph": 1,
      "run": 0,
      "start": 84,
      "end": 88,
      "neighborText": "Contrato número ______________, celebrado en [CIUDAD], el ____ de ____________ de 20____.",
      "snippet": "____",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "dato_1",
      "label": "Dato 1",
      "kind": "data",
      "type": "text",
      "confidence": 0.7,
      "why": "raya en el contrato",
      "slots": [],
      "index": 6,
      "paragraph": 2,
      "run": 0,
      "start": 6,
      "end": 40,
      "neighborText": "Entre __________________________________ (en adelante \"EL ARRENDADOR\"), con RFC [RFC DEL ARRENDADOR] y domicilio en ______________________________________________,",
      "snippet": "__________________________________",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "rfc_del_arrendador",
      "label": "RFC del arrendador",
      "kind": "data",
      "type": "rfc",
      "confidence": 1,
      "why": "entre corchetes",
      "slots": [],
      "index": 7,
      "paragraph": 2,
      "run": 0,
      "start": 80,
      "end": 100,
      "neighborText": "Entre __________________________________ (en adelante \"EL ARRENDADOR\"), con RFC [RFC DEL ARRENDADOR] y domicilio en ______________________________________________,",
      "snippet": "[RFC DEL ARRENDADOR]",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "domicilio",
      "label": "Domicilio",
      "kind": "data",
      "type": "text",
      "confidence": 0.7,
      "why": "raya en el contrato",
      "slots": [],
      "index": 8,
      "paragraph": 2,
      "run": 0,
      "start": 116,
      "end": 162,
      "neighborText": "Entre __________________________________ (en adelante \"EL ARRENDADOR\"), con RFC [RFC DEL ARRENDADOR] y domicilio en ______________________________________________,",
      "snippet": "______________________________________________",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "dato_2",
      "label": "Dato 2",
      "kind": "data",
      "type": "text",
      "confidence": 0.7,
      "why": "raya en el contrato",
      "slots": [],
      "index": 9,
      "paragraph": 3,
      "run": 0,
      "start": 2,
      "end": 36,
      "neighborText": "y __________________________________ (en adelante \"EL ARRENDATARIO\"), con RFC [RFC DEL ARRENDATARIO], teléfono ______________ y correo ______________________.",
      "snippet": "__________________________________",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "rfc_del_arrendatario",
      "label": "RFC del arrendatario",
      "kind": "data",
      "type": "rfc",
      "confidence": 1,
      "why": "entre corchetes",
      "slots": [],
      "index": 10,
      "paragraph": 3,
      "run": 0,
      "start": 78,
      "end": 100,
      "neighborText": "y __________________________________ (en adelante \"EL ARRENDATARIO\"), con RFC [RFC DEL ARRENDATARIO], teléfono ______________ y correo ______________________.",
      "snippet": "[RFC DEL ARRENDATARIO]",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "telefono",
      "label": "Teléfono",
      "kind": "data",
      "type": "phone",
      "confidence": 0.7,
      "why": "raya en el contrato",
      "slots": [],
      "index": 11,
      "paragraph": 3,
      "run": 0,
      "start": 111,
      "end": 125,
      "neighborText": "y __________________________________ (en adelante \"EL ARRENDATARIO\"), con RFC [RFC DEL ARRENDATARIO], teléfono ______________ y correo ______________________.",
      "snippet": "______________",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "correo",
      "label": "Correo",
      "kind": "data",
      "type": "email",
      "confidence": 0.7,
      "why": "raya en el contrato",
      "slots": [],
      "index": 12,
      "paragraph": 3,
      "run": 0,
      "start": 135,
      "end": 157,
      "neighborText": "y __________________________________ (en adelante \"EL ARRENDATARIO\"), con RFC [RFC DEL ARRENDATARIO], teléfono ______________ y correo ______________________.",
      "snippet": "______________________",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "arrendador_entrega_arrendamiento_vehiculo_marca",
      "label": "Arrendador entrega arrendamiento vehículo marca",
      "kind": "data",
      "type": "text",
      "confidence": 0.7,
      "why": "raya en el contrato",
      "slots": [],
      "index": 13,
      "paragraph": 5,
      "run": 0,
      "start": 57,
      "end": 71,
      "neighborText": "EL ARRENDADOR entrega en arrendamiento el vehículo marca ______________, modelo ______________, placas ______________ y número de serie ______________________.",
      "snippet": "______________",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "modelo",
      "label": "Modelo",
      "kind": "data",
      "type": "text",
      "confidence": 0.7,
      "why": "raya en el contrato",
      "slots": [],
      "index": 14,
      "paragraph": 5,
      "run": 0,
      "start": 80,
      "end": 94,
      "neighborText": "EL ARRENDADOR entrega en arrendamiento el vehículo marca ______________, modelo ______________, placas ______________ y número de serie ______________________.",
      "snippet": "______________",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "placas",
      "label": "Placas",
      "kind": "data",
      "type": "text",
      "confidence": 0.7,
      "why": "raya en el contrato",
      "slots": [],
      "index": 15,
      "paragraph": 5,
      "run": 0,
      "start": 103,
      "end": 117,
      "neighborText": "EL ARRENDADOR entrega en arrendamiento el vehículo marca ______________, modelo ______________, placas ______________ y número de serie ______________________.",
      "snippet": "______________",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "numero_serie",
      "label": "Número serie",
      "kind": "data",
      "type": "number",
      "confidence": 0.7,
      "why": "raya en el contrato",
      "slots": [],
      "index": 16,
      "paragraph": 5,
      "run": 0,
      "start": 136,
      "end": 158,
      "neighborText": "EL ARRENDADOR entrega en arrendamiento el vehículo marca ______________, modelo ______________, placas ______________ y número de serie ______________________.",
      "snippet": "______________________",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "renta_mensual_es",
      "label": "Renta mensual es $",
      "kind": "data",
      "type": "amount",
      "confidence": 0.7,
      "why": "raya en el contrato",
      "slots": [],
      "index": 17,
      "paragraph": 7,
      "run": 0,
      "start": 24,
      "end": 38,
      "neighborText": "La renta mensual es de $______________ (______________________________ pesos 00/100 M.N.), pagadera los días ____ de cada mes.",
      "snippet": "______________",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "renta_mensual_es_2",
      "label": "Renta mensual es $",
      "kind": "data",
      "type": "amount",
      "confidence": 0.7,
      "why": "raya en el contrato",
      "slots": [],
      "index": 18,
      "paragraph": 7,
      "run": 0,
      "start": 40,
      "end": 70,
      "neighborText": "La renta mensual es de $______________ (______________________________ pesos 00/100 M.N.), pagadera los días ____ de cada mes.",
      "snippet": "______________________________",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "pagadera_dias",
      "label": "Pagadera días",
      "kind": "data",
      "type": "text",
      "confidence": 0.7,
      "why": "raya en el contrato",
      "slots": [],
      "index": 19,
      "paragraph": 7,
      "run": 0,
      "start": 109,
      "end": 113,
      "neighborText": "La renta mensual es de $______________ (______________________________ pesos 00/100 M.N.), pagadera los días ____ de cada mes.",
      "snippet": "____",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "transferencia_tarjeta_efectivo",
      "label": "Transferencia / Tarjeta / Efectivo",
      "kind": "decision",
      "type": "choice",
      "confidence": 0.7,
      "why": "equis en el texto",
      "slots": [],
      "index": 20,
      "paragraph": 8,
      "run": 0,
      "start": 16,
      "end": 61,
      "neighborText": "Forma de pago:  ( X ) Transferencia    (   ) Tarjeta    (   ) Efectivo",
      "snippet": "( X ) Transferencia    (   ) Tarjeta    (   )",
      "options": [
        "Transferencia",
        "Tarjeta",
        "Efectivo"
      ],
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "dato_3",
      "label": "$",
      "kind": "data",
      "type": "text",
      "confidence": 0.7,
      "why": "raya en el contrato",
      "slots": [],
      "index": 21,
      "paragraph": 9,
      "run": 0,
      "start": 23,
      "end": 37,
      "neighborText": "Depósito en garantía: $______________. Vigencia: ______ meses a partir del ____ de ____________ de 20____.",
      "snippet": "______________",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "vigencia",
      "label": "Vigencia",
      "kind": "data",
      "type": "text",
      "confidence": 0.7,
      "why": "raya en el contrato",
      "slots": [],
      "index": 22,
      "paragraph": 9,
      "run": 0,
      "start": 49,
      "end": 55,
      "neighborText": "Depósito en garantía: $______________. Vigencia: ______ meses a partir del ____ de ____________ de 20____.",
      "snippet": "______",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "meses_partir",
      "label": "Meses partir",
      "kind": "data",
      "type": "text",
      "confidence": 0.7,
      "why": "raya en el contrato",
      "slots": [],
      "index": 23,
      "paragraph": 9,
      "run": 0,
      "start": 75,
      "end": 79,
      "neighborText": "Depósito en garantía: $______________. Vigencia: ______ meses a partir del ____ de ____________ de 20____.",
      "snippet": "____",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "meses_partir_2",
      "label": "Meses partir",
      "kind": "data",
      "type": "text",
      "confidence": 0.7,
      "why": "raya en el contrato",
      "slots": [],
      "index": 24,
      "paragraph": 9,
      "run": 0,
      "start": 83,
      "end": 95,
      "neighborText": "Depósito en garantía: $______________. Vigencia: ______ meses a partir del ____ de ____________ de 20____.",
      "snippet": "____________",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "dato_20_2",
      "label": "20",
      "kind": "data",
      "type": "text",
      "confidence": 0.7,
      "why": "raya en el contrato",
      "slots": [],
      "index": 25,
      "paragraph": 9,
      "run": 0,
      "start": 101,
      "end": 105,
      "neighborText": "Depósito en garantía: $______________. Vigencia: ______ meses a partir del ____ de ____________ de 20____.",
      "snippet": "____",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "nombre_y_firma_del_arrendador",
      "label": "Nombre y firma del arrendador",
      "kind": "signature",
      "type": null,
      "confidence": 0.7,
      "why": "línea de firma",
      "slots": [],
      "index": 26,
      "paragraph": 13,
      "run": 0,
      "start": 0,
      "end": 29,
      "neighborText": "NOMBRE Y FIRMA DEL ARRENDADOR",
      "snippet": "NOMBRE Y FIRMA DEL ARRENDADOR",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "nombre_y_firma_del_arrendatario",
      "label": "Nombre y firma del arrendatario",
      "kind": "signature",
      "type": null,
      "confidence": 0.7,
      "why": "línea de firma",
      "slots": [],
      "index": 27,
      "paragraph": 16,
      "run": 0,
      "start": 0,
      "end": 31,
      "neighborText": "NOMBRE Y FIRMA DEL ARRENDATARIO",
      "snippet": "NOMBRE Y FIRMA DEL ARRENDATARIO",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    },
    {
      "name": "nombre_y_firma_del_aval",
      "label": "Nombre y firma del aval",
      "kind": "signature",
      "type": null,
      "confidence": 0.7,
      "why": "línea de firma",
      "slots": [],
      "index": 28,
      "paragraph": 19,
      "run": 0,
      "start": 0,
      "end": 23,
      "neighborText": "NOMBRE Y FIRMA DEL AVAL",
      "snippet": "NOMBRE Y FIRMA DEL AVAL",
      "options": null,
      "filledBy": null,
      "labeledBy": null
    }
  ],
  "parts": [
    {
      "index": 1,
      "text": "ARRENDADOR",
      "paragraph": 13,
      "run": 0
    },
    {
      "index": 2,
      "text": "ARRENDATARIO",
      "paragraph": 16,
      "run": 0
    },
    {
      "index": 3,
      "text": "AVAL",
      "paragraph": 19,
      "run": 0
    }
  ],
  "pageCount": 0
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:15 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/plantillas.ejemplos.spec.ts`

## Validate template values

POST `/templates/{template_id}/validate-values`

Comprueba un mapa `templateValues` contra las variables de la plantilla **sin crear nada y sin consumir crédito**. Es el ensayo previo de Create document: te dice qué falta antes de que el documento exista. Por qué importa: si emites el documento sin una variable requerida, la respuesta es `422` y no se crea nada — pero ya escribiste el formulario, ya pediste los datos al usuario y ya armaste el request. Validar en cada guardado te deja corregir mientras el usuario sigue en la pantalla. **Siempre responde `200`**, incluso cuando el mapa está mal: es un diagnóstico, no un rechazo. Lo que te dice si puedes crear el documento es el campo `valid`. La respuesta separa tres cosas que no pesan igual: - **`errors`** — falta una variable **requerida**, llegó vacía, o mandaste una llave que la plantilla no declara (`UNKNOWN_VARIABLE`, casi siempre un typo como `nombre_completoo`). Cualquiera de ellos pone `valid` en `false`. `POST /v3/templates/{id}/documents` rechaza con `422` estos mismos errores; `POST /v3/documents` rechaza la requerida que falta, pero descarta sin imprimir las llaves desconocidas. - **`warnings`** — el valor no cuadra con el `type` de la variable. **Nunca bloquean.** El `type` no se declara: se infiere del nombre, así que una variable llamada `forma_de_pago` se marca `currency` aunque contenga texto. Trátalos como una pista para revisar, no como un error. - **`ignored`** — las mismas llaves desconocidas, en una lista simple de nombres. Cada una aparece también en `errors` con `UNKNOWN_VARIABLE`.

#### Parámetros

-   `template_id` string ruta requerido
    
    ID de la plantilla (`tmpl_…`) contra la que se validan los valores.
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Cuerpo de la petición

application/json

-   `templateValues` objeto (llave → valor)
    
    El mismo mapa que mandarías en `templateValues` al crear el documento. Las llaves son los `name` de las variables y conservan su forma natural (`nombre_completo`): nunca se camelizan, porque son datos del negocio y no campos del protocolo.
    

#### Devuelve

**200** El diagnóstico del mapa (`object: "template_values_validation"`), con `valid` y los tres bloques. `200` no significa que el mapa esté bien — revisa `valid`.

Ver los 7 atributos de la respuesta

-   `livemode` boolean requerido
    
    `true` en entorno `live`, `false` en `test`/`dev` (marca de agua, sin validez legal).
    
-   `object` string, siempre "template\_values\_validation"
    
    Siempre `"template_values_validation"`.
    
-   `templateId` string requerido
    
    La plantilla contra la que se validó (`tmpl_…`).
    
-   `valid` boolean requerido
    
    `false` únicamente cuando hay `errors`, incluida una llave que la plantilla no declara. Los `warnings` no invalidan: el `type` de una variable se infiere de su nombre, así que no puede bloquear.
    
-   `errors` array de objetos
    
    Problemas que SÍ romperían el documento: una variable requerida ausente o vacía saldría como un espacio en blanco en el contrato, y una llave que la plantilla no declara (`UNKNOWN_VARIABLE`) no se imprimiría en ningún lado. `POST /v3/templates/{id}/documents` rechaza con 422 estos mismos errores.
    
    Ver 3 atributos hijos
    
    -   `errors[].name` string requerido
        
        La variable a la que se refiere el hallazgo.
        
    -   `errors[].code` string requerido
        
        Código estable del hallazgo: `MISSING_REQUIRED_VARIABLE` (falta), `EMPTY_REQUIRED_VARIABLE` (llegó vacía), `UNKNOWN_VARIABLE` (la plantilla no declara esa llave) o `TYPE_MISMATCH_HINT` (el valor no cuadra con el tipo inferido).
        
    -   `errors[].detail` string requerido
        
        Explicación legible de qué pasaría si envías así el documento.
        
    
-   `warnings` array de objetos
    
    Avisos que no bloquean. El `type` de cada variable se **infiere de su nombre** (`monto_…` → `currency`), no está declarado en la plantilla; por eso un desajuste se avisa pero nunca rechaza.
    
    Ver 3 atributos hijos
    
    -   `warnings[].name` string requerido
        
        La variable a la que se refiere el hallazgo.
        
    -   `warnings[].code` string requerido
        
        Código estable del hallazgo: `MISSING_REQUIRED_VARIABLE` (falta), `EMPTY_REQUIRED_VARIABLE` (llegó vacía), `UNKNOWN_VARIABLE` (la plantilla no declara esa llave) o `TYPE_MISMATCH_HINT` (el valor no cuadra con el tipo inferido).
        
    -   `warnings[].detail` string requerido
        
        Explicación legible de qué pasaría si envías así el documento.
        
    
-   `ignored` array de string
    
    Llaves que mandaste y la plantilla no declara — normalmente un typo. Cada una sale también en `errors` con `UNKNOWN_VARIABLE`: `POST /v3/templates/{id}/documents` las rechaza con 422 y `POST /v3/documents` las descarta sin imprimirlas.
    

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl -X POST 'https://api.allsign.io/v3/templates/tmpl_67fb98658fe548d3a71eae28087d7060/validate-values' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11" \
  -H "Content-Type: application/json" \
  -d '{
  "templateValues": {
    "folio_acuerdo": "NDA-2026-014",
    "fecha_celebracion": "mañana",
    "ciudad_celebracion": "Ciudad de México",
    "objeto_relacion": "una integración de firma electrónica",
    "tipo_informacion_confidencial": "técnica, comercial y financiera",
    "vigencia": "2 años",
    "vigencia_post_terminacion": "3 años",
    "monto_pena": "cien mil",
    "monto_pena_letra": "doscientos cincuenta mil pesos 00/100 M.N.",
    "jurisdiccion": "Ciudad de México",
    "parte_a__nombre": "Comercializadora Ejemplo SA de CV",
    "parte_a__rfc": "CEJ200101AB1",
    "parte_a__domicilio": "Av. Reforma 100, Cuauhtémoc, Ciudad de México",
    "parte_a__representante": "Ana Torres",
    "parte_a__email": "contacto@ejemplo.com",
    "parte_a__telefono": "+525555550001",
    "parte_b__nombre": "Servicios Muestra SC",
    "parte_b__rfc": "SMU190505CD2",
    "parte_b__domicilio": "Insurgentes Sur 200, Benito Juárez, Ciudad de México",
    "parte_b__representante": "Luis Ramírez",
    "parte_b__email": "legal@ejemplo.com",
    "parte_b__telefono": "+525555550002",
    "numero_cliente": "C-0042"
  }
}'
```

**Node**

```
const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_67fb98658fe548d3a71eae28087d7060/validate-values', {
    method: 'POST',
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        templateValues: {
            folio_acuerdo: 'NDA-2026-014',
            fecha_celebracion: 'mañana',
            ciudad_celebracion: 'Ciudad de México',
            objeto_relacion: 'una integración de firma electrónica',
            tipo_informacion_confidencial: 'técnica, comercial y financiera',
            vigencia: '2 años',
            vigencia_post_terminacion: '3 años',
            monto_pena: 'cien mil',
            monto_pena_letra: 'doscientos cincuenta mil pesos 00/100 M.N.',
            jurisdiccion: 'Ciudad de México',
            parte_a__nombre: 'Comercializadora Ejemplo SA de CV',
            parte_a__rfc: 'CEJ200101AB1',
            parte_a__domicilio: 'Av. Reforma 100, Cuauhtémoc, Ciudad de México',
            parte_a__representante: 'Ana Torres',
            parte_a__email: 'contacto@ejemplo.com',
            parte_a__telefono: '+525555550001',
            parte_b__nombre: 'Servicios Muestra SC',
            parte_b__rfc: 'SMU190505CD2',
            parte_b__domicilio: 'Insurgentes Sur 200, Benito Juárez, Ciudad de México',
            parte_b__representante: 'Luis Ramírez',
            parte_b__email: 'legal@ejemplo.com',
            parte_b__telefono: '+525555550002',
            numero_cliente: 'C-0042',
        },
    }),
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os

import requests

respuesta = requests.post(
    "https://api.allsign.io/v3/templates/tmpl_67fb98658fe548d3a71eae28087d7060/validate-values",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
    json={
        "templateValues": {
            "folio_acuerdo": "NDA-2026-014",
            "fecha_celebracion": "mañana",
            "ciudad_celebracion": "Ciudad de México",
            "objeto_relacion": "una integración de firma electrónica",
            "tipo_informacion_confidencial": "técnica, comercial y financiera",
            "vigencia": "2 años",
            "vigencia_post_terminacion": "3 años",
            "monto_pena": "cien mil",
            "monto_pena_letra": "doscientos cincuenta mil pesos 00/100 M.N.",
            "jurisdiccion": "Ciudad de México",
            "parte_a__nombre": "Comercializadora Ejemplo SA de CV",
            "parte_a__rfc": "CEJ200101AB1",
            "parte_a__domicilio": "Av. Reforma 100, Cuauhtémoc, Ciudad de México",
            "parte_a__representante": "Ana Torres",
            "parte_a__email": "contacto@ejemplo.com",
            "parte_a__telefono": "+525555550001",
            "parte_b__nombre": "Servicios Muestra SC",
            "parte_b__rfc": "SMU190505CD2",
            "parte_b__domicilio": "Insurgentes Sur 200, Benito Juárez, Ciudad de México",
            "parte_b__representante": "Luis Ramírez",
            "parte_b__email": "legal@ejemplo.com",
            "parte_b__telefono": "+525555550002",
            "numero_cliente": "C-0042",
        },
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 200**

```
{
  "livemode": false,
  "object": "template_values_validation",
  "templateId": "tmpl_67fb98658fe548d3a71eae28087d7060",
  "valid": false,
  "errors": [
    {
      "name": "fecha_celebracion",
      "code": "INVALID_DATE",
      "detail": "Write a date as YYYY-MM-DD or DD/MM/YYYY."
    },
    {
      "name": "monto_pena",
      "code": "INVALID_AMOUNT",
      "detail": "Write a numeric amount. Example: 15000 or $15,000.00."
    },
    {
      "name": "numero_cliente",
      "code": "UNKNOWN_VARIABLE",
      "detail": "The template has no variable with this name. Check the spelling in GET /v3/templates/{id}/variables."
    }
  ],
  "warnings": [],
  "ignored": [
    "numero_cliente"
  ]
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:17 (hora CDMX) · test `docs-checks-v3/tests/recetas/documento-desde-plantilla-docx.receta.spec.ts`

## Get signing layout (legacy)

GET `/templates/{template_id}/signing`

El layout de firma del modo anterior a los formularios: cajas de firma/iniciales/fecha por rol sobre una plantilla DOCX. Para plantillas PDF con formulario usa `…/fields` y `…/roles`, que lo sustituyen.

#### Parámetros

-   `template_id` string ruta requerido
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Devuelve

**200** Roles con sus cajas.

Ver los 4 atributos de la respuesta

-   `livemode` boolean requerido
    
    `true` en entorno `live`, `false` en `test`/`dev` (marca de agua, sin validez legal).
    
-   `object` string, siempre "template\_signing"
    
    Siempre `"template_signing"`.
    
-   `templateId` string requerido
    
    La plantilla (`tmpl_…`).
    
-   `roles` array de objetos
    
    Roles y sus campos de firma.
    
    Ver 2 atributos hijos
    
    -   `roles[].name` string requerido
        
        Nombre del rol (ej. `proveedor`).
        
    -   `roles[].fields` array de objetos
        
        Campos de firma de este rol.
        
        Ver 8 atributos hijos
        
        -   `roles[].fields[].roleName` string requerido
            
            Nombre del rol al que pertenece este campo.
            
        -   `roles[].fields[].kind` enum requerido
            
            Tipo de campo: `signature`, `initials`, `name`, `date` o `vobo`.
            
            Valores: `signature` `initials` `name` `date` `vobo`
            
        -   `roles[].fields[].page` integer requerido
            
            Página 1-based.
            
            mín. 1
            
        -   `roles[].fields[].rect` objeto requerido
            
            Rectángulo del campo, en % del papel.
            
            Ver 4 atributos hijos
            
            -   `roles[].fields[].rect.x` number requerido
                
                X izquierdo, porcentaje del ancho de la página.
                
                entre 0 y 100
                
            -   `roles[].fields[].rect.y` number requerido
                
                Y superior, porcentaje del alto de la página.
                
                entre 0 y 100
                
            -   `roles[].fields[].rect.width` number requerido
                
                Ancho en porcentaje de la página.
                
                entre 0 y 100
                
            -   `roles[].fields[].rect.height` number requerido
                
                Alto en porcentaje de la página.
                
                entre 0 y 100
                
            
        -   `roles[].fields[].rule` enum puede ser null
            
            Regla de expansión. `all_pages` replica el campo en cada página.
            
            Valores: `all_pages`
            
        -   `roles[].fields[].anchor` string puede ser null
            
            Texto ancla en el PDF, o `null` si va por coordenadas.
            
        -   `roles[].fields[].expect` integer puede ser null
            
            Cuántas coincidencias del ancla se esperan.
            
            mín. 1
            
        -   `roles[].fields[].onMiss` enum puede ser null
            
            Qué hacer si el ancla no aparece: `fail` o `ignore`.
            
            Valores: `fail` `ignore`
            
        
    

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl 'https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/signing' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11"
```

**Node**

```
const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/signing', {
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
    },
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os

import requests

respuesta = requests.get(
    "https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/signing",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 200**

```
{
  "livemode": false,
  "object": "template_signing",
  "templateId": "tmpl_c405a9544678416a9b2e29dfa4a7f331",
  "roles": [
    {
      "name": "Cliente",
      "fields": [
        {
          "roleName": "Cliente",
          "kind": "signature",
          "page": 1,
          "rect": {
            "x": 8.1699,
            "y": 39.1414,
            "width": 40.8497,
            "height": 7.5758
          },
          "rule": null,
          "anchor": null,
          "expect": null,
          "onMiss": null
        }
      ]
    }
  ]
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:16 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/plantillas.ejemplos.spec.ts`

## Replace signing layout (legacy)

PUT `/templates/{template_id}/signing`

Reemplaza el layout de firma completo (roles y cajas) de una plantilla DOCX. Declarativo. En plantillas PDF con formulario usa `PUT …/fields`.

#### Parámetros

-   `template_id` string ruta requerido
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Cuerpo de la petición

application/json

-   `roles` array de objetos requerido
    
    Disposición completa de roles y campos. Reemplaza la anterior.
    
    Ver 2 atributos hijos
    
    -   `roles[].name` string requerido
        
        Nombre del rol (ej. `proveedor`).
        
    -   `roles[].fields` array de objetos
        
        Campos de firma de este rol.
        
        Ver 8 atributos hijos
        
        -   `roles[].fields[].roleName` string requerido
            
            Nombre del rol al que pertenece este campo.
            
        -   `roles[].fields[].kind` enum requerido
            
            Tipo de campo: `signature`, `initials`, `name`, `date` o `vobo`.
            
            Valores: `signature` `initials` `name` `date` `vobo`
            
        -   `roles[].fields[].page` integer requerido
            
            Página 1-based.
            
            mín. 1
            
        -   `roles[].fields[].rect` objeto requerido
            
            Rectángulo del campo, en % del papel.
            
            Ver 4 atributos hijos
            
            -   `roles[].fields[].rect.x` number requerido
                
                X izquierdo, porcentaje del ancho de la página.
                
                entre 0 y 100
                
            -   `roles[].fields[].rect.y` number requerido
                
                Y superior, porcentaje del alto de la página.
                
                entre 0 y 100
                
            -   `roles[].fields[].rect.width` number requerido
                
                Ancho en porcentaje de la página.
                
                entre 0 y 100
                
            -   `roles[].fields[].rect.height` number requerido
                
                Alto en porcentaje de la página.
                
                entre 0 y 100
                
            
        -   `roles[].fields[].rule` enum puede ser null
            
            Regla de expansión. `all_pages` replica el campo en cada página.
            
            Valores: `all_pages`
            
        -   `roles[].fields[].anchor` string puede ser null
            
            Texto ancla en el PDF, o `null` si va por coordenadas.
            
        -   `roles[].fields[].expect` integer puede ser null
            
            Cuántas coincidencias del ancla se esperan.
            
            mín. 1
            
        -   `roles[].fields[].onMiss` enum puede ser null
            
            Qué hacer si el ancla no aparece: `fail` o `ignore`.
            
            Valores: `fail` `ignore`
            
        
    

#### Devuelve

**200** El layout tal como quedó.

Ver los 4 atributos de la respuesta

-   `livemode` boolean requerido
    
    `true` en entorno `live`, `false` en `test`/`dev` (marca de agua, sin validez legal).
    
-   `object` string, siempre "template\_signing"
    
    Siempre `"template_signing"`.
    
-   `templateId` string requerido
    
    La plantilla (`tmpl_…`).
    
-   `roles` array de objetos
    
    Roles y sus campos de firma.
    
    Ver 2 atributos hijos
    
    -   `roles[].name` string requerido
        
        Nombre del rol (ej. `proveedor`).
        
    -   `roles[].fields` array de objetos
        
        Campos de firma de este rol.
        
        Ver 8 atributos hijos
        
        -   `roles[].fields[].roleName` string requerido
            
            Nombre del rol al que pertenece este campo.
            
        -   `roles[].fields[].kind` enum requerido
            
            Tipo de campo: `signature`, `initials`, `name`, `date` o `vobo`.
            
            Valores: `signature` `initials` `name` `date` `vobo`
            
        -   `roles[].fields[].page` integer requerido
            
            Página 1-based.
            
            mín. 1
            
        -   `roles[].fields[].rect` objeto requerido
            
            Rectángulo del campo, en % del papel.
            
            Ver 4 atributos hijos
            
            -   `roles[].fields[].rect.x` number requerido
                
                X izquierdo, porcentaje del ancho de la página.
                
                entre 0 y 100
                
            -   `roles[].fields[].rect.y` number requerido
                
                Y superior, porcentaje del alto de la página.
                
                entre 0 y 100
                
            -   `roles[].fields[].rect.width` number requerido
                
                Ancho en porcentaje de la página.
                
                entre 0 y 100
                
            -   `roles[].fields[].rect.height` number requerido
                
                Alto en porcentaje de la página.
                
                entre 0 y 100
                
            
        -   `roles[].fields[].rule` enum puede ser null
            
            Regla de expansión. `all_pages` replica el campo en cada página.
            
            Valores: `all_pages`
            
        -   `roles[].fields[].anchor` string puede ser null
            
            Texto ancla en el PDF, o `null` si va por coordenadas.
            
        -   `roles[].fields[].expect` integer puede ser null
            
            Cuántas coincidencias del ancla se esperan.
            
            mín. 1
            
        -   `roles[].fields[].onMiss` enum puede ser null
            
            Qué hacer si el ancla no aparece: `fail` o `ignore`.
            
            Valores: `fail` `ignore`
            
        
    

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl -X PUT 'https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/signing' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11" \
  -H "Content-Type: application/json" \
  -d '{
  "roles": [
    {
      "name": "Cliente",
      "fields": [
        {
          "roleName": "Cliente",
          "kind": "signature",
          "page": 1,
          "rect": {
            "x": 8.1699,
            "y": 39.1414,
            "width": 40.8497,
            "height": 9
          }
        }
      ]
    }
  ]
}'
```

**Node**

```
const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/signing', {
    method: 'PUT',
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        roles: [
            {
                name: 'Cliente',
                fields: [
                    {
                        roleName: 'Cliente',
                        kind: 'signature',
                        page: 1,
                        rect: {
                            x: 8.1699,
                            y: 39.1414,
                            width: 40.8497,
                            height: 9,
                        },
                    },
                ],
            },
        ],
    }),
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os

import requests

respuesta = requests.put(
    "https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/signing",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
    json={
        "roles": [
            {
                "name": "Cliente",
                "fields": [
                    {
                        "roleName": "Cliente",
                        "kind": "signature",
                        "page": 1,
                        "rect": {
                            "x": 8.1699,
                            "y": 39.1414,
                            "width": 40.8497,
                            "height": 9,
                        },
                    },
                ],
            },
        ],
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 200**

```
{
  "livemode": false,
  "object": "template_signing",
  "templateId": "tmpl_c405a9544678416a9b2e29dfa4a7f331",
  "roles": [
    {
      "name": "Cliente",
      "fields": [
        {
          "roleName": "Cliente",
          "kind": "signature",
          "page": 1,
          "rect": {
            "x": 8.1699,
            "y": 39.1414,
            "width": 40.8497,
            "height": 9
          },
          "rule": null,
          "anchor": null,
          "expect": null,
          "onMiss": null
        }
      ]
    }
  ]
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:16 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/plantillas.ejemplos.spec.ts`

## List documents to seed the signing layout (legacy)

GET `/templates/{template_id}/signing/documents`

Documentos ya firmados creados desde esta plantilla, de los que puedes copiar las cajas de firma con `POST …/signing:from-document`.

#### Parámetros

-   `template_id` string ruta requerido
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Devuelve

**200** Colección de documentos candidatos.

Ver los 2 atributos de la respuesta

-   `object` string, siempre "list"
    
    Siempre `"list"`.
    
-   `data` array de objetos requerido
    
    Documentos candidatos, más recientes primero.
    
    Ver 6 atributos hijos
    
    -   `data[].documentId` string requerido
        
        El documento candidato (`doc_…`).
        
    -   `data[].name` string requerido
        
        Nombre del documento.
        
    -   `data[].completedAt` string (fecha-hora ISO 8601) puede ser null
        
        Cuándo terminó de firmarse, o `null` si el documento aún no se completa (puede seguir listado si ya trae una disposición de firma original).
        
    -   `data[].fieldCount` integer requerido
        
        Campos de firma originales que tiene este documento.
        
        mín. 0
        
    -   `data[].roleNames` array de string
        
        Roles con campos de firma en este documento.
        
    -   `data[].matchable` boolean requerido
        
        `true` si el documento nació exactamente de esta plantilla (mapeo directo por rol); `false` si solo es comparable por archivo/hash.
        
    

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors)

**cURL**

```
curl 'https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/signing/documents' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11"
```

**Node**

```
const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/signing/documents', {
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
    },
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os

import requests

respuesta = requests.get(
    "https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/signing/documents",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 200**

```
{
  "object": "list",
  "data": [
    {
      "documentId": "doc_2abcccc1b53249348a14e6a17c3ebe28",
      "name": "v3audit-ejemplos borrador desde plantilla",
      "completedAt": null,
      "fieldCount": 1,
      "roleNames": [],
      "matchable": true
    }
  ]
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:16 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/plantillas.ejemplos.spec.ts`

## Import signing layout from a document (legacy)

POST `/templates/{template_id}/signing:from-document`

Copia las cajas de firma (por rol) de un documento firmado al layout de la plantilla DOCX. El equivalente para formularios PDF es `POST …/fields:from-document`.

#### Parámetros

-   `template_id` string ruta requerido
    
-   `Idempotency-Key` string header
    
    Clave única (UUID v4) que vuelve idempotente el POST: un reintento con la misma clave repite la respuesta original en lugar de volver a crear, cobrar o notificar.
    
-   `AllSign-Version` enum header
    
    Fecha del contrato contra la que quieres resolver la petición. Si la omites se sirve la versión vigente; una fecha desconocida responde 400 `UNSUPPORTED_API_VERSION`.
    
    Valores: `2026-07-11`
    

#### Cuerpo de la petición

application/json

-   `documentId` string puede ser null
    
    Documento (`doc_…`) del que se copian los campos de firma.
    
-   `consolidate` boolean
    
    Si es `true`, consolida campos de documentos comparables en vez de copiar uno solo.
    
    default false
    

#### Devuelve

**200** El layout tal como quedó.

Ver los 7 atributos de la respuesta

-   `livemode` boolean requerido
    
    `true` en entorno `live`, `false` en `test`/`dev` (marca de agua, sin validez legal).
    
-   `object` string, siempre "template\_signing\_import"
    
    Siempre `"template_signing_import"`.
    
-   `templateId` string requerido
    
    La plantilla destino (`tmpl_…`).
    
-   `matchedCount` integer requerido
    
    Campos que encajaron.
    
    mín. 0
    
-   `totalCount` integer requerido
    
    Campos considerados.
    
    mín. 0
    
-   `signing` objeto requerido
    
    Disposición resultante.
    
    Ver 4 atributos hijos
    
    -   `signing.livemode` boolean requerido
        
        `true` en entorno `live`, `false` en `test`/`dev` (marca de agua, sin validez legal).
        
    -   `signing.object` string, siempre "template\_signing"
        
        Siempre `"template_signing"`.
        
    -   `signing.templateId` string requerido
        
        La plantilla (`tmpl_…`).
        
    -   `signing.roles` array de objetos
        
        Roles y sus campos de firma.
        
        Ver 2 atributos hijos
        
        -   `signing.roles[].name` string requerido
            
            Nombre del rol (ej. `proveedor`).
            
        -   `signing.roles[].fields` array de objetos
            
            Campos de firma de este rol.
            
            Ver 8 atributos hijos
            
            -   `signing.roles[].fields[].roleName` string requerido
                
                Nombre del rol al que pertenece este campo.
                
            -   `signing.roles[].fields[].kind` enum requerido
                
                Tipo de campo: `signature`, `initials`, `name`, `date` o `vobo`.
                
                Valores: `signature` `initials` `name` `date` `vobo`
                
            -   `signing.roles[].fields[].page` integer requerido
                
                Página 1-based.
                
                mín. 1
                
            -   `signing.roles[].fields[].rect` objeto requerido
                
                Rectángulo del campo, en % del papel.
                
                Ver 4 atributos hijos
                
                -   `signing.roles[].fields[].rect.x` number requerido
                    
                    X izquierdo, porcentaje del ancho de la página.
                    
                    entre 0 y 100
                    
                -   `signing.roles[].fields[].rect.y` number requerido
                    
                    Y superior, porcentaje del alto de la página.
                    
                    entre 0 y 100
                    
                -   `signing.roles[].fields[].rect.width` number requerido
                    
                    Ancho en porcentaje de la página.
                    
                    entre 0 y 100
                    
                -   `signing.roles[].fields[].rect.height` number requerido
                    
                    Alto en porcentaje de la página.
                    
                    entre 0 y 100
                    
                
            -   `signing.roles[].fields[].rule` enum puede ser null
                
                Regla de expansión. `all_pages` replica el campo en cada página.
                
                Valores: `all_pages`
                
            -   `signing.roles[].fields[].anchor` string puede ser null
                
                Texto ancla en el PDF, o `null` si va por coordenadas.
                
            -   `signing.roles[].fields[].expect` integer puede ser null
                
                Cuántas coincidencias del ancla se esperan.
                
                mín. 1
                
            -   `signing.roles[].fields[].onMiss` enum puede ser null
                
                Qué hacer si el ancla no aparece: `fail` o `ignore`.
                
                Valores: `fail` `ignore`
                
            
        
    
-   `unmatched` array de objetos
    
    Campos que no encajaron, con su diferencia.
    
    Ver 4 atributos hijos
    
    -   `unmatched[].roleName` string requerido
        
        Rol del campo que no encajó.
        
    -   `unmatched[].kind` enum requerido
        
        Tipo del campo que no encajó.
        
        Valores: `signature` `initials` `name` `date` `vobo`
        
    -   `unmatched[].page` integer requerido
        
        Página 1-based del campo que no encajó.
        
        mín. 1
        
    -   `unmatched[].detail` string requerido
        
        Por qué quedó fuera (posición distinta, rol sin pareja, etc.).
        
    

Errores posibles (problem+json): [400](https://allsign.io/developers/docs/errors) [401](https://allsign.io/developers/docs/errors) [403](https://allsign.io/developers/docs/errors) [404](https://allsign.io/developers/docs/errors) [422](https://allsign.io/developers/docs/errors) [429](https://allsign.io/developers/docs/errors) [503](https://allsign.io/developers/docs/errors)

**cURL**

```
curl -X POST 'https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/signing:from-document' \
  -H "Authorization: Bearer $ALLSIGN_API_KEY" \
  -H "AllSign-Version: 2026-07-11" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "documentId": "doc_c9b39590d09645c9b9ebc28f4b3a5349"
}'
```

**Node**

```
import { randomUUID } from 'node:crypto';

const respuesta = await fetch('https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/signing:from-document', {
    method: 'POST',
    headers: {
        Authorization: `Bearer ${process.env.ALLSIGN_API_KEY}`,
        'AllSign-Version': '2026-07-11',
        'Idempotency-Key': randomUUID(),
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        documentId: 'doc_c9b39590d09645c9b9ebc28f4b3a5349',
    }),
});
console.log(respuesta.status, await respuesta.json());
```

**Python**

```
import os
import uuid

import requests

respuesta = requests.post(
    "https://api.allsign.io/v3/templates/tmpl_c405a9544678416a9b2e29dfa4a7f331/signing:from-document",
    headers={
        "Authorization": f"Bearer {os.environ['ALLSIGN_API_KEY']}",
        "AllSign-Version": "2026-07-11",
        "Idempotency-Key": str(uuid.uuid4()),
    },
    json={
        "documentId": "doc_c9b39590d09645c9b9ebc28f4b3a5349",
    },
)
print(respuesta.status_code, respuesta.json())
```

**Respuesta · 200**

```
{
  "livemode": false,
  "object": "template_signing_import",
  "templateId": "tmpl_c405a9544678416a9b2e29dfa4a7f331",
  "matchedCount": 1,
  "totalCount": 1,
  "signing": {
    "livemode": false,
    "object": "template_signing",
    "templateId": "tmpl_c405a9544678416a9b2e29dfa4a7f331",
    "roles": [
      {
        "name": "Cliente",
        "fields": [
          {
            "roleName": "Cliente",
            "kind": "signature",
            "page": 1,
            "rect": {
              "x": 13.0719,
              "y": 78.2828,
              "width": 32.6797,
              "height": 7.5758
            },
            "rule": null,
            "anchor": null,
            "expect": null,
            "onMiss": null
          }
        ]
      }
    ]
  },
  "unmatched": []
}
```

Grabado en el entorno interno de AllSign con una key de sandbox · backend `24c0469` · 8 oct 2026, 06:16 (hora CDMX) · test `docs-checks-v3/tests/ejemplos/plantillas.ejemplos.spec.ts`
