Skip to the documentation
API

Retrieve a template

Takes the id or the slug. The newest version comes back in full, body included.

GETapi.openemail.uk/templates/{id}

Runs the real call against your workspace, with your own key.

GET /templates/{id}

Takes the id or the slug. The newest version comes back in full, body included.

Example

Needs templates:read. Ids carry a tpl_ prefix and slugs cannot, so the two vocabularies cannot collide on this path.

curl
curl "$OE/templates/order-shipped" -H "$AUTH"
Response
{  "object": "template",  "id": "tpl_9c1f0a4b7e05d3862c1f0a44",  "name": "Order shipped",  "slug": "order-shipped",  "status": "active",  "publishedVersion": 3,  "latestVersion": 4,  "subject": "Order {{orderId}} is on its way",  "engine": "html",  "slots": [],  "props": [{ "key": "orderId", "kind": "text", "required": true, "default": null }],  "latest": {    "object": "template_version",    "id": "tplv_5d31c2a8…",    "templateId": "tpl_9c1f0a4b7e05d3862c1f0a44",    "version": 4,    "state": "draft",    "engine": "html",    "subject": "Order {{orderId}} is on its way",    "slots": [],    "props": [{ "key": "orderId", "kind": "text", "required": true, "default": null }],    "document": null,    "html": "<p>Hello {{customer}}, {{orderId}} left the warehouse.</p>",    "createdAt": "2026-08-28T16:03:10.000Z",    "publishedAt": null  },  "createdAt": "2026-08-01T09:12:44.000Z",  "updatedAt": "2026-08-28T16:03:10.000Z"}

latest is the NEWEST version, which is the draft when there is an unpublished edit. The fields beside it (subject, engine, slots, props) describe the PUBLISHED one, because that is what a send resolves.

document is the block tree and is null under engine: "html"; html is the markup as submitted and is null under engine: "blocks". Only a single retrieval carries either. A list of versions each holding a full tree is a payload nobody asked for.