Skip to the documentation
API

Read one version

One revision with its body, so you can see what an old version holds without restoring it.

GETapi.openemail.uk/templates/{id}/versions/{version}

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

GET /templates/{id}/versions/{version}

One revision with its body, so you can see what an old version holds without restoring it.

Example

Needs templates:read. The version list leaves bodies out. This is where they are.

curl
curl "$OE/templates/order-shipped/versions/3" -H "$AUTH"
Response
{  "object": "template_version",  "id": "tplv_5d31c2a8…",  "templateId": "tpl_9c1f0a4b7e05d3862c1f0a44",  "version": 3,  "state": "published",  "engine": "blocks",  "subject": "Order {{orderId}} is on its way",  "slots": [],  "props": [{ "key": "orderId", "kind": "text", "required": true, "default": null }],  "document": {    "preview": "Your order is on its way",    "tailwind": false,    "fonts": [],    "body": [{ "kind": "Heading", "text": "Order {{orderId}} is on its way" }],    "slots": [],    "props": [{ "key": "orderId", "kind": "text", "required": true, "default": null }]  },  "html": null,  "publishedAt": "2026-07-14T09:12:44.000Z",  "createdAt": "2026-07-14T09:10:02.000Z"}

Reading a version changes nothing. Restoring one moves the draft, so this is the call for a diff, an audit, or lifting a block out of a design you have since replaced. POST /templates/{id}/versions/{version}/restore is still what brings it back.

Only one of document and html holds anything, and engine says which. html is the markup exactly as it was submitted, before the publish-time sanitiser, so it is what to send back on a PATCH rather than what the recipient received.

A number nobody published, or one that was deleted, is a 404 template_version_not_found. Numbers are never reused, so a deleted one stays gone.