---
slug: "sendsay"
name: "Sendsay API"
vendor: "Sendsay"
industry: "communications"
docsUrl: "https://docs.sendsay.ru/sendsay-api/sendsay-api-guide"
version: 2
updatedAt: "2026-10-24"
---

# Sendsay 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 — перенаправления, клиент должен их обрабатывать.

```bash
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.

```bash
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.

```bash
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.

```bash
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

- Боевой: `https://api.sendsay.ru`
- Адрес вызова: `https://api.sendsay.ru/general/api/v100/json/{account}`

## Авторизация

Тип: 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 |

## Нюансы

- Тело — JSON в UTF-8 с `Content-Type: application/json`; обязательное поле — `action`; размер запроса — до 400 МБ.
- Ответы с кодами 3xx — перенаправления, клиент обязан их обрабатывать.
- Массив `warnings` означает частичное выполнение, а не ошибку.
- При `error/auth/failed` с уточнением `force_change_password` смените пароль через `sys.user.set` и повторите запрос.
- Результаты импорта и других заданий видны в журнале заданий (`https://app.sendsay.ru/queue`).
- Есть также вызовы стоп-листов, черновиков, форм, участников сценариев и Stream API.

## Ошибки

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

## Ограничения

- 80 запросов в секунду.
- До 10 одновременных запросов, из них до 5 на изменение данных.
- До 400 МБ на запрос.

## Источники

- [Гайд по работе с API](https://docs.sendsay.ru/sendsay-api/sendsay-api-guide)
- [Шаблоны API-запросов](https://docs.sendsay.ru/sendsay-api/api-request-templates)
- [Работа с API](https://docs.sendsay.ru/sendsay-api)

---

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