Create an email template

POST
/v1/email_templates

Creates a template with a draft holding its variables and a subject, HTML and text per locale. Sends use it once its draft is published. Not idempotent: retrying after a lost response can create a second template (unless it has an alias). Templates belong to the API key's own environment: a coss_test_… key only ever sees sandbox ones. Give a template the same alias in every environment to send it by that name.

Authorization

bearerAuth
headerAuthorizationBearer <token>

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

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

Creates the template and its draft. Publish the draft to send it.

name*string

Shown in the dashboard.

Length1 <= length <= 100
alias?string

A name to send the template by instead of its id, e.g. welcome: the same alias can be used in every environment.

Match^[a-z0-9][a-z0-9_-]{0,63}$
description?string
Lengthlength <= 500
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 template.

application/json
  1. response
object*"email_template"
Value in"email_template"
id*string
alias*string|null
name*string
description*string|null
published_version*|

The version sends use; null until the draft is first published.

published_at*|
Formatdate-time
has_unpublished_changes*boolean

Whether the draft was changed since it was last published.

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.create({  name: "Welcome",  alias: "welcome",  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",  "id": "etpl_01k7c8m4q2f3e9v6t5r1n0p8yz",  "alias": "welcome",  "name": "Welcome",  "description": "Sent after sign-up.",  "published_version": 2,  "published_at": "2026-10-10T12:00:00.000Z",  "has_unpublished_changes": false,  "created_at": "2026-10-01T09:00:00.000Z",  "updated_at": "2026-10-10T12:00:00.000Z"}