Перейти к содержанию

Notify

POST https://api.pushwoosh.com/messaging/v2/notify

Создает и планирует отправку одного сообщения.

Структура запроса

Anchor link to

Тело запроса — это NotifyRequest с одним из двух видов:

  • segment: нацеливание на сегмент аудитории по коду сегмента или — без предварительного создания сегмента — на выражение seglang или структурированное выражение фильтра.
  • transactional: отправка по явному списку hwids, User ID, push-токенов или тестовых устройств.
Shape
{
"segment": { ... }, // ИЛИ
"transactional": { ... },
"transaction_id": "unique-uuid"
}
ПолеТипОписание
transaction_idstringНеобязательно. Ключ идемпотентности для запроса — работает как с segment, так и с transactional. Повторный вызов с тем же transaction_id в течение 5 минут возвращает исходный message_code вместо отправки дублирующего сообщения. Используйте UUID или другое уникальное значение для каждой логической отправки.

NotifySegment

Anchor link to

Нацеливается на пользователей, которые соответствуют сегменту аудитории или выражению фильтра. Установите ровно одно из полей: code, expression или filter_expression. Для expression и filter_expression не требуется предварительно создавать сегмент — выражение вычисляется “на лету” только для этой отправки.

ПолеТипОписание
scheduleScheduleКогда и как отправлять. Обязательно.
applicationstringКод приложения.
platformsarray of PlatformПлатформы, на которые нацелено сообщение.
codestringКод сегмента, сохраненного заранее. Взаимоисключающий с expression и filter_expression.
expressionstringВыражение Seglang, вычисляемое только для этой отправки — сохраненный сегмент не требуется. Взаимоисключающий с code и filter_expression.
filter_expressionFilterExpressionТа же логика, что и у expression, но в виде структурированного объекта, а не строки seglang. Взаимоисключающий с code и expression. Схема FilterExpression не документирована публично — запросите ее у службы поддержки Pushwoosh, если вам нужна структурированная форма.
payloadPayloadПолезная нагрузка для Push / SMS / Telegram / Kakao / LINE / WhatsApp / Viber / Facebook Messenger. Взаимоисключающий с email_payload.
email_payloadEmailPayloadПолезная нагрузка для Email.
campaignstringКод кампании, к которой относится это сообщение.
campaign_namestringВнутреннее название этого сообщения, отображается как заголовок строки в Message History и в её экспорте. Не связано с campaign выше. Оно не группирует сообщения и не влияет на доставку. Максимум 255 символов, обрезается. Не указывайте это поле или оставьте его пустым, чтобы заголовок строки формировался из содержимого полезной нагрузки.
frequency_cappingFrequencyCappingОграничения частоты для каждого пользователя.
send_rateSendRateОграничение скорости отправки.
message_typeMessageTypeMESSAGE_TYPE_MARKETING (по умолчанию) или MESSAGE_TYPE_TRANSACTIONAL. Управляет фильтрацией по контрольной группе.
dynamic_content_placeholdersmap<string, string>Заменяет плейсхолдеры в контенте.
meta_dataobjectМетаданные в свободной форме, передаваемые в последующие системы аналитики.
use_latest_user_deviceboolЕсли true, доставляет сообщение на последнее активное устройство каждого пользователя (то, у которого самое свежее время последнего открытия приложения), а не на каждое устройство, соответствующее сегменту. Ограничено platforms: учитываются только устройства на этих платформах, и если ни у одного из них нет данных о последнем открытии приложения, используется первое подходящее устройство, а не отменяется отправка. По умолчанию false (отправлять на каждое устройство).
control_groupstringКод или название собственной удерживаемой группы отправки, применяемой к этому сообщению. Не сужает набор контрольных групп, которые действуют: каждая включённая контрольная группа приложения удерживает пользователей от маркетинговых отправок независимо от того, задано ли это поле. Взаимоисключающее с holdout_percentage.
holdout_percentageuint32Отбирает эту долю сегмента (от 1 до 20) в контрольную группу, действующую только для этой отправки, в дополнение к включённым контрольным группам приложения, чтобы измерить эффект одной кампании, не расходуя общие группы. 0 (по умолчанию) отключает отбор. Взаимоисключающее с control_group.

Устройства, отобранные в удерживаемую группу, исключаются из доставки так же, как контрольными группами приложения. Сообщение им не отправляется, а журнал отслеживания фиксирует отсев как Device is in control group. При message_type, равном MESSAGE_TYPE_TRANSACTIONAL, это исключение полностью пропускается — так же, как для контрольных групп приложения.

Если задать holdout_percentage вместе с control_group или указать holdout_percentage больше 20, возвращается 400:

Invalid holdout_percentage
{
"code": 3,
"message": "invalid argument",
"details": [
{
"@type": "type.googleapis.com/google.rpc.BadRequest",
"fieldViolations": [
{
"field": "holdout_percentage",
"description": "holdout_percentage and control_group are mutually exclusive"
}
]
},
{
"@type": "type.googleapis.com/google.rpc.ErrorInfo",
"reason": "InvalidHoldoutPercentage",
"domain": "api.pushwoosh.com",
"metadata": {}
}
]
}

Пример: Отправка сегменту

Anchor link to
Terminal window
curl -X POST https://api.pushwoosh.com/messaging/v2/notify \
-H "Authorization: Token YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"segment": {
"application": "XXXXX-XXXXX",
"platforms": ["IOS", "ANDROID"],
"code": "active_users",
"payload": {
"content": {
"localized_content": {
"en": {
"ios": { "body": "Hello!" },
"android": { "body": "Hello!" }
}
}
}
},
"schedule": { "at": "2026-05-01T12:00:00Z" },
"message_type": "MESSAGE_TYPE_MARKETING"
}
}'

NotifyTransactional

Anchor link to

Отправляет сообщение по явному списку получателей.

ПолеТипОписание
scheduleScheduleОбязательно.
applicationstringКод приложения.
platformsarray of PlatformПлатформы, на которые нацелено сообщение.
test_devicesboolЕсли true, отправлять только на тестовые устройства приложения.
hwids{ "list": [string, ...] }Отправлять только на эти hwids.
users{ "list": [string, ...] }Отправлять только на эти User ID.
push_tokens{ "list": [string, ...] }Отправлять только на эти push-токены.
payloadPayloadПолезная нагрузка для Push / SMS / Telegram / Kakao / LINE / WhatsApp / Viber / Facebook Messenger.
email_payloadEmailPayloadПолезная нагрузка для Email.
return_unknown_identifiersboolЕсли true, поле unknown_identifiers в ответе будет содержать список ненайденных идентификаторов.
use_latest_user_deviceboolПрименяется только при нацеливании на users. Поведение такое же, как в NotifySegment выше — доставляет одно сообщение на пользователя, а не на устройство, в рамках platforms. По умолчанию false.
campaign, campaign_name, frequency_capping, send_rate, message_type, dynamic_content_placeholders, meta_dataСм. NotifySegment выше.

test_devices, hwids, users и push_tokens взаимоисключающие. Должно быть установлено ровно одно из этих полей.

Пример: Транзакционная отправка по User ID

Anchor link to
Terminal window
curl -X POST https://api.pushwoosh.com/messaging/v2/notify \
-H "Authorization: Token YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"transactional": {
"application": "XXXXX-XXXXX",
"platforms": ["IOS", "ANDROID"],
"users": { "list": ["user-123", "user-456"] },
"payload": {
"content": {
"localized_content": {
"en": { "ios": { "body": "Your order has shipped." } }
}
}
},
"schedule": { "at": "2026-05-01T12:00:00Z" },
"message_type": "MESSAGE_TYPE_TRANSACTIONAL",
"return_unknown_identifiers": true,
"use_latest_user_device": true
}
}'

Ответ

Anchor link to
{
"result": {
"message_code": "XXXXX-XXXXX-XXXXX",
"unknown_identifiers": []
}
}
ПолеТипОписание
message_codestringУникальный код сообщения. Используйте его с эндпоинтами /getMessageDetails и статистики сообщений.
unknown_identifiersarray of stringИдентификаторы, не найденные в аккаунте. Заполняется только если в transactional-запросе было установлено return_unknown_identifiers: true.

Общие типы

Anchor link to
{
"at": "2026-05-01T12:00:00Z",
"follow_user_timezone": true,
"past_timezones_behaviour": "PAST_TIMEZONES_BEHAVIOUR_SEND_IMMEDIATELY"
}
ПолеТипОписание
attimestampАбсолютное время отправки (RFC 3339). Если время в прошлом, Pushwoosh подставляет время получения запроса. Если follow_user_timezone не задан или равен false, это означает, что сообщение уходит всем немедленно. О случае follow_user_timezone: true см. предупреждение ниже. Максимум на 30 дней в будущем.
afterdurationАльтернатива at. Отправить через указанный промежуток времени от “сейчас” (например, "3600s"). Максимум 30 дней.
follow_user_timezoneboolЕсли true, каждое устройство получает сообщение в at по своему локальному времени.
past_timezones_behaviourenumPAST_TIMEZONES_BEHAVIOUR_SEND_IMMEDIATELY (по умолчанию), PAST_TIMEZONES_BEHAVIOUR_DO_NOT_SEND или PAST_TIMEZONES_BEHAVIOUR_NEXT_DAY. Имеет смысл только если follow_user_timezone равно true или задан best_time_to_send.
best_time_to_sendtimestampНеобязательно. Только для отправок сегменту. Каждое устройство получает сообщение в свой лучший час в течение 24 часов от этого времени. Устройства без лучшего часа получают его в дату и время из at / after по своему локальному часовому поясу. См. Лучшее время отправки.

Лучшее время отправки

Anchor link to

best_time_to_send — это API-аналог опции Лучшее время в Control Panel. at / after задаёт резервную отправку для устройств, по которым недостаточно данных для определения лучшего часа. Pushwoosh берёт дату и время at / after в UTC и доставляет резервную отправку в эту дату и время по локальному часовому поясу каждого устройства, как при follow_user_timezone: true. Это применяется неявно: не задавайте follow_user_timezone, поскольку значение true отклоняется с BestTimeToSendWithUserTimezone. В примере ниже устройства без лучшего часа получат сообщение 1 мая в 18:00 по местному времени. Там, где это местное время на момент начала отправки уже прошло, действует past_timezones_behaviour.

{
"at": "2026-05-01T18:00:00Z",
"best_time_to_send": "2026-05-01T00:00:00Z"
}

Pushwoosh отклоняет запрос с 400, если не выполнены все следующие условия:

  • Запрос использует вид segment. Отправки transactional не поддерживают best_time_to_send.
  • follow_user_timezone не задан или равен false.
  • Время отправки из at / after находится в будущем. Прошедшее at, after: "0s" или отсутствующий after считаются «отправить сейчас» и отклоняются.
  • best_time_to_send не раньше следующего полного часа и не более чем на 30 дней вперёд. Значение округляется вниз до полного часа.
  • Время отправки из at / after не позже best_time_to_send плюс 24 часа.

Поле reason ошибки (в детали ErrorInfo) указывает, какая проверка не пройдена:

reasonПричина
BestTimeToSendWithUserTimezonefollow_user_timezone равно true.
BestTimeToSendTooEarlybest_time_to_send раньше следующего полного часа.
BestTimeToSendTooFarInFuturebest_time_to_send более чем на 30 дней вперёд.
SendDateAfterBestTimeToSendat / after позже best_time_to_send плюс 24 часа.
BestTimeToSendNotAllowedbest_time_to_send задан для отправки transactional.
BestTimeToSendWithSendNowat / after означает «сейчас» (прошедшее at или нулевой after).

FrequencyCapping

Anchor link to

Ограничения частоты на пользователя для маркетинговых рассылок. Чтобы отключить ограничение, полностью опустите frequency_capping или отправьте days: 0 вместе с count: 0.

{ "days": 7, "count": 3, "exclude": false, "avoid": true }
  • days (int, 1–30, или 0 для отключения): окно ретроспективного анализа. Должно отправляться вместе с count — если одно из полей равно 0, другое также должно быть 0; отправка одного поля как 0, а другого ненулевым, вернет ошибку 400.
  • count (int, 1 или выше, или 0 для отключения): максимальное количество сообщений, разрешенное в течение days. То же правило парности, что и для days выше.
  • exclude (bool): жестко исключать пользователей, которые уже достигли лимита.
  • avoid (bool): мягко избегать пользователей, которые уже достигли лимита (они все равно учитываются в аналитике).
{ "value": 500, "bucket": "1s", "avoid": false }

Ограничивает скорость отправки. value — это количество сообщений в bucket; типичный bucket — "1s".

Перечисление Platform

Anchor link to

IOS, ANDROID, OSX, WINDOWS, AMAZON, SAFARI, CHROME, FIREFOX, IE, EMAIL, HUAWEI_ANDROID, SMS, WEB, KAKAO, TELEGRAM, LINE, WHATS_APP, VIBER, FB_MESSENGER.

Перечисление MessageType

Anchor link to
  • MESSAGE_TYPE_UNSPECIFIED: эквивалентно MESSAGE_TYPE_MARKETING.
  • MESSAGE_TYPE_MARKETING: подлежит фильтрации по контрольной группе и ограничению частоты.
  • MESSAGE_TYPE_TRANSACTIONAL: пропускает фильтрацию по контрольной группе и ограничение частоты. Используйте для подтверждений заказов, одноразовых паролей и подобных критически важных процессов.

Связанные материалы

Anchor link to