---
title: "Create a template"
method: POST
path: "/v1/org/{orgId}/template"
tags: ["template"]
---

# Create a template

`POST /v1/org/{orgId}/template`

## Path parameters

- `orgId` string, required

## Request body

- CreateTemplate
  - `name` string, required — template name, must be unique to organization
  - `description` string — description of template
  - `content` string — template content
  - `stylesheet` string — template inline stylesheet
  - `fileId` string — file identifier, if the template is based on a PDF file instead of a CQLT template
  - `placements` SignaturePlacement[] — signature zone placements for a file-based template; only valid when fileId is set
    - `type` 'SIGNATURE' | 'NAME' | 'TITLE' | 'DATE' | 'EXPR', required — the kind of placement
    - `x` number, float, required — horizontal position as a fraction (0..1) of page width, from the left edge
    - `y` number, float, required — vertical position as a fraction (0..1) of page height, from the top edge
    - `pageNumber` integer, required — 1-based page number the placement is anchored to
    - `width` number, float — optional width as a fraction (0..1) of page width, reserved for future use
    - `height` number, float — optional height as a fraction (0..1) of page height, reserved for future use
    - `expr` string — carrot expression evaluated against the document's person; required for EXPR placements
    - `signerNumber` integer — 1-based signer this placement binds to; when null, the placement is assigned to a signer by position
  - `type` 'DOCUMENT' | 'EMAIL' — type of template
  - `tags` string[] — tags to organize the purpose of the template
  - `filename` string — document filename CQL
  - `fieldId` string — the field id that will be used to store documents generated by this template
  - `qesFilter` string — filter expression evaluated on each signer for whether to use qualified electronic signature (if it evalutes to true for any signer, QES will be used). If null, defaults to org `qesFilter` setting
  - `isSequential` boolean — whether signers must sign in sequential order; false (the default) means simultaneous signing

## Response `201`

template created

- Template
  - `id` string, required — globally unique id
  - `orgId` string, required — parent organization id
  - `name` string, required — template name, must be unique to organization
  - `description` string — description of template
  - `content` string — template content
  - `stylesheet` string — template inline stylesheet
  - `fileId` string — file identifier, if the template is based on a PDF file instead of a CQLT template
  - `placements` SignaturePlacement[] — signature zone placements for a file-based template; only valid when fileId is set
    - `type` 'SIGNATURE' | 'NAME' | 'TITLE' | 'DATE' | 'EXPR', required — the kind of placement
    - `x` number, float, required — horizontal position as a fraction (0..1) of page width, from the left edge
    - `y` number, float, required — vertical position as a fraction (0..1) of page height, from the top edge
    - `pageNumber` integer, required — 1-based page number the placement is anchored to
    - `width` number, float — optional width as a fraction (0..1) of page width, reserved for future use
    - `height` number, float — optional height as a fraction (0..1) of page height, reserved for future use
    - `expr` string — carrot expression evaluated against the document's person; required for EXPR placements
    - `signerNumber` integer — 1-based signer this placement binds to; when null, the placement is assigned to a signer by position
  - `type` 'DOCUMENT' | 'EMAIL', required — type of template
  - `tags` string[], required — tags to organize the purpose of the template
  - `filename` string — document filename CQL
  - `fieldId` string — the field id that will be used to store documents generated by this template
  - `qesFilter` string — filter expression evaluated on each signer for whether to use qualified electronic signature (if it evalutes to true for any signer, QES will be used). If null, defaults to org `qesFilter` setting
  - `isSequential` boolean — whether signers must sign in sequential order; false (the default) means simultaneous signing
  - `createId` string — created by user id
  - `createBehalfId` string — created on behalf of user id
  - `createAttribution` Attribution
    - `principalUserId` string
    - `agentUserIds` string[]
    - `eventId` string
    - `aiChatId` string
    - `aiToolUseId` string
    - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
  - `createAt` string — created timestamp
  - `updateId` string — last updated by user id
  - `updateBehalfId` string — last updated on behalf of user id
  - `updateAttribution` Attribution
    - `principalUserId` string
    - `agentUserIds` string[]
    - `eventId` string
    - `aiChatId` string
    - `aiToolUseId` string
    - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
  - `updateAt` string — last updated timestamp
  - `deleteId` string — deleted by user id
  - `deleteBehalfId` string — deleted on behalf of user id
  - `deleteAttribution` Attribution
    - `principalUserId` string
    - `agentUserIds` string[]
    - `eventId` string
    - `aiChatId` string
    - `aiToolUseId` string
    - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
  - `deleteAt` string — deleted timestamp

## Other responses

- `400` — invalid data
- `401` — not authorized
- `403` — permission denied
- `404` — org not found

---

[API](https://skmtc.net/charthop/apis/charthop-api.md) · [All operations](https://skmtc.net/charthop/apis/charthop-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/charthop/charthop-api/revisions/33fc84a173ce/schema)
