API
List versions
Every revision, newest first and a page at a time, with the declared keys each one expects.
GET/templates/{id}/versions
Runs the real call on your workspace.
GET /templates/{id}/versions
Every revision, newest first and a page at a time, with the declared keys each one expects.
Example
Needs templates:read. Takes limit (1 to 100, 25 by default) and cursor, and answers with hasMore and nextCursor: every publish adds a version, so follow nextCursor while hasMore is true to reach version 1. Bodies are left out here. Read one version with its body at GET /templates/{id}/versions/{version}.
curl "$OE/templates/order-shipped/versions?limit=1" -H "$AUTH"{ "object": "list", "data": [ { "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 }], "publishedAt": null, "createdAt": "2026-08-28T16:03:10.000Z" } ], "hasMore": true, "nextCursor": "WzRd"}This is the call that answers "what did we actually send in June". props is versioned with the body, so an old message can be read against the keys that were declared at the time rather than against today’s.