Управление черновиками выпусков через 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": "Привет! Рады видеть вас в нашей рассылке."
}
}
}
}
Создание email-черновика с utm-метками
{
"action": "issue.draft.set",
"return_fresh_obj": "1",
"obj": {
"name": "Название шаблона",
"link.qsid": "utm_source=email&utm_medium=newsletter&utm_campaign=summer_sale&utm_content=button&utm_term=discount_10",
"relink": "1",
"relink.param": {
"link": 1,
"test": 0,
"image": 0
},
"letter": {
"message": {
"html": "<html>\n Тело письма\n</html>"
},
"subject": "Тема письма",
"from.email": "sender@example.com",
"from.name": "Название компании"
}
}
}
Изменение существующего черновика
{
"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() автоматически обновляются.