Skip to content

Notify

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

Creates and schedules a single message.

Request structure

Anchor link to

The request body is a NotifyRequest with exactly one of two kinds:

  • segment: target an audience segment by segment code, or — without creating a segment first — a seglang expression or a structured filter expression.
  • transactional: send to an explicit list of hwids, user IDs, push tokens, or test devices.
Shape
{
"segment": { ... }, // OR
"transactional": { ... },
"transaction_id": "unique-uuid"
}
FieldTypeDescription
transaction_idstringOptional. 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 to

Targets users who match an audience segment or filter expression. Set exactly one of code, expression, or filter_expression. For expression and filter_expression, no segment needs to be created beforehand — the expression is evaluated inline for this send only.

FieldTypeDescription
scheduleScheduleWhen and how to send. Required.
applicationstringApplication code.
platformsarray of PlatformPlatforms the message targets.
codestringSegment code of a segment saved in advance. Mutually exclusive with expression and filter_expression.
expressionstringSeglang expression, evaluated for this send only — no saved segment required. Mutually exclusive with code and filter_expression.
filter_expressionFilterExpressionThe same logic as expression, as a structured object instead of a seglang string. Mutually exclusive with code and expression. The FilterExpression schema isn’t publicly documented — request it from Pushwoosh support if you need the structured form.
payloadPayloadPush / SMS / Telegram / Kakao / LINE / WhatsApp / Viber / Facebook Messenger payload. Mutually exclusive with email_payload.
email_payloadEmailPayloadEmail payload.
campaignstringCampaign code to attribute this message to.
campaign_namestringInternal name for this message, shown as the row title in Message History and in its export. Unrelated to campaign above. It doesn’t group messages or affect delivery. Max 255 characters, trimmed. Omit it or leave it empty to keep the row titled from the payload’s own content instead.
frequency_cappingFrequencyCappingPer-user frequency limits.
send_rateSendRateThrottling for the send.
message_typeMessageTypeMESSAGE_TYPE_MARKETING (default) or MESSAGE_TYPE_TRANSACTIONAL. Controls control-group filtering.
dynamic_content_placeholdersmap<string, string>Replaces placeholders in content.
meta_dataobjectFree-form metadata forwarded to downstream analytics.
use_latest_user_deviceboolWhen 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).
control_groupstringControl group to measure this message against, by group code or name. Empty uses the application’s default control group. Mutually exclusive with holdout_percentage.
holdout_percentageuint32Share of this send’s audience, 1–20, held out into a one-off control group for this message only. Mutually exclusive with control_group.

Example: Send to a segment

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

Sends to an explicit list of recipients.

FieldTypeDescription
scheduleScheduleRequired.
applicationstringApplication code.
platformsarray of PlatformPlatforms the message targets.
test_devicesboolIf 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.
payloadPayloadPush / SMS / Telegram / Kakao / LINE / WhatsApp / Viber / Facebook Messenger payload.
email_payloadEmailPayloadEmail payload.
return_unknown_identifiersboolWhen true, the response’s unknown_identifiers lists identifiers that were not found.
use_latest_user_deviceboolOnly 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, campaign_name, frequency_capping, send_rate, message_type, dynamic_content_placeholders, meta_dataSee NotifySegment above.

test_devices, hwids, users, and push_tokens are mutually exclusive. Exactly one must be set.

Example: Transactional by user IDs

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
}
}'
{
"result": {
"message_code": "XXXXX-XXXXX-XXXXX",
"unknown_identifiers": []
}
}
FieldTypeDescription
message_codestringUnique message code. Use it with /getMessageDetails and message statistics endpoints.
unknown_identifiersarray of stringIdentifiers not found on the account. Populated only when return_unknown_identifiers: true was set on the transactional kind.

Shared types

Anchor link to
{
"at": "2026-05-01T12:00:00Z",
"follow_user_timezone": true,
"past_timezones_behaviour": "PAST_TIMEZONES_BEHAVIOUR_SEND_IMMEDIATELY"
}
FieldTypeDescription
attimestampAbsolute send time (RFC 3339). If in the past, the message is sent immediately. Maximum 14 days in the future.
afterdurationAlternative to at. Send after this offset from “now” (e.g. "3600s").
follow_user_timezoneboolWhen true, each device receives the message at at in its local timezone.
past_timezones_behaviourenumPAST_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 to

Per-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, or 0 to disable capping): look-back window. Must be sent together with count — if one is 0, the other must also be 0; sending one as 0 while the other is nonzero returns 400.
  • count (int, 1 or higher, or 0 to disable capping): maximum messages allowed within days. Same pairing rule as days above.
  • 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).
{ "value": 500, "bucket": "1s", "avoid": false }

Throttles the send. value is messages per bucket; typical bucket is "1s".

Platform enum

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 enum

Anchor link to
  • MESSAGE_TYPE_UNSPECIFIED: equivalent to MESSAGE_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.