---
title: "Update a template"
method: PATCH
path: "/templates/{template_slug}"
tags: ["Catalog"]
---

# Update a template

`PATCH /templates/{template_slug}`

## Request

- Base URL: `https://app.vern.so/api/v1`
- URL: `https://app.vern.so/api/v1/templates/{template_slug}`
- Auth: API key in header `x-api-key`
- TypeScript: <https://skmtc.dev/vern-so/apis/vern-api/docs/templates/:template_slug/patch.ts> (a function with typed inputs; its response is checked against the schema)

Partial update of an active template. The `slug` is frozen — renaming changes only the display name, never the address. `columns` is a full replacement of the column set when present; cross-cell rules stored on the template are always preserved. Edits are refused with `409` while a migration that uses the template is running. `grouping` organises the template list in the dashboard and is not returned by template reads.

## Path parameters

- `template_slug` string, required

## Request body

- object
  - `name` string: New display name. Does not change the slug.
  - `description` string, nullable: The template's knowledge / description. `null` clears it.
  - `grouping` string, nullable: Free-text group label for the dashboard. `null` clears it.
  - `columns` object[]: Full replacement of the column set.
    - `name` string, required
    - `description` string
    - `required` boolean
    - `unique` boolean
    - `desiredRule` string
    - `strictRule` string: Regex pattern for strict validation.

## Response `200`

The updated template.

- Template
  - `slug` string: Stable public identifier.
  - `name` string
  - `description` string, nullable
  - `columns` TemplateColumn[]
    - `name` string
    - `description` string: What the column holds. At most 500 characters for a new or changed value.
    - `required` boolean
    - `unique` boolean
    - `desiredRule` 'none' | 'ai' | 'strict' | 'link'
    - `strictRule` string: Regex the value must match (when desiredRule is strict).
    - `linkRule` object[]: Cross-template references (when desiredRule is link).
      - `templateId` string
      - `columnName` string

## Other responses

- `400`: Malformed request.
- `401`: API key missing, malformed, or revoked.
- `404`: No active template with this slug in your organisation.
- `409`: A migration that uses this template is currently running; edits are refused until it settles.
- `429`: Rate limit hit. Counted per account, not per API key. Creating a migration and starting a `generate` run are limited to 30/hour each; answering a run is limited to 30/hour; reads allow 30/minute and writes 30/minute. `Retry-After` gives the seconds until the window resets, alongside `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset`.

## Changes

- **2026-10-22** `5366d630afe8`: 1 breaking
  - the `columns/items/description` response property's maxLength was increased from `200` to `500` for the response status `200`
- **2026-09-10** `6f056d5508c8`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/vern-so/apis/vern-api/changes/templates/:template_slug/patch.md)

---

[API](https://skmtc.dev/vern-so/apis/vern-api.md) - [All operations](https://skmtc.dev/vern-so/apis/vern-api/llms.txt) - [OpenAPI document](https://skmtc.dev/vern-so/apis/vern-api/revisions/6ae61af2db81?raw)
