Overview
This guide walks you through sending messages with the OneSignal API—from choosing a target audience to composing content, scheduling delivery, and validating responses. You’ll find channel-specific options, performance guidance, and common pitfalls to avoid.Prerequisites
- Complete Channel Setup for the channels you’ll use: Push, Email, SMS, Live Activities.
- Start accumulating Subscriptions for your users.
- Have your REST API Key and App ID ready. See Keys and IDs.
Choose your target audience
You can target users with one of the following methods per request:- 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.
isAndroid, isIos, isAnyWeb) when sending push notifications.
Aliases, emails, phone numbers
Target specific users or lists of users (up to 20,000 entries per request). This method is best for Transactional Messages.Aliases, emails, and phone numbers targeting parameters.
Aliases, emails, and phone numbers targeting parameters.
Target up to 20,000 users by their
external_id, onesignal_id, or a custom alias. Combine with target_channel to select the delivery channel.The targeted delivery channel. Required when using
include_aliases. Accepts "push", "email", or "sms".Target users’ specific Subscriptions by ID. Max 20,000
subscription_id per request.Send email to specific email addresses (max 20,000 per request). Can only be used when sending Email. If the email address does not exist within the OneSignal App, then a new email Subscription will be created.
Send SMS/MMS/RCS to phone number in E.164 format (max 20,000 per request). Can only be used when sending SMS/MMS/RCS. If the phone number does not exist within the OneSignal App, then a new SMS Subscription will be created.
Segments
Target users in existing Segments. Users in multiple Segments only receive the message once.Segments targeting parameters.
Segments targeting parameters.
filters
Build real-time audiences with AND/OR logic. No need to create segments first.
You can include up to 200 total entries per request. This includes filter rows (e.g., each field) and logical operators like {"operator": "OR"}.
Filters targeting parameter details.
Filters targeting parameter details.
Performance guidance:
Target based on custom user Data Tags.
Country of the user.
Time since user last used the app (in
Time since user first used the app or was created (in
Total number of sessions by the user.
Total time spent in the app (in seconds).
User’s language code (e.g., “en”). See Multi-Language Messaging for details and supported language codes.
Subscription’s app version.
Target by GPS coordinates and radius. See Location-Triggered Notifications for details.
- 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.
- Implicit
ANDlogic between filters. Use"operator": "OR"to start a new branch. ORfilters are mutually exclusive. Recipients only need to satisfy one condition.- Allowed values:
"AND","OR".
tag
Target based on custom user Data Tags.-
relation=">","<","=","!=","exists","not_exists","time_elapsed_gt", (time elapsed greater than) and"time_elapsed_lt"(time elapsed less than)time_elapsed_gt/ltfields 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".
country
Country of the user.-
relation="=","!=","exists","not_exists" -
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 channel has its own set of fields. At a minimum, you need the following to send a displayable message:- Push & SMS use
contents - Email uses
email_subjectandemail_body - Or reuse
template_idif you created Templates.
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_iconlarge_iconbuttons– Action buttons.
🔔 Delivery & priority
android_channel_idpriority– Delivery urgency.ios_interruption_levelcollapse_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
contentstemplate_id– Use a pre-defined template for common message types.
🖼 Media (MMS only)
📬 Sender Info
Schedule & per-user delivery
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.
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.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.
throttle_rate_per_minute to 0.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)
Submit the request
This final example sends a localized push notification to all subscribed users:Handle the response
You will receive a200 response code if the request is valid and accepted.
- If an
idis returned, the message was created successfully. Save thisidfor future tracking and reference of message stats via View Message API. - If no
idis returned, then the message was not created, likely due to no valid Subscriptions in the target audience.
See our REST API Overview page for details on retries and rate limits.