---
name: "esign_save_template"
area: "esign"
title: "Save a document as a template"
price: "$0.001"
method: "POST"
url: "https://api.conecto.chat/v1/tools/esign_save_template"
mcp_server: "https://api.conecto.chat/mcp/esign"
auth: "Authorization: Bearer <conecto_sk_ key>"
docs_url: "https://conecto.chat/tools/esign/esign_save_template"
---

# Save a document as a template (`esign_save_template`)

Saves a PDF once with its signature fields placed per signer role, to send again and again.

Save a PDF from the file store once, with its fields placed per signer role (page, x, y, width and height in percent of the page, as in esign_send), so contracts, NDAs and waivers go out later without placing a field again. roles names who signs, in order; every role needs a signature field. Saving a name again replaces it. $0.001.

Price: $0.001 a call. A call that fails costs nothing.

## Use it when

A contract, NDA or waiver goes out often, to different people.

- For a one-off document, use [esign_send](https://conecto.chat/tools/esign/esign_send.md).

## Say this to your agent

> Keep our trade account agreement as a template: the customer signs and dates at the bottom of page 2, then Henrik countersigns.

## Inputs

| Name | Type | Required | Description | Allowed values | Default |
|---|---|---|---|---|---|
| `name` | string | yes | The template's name, like service-agreement. 2 to 60 characters, matches ^[a-z0-9][a-z0-9-]*[a-z0-9]$. |  |  |
| `file_id` | string | yes | A PDF in the file store. Exactly 36 characters. |  |  |
| `title` | string | yes | What signers see, e.g. "Service agreement". 1 to 200 characters. |  |  |
| `roles` | array of strings | yes | Who signs, in order, e.g. ["Customer", "Hansen & Voss"]. 1 to 10 items. |  |  |
| `fields` | array of objects | yes | 1 to 300 items. |  |  |
| `fields[].kind` | string | yes, in each item of `fields` |  | `"signature"`, `"initials"`, `"name"`, `"date"`, `"text"`, `"checkbox"` |  |
| `fields[].page` | integer | yes, in each item of `fields` | At least 1. |  |  |
| `fields[].x` | number | yes, in each item of `fields` | Left edge, in percent of the page width from the left. |  |  |
| `fields[].y` | number | yes, in each item of `fields` | Top edge, in percent of the page height from the top. |  |  |
| `fields[].width` | number | yes, in each item of `fields` | In percent of the page width. |  |  |
| `fields[].height` | number | yes, in each item of `fields` | In percent of the page height. |  |  |
| `fields[].required` | boolean | no | Default true (false for checkboxes). |  |  |
| `fields[].label` | string | no | Shown to the signer, e.g. "Company name". Up to 120 characters. |  |  |
| `fields[].role` | integer | yes, in each item of `fields` | Whose field: the role's number in roles, from 1. At least 1. |  |  |
| `message` | string | no | The note to signers each time. Up to 2,000 characters. |  |  |
| `order` | string | no |  | `"parallel"`, `"sequential"` | `"parallel"` |
| `expires_in_days` | integer | no | 1 to 90. |  | `30` |

## Example

Written for Hansen & Voss, a restaurant-equipment wholesaler in Hamburg with 60 staff.

MCP: call `esign_save_template` on the MCP server `https://api.conecto.chat/mcp/esign` with these arguments:

```json
{
  "name": "trade-account-agreement",
  "file_id": "0b8e4c1a-5d2f-4f8e-9a51-2c3d4e5f6a7b",
  "title": "Trade account agreement",
  "roles": [
    "Customer",
    "Hansen & Voss"
  ],
  "fields": [
    {
      "role": 1,
      "kind": "signature",
      "page": 1,
      "x": 10,
      "y": 70,
      "width": 30,
      "height": 5
    },
    {
      "role": 1,
      "kind": "date",
      "page": 1,
      "x": 45,
      "y": 70,
      "width": 15,
      "height": 4
    },
    {
      "role": 2,
      "kind": "signature",
      "page": 1,
      "x": 10,
      "y": 82,
      "width": 30,
      "height": 5
    }
  ]
}
```

REST:

```bash
curl https://api.conecto.chat/v1/tools/esign_save_template \
  -H "Authorization: Bearer $CONECTO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "trade-account-agreement", "file_id": "0b8e4c1a-5d2f-4f8e-9a51-2c3d4e5f6a7b", "title": "Trade account agreement", "roles": ["Customer", "Hansen & Voss"], "fields": [{"role": 1, "kind": "signature", "page": 1, "x": 10, "y": 70, "width": 30, "height": 5}, {"role": 1, "kind": "date", "page": 1, "x": 45, "y": 70, "width": 15, "height": 4}, {"role": 2, "kind": "signature", "page": 1, "x": 10, "y": 82, "width": 30, "height": 5}]}'
```

## Response

```json
{
  "call_id": "5f0c8a2e-3b7d-4c1e-9a64-2d8e1f7b0c93",
  "tool": "esign_save_template",
  "status": "succeeded",
  "replayed": false,
  "cost_usd": "$0.001",
  "balance_usd": "$19.75",
  "result": {
    "template": {
      "name": "trade-account-agreement",
      "title": "Trade account agreement",
      "file_id": "0b8e4c1a-5d2f-4f8e-9a51-2c3d4e5f6a7b",
      "roles": [
        "Customer",
        "Hansen & Voss"
      ],
      "fields": [
        {
          "kind": "signature",
          "page": 1,
          "x": 10.0,
          "y": 70.0,
          "width": 30.0,
          "height": 5.0,
          "required": true,
          "label": "",
          "role": 1
        },
        {
          "kind": "date",
          "page": 1,
          "x": 45.0,
          "y": 70.0,
          "width": 15.0,
          "height": 4.0,
          "required": true,
          "label": "",
          "role": 1
        }
      ],
      "message": null,
      "order": "parallel",
      "expires_in_days": 30,
      "updated_at": "2026-10-14T08:00:00+00:00"
    }
  }
}
```

`result`: template: its name, title, PDF, roles and fields (each with its role), note, order and expiry.

## Errors

| Code | Status | When | Fix |
|---|---|---|---|
| `not_found` | 404 | The file is not in the store. | Upload the PDF with files_upload first. |
| `not_pdf` | 400 | The file is not a PDF. | Make one with documents_convert_to_pdf. |
| `invalid_input` | 400 | A role has no signature field, a field does not fit its page, or the name is not lowercase letters, digits and dashes. | Fix what the message names. |
| `limit_reached` | 409 | The account keeps 100 templates already. | Delete one first. |

The refusals every tool can give (401 key, 402 balance, 429 limits) are on the errors page: https://conecto.chat/docs/errors.md

## Related

- [esign_send](https://conecto.chat/tools/esign/esign_send.md): Sends a PDF from the file store to up to 10 people to sign; each gets their own link by email. $0.50 a call.
- [esign_send_template](https://conecto.chat/tools/esign/esign_send_template.md): Sends a saved template to new signers, one per role: one request, or up to 50 at once. $0.50 per request sent.
- [esign_list_templates](https://conecto.chat/tools/esign/esign_list_templates.md): The saved templates, with their roles and fields. Free up to 1,000,000 reads a month.
- [esign_delete_template](https://conecto.chat/tools/esign/esign_delete_template.md): Deletes a saved template; requests already sent from it stay as they are. Free.
- [esign_get](https://conecto.chat/tools/esign/esign_get.md): Where a signature request stands: each signer's status, and the signed PDF once everyone signed. Free up to 1,000,000 reads a month.
- [esign_list](https://conecto.chat/tools/esign/esign_list.md): Signature requests, newest first, optionally of one status. Free up to 1,000,000 reads a month.
- [esign_signing_link](https://conecto.chat/tools/esign/esign_signing_link.md): One signer's signing link, to hand over yourself. Free up to 1,000,000 reads a month.
- [esign_remind](https://conecto.chat/tools/esign/esign_remind.md): Emails everyone who still has to sign a reminder with their link, at most once a day. $0.02 a call.
- [esign_cancel](https://conecto.chat/tools/esign/esign_cancel.md): Stops a request before everyone has signed; signers are told and their links stop working. Free.
