Перейти к основному содержимому
Опубликовано: 

Управление черновиками выпусков через 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.idid черновика
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).

Параметры

ПараметрОписание
idid черновика или его alias
novars1 — не возвращать список переменных персонализации

Ответ

{
"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.zipZIP-архив с HTML и картинками, закодированный в base64 (для Email)

Дополнительные параметры issue.draft.set:

ПараметрОписание
idid или alias существующего черновика. Если не указан — создаётся новый
return_fresh_obj1 — вернуть данные обновлённого объекта в формате 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.htmlHTML-версия письма
message.textТекстовая версия
message.ampAMP-версия
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, преобразованный в текст с сохранением команд персонализации.

Параметры

ПараметрОписание
idid или 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.