Управление черновиками выпусков через API
Черновик выпуска — это сохранённая заготовка письма, в которой хранится содержимое сообщения (параметр letter) и, возможно, параметры выпуска. Черновики используются как шаблоны для отправки выпусков: достаточно указать draft.id в issue.send, и содержимое возьмётся из черновика.
Черновики можно создать для всех каналов: Email, SMS, Web Push, VK, Telegram, Mobile Push и Max.
Доступные операции
| Вызов | Описание |
|---|---|
issue.draft.list | Список черновиков с фильтрацией и сортировкой |
issue.draft.get | Чтение одного черновика |
issue.draft.set | Создание или изменение черновика |
issue.draft.delete | Удаление одного или нескольких черновиков |
issue.draft.preview | Предпросмотр с персонализацией |
Список черновиков — issue.draft.list
Вызов issue.draft.list возвращает список черновиков с возможностью фильтрации и сортировки. Для фильтров и сортировки используются те же правила, что и в stat.uni.
{
"action": "issue.draft.list",
"filter": [{ "a": "issue_draft.channel", "op": "==", "v": "email" }],
"order": ["-issue_draft.update.date"],
"skip": 0,
"first": 50
}
Параметры
| Параметр | Описание |
|---|---|
filter | Обязательно (хотя бы один фильтр). Синтаксис как у stat.uni |
order | Сортировка. Синтаксис как у stat.uni |
skip | Пропустить N записей (по умолчанию 0) |
first | Количество записей (по умолчанию 50, максимум 50) |
Доступные поля для фильтрации и сортировки
| Поле | Описание |
|---|---|
issue_draft.id | id черновика |
issue_draft.name | Название |
issue_draft.channel | Канал: email, sms, viber, push, vk, tg, vknotify, pushapp, max |
issue_draft.create.date | Дата создания (Ys, null) |
issue_draft.update.date | Дата последнего изменения (Ys, null) |
issue_draft.alias | Альтернативный идентификатор |
issue_draft.template | Признак шаблона: 0 — обычный черновик, 1 — предустановленный шаблон с оформлением |
Ответ
{
"list": [
{
"id": 123,
"alias": "welcome-email",
"name": "Приветственное письмо",
"format": "html",
"template": 0,
"create.date": "2026-01-10 14:30:00",
"update.date": "2026-01-15 09:00:00",
"public_preview": "https://...",
"thumbnail": [{ "url": "https://...", "width": 800, "height": 600 }]
}
]
}
Если выбрана последняя часть списка, ответ содержит "last_page": 1.
Альтернативный способ получить список черновиков — использовать stat.uni для области draft.*.
Чтение черновика — issue.draft.get
Вызов issue.draft.get возвращает полные данные черновика: содержимое, настройки выпуска, переменные персонализации и превью.
{
"action": "issue.draft.get",
"id": 123
}
Вместо числового id можно указать альтернативный идентификатор (alias).
Параметры
| Параметр | Описание |
|---|---|
id | id черновика или его alias |
novars | 1 — не возвращать список переменных персонализации |
Ответ
{
"obj": {
"id": 123,
"alias": "welcome-email",
"name": "Приветственное письмо",
"channel": "email",
"format": "html",
"create.date": "2026-01-10 14:30:00",
"update.date": "2026-01-15 09:00:00",
"public_preview": "https://...",
"template": 0,
"letter": {
"subject": "Добро пожаловать!",
"from.name": "Команда Sendsay",
"from.email": "test@test.com",
"message": {
"html": "<h1>Привет!</h1><p>Рады видеть вас.</p>"
}
},
"thumbnail": [{ "url": "https://...", "width": 800, "height": 600 }]
},
"variables": {
"email": {
"header": ["member.email"],
"html": ["member.datakey.base.firstName"]
}
}
}
Блок variables содержит список переменных персонализации, используемых в черновике, с разбивкой по каналам и частям сообщения. Отсутствует при novars: 1 или если у черновика нет letter.
Создание и изменение черновика — issue.draft.set
Вы можете создать новый черновик или изменить существующий вызовом issue.draft.set. При изменении обновляются только указанные параметры — остальные сохраняются как были.
Вызов неприменим к предустановленным шаблонам (template: 1).
Создание email-черновика
{
"action": "issue.draft.set",
"obj": {
"name": "Приветственное письмо",
"alias": "welcome-email",
"letter": {
"subject": "Добро пожаловать, [% member.datakey.base.firstName %]!",
"from.name": "Команда Sendsay",
"from.email": "test@test.com",
"message": {
"html": "<h1>Привет!</h1><p>Рады видеть вас в нашей рассылке.</p>",
"text": "Привет! Рады видеть вас в нашей рассылке."
}
}
}
}
Изменение существующего черновика
{
"action": "issue.draft.set",
"id": "welcome-email",
"obj": {
"letter": {
"subject": "Новая тема письма"
}
}
}
При изменении указывается id (id черновика или alias). Обновляются только переданные поля.
Параметры obj
| Параметр | Описание |
|---|---|
name | Название черновика (обязательно при создании) |
alias | Альтернативный идентификатор (не должен начинаться с цифры, без пробелов). Можно использовать везде вместо числового id |
letter | Содержимое сообщения (обязательно при создании). Структура зависит от канала |
letter.zip | ZIP-архив с HTML и картинками, закодированный в base64 (для Email) |
Дополнительные параметры issue.draft.set:
| Параметр | Описание |
|---|---|
id | id или alias существующего черновика. Если не указан — создаётся новый |
return_fresh_obj | 1 — вернуть данные обновлённого объекта в формате issue.draft.get |
Содержимое параметра letter для разных каналов
Email
Наиболее полный набор параметров. Обязательны: from.email, subject и хотя бы одна версия текста (html или text).
"letter": {
"subject": "Тема письма",
"from.name": "Имя отправителя",
"from.email": "sender@example.com",
"reply.email": "reply@example.com",
"to.name": "[% member.datakey.base.firstName %]",
"message": {
"html": "<h1>Привет!</h1>",
"text": "Привет!",
"amp": "<html amp4email>...</html>"
},
"autotext": 1,
"attaches": [
{ "name": "price.pdf", "content": "base64...", "encoding": "base64" },
{ "url": "https://example.com/file.pdf" }
]
}
| Параметр | Описание |
|---|---|
subject | Тема письма (обязательно) |
from.email | Адрес отправителя (обязательно, должен быть подтверждён) |
from.name | Имя отправителя |
reply.email | Обратный адрес для ответа (должен быть подтверж дён) |
to.name | Имя получателя (поддерживает персонализацию) |
message.html | HTML-версия письма |
message.text | Текстовая версия |
message.amp | AMP-версия |
autotext | Автогенерация текстовой версии из HTML: 0 — выкл, 1 — вкл (ширина 80), число — своя ширина |
attaches | Массив прикреплённых файлов |
prescript | Начальный PROScript, выполняется до формирования сообщения |
Адреса Mail.ru (mail.ru, bk.ru, inbox.ru, list.ru) нельзя использовать как адрес отправителя.
SMS
Обязательны: from.name (должно быть подтве рждено модерацией) и message.sms.
"letter": {
"from.name": "Test",
"message": { "sms": "Ваш код: 1234" }
}
Web Push
Обязательны: subject и message.push.
"letter": {
"subject": "Новая акция",
"message": { "push": "Скидки до 50%!" },
"click.url": "https://example.com/sale",
"icon.url": "https://example.com/icon.png"
}
Telegram
Обязательны: subject и message.tg. Текст в формате MarkdownV2.
"letter": {
"subject": "Рассылка в Telegram",
"message": { "tg": "Привет\\! Новая *акция* уже доступна\\." }
}
Поддерживает встроенные медиа через , кнопки через settings.reply_markup, а также запрос геолокации и номера телефона.
VK
Обязательны: subject и message.vk. Поддерживает встроенные картинки (<img>), видео (<video>) и разбиение на части (<hr />).
VK Notify
Обязательны: from.name и message.vknotify. Содержимое должно быть заранее согласовано с VK. Только выпуски типа personal.
Mobile Push
Обязательны: subject и message.pushapp. Поддерживает settings для платформенных настроек (APNS, FCM, HMS) и data для передачи данных в приложение.
Max
Обязательны: subject и message.max. Текст в формате Markdown. Поддерживает медиа через  и кнопки через settings.
Загрузка HTML из ZIP-архива
Вместо передачи HTML в letter.message.html вы можете загрузить ZIP-архив с вёрсткой и картинками:
{
"action": "issue.draft.set",
"obj": {
"name": "Письмо из архива",
"letter": {
"subject": "Тема письма",
"from.email": "sender@example.com"
},
"letter.zip": "UEsDBBQAAAAI..."
}
}
Из архива берётся первый *.htm(l) файл с наименьшим уровнем вложенности — он становится HTML-версией. Остальные файлы из его каталога загружаются в хранилище картинок, а относительные ссылки в img src и css url() автоматически обновляются.
Удаление параметра из черновика
Чтобы удалить параметр, передайте значение null:
{
"action": "issue.draft.set",
"id": 123,
"obj": {
"letter": { "reply.email": null }
}
}
Удаление черновиков — issue.draft.delete
Вызовом issue.draft.delete вы можете удалить один или несколько черновиков.
Удаление одного
{
"action": "issue.draft.delete",
"id": 123
}
Удаление нескольких
{
"action": "issue.draft.delete",
"id": [123, "welcome-email", 456]
}
В id можно передавать как числовые коды, так и alias.
Предпросмотр черновика — issue.draft.preview
Вызов issue.draft.preview позволяет получить персонализированный вариант сообщения для конкретного адреса ил и с подставленными данными — чтобы оценить, как будет выглядеть письмо.
Также можно получить автоматически сгенерированную текстовую версию из HTML.
По существующему черновику
{
"action": "issue.draft.preview",
"id": 123,
"email": "test@test.com"
}
С произвольными данными персонализации
{
"action": "issue.draft.preview",
"id": 123,
"email": {
"member": {
"email": "test@test.com"
},
"base": {
"firstName": "Анна",
"city": "Москва"
}
}
}
По объекту (без сохранённого черновика)
{
"action": "issue.draft.preview",
"obj": {
"letter": {
"subject": "Привет, [% member.datakey.base.firstName %]!",
"from.email": "hello@example.com",
"message": {
"html": "<p>Здравствуйте, [% member.datakey.base.firstName %]!</p>"
}
}
},
"email": "test@test.com"
}
Получение текстовой версии из HTML
{
"action": "issue.draft.preview",
"id": 123,
"autotext": 1
}
Параметр autotext: 1 — ширина 80 символов, число — своя ширина строки. Возвращает HTML, преобразованный в текст с сохранением команд персонализации.
Параметры
| Параметр | Описание |
|---|---|
id | id или alias черновика (один из id или obj.) |
obj | Объект с letter для предпросмотра без сохранённого черновика |
email | Адрес для данных персонализации или объект с произвольными данными |
addr_type | Тип адреса (не обязательно) |
autotext | Получить текстовую версию из HTML |
extra | Дополнительные данные персонализации (как в issue.send) |
Ответ
{
"format": "html",
"letter": {
"subject": "Привет, Анна!",
"from.email": "hello@example.com",
"message": {
"html": "<p>Здравствуйте, Анна!</p>"
}
}
}
Симуляция отправки письма
Вызов issue.draft.preview поддерживает расширенный режим — полную симуляцию отправки. В этом режиме генерируется настоящее письмо так, как оно выглядело бы при реальной рассылке, включая заголовки, обратный адрес и обработку ссылок.
Режим активируется параметром issue. Параметры соответствуют формату issue.send: в issue.letter указывается черновик или содержимое, а в самом issue — настройки ссылок и прочие параметры выпуска.
В этом режиме необязательные поля (тема, адрес отправителя) можно не указывать. Параметры sendwhen, mca, users.list, users.url игнорируются. Если email не указан, подставляется тестовый адрес.
{
"action": "issue.draft.preview",
"email": "test@test.com",
"issue": {
"letter": {
"draft.id": 123
}
}
}
Можно передать содержимое напрямую, без черновика:
{
"action": "issue.draft.preview",
"email": "test@test.com",
"group": "personal",
"issue": {
"letter": {
"subject": "Тестовая тема",
"from.email": "hello@example.com",
"message": {
"html": "<p>Привет, [% member.datakey.base.firstName %]!</p>"
}
}
}
}
Ответ в режиме симуляции
Для Email возвращается полное сообщение с заголовками:
{
"channel": "email",
"to.email": "test@test.com",
"mailfrom": "email-0-0-123-test@mail.sendsay.ru",
"message": {
"html": "<p>Привет, Анна!</p>",
"text": "Привет, Анна!",
"header": "Return-Path: <email-0-0-123-test@mail.sendsay.ru>\r\nFrom: ...",
"header.tags": {
"return-path": ["<email-0-0-123-test@mail.sendsay.ru>"],
"date": ["Fri, 31 Aug 2026 14:29:50 +0300"],
"to": ["<anna@example.com>"],
"from": ["Команда Sendsay <hello@example.com>"],
"subject": ["Тестовая тема"]
}
}
}
Для других каналов вместо объекта message возвращается строка с текстом сообщения.
Использование черновика при отправке
Чтобы отправить выпуск по черновику, укажите draft.id в параметре letter вызова issue.send:
{
"action": "issue.send",
"letter": {
"draft.id": 123
},
"group": "personal",
"email": "test@test.com"
}
Параметры, указанные в issue.send, имеют приоритет над параметрами из черновика.
Особенности управления черновиками выпусков через API
- При изменении черновика обновляются только переданные поля. Чтобы удалить поле, передайте
null. - Альтернативный идентификатор (
alias) не должен начинаться с цифры и не должен содержать пробелы. - Вызов
issue.draft.setнельзя применять к предустановленным шаблонам (template: 1). - Список черновиков также можно получить через
stat.uniдля областиdraft.*с более гибкой фильтрацией. - Для Telegram экранируйте управляющие символы MarkdownV2. При использовании переменных персонализации внутри форматирования добавляйте пробел перед закрывающим символом:
_[% переменная %] _. - Для VK Notify содержимое должно быть заранее согласовано с VK.