Sendsay API API

Отрасль: Связь и уведомления. Актуально на 2026-10-24.

API платформы email-маркетинга Sendsay: добавление и изменение контактов, получение их данных, транзакционные и массовые рассылки, стоп-листы, черновики выпусков, статистика, формы и участники сценариев. Все вызовы идут POST-запросом на один адрес аккаунта; действие задаётся полем action в JSON-теле.

Сценарии

Добавить или обновить подписчика

Подписка с сайта или синхронизация клиентов из CRM в Sendsay.

  1. Создай API-ключ вызовом sys.user.apikey.create — лучше на отдельный саблогин с минимальными правами. Все вызовы идут POST-запросом с JSON на https://api.sendsay.ru/general/api/v100/json/<код аккаунта>, действие задаётся полем action.
  2. Проверь доступ: action = pong — в ответе account и sublogin.
  3. Добавь контакт: action = member.set с email, addr_type = email и datakey — тройками «ключ, режим, значение». Например, ["-group.pl21586", "set", "1"] добавит контакт в список pl21586, а анкетные поля пишутся через ключи вида base.firstName.
  4. Получить данные контакта: action = member.get с email.
  5. warnings в ответе означают частичное выполнение, а не ошибку. Ответы 3xx — перенаправления, клиент должен их обрабатывать.
curl -L -X POST "https://api.sendsay.ru/general/api/v100/json/<аккаунт>" \
  -H 'Content-Type: application/json' \
  -d '{
        "action": "member.set",
        "apikey": "<API-ключ>",
        "email": "ivan@example.ru",
        "addr_type": "email",
        "datakey": [
          ["base.firstName", "set", "Иван"],
          ["-group.pl21586", "set", "1"]
        ]
      }'

Отправить транзакционное письмо

Письмо одному получателю по событию: заказ оформлен, оплата получена.

  1. Вызови action = issue.send с group = personal, sendwhen = now и email получателя.
  2. В letter передай subject, from.email (и from.name) и message.html. Значения для подстановки в шаблон — в extra.
  3. В ответе — letter: по нему письмо находится в статистике.
  4. Лимит — 80 запросов в секунду и не больше 5 одновременных запросов на изменение данных; при превышении — 503 rate_limit.
curl -L -X POST "https://api.sendsay.ru/general/api/v100/json/<аккаунт>" \
  -H 'Content-Type: application/json' \
  -d '{
        "action": "issue.send",
        "apikey": "<API-ключ>",
        "sendwhen": "now",
        "group": "personal",
        "email": "ivan@example.ru",
        "letter": {
          "subject": "Заказ №1042 оформлен",
          "from": {"name": "Магазин", "email": "noreply@example.ru"},
          "message": {"html": "<p>Спасибо за заказ! Мы сообщим, когда он будет отправлен.</p>"}
        }
      }'

Запустить массовую рассылку

Рассылка по списку получателей — из готового черновика или с текстом в запросе.

  1. Вызови action = issue.send с group = masssending и sendwhen = now.
  2. В letter передай draft.id существующего черновика — или тему, отправителя и HTML прямо в запросе.
  3. Получателей задай в users.list. Переменные в тексте вида [% anketa.personal.product %] должны совпадать с ключами данных, которые ты передаёшь.
  4. Ход выполнения задания виден в журнале заданий: https://app.sendsay.ru/queue.
curl -L -X POST "https://api.sendsay.ru/general/api/v100/json/<аккаунт>" \
  -H 'Content-Type: application/json' \
  -d '{
        "action": "issue.send",
        "apikey": "<API-ключ>",
        "sendwhen": "now",
        "group": "masssending",
        "letter": {"draft.id": 125},
        "users.list": [
          {"member": {"email": "ivan@example.ru"}, "personal": {"product": "кружка"}},
          {"member": {"email": "anna@example.ru"}, "personal": {"product": "чайник"}}
        ]
      }'

Узнать, кому дошли письма

