Templates

Handlebars and Markdown templates, and rendering one without sending.

Guides: Templates.

MethodPathOperationScope
GET/v1/templatesList templatesread
POST/v1/templatesCreate a templatewrite
GET/v1/templates/{templateId}Get a templateread
PATCH/v1/templates/{templateId}Update a templatewrite
DELETE/v1/templates/{templateId}Delete a templatewrite
POST/v1/template-rendersRender a template without sendingread

List templates

GET
/v1/templates

Runs in your browser against api.workwae.com with the key you enter. Use a read-only key, limited to a test account if you can.

Newest first, without their content (GET /v1/templates/{templateId} has it). accountId lists those bound to that account; usableBy those the account may send with (the tenant's shared ones and its own); name the ones of that exact name, one per scope; query those whose name contains it, ignoring case.

Required scope: read.

Query Parameters

limit?integer
Range1 <= value <= 200
Default50
cursor?string
Length1 <= length <= 512
accountId?string
Formatuuid
usableBy?string
Formatuuid
name?string
Lengthlength <= 255
query?string
Lengthlength <= 255

Response Body

OK

application/json
  1. response
items*array<>
nextCursor*|null
Example Request
curl -X GET 'https://api.workwae.com/v1/templates'
Example Response
{  "items": [    {      "id": "c4e6a8b0-1d3f-4a5c-8e7b-9d1f3a5c7e9b",      "accountId": "6f1c2a4e-8b3d-4e5f-9a7b-1c2d3e4f5a6b",      "name": "string",      "description": "Production",      "source": "handlebars",      "externalRef": "user_42",      "createdAt": "2026-05-04T09:30:00.000Z",      "updatedAt": "2026-05-04T09:30:00.000Z"    }  ],  "nextCursor": "eyJ0eG5pZCI6IjQyIiwiaWQiOjEwMDF9"}

Create a template

POST
/v1/templates

Runs against the live API with the key you enter: this change really happens. Use a key limited to a test account.

Every field is checked to compile as Handlebars.

Required scope: write.

Request Body

application/json
  1. body
accountId?string
Formatuuid
name*string
Length1 <= length <= 255
description?string
Lengthlength <= 1000
subject?string
Lengthlength <= 2000
html?string
Lengthlength <= 1000000
text?string
Lengthlength <= 1000000
previewText?string
Lengthlength <= 2000
format?TemplateFormat
Default"html"
Value in"html""markdown"
source?TemplateSource
Default"handlebars"
Value in"handlebars""react-email"
externalRef?string
Lengthlength <= 255

Response Body

OK

application/json
  1. response
id*string
Formatuuid
accountId*|null
name*string
description*string|null
source*TemplateSource
Value in"handlebars""react-email"
externalRef*string|null
createdAt*string
Formatdate-time
updatedAt*string
Formatdate-time
subject*|null
html*|null
text*|null
previewText*|null
format*TemplateFormat
Value in"html""markdown"
Example Request
curl -X POST 'https://api.workwae.com/v1/templates' \  -H 'Content-Type: application/json' \  -d '{  "name": "string"}'
Example Response
{  "id": "c4e6a8b0-1d3f-4a5c-8e7b-9d1f3a5c7e9b",  "accountId": "6f1c2a4e-8b3d-4e5f-9a7b-1c2d3e4f5a6b",  "name": "string",  "description": "Production",  "source": "handlebars",  "externalRef": "user_42",  "createdAt": "2026-05-04T09:30:00.000Z",  "updatedAt": "2026-05-04T09:30:00.000Z",  "subject": "Quarterly report",  "html": "string",  "text": "string",  "previewText": "string",  "format": "html"}

Get a template

GET
/v1/templates/{templateId}

Runs in your browser against api.workwae.com with the key you enter. Use a read-only key, limited to a test account if you can.

Required scope: read.

Path Parameters

templateId*string
Formatuuid

Response Body

OK

application/json
  1. response
id*string
Formatuuid
accountId*|null
name*string
description*string|null
source*TemplateSource
Value in"handlebars""react-email"
externalRef*string|null
createdAt*string
Formatdate-time
updatedAt*string
Formatdate-time
subject*|null
html*|null
text*|null
previewText*|null
format*TemplateFormat
Value in"html""markdown"
Example Request
curl -X GET 'https://api.workwae.com/v1/templates/c0e1bf1f-c03b-4b05-acbf-794066d1e730'
Example Response
{  "id": "c4e6a8b0-1d3f-4a5c-8e7b-9d1f3a5c7e9b",  "accountId": "6f1c2a4e-8b3d-4e5f-9a7b-1c2d3e4f5a6b",  "name": "string",  "description": "Production",  "source": "handlebars",  "externalRef": "user_42",  "createdAt": "2026-05-04T09:30:00.000Z",  "updatedAt": "2026-05-04T09:30:00.000Z",  "subject": "Quarterly report",  "html": "string",  "text": "string",  "previewText": "string",  "format": "html"}

Update a template

PATCH
/v1/templates/{templateId}

Runs against the live API with the key you enter: this change really happens. Use a key limited to a test account.

Only the fields given change; queued sends keep what they were rendered with.

Required scope: write.

Path Parameters

templateId*string
Formatuuid

Request Body

application/json
  1. body
name?string
Length1 <= length <= 255
description?|null
subject?|null
html?|null
text?|null
previewText?|null
format?TemplateFormat
Value in"html""markdown"
source?TemplateSource
Value in"handlebars""react-email"
externalRef?|null

Response Body

OK

application/json
  1. response
id*string
Formatuuid
accountId*|null
name*string
description*string|null
source*TemplateSource
Value in"handlebars""react-email"
externalRef*string|null
createdAt*string
Formatdate-time
updatedAt*string
Formatdate-time
subject*|null
html*|null
text*|null
previewText*|null
format*TemplateFormat
Value in"html""markdown"
Example Request
curl -X PATCH 'https://api.workwae.com/v1/templates/c0e1bf1f-c03b-4b05-acbf-794066d1e730' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "id": "c4e6a8b0-1d3f-4a5c-8e7b-9d1f3a5c7e9b",  "accountId": "6f1c2a4e-8b3d-4e5f-9a7b-1c2d3e4f5a6b",  "name": "string",  "description": "Production",  "source": "handlebars",  "externalRef": "user_42",  "createdAt": "2026-05-04T09:30:00.000Z",  "updatedAt": "2026-05-04T09:30:00.000Z",  "subject": "Quarterly report",  "html": "string",  "text": "string",  "previewText": "string",  "format": "html"}

Delete a template

DELETE
/v1/templates/{templateId}

Runs against the live API with the key you enter: this change really happens. Use a key limited to a test account.

Queued sends keep their rendered content.

Required scope: write.

Path Parameters

templateId*string
Formatuuid

Response Body

OK

application/json
  1. response
Example Request
curl -X DELETE 'https://api.workwae.com/v1/templates/c0e1bf1f-c03b-4b05-acbf-794066d1e730'
Example Response
null
POST
/v1/template-renders

Runs against the live API with the key you enter: this change really happens. Use a key limited to a test account.

Renders a stored template (templateId) or inline fields with params, as a send would. account.email and account.name come from accountId, else from the template's own account, else render empty.

Required scope: read.

Request Body

application/json
  1. body
templateId?string
Formatuuid
accountId?string
Formatuuid
subject?string
Lengthlength <= 2000
html?string
Lengthlength <= 1000000
text?string
Lengthlength <= 1000000
previewText?string
Lengthlength <= 2000
format?TemplateFormat
Value in"html""markdown"
params?
Default{}

Response Body

OK

application/json
  1. response
subject*string|null
html*string|null
text*string|null
previewText*string|null
Example Request
curl -X POST 'https://api.workwae.com/v1/template-renders' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "subject": "Quarterly report",  "html": "string",  "text": "string",  "previewText": "string"}