Notify
POST https://api.pushwoosh.com/messaging/v2/notify
Creates and schedules a single message.
Request structure
Anchor link toThe request body is a NotifyRequest with exactly one of two kinds:
segment: target an audience segment by segment code, a seglang expression, or a structured filter expression.transactional: send to an explicit list of hwids, user IDs, push tokens, or test devices.
{ "segment": { ... }, // OR "transactional": { ... }, "transaction_id": "unique-uuid"}| Field | Type | Description |
|---|---|---|
transaction_id | string | Optional. Idempotency key for the request — works with both segment and transactional. A repeat call with the same transaction_id within 5 minutes returns the original message_code instead of sending a duplicate message. Use a UUID or another value unique per logical send. |
NotifySegment
Anchor link toTargets users who match an audience segment or filter expression.
| Field | Type | Description |
|---|---|---|
schedule | Schedule | When and how to send. Required. |
application | string | Application code. |
platforms | array of Platform | Platforms the message targets. |
code | string | Segment code. Mutually exclusive with expression and filter_expression. |
expression | string | Seglang expression. |
filter_expression | FilterExpression | Structured filter expression (advanced). |
payload | Payload | Push / SMS / Telegram / Kakao / LINE / WhatsApp / Viber payload. Mutually exclusive with email_payload. |
email_payload | EmailPayload | Email payload. |
campaign | string | Campaign code to attribute this message to. |
frequency_capping | FrequencyCapping | Per-user frequency limits. |
send_rate | SendRate | Throttling for the send. |
message_type | MessageType | MESSAGE_TYPE_MARKETING (default) or MESSAGE_TYPE_TRANSACTIONAL. Controls control-group filtering. |
dynamic_content_placeholders | map<string, string> | Replaces placeholders in content. |
meta_data | object | Free-form metadata forwarded to downstream analytics. |
use_latest_user_device | bool | When true, delivers the message to each user’s most recently active device (the one with the latest Last Application Open) instead of every device matched by the segment. Scoped to platforms: only devices on those platforms are considered, and if none has Last Application Open data, the first matching device is used instead of dropping the send. Defaults to false (send to every device). |
Example: Send to a segment
Anchor link tocurl -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 toSends to an explicit list of recipients.
| Field | Type | Description |
|---|---|---|
schedule | Schedule | Required. |
application | string | Application code. |
platforms | array of Platform | Platforms the message targets. |
test_devices | bool | If true, send to the app’s test devices only. |
hwids | { "list": [string, ...] } | Send to these hwids only. |
users | { "list": [string, ...] } | Send to these user IDs only. |
push_tokens | { "list": [string, ...] } | Send to these push tokens only. |
payload | Payload | Push / SMS / Telegram / Kakao / LINE / WhatsApp / Viber payload. |
email_payload | EmailPayload | Email payload. |
return_unknown_identifiers | bool | When true, the response’s unknown_identifiers lists identifiers that were not found. |
use_latest_user_device | bool | Only applies when you target users. Same behavior as in NotifySegment above — delivers one message per user instead of one per device, scoped to platforms. Defaults to false. |
campaign, frequency_capping, send_rate, message_type, dynamic_content_placeholders, meta_data | See NotifySegment above. |
test_devices, hwids, users, and push_tokens are mutually exclusive. Exactly one must be set.
Example: Transactional by user IDs
Anchor link tocurl -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 } }'Response
Anchor link to{ "result": { "message_code": "XXXXX-XXXXX-XXXXX", "unknown_identifiers": [] }}| Field | Type | Description |
|---|---|---|
message_code | string | Unique message code. Use it with /getMessageDetails and message statistics endpoints. |
unknown_identifiers | array of string | Identifiers not found on the account. Populated only when return_unknown_identifiers: true was set on the transactional kind. |
Shared types
Anchor link toSchedule
Anchor link to{ "at": "2026-05-01T12:00:00Z", "follow_user_timezone": true, "past_timezones_behaviour": "PAST_TIMEZONES_BEHAVIOUR_SEND_IMMEDIATELY"}| Field | Type | Description |
|---|---|---|
at | timestamp | Absolute send time (RFC 3339). If in the past, the message is sent immediately. Maximum 14 days in the future. |
after | duration | Alternative to at. Send after this offset from “now” (e.g. "3600s"). |
follow_user_timezone | bool | When true, each device receives the message at at in its local timezone. |
past_timezones_behaviour | enum | PAST_TIMEZONES_BEHAVIOUR_SEND_IMMEDIATELY (default), PAST_TIMEZONES_BEHAVIOUR_DO_NOT_SEND, or PAST_TIMEZONES_BEHAVIOUR_NEXT_DAY. Only meaningful when follow_user_timezone is true. |
FrequencyCapping
Anchor link toPer-user frequency limits for marketing sends. To disable capping, omit frequency_capping entirely, or send days: 0 together with count: 0.
{ "days": 7, "count": 3, "exclude": false, "avoid": true }days(int, 1–30, or0to disable capping): look-back window. Must be sent together withcount— if one is0, the other must also be0; sending one as0while the other is nonzero returns400.count(int, 1 or higher, or0to disable capping): maximum messages allowed withindays. Same pairing rule asdaysabove.exclude(bool): hard-exclude users who have already hit the cap.avoid(bool): soft-avoid users who have already hit the cap (they still count toward analytics).
SendRate
Anchor link to{ "value": 500, "bucket": "1s", "avoid": false }Throttles the send. value is messages per bucket; typical bucket is "1s".
Platform enum
Anchor link toIOS, ANDROID, OSX, WINDOWS, AMAZON, SAFARI, CHROME, FIREFOX, IE, EMAIL, BAIDU_ANDROID, HUAWEI_ANDROID, SMS, WEB, KAKAO, TELEGRAM, LINE, WHATS_APP, VIBER.
MessageType enum
Anchor link toMESSAGE_TYPE_UNSPECIFIED: equivalent toMESSAGE_TYPE_MARKETING.MESSAGE_TYPE_MARKETING: subject to control-group filtering and frequency capping.MESSAGE_TYPE_TRANSACTIONAL: skips control-group filtering and frequency capping. Use for order confirmations, OTPs, and similar critical flows.