Update a template's draft

PUT
/v1/email_templates/{id}/draft

Replaces the draft's variables and content. Sends keep using the published version until the draft is published. Pass the revision you read to refuse overwriting someone else's changes. A draft with problems is saved (and reported in problems).

Authorization

bearerAuth
headerAuthorizationBearer <token>

A secret API key from the dashboard: coss_live_… for production environments, coss_test_… for sandbox environments.

Path Parameters

id*string

The template's id or alias.

Header Parameters

Coss-Version?"2026-10-10"

The API version (a date) to use for this request. Defaults to your organization's version, pinned to the latest one when it first used the API and upgraded from the dashboard. The SDK always sends the version it was built for.

Value in"2026-10-10"

Request Body

application/json
  1. body

Replaces the whole draft: fields left out are emptied (default_locale falls back to the first locale).

revision?integer

The draft revision you read. When given, the request is refused (template_revision_mismatch) if the draft changed since.

Range1 <= value
default_locale?string

The locale sends fall back to when they ask for none, or for one without content. Defaults to the first entry of contents (or "en").

Lengthlength <= 35
variables?array<>

The variables the template uses, with their types.

Itemsitems <= 50
sample_variables?

Example values for previews and test sends in the dashboard.

contents?array<>

The subject, HTML and text per locale.

Itemsitems <= 30

Response Body

The saved draft.

application/json
  1. response
object*"email_template_version"
Value in"email_template_version"
template_id*string
version*|

The version number; null for the draft.

revision*integer

Counts the draft's saves. A published version keeps the revision it was published from.

default_locale*string
variables*array<>
sample_variables*
contents*array<>
problems*array<>

Syntax errors and undeclared variables per locale and field, which keep a draft from being published. Always empty for published versions.

published_at*|
Formatdate-time
created_at*string
Formatdate-time
updated_at*string
Formatdate-time
import { Coss } from "coss";const coss = new Coss({  apiKey: process.env.COSS_API_KEY,  baseUrl: "https://api.coss.com",});const { data, error } = await coss.email.templates.updateDraft("etpl_01k7c8m4q2f3e9v6t5r1n0p8yz", {  revision: 3,  default_locale: "en",  variables: [    {      name: "first_name",      type: "string",      required: true,    },  ],  sample_variables: {    first_name: "Ada",  },  contents: [    {      locale: "en",      subject: "Welcome, {{first_name}}",      html: "<p>Hi {{first_name}}, thanks for signing up!</p>",    },    {      locale: "de",      subject: "Willkommen, {{first_name}}",      html: "<p>Hallo {{first_name}}, danke für deine Anmeldung!</p>",    },  ],});
{  "object": "email_template_version",  "template_id": "etpl_01k7c8m4q2f3e9v6t5r1n0p8yz",  "version": 2,  "revision": 3,  "default_locale": "en",  "variables": [    {      "name": "first_name",      "type": "string",      "required": true    }  ],  "sample_variables": {    "first_name": "Ada"  },  "contents": [    {      "locale": "en",      "subject": "Welcome, {{first_name}}",      "html": "<p>Hi {{first_name}}, thanks for signing up!</p>",      "text": null    }  ],  "problems": [],  "published_at": "2026-10-10T12:00:00.000Z",  "created_at": "2026-10-10T12:00:00.000Z",  "updated_at": "2026-10-10T12:00:00.000Z"}