Sending messages with the OneSignal API
An easy-to-follow guide for developers to start sending push notifications, emails, and SMS using OneSignal’s API.
This guide helps you get started with sending messages using the OneSignal API. You’ll learn how to pick your target audience, set up content for push, email, or SMS, and schedule when it sends.
Before you begin, make sure you:
- Completed our Channel Setup Guides for the channels you want to use.
- Started accumulating Subscriptions to send messages to.
Select your target audience
You can target users using:
- Aliases – Specific users via unique IDs, emails, or phone numbers.
- Segments – Groups based on predefined behaviors or attributes.
- Filters – Custom rules using tags, location, activity, and more.
Only one targeting method is allowed per message. For example, you cannot mix aliases and filters.
Additionally, you can target specific platforms (Android, iOS, Web) when sending push notifications.
Aliases, emails, phone numbers
Target specific users or groups of users (up to 20,000 entries). This method is best for Transactional Messages.
Aliases, emails, and phone numbers targeting parameters.
Aliases, emails, and phone numbers targeting parameters.
include_aliases
Target up to 20,000 users by their external_id
, onesignal_id
, or a custom alias. Use with target_channel
to control the delivery channel. See Users and Aliases for more details.
target_channel
The targeted delivery channel.Required when using include_aliases
. Accepts "push"
, "email"
, or "sms"
.
include_subscription_ids
Target users’ specific subscriptions by ID. Include up to 20,000 subscription_id
per API call.
email_to
Send email to specific users by their email address. Can only be used when sending Email. Include up to 20,000 email addresses per API call. If the email address does not exist within the OneSignal App, then a new email Subscription will be created.
include_phone_numbers
Send SMS/MMS to specific users by their phone number in E.164 format. Can only be used when sending SMS/MMS. Include up to 20,000 phone numbers per API call. If the phone number does not exist within the OneSignal App, then a new SMS Subscription will be created.
Segments
Target groups of users based on predefined Segments.
Segments targeting parameters.
Segments targeting parameters.
filters
Use filters to target groups of users dynamically without creating predefined Segments.
Filters targeting parameter details.
Filters targeting parameter details.
Dynamically target users based on real-time properties like tags, activity, app usage, or location using flexible AND
/OR
logic. No need to create predefined Segments.
You can include up to 200 total entries per request. This limit includes each filter condition (e.g., field
) and logic operators like "OR"
.
Performance guidance:
- Fast: Tag filters using
"="
or"exists"
, and filters onlast_session
,session_count
, orcountry
. - Slower: Negation filters (
"!="
,"not_exists"
)—especially with users who have many tags. Contact support to request indexing optimizations. - Slow by default: Numeric comparisons (
">"
,"<"
) on tags or custom properties. Indexing may be available on request. - Mixed performance: Combining tag filters with other fields may increase computation time.
Available filters:
operator
- Chain conditions with implicit
AND
logic (default).AND
filters must be satisfied for the recipient to be included - Use
"operator": "OR"
to separate branches of logic.OR
filters are mutually exclusive. Recipients only need to satisfy one condition. - Mix and nest operators to build complex logic trees.
- Allowed values:
"AND"
,"OR"
.
tag
Target based on custom user Data Tags.
Do not use tags for targeting individual users like a “user id”.
Instead use External ID or custom Aliases and the include_aliases
targeting property.
-
relation
=">"
,"<"
,"="
,"!="
,"exists"
,"not_exists"
,"time_elapsed_gt"
, (time elapsed greater than) and"time_elapsed_lt"
(time elapsed less than)time_elapsed_gt/lt
fields correspond to Time Operators and require a paid plan.
-
key
= Tag key to compare. -
value
= Tag value to compare. Not required for"exists"
or"not_exists"
.
last_session
Time since user last used the app (in hours_ago
).
-
relation
=">"
or"<"
-
hours_ago
= number of hours before or after the user’s last session. Example:"1.1"
first_session
Time since user first used the app or was created (in hours_ago
).
-
relation
=">"
or"<"
-
hours_ago
= number of hours before or after the user’s first session. Example:"1.1"
session_count
Total number of sessions by the user.
-
relation
=">"
,"<"
,"="
or"!="
-
value
= number sessions. Example:"1"
session_time
Total time spent in the app (in seconds).
-
relation
=">"
or"<"
-
value
= Time in seconds the user has been in your app. Example: 1 day is"86400"
seconds
language
User’s language code (e.g., “en”). See Multi-Language Messaging for details and supported language codes.
-
relation
="="
or"!="
-
value
= 2 character language code. Example:"en"
.
app_version
Subscription’s app version.
-
relation
=">"
,"<"
,"="
or"!="
-
value
= app version. Example:"1.0.0"
location
Target by GPS coordinates and radius. See Location-Triggered Notifications for details.
-
radius
= in meters -
lat
= latitude -
long
= longitude
Craft your message
Each messaging channel has its own set of parameters that control how the message appears, behaves, and is delivered. At a minimum, you need the following to send a displayable message:
- Push & SMS use
contents
- Email uses
email_subject
andemail_body
- If you created Templates, you can use
template_id
instead.
For advanced customization—like adding images, buttons, sounds, or tracking—see the channel-specific options below.
Push notification options
Below are the most common parameters for push notifications. For the full list of options, see the Push notification reference.
📲 Push Notification Options.
📲 Push Notification Options.
📄 Content & text
contents
– Main message body.headings
– Title of the notification.subtitle
– Secondary line of text.template_id
– Use a pre-defined template for common message types.
🖼 Appearance
ios_attachments
– Images/video/media.big_picture
– Large image (Android).chrome_web_image
– Large image (Chrome).small_icon
large_icon
buttons
– Action buttons.
🔔 Delivery & priority
android_channel_id
priority
– Delivery urgency.ios_interruption_level
collapse_id
– Replaces older messages.
🧩 Data & Extras
Email options
📧 Email Options
📧 Email Options
📄 Content
🖼 Appearance
template_id
– Use a pre-defined template for common message types.
📬 Sender Info
SMS/MMS options
💬 SMS/MMS Options
💬 SMS/MMS Options
📄 Content
contents
template_id
– Use a pre-defined template for common message types.
🖼 Media (MMS only)
📬 Sender Info
Schedule & per-user delivery options
By default, messages are sent immediately. You can schedule delivery in advance and optimize timing per-user based on their local timezone or recent activity.
Schedule delivery and per-user optimization parameters.
Schedule delivery and per-user optimization parameters.
send_after
Schedule delivery for a future date/time (in UTC). The format must be valid per the ISO 8601 standard and compatible with JavaScript’s Date() parser
.
delayed_option
Controls how messages are delivered on a per-user basis:
'timezone'
: Sends at the same local time across time zones.'last-active'
: Delivers based on each user’s most recent session.
Not compatible with Push Throttling. If enabled, set throttle_rate_per_minute
to 0
.
delivery_time_of_day
Use with delayed_option: 'timezone'
to set a consistent daily delivery time. Accepted formats:
"9:00AM"
(12-hour)"21:45"
(24-hour)"09:45:30"
(HH:mm:ss)
Example – Send every day at 9 AM in each user’s local time:
Submit the request
This final example sends a localized push notification to all subscribed users:
Next steps
Refer to the channel-specific APIs to customize delivery further: