---
title: "List versions"
description: "Every revision, newest first and a page at a time, with the declared keys each one expects."
url: "https://nextmail.sh/docs/api/templates/versions"
area: "API"
category: "Mailbox"
---

# List versions

Every revision, newest first and a page at a time, with the declared keys each one expects.

`GET /templates/{id}/versions`

## 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**

```
curl "$OE/templates/order-shipped/versions?limit=1" -H "$AUTH"
```

**Response**

```
{
  "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.

## Reference

- [`GET /templates/{id}/versions`](https://nextmail.sh/docs/api/reference/templates#get-templates-id-versions): full reference