Статистика доставки по рассылке или по конкретному адресу.

  1. Вызови action = stat.uni с select — нужными полями, например deliv.member.email и deliv.result.
  2. Условия задай в filter: a — поле, op — оператор, v — значение. Для периода используй поля дат.
  3. Большую выгрузку можно сохранить файлом: result с типом save и форматом xlsx.
curl -L -X POST "https://api.sendsay.ru/general/api/v100/json/<аккаунт>" \
  -H 'Content-Type: application/json' \
  -d '{
        "action": "stat.uni",
        "apikey": "<API-ключ>",
        "select": ["deliv.member.email", "deliv.result"],
        "filter": [{"a": "deliv.member.email", "op": "==", "v": "ivan@example.ru"}]
      }'

Базовые URL

Авторизация

Тип: API-ключ

Рекомендуемый способ — API-ключ (создаётся вызовом sys.user.apikey.create, лучше на отдельный саблогин с минимальными правами). Ключ передаётся полем apikey в теле JSON или заголовком Authorization: sendsay apikey=... (ключ URL-кодируется). Аутентификация действует на один вызов, выход не нужен. Также поддерживаются логин с паролем (сессия), JWT, двухфакторная аутентификация и OpenID.

Методы

POST /general/api/v100/json/{account} — member.set: добавление и изменение контакта

Параметр Где Тип Обяз. Описание
account path string да Код аккаунта
action body string да member.set
email body string да Адрес подписчика
addr_type body string нет Тип адреса, например email
datakey body array нет Тройки «ключ данных, режим, значение»; например -group.pl21586, set, 1 — добавить в список (0 — удалить)
obj body object нет Анкетные данные, например блок base

POST /general/api/v100/json/{account} — member.get: данные контакта

Параметр Где Тип Обяз. Описание
account path string да Код аккаунта
action body string да member.get
email body string да Адрес подписчика
addr_type body string нет Тип адреса
datakey body array нет Какие ключи данных вернуть

POST /general/api/v100/json/{account} — issue.send: транзакционное письмо

В ответе — letter, по нему письмо отслеживается в статистике.

Параметр Где Тип Обяз. Описание
account path string да Код аккаунта
action body string да issue.send
sendwhen body string да now — отправить сразу
group body string да personal
email body string да Получатель
letter.subject body string да Тема
letter.from.name body string нет Имя отправителя
letter.from.email body string да Адрес отправителя
letter.message.html body string да HTML-текст
extra body object нет Значения для подстановки в шаблон
relink body integer нет Перелинковка ссылок

POST /general/api/v100/json/{account} — issue.send: массовая рассылка

Переменные в тексте вида [% anketa.personal.product %] должны совпадать с ключами в запросе.

Параметр Где Тип Обяз. Описание
account path string да Код аккаунта
action body string да issue.send
name body string нет Название черновика
sendwhen body string да now
group body string да masssending
letter body object да draft.id существующего черновика либо тема, отправитель и HTML
users.list body object нет Получатели: массив с блоками member и personal или объект caption + rows

POST /general/api/v100/json/{account} — stat.uni: универсальная статистика

Параметр Где Тип Обяз. Описание
account path string да Код аккаунта
action body string да stat.uni
select body array да Поля, например deliv.member.email, deliv.result
filter body array нет Условия a (поле), op (оператор), v (значение); для периода — суффикс :YD
groupby body array нет Группировка
join body object нет Объединение выборок
result body object нет Выгрузка в файл, например тип save, формат xlsx

POST /general/api/v100/json/{account} — pong: проверка доступности и авторизации

В ответе — ping, account, sublogin, via.

Параметр Где Тип Обяз. Описание
account path string да Код аккаунта
action body string да pong

Нюансы

Ошибки

Код Описание
error/auth/failed Ошибка аутентификации
rate_limit Превышен лимит (HTTP 503)

Ограничения

Источники


Если этого недостаточно — официальная документация: https://docs.sendsay.ru/sendsay-api/sendsay-api-guide JSON: https://mcp-everything.ru/api/integrations/sendsay. MCP: https://mcp-everything.ru/mcp