Список шаблонов
Все шаблоны подключения, новые сверху, с keyset-пагинацией.
Выполняет настоящий запрос в вашем рабочем пространстве, с вашим собственным ключом.
GET /templates
Все шаблоны подключения, новые сверху, с keyset-пагинацией.
Два движка
export OE=https://api.openemail.ukexport AUTH="Authorization: Bearer $OPENEMAIL_API_KEY"Шаблон — это тело, сохранённое один раз и отправляемое много раз, и принадлежит оно ПОДКЛЮЧЕНИЮ, а не тому, кто его написал. Ключ рабочего пространства видит те же шаблоны, что и коллега, а удаление аккаунта автора не забирает их с собой.
engine: "blocks" хранит дерево, виды узлов которого — это экспорты @react-email/components (Section, Row, Column, Container, Text, Heading, Button, Link, Img, Hr, Markdown, CodeBlock и CodeInline), а свойства — собственные свойства этих компонентов. Оно проверяется на входе, так что неправильный узел — это 422 на том вызове, который его записал, а не сломанное письмо позже.
engine: "html" хранит разметку, которая у вас уже есть, санируемую один раз при публикации версии. За этим вариантом стоит идти, когда ваши шаблоны — это компоненты react-email, живущие в вашем собственном репозитории: отрендерьте компонент через @react-email/render в своей сборке и отправьте результат. Эндпоинта для JSX нет и не будет. API принимает HTML, потому что именно HTML читает почтовый клиент, а выполнение чужого компонента потребовало бы песочницы, которая никому не нужна.
| Объявлено как | Заполняет | Отсутствует при отправке |
|---|---|---|
| `slots` | тот, кто редактирует шаблон | отрисовывается собственный default слота |
| `props` | тот, кто отправляет | missing_template_prop, 422, и почта не уходит |
Оба пишутся как {{key}} в теле и в теме, и у обоих есть kind (text, url или image), который решает, как значение экранируется при подстановке. Ключ, который нигде не объявлен, ломается при публикации; значение url, чья схема не http, https или mailto, отклоняется, а не отрисовывается.
Опубликованная версия заморожена. Правка тела опубликованного шаблона порождает новый черновик, а не меняет то, что разрешают живые отправки, так что коллега, переписывающий текст, не может изменить то, что уже отправляет ваш код, а закреплённая version не даст ему изменить это и в момент публикации.
Пример
Требует templates:read. limit доходит до 100, status сужает до draft, active или archived, а cursor непрозрачен, так что возвращайте выданный вам nextCursor, а не собирайте его сами.
curl "$OE/templates?limit=25&status=active" -H "$AUTH"{ "object": "list", "data": [ { "object": "template", "id": "tpl_9c1f0a4b7e05d3862c1f0a44", "name": "Order shipped", "slug": "order-shipped", "description": null, "status": "active", "publishedVersion": 3, "latestVersion": 4, "createdAt": "2026-08-01T09:12:44.000Z", "updatedAt": "2026-08-28T16:03:10.000Z" } ], "hasMore": false, "nextCursor": null}publishedVersion — то, что разрешает отправка без version, а latestVersion — черновик, лежащий поверх. Их расхождение означает, что кто-то отредактировал и не опубликовал. Это не ошибка, и её стоит показать в журнале развёртывания.
Строка — это метаданные. Объявленные slots и props приходят при получении шаблона, и именно этот вызов нужен, когда надо узнать, что в него передавать.