Sendsay API — Руководство по работе
- Общие сведения
- Формат запроса
- Аутентификация
- Формат ответа
- Синхронные и асинхронные вызовы
- Отслеживание асинхронных запросов
- Лимиты и ограничения
- Идентификация запросов (request.id)
- Пакетные запросы (batch)
- Кэширование ответов
- Возвращаемое значение и способы получения результата
- Представление данных
- Порядок обработки вызовов
- Защищённые сущности
- Логины и пароли в ссылках
- Готовые библиотеки
Полная документация Sendsay API
Общие сведения
Sendsay API — это HTTP-интерфейс для управления рассылками, подписчиками, статистикой и другими объектами системы. Взаимодействие с API происходит через JSON-запросы, которые отправляются методом POST.
Параметры подключения
- Транспорт: HTTPS (HTTP 1.0/1.1)
- Шифрование: TLS 1.2 или TLS 1.3
- Адрес API:
https://api.sendsay.ru
Рекомендуется использовать расширение SNI.
Имя api.sendsay.ru имеет несколько IP-адресов. Если соединение с одним из них не устанавливается, рекомендуется повторить запрос с использованием другого.
Для работы с API в CDP поддерживается ГОСТ-шифрование. Это дополнительная услуга. Чтобы подключить её, .
Формат запроса
Endpoint
POST https://api.sendsay.ru/general/api/v100/json/account
Где account — код вашего аккаунта (совпадает с основным логином).
Для вызовов, не требующих привязки к аккаунту (например, ping), используйте символ -:
POST https://api.sendsay.ru/general/api/v100/json/-
Тело запроса
Основные требования к телу запроса:
- Content-Type:
application/json. - Кодировка: UTF-8.
- Максимальный размер: 400 Мбайт.
Запрос — это JSON-объект с обязательным полем action:
{
"action": "название_действия",
"session": "идентификатор_сессии",
"параметр1": "значение1",
"параметр2": "значение2"
}
Используйте готовые функции вашего языка программирования для сериализации JSON. «Красивое» форматирование пробелами необязательно — его отсутствие уменьшает размер запроса и ускоряет обработку.
Аутентификация
Для автоматической работы по API создавайте отдельный саблогин с максимально ограниченными правами и используйте для него API-ключ или JWT-токен.
Sendsay API поддерживает несколько способов аутентификации. Ниже подробно описан рекомендуемый для автоматизации способ — API-ключ. Остальные способы смотрите в документации API.
API-ключ (рекомендуется для автоматизации)
Создайте API-ключ заранее вызовом sys.user.apikey.create.
Аутентификация действует на один вызов и не требует logout. Процессы, запущенные асинхронными вызовами, продолжат работу до завершения.
В теле запроса:
{
"action": "нужное_действие",
"apikey": "ваш_ключ_api",
"...": "..."
}
В HTTP-заголовке:
Authorization: sendsay apikey=ключ-api-url-кодированный
Другие способы аутентификации
| Способ | Описание | Документация |
|---|---|---|
| Логин и пароль (сессия) | Классическая аутентификация через login / logout. Сессия живёт несколько часов | Подробнее |
| JWT-токен | Аутентификация по подписанному токену (RFC 7519). Подходит для серверного взаимодействия | Подробнее |
| Двухфакторная аутентификация (SMS) | Логин + пароль с подтверждением кодом из SMS | Подробнее |
| OpenID | Аутентификация через внешний OpenID-провайдер. Для настройки | Подробнее |
Формат ответа
Ответ — JSON в кодировке UTF-8 (Content-Type: application/json).
HTTP-статусы
| Статус | Значение |
|---|---|
| 200 | Нормальный ответ |
| 3xx | Перенаправления (необходимо обрабатывать) |
| 503 | Превышение лимита запросов (rate_limit) |
| Прочие | Неизвестная ошибка — повторите запрос |
Общие поля ответа
Каждый ответ может содержать следующие служебные поля:
{
"request.id": "значение из запроса",
"duration": "время обработки в секундах",
"_ehid": "служебная строка для отладки"
}
Успешный ответ
{
"request.id": "...",
"поле_результата_1": "значение",
"поле_результата_2": "значение"
}
Ответ с ошибкой
При ошибке в ответе появляется массив errors:
{
"errors": [
{
"id": "код_ошибки",
"explain": "описание ошибки"
}
]
}
Поле explain может быть строкой, массивом или объектом — в зависимости от вызова и ошибки.
Некоторые вызовы также возвращают массив warnings — это события, которые помешали выполнить вызов частично, но не делают его ошибочным.
Специальный случай: требуется смена пароля
Если вы получили ошибку error/auth/failed с уточнением force_change_password, для продолжения работы необходимо:
- Сменить пароль через вызов
sys.user.setс разовой аутентификацией. - Повторить исходный запрос (он не был выполнен). Может потребоваться новая сессия.
Синхронные и асинхронные запросы
Синхронные запросы
По умолчанию запросы синхронны — запрошенное действие выполняется (или не выполняется при ошибке) к моменту ответа. Результат содержится непосредственно в ответе.
Асинхронные запросы
Асинхронный запросы означает, что действие принято в очередь, и будет выполнено позже. В ответе возвращается track.id — номер трекера для отслеживания статуса запроса через track.get.
Примеры асинхронных запросов: issue.send, member.import, stat.uni, member.list и другие.
Отслеживание асинхронных запросов
Получение состояния запроса
{
"action": "track.get",
"id": 12345
}
Ответ содержит поле obj с подробной информацией: статус, дата создания, параметры запроса, прогресс выполнения (ETA) и результаты.
Основные статусы трекера
| Код | Значение |
|---|---|
| -7 | Приостановлен |
| -6 | Не прошёл модерацию |
| -5 | На премодерации |
| -4 | Отложенное действие |
| -3 | Отменён |
| -2 | Завершился с ошибкой |
| -1 | Завершился успешно |
| 0 | Принят |
| 1 | Запущен |
| 2 | Начата обработка |
| 3–6 | Промежуточные этапы (сортировка, форматирование, генерация отчёта, антиспам) |
Список всех трекеров
{
"action": "track.list",
"filter": [],
"order": [],
"skip": 0,
"first": 50
}
Информация о запросах старше двух месяцев удаляется автоматически. Для issue.send/personal — через два дня.
Отмена и пауза
Для трекеров в состояниях 0, 1 или 2 можно установить статус «отменён» (-3) или «пауза» (-7, только для member.import):
{
"action": "track.set",
"id": 12345,
"status": -3
}
Уже совершённые действия останутся в силе. Отмена прекращает обработку только оставшейся части списка действий.
Лимиты и ограничения
| Параметр | Значение |
|---|---|
| Одновременных запросов на изменение данных | 5 |
| Одновременных запросов всего | 10 |
| Запросов в секунду | 80 |
| Максимальный размер запроса | 400 Мбайт |
При превышении лимитов вы получите ошибку rate_limit с HTTP-кодом 503.
Идентификация запросов (request.id)
Необязательный параметр request.id помогает при отладке и обращениях в службу поддержки. Он возвращается в ответе без изменений.
Способы передачи
В URL:
https://api.sendsay.ru/general/api/v100/json/account?request.id=мой-запрос-123
В теле запроса:
{
"action": "...",
"request.id": "мой-запрос-123"
}
В HTTP-заголовке:
X-Request-ID: мой-запрос-123
Нельзя указывать request.id несколькими способами одновременно — это вызовет ошибку double_request.id.
Защита от дублирования
Для некоторых вызовов повторный запрос с тем же request.id в течение 15 минут вернёт ошибку repeated_request.id. Это правило действует для следующих вызовов:
issue.sendissue.send.multimember.importmember.import.probemember.sendconfirm
Время защиты можно увеличить (до 2 часов) через параметр repeated_request_ttl (в секундах).