Development — entry 064 of 100

OneSignal

Verified Jul 2026

OneSignal's REST API (api.onesignal.com) sends and manages push, email, SMS, and in-app messages plus user, segment, and app data, authenticated with an App or Organization API key rather than OAuth. The free plan covers unlimited mobile push and up to 10,000 web-push subscribers per send with core segmentation, while the paid Growth plan (from $19/month) adds per-MAU push billing and higher email/SMS limits. The API host returns no Access-Control-Allow-Origin header, so it isn't meant to be called directly from browser JavaScript.

push-notificationsmessagingemailsms
AuthenticationAPI KeySign up with the provider to obtain credentials.
HTTPSSupportedTraffic is encrypted in transit.
CORSDisabledBrowser calls need a server-side proxy.
PricingFreemiumA usable free tier exists, with paid plans for more volume.
FormatsJSONResponses can be requested as JSON.

GreatAPIs Score

Score81out of 100
Authentication15/25API key required
Pricing17/20Freemium tier available
Docs20/20Machine-readable spec file bundled
Formats9/15Single response format
Freshness20/20Verified within 6 months

Embed this badge

Scored 81 on greatapis.com
<a href="https://greatapis.com/api/onesignal/"><img src="https://greatapis.com/badge/onesignal.svg" alt="Scored 81 on greatapis.com"></a>

Auth quickstart

  1. Sign up with the provider to get an API key.
  2. Send it on every request as a headerAuthorization: <key>
  3. The exact header isn't documented — Authorization is a common default; confirm in the provider's docs.
Stored keyNo key stored

Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.

Endpoints

Servers
https://onesignal.com/api/v1
Auth
app_keyuser_key
apps25
GET/appsView apps
Responses
StatusDescriptionSchema
200OKApps
400Bad RequestGenericError
429Rate Limit ExceededRateLimiterError
POST/appsCreate an app
Request body

application/jsonApp (required)

Responses
StatusDescriptionSchema
200OKApp
400Bad RequestGenericError
429Rate Limit ExceededRateLimiterError
GET/apps/{app_id}View an app
Parameters
NameInRequiredType
app_idpathyesstring
Responses
StatusDescriptionSchema
200OKApp
400Bad RequestGenericError
429Rate Limit ExceededRateLimiterError
PUT/apps/{app_id}Update an app
Parameters
NameInRequiredType
app_idpathyesstring
Request body

application/jsonApp (required)

Responses
StatusDescriptionSchema
200OKApp
400Bad RequestGenericError
429Rate Limit ExceededRateLimiterError
POST/apps/{app_id}/live_activities/{activity_id}/notificationsUpdate a Live Activity via Push
Parameters
NameInRequiredType
app_idpathyesstring
activity_idpathyesstring
Request body

application/jsonUpdateLiveActivityRequest (required)

Responses
StatusDescriptionSchema
200OKUpdateLiveActivitySuccessResponse
400Bad RequestGenericError
429Rate Limit ExceededRateLimiterError
POST/apps/{app_id}/live_activities/{activity_id}/tokenStart Live Activity
Parameters
NameInRequiredType
app_idpathyesstring
activity_idpathyesstring
Request body

application/jsonBeginLiveActivityRequest (required)

Responses
StatusDescriptionSchema
204OK
400Bad RequestGenericError
429Rate Limit ExceededRateLimiterError
DELETE/apps/{app_id}/live_activities/{activity_id}/token/{subscription_id}Stop Live Activity
Parameters
NameInRequiredType
app_idpathyesstring
activity_idpathyesstring
subscription_idpathyesstring
Responses
StatusDescriptionSchema
204OK
400Bad RequestGenericError
429Rate Limit ExceededRateLimiterError
GET/apps/{app_id}/outcomesView Outcomes
Parameters
NameInRequiredType
app_idpathyesstring
outcome_namesqueryyesstring
outcome_names[]querynostring
outcome_time_rangequerynostring
outcome_platformsquerynostring
outcome_attributionquerynostring
Responses
StatusDescriptionSchema
200OKOutcomesData
400Bad RequestGenericError
429Rate Limit ExceededRateLimiterError
POST/apps/{app_id}/segmentsCreate Segments
Parameters
NameInRequiredType
app_idpathyesstring
Request body

application/jsonSegment

Responses
StatusDescriptionSchema
201CreatedCreateSegmentSuccessResponse
400Bad RequestGenericError
409ConflictCreateSegmentConflictResponse
429Rate Limit ExceededRateLimiterError
DELETE/apps/{app_id}/segments/{segment_id}Delete Segments
Parameters
NameInRequiredType
app_idpathyesstring
segment_idpathyesstring
Responses
StatusDescriptionSchema
200OKDeleteSegmentSuccessResponse
400Bad RequestGenericError
404Not FoundDeleteSegmentNotFoundResponse
429Rate Limit ExceededRateLimiterError
PATCH/apps/{app_id}/subscriptions/{subscription_id}
Parameters
NameInRequiredType
app_idpathyesstring
subscription_idpathyesstring
Request body

application/jsonUpdateSubscriptionRequestBody (required)

Responses
StatusDescriptionSchema
202ACCEPTED
400Bad RequestGenericError
409ConflictGenericError
429Rate Limit ExceededRateLimiterError
DELETE/apps/{app_id}/subscriptions/{subscription_id}
Parameters
NameInRequiredType
app_idpathyesstring
subscription_idpathyesstring
Responses
StatusDescriptionSchema
202ACCEPTED
400Bad RequestGenericError
409ConflictGenericError
429Rate Limit ExceededRateLimiterError
GET/apps/{app_id}/subscriptions/{subscription_id}/iams
Parameters
NameInRequiredType
app_idpathyesstring
subscription_idpathyesstring
Responses
StatusDescriptionSchema
200OK
400Bad RequestGenericError
429Rate Limit ExceededRateLimiterError
PATCH/apps/{app_id}/subscriptions/{subscription_id}/owner
Parameters
NameInRequiredType
app_idpathyesstring
subscription_idpathyesstring
Request body

application/jsonTransferSubscriptionRequestBody (required)

Responses
StatusDescriptionSchema
200OKUserIdentityResponse
400Bad RequestGenericError
409ConflictGenericError
429Rate Limit ExceededRateLimiterError
GET/apps/{app_id}/subscriptions/{subscription_id}/user/identity
Parameters
NameInRequiredType
app_idpathyesstring
subscription_idpathyesstring
Responses
StatusDescriptionSchema
200OKUserIdentityResponse
400Bad RequestGenericError
PATCH/apps/{app_id}/subscriptions/{subscription_id}/user/identity
Parameters
NameInRequiredType
app_idpathyesstring
subscription_idpathyesstring
Request body

application/jsonUserIdentityRequestBody (required)

Responses
StatusDescriptionSchema
200OKUserIdentityResponse
400Bad RequestGenericError
409ConflictGenericError
429Rate Limit ExceededRateLimiterError
POST/apps/{app_id}/users
Parameters
NameInRequiredType
app_idpathyesstring
Request body

application/jsonUser (required)

Responses
StatusDescriptionSchema
200CREATEDUser
201CREATEDUser
202ACCEPTEDUser
400Bad RequestGenericError
409Multiple User Identity ConflictCreateUserConflictResponse
429Rate Limit ExceededRateLimiterError
GET/apps/{app_id}/users/by/{alias_label}/{alias_id}
Parameters
NameInRequiredType
app_idpathyesstring
alias_labelpathyesstring
alias_idpathyesstring
Responses
StatusDescriptionSchema
200OKUser
400Bad RequestGenericError
429Rate Limit ExceededRateLimiterError
PATCH/apps/{app_id}/users/by/{alias_label}/{alias_id}
Parameters
NameInRequiredType
app_idpathyesstring
alias_labelpathyesstring
alias_idpathyesstring
Request body

application/jsonUpdateUserRequest (required)

Responses
StatusDescriptionSchema
202ACCEPTED
400Bad RequestGenericError
409ConflictGenericError
429Rate Limit ExceededRateLimiterError
DELETE/apps/{app_id}/users/by/{alias_label}/{alias_id}
Parameters
NameInRequiredType
app_idpathyesstring
alias_labelpathyesstring
alias_idpathyesstring
Responses
StatusDescriptionSchema
200OK
400Bad RequestGenericError
409ConflictGenericError
429Rate Limit ExceededRateLimiterError
GET/apps/{app_id}/users/by/{alias_label}/{alias_id}/identity
Parameters
NameInRequiredType
app_idpathyesstring
alias_labelpathyesstring
alias_idpathyesstring
Responses
StatusDescriptionSchema
200OK
400Bad RequestGenericError
429Rate Limit ExceededRateLimiterError
PATCH/apps/{app_id}/users/by/{alias_label}/{alias_id}/identity
Parameters
NameInRequiredType
app_idpathyesstring
alias_labelpathyesstring
alias_idpathyesstring
Request body

application/jsonUserIdentityRequestBody (required)

Responses
StatusDescriptionSchema
200OK
400Bad RequestGenericError
409ConflictGenericError
429Rate Limit ExceededRateLimiterError
DELETE/apps/{app_id}/users/by/{alias_label}/{alias_id}/identity/{alias_label_to_delete}
Parameters
NameInRequiredType
app_idpathyesstring
alias_labelpathyesstring
alias_idpathyesstring
alias_label_to_deletepathyesstring
Responses
StatusDescriptionSchema
200OK
400Bad RequestGenericError
409ConflictGenericError
429Rate Limit ExceededRateLimiterError
POST/apps/{app_id}/users/by/{alias_label}/{alias_id}/subscriptions
Parameters
NameInRequiredType
app_idpathyesstring
alias_labelpathyesstring
alias_idpathyesstring
Request body

application/jsonCreateSubscriptionRequestBody (required)

Responses
StatusDescriptionSchema
201CREATED
202ACCEPTED
400Bad RequestGenericError
409Operation is not permitted due to user having the maximum number of subscriptions assignedGenericError
429Rate Limit ExceededRateLimiterError
PUT/apps/{app_id}/users/{external_user_id}Edit tags with external user id
Parameters
NameInRequiredType
app_idpathyesstring
external_user_idpathyesstring
Request body

application/json

Responses
StatusDescriptionSchema
200OKUpdatePlayerTagsSuccessResponse
400Bad RequestGenericError
409ConflictGenericError
429Rate Limit ExceededRateLimiterError
notifications6
GET/notificationsView notifications
Parameters
NameInRequiredType
app_idqueryyesstring
limitquerynointeger
offsetquerynointeger
kindquerynointeger
Responses
StatusDescriptionSchema
200OKNotificationSlice
400Bad RequestGenericError
429Rate Limit ExceededRateLimiterError
POST/notificationsCreate notification
Request body

application/jsonNotification (required)

Responses
StatusDescriptionSchema
200OK, invalid_player_ids, invalid_external_user_ids or No Subscribed Players If a message was successfully created, you will get a 200 response and an id for the notification. If the 200 response contains "invalid_player_ids" or "invalid_external_user_ids" this will mark devices that exist in the provided app_id but are no longer subscribed. If no id is returned, then a message was not created and the targeted User IDs do not exist under the provided app_id. Any User IDs sent in the request that do not exist under the specified app_id will be ignored. CreateNotificationSuccessResponse
400Bad RequestGenericError
429Rate Limit ExceededRateLimiterError
GET/notifications/{notification_id}View notification
Parameters
NameInRequiredType
app_idqueryyesstring
notification_idpathyesstring
Responses
StatusDescriptionSchema
200OKNotificationWithMeta
400Bad RequestGenericError
429Rate Limit ExceededRateLimiterError
DELETE/notifications/{notification_id}Stop a scheduled or currently outgoing notification
Parameters
NameInRequiredType
app_idqueryyesstring
notification_idpathyesstring
Responses
StatusDescriptionSchema
200OKCancelNotificationSuccessResponse
400Bad RequestGenericError
429Rate Limit ExceededRateLimiterError
POST/notifications/{notification_id}/export_events?app_id={app_id}Export CSV of Events
Parameters
NameInRequiredType
notification_idpathyesstring
app_idqueryyesstring
Responses
StatusDescriptionSchema
200OKExportEventsSuccessResponse
400Bad RequestGenericError
404Not FoundGenericError
429Rate Limit ExceededRateLimiterError
POST/notifications/{notification_id}/historyNotification History
Parameters
NameInRequiredType
notification_idpathyesstring
Request body

application/json (required)

Responses
StatusDescriptionSchema
200OKNotificationHistorySuccessResponse
400Bad RequestGenericError
429Rate Limit ExceededRateLimiterError
players6
GET/playersView devices
Parameters
NameInRequiredType
app_idqueryyesstring
limitquerynointeger
offsetquerynointeger
Responses
StatusDescriptionSchema
200OKPlayerSlice
400Bad RequestGenericError
429Rate Limit ExceededRateLimiterError
POST/playersAdd a device
Request body

application/jsonPlayer (required)

Responses
StatusDescriptionSchema
200OKCreatePlayerSuccessResponse
400Bad RequestGenericError
409ConflictGenericError
429Rate Limit ExceededRateLimiterError
POST/players/csv_export?app_id={app_id}Export CSV of Players
Parameters
NameInRequiredType
app_idpathyesstring
Request body

application/json

Responses
StatusDescriptionSchema
200OKExportPlayersSuccessResponse
400Bad RequestGenericError
429Rate Limit ExceededRateLimiterError
GET/players/{player_id}View device
Parameters
NameInRequiredType
app_idqueryyesstring
player_idpathyesstring
email_auth_hashquerynostring
Responses
StatusDescriptionSchema
200OKPlayer
400Bad RequestGenericError
429Rate Limit ExceededRateLimiterError
PUT/players/{player_id}Edit device
Parameters
NameInRequiredType
player_idpathyesstring
Request body

application/jsonPlayer (required)

Responses
StatusDescriptionSchema
200OKUpdatePlayerSuccessResponse
400Bad RequestGenericError
409ConflictGenericError
429Rate Limit ExceededRateLimiterError
DELETE/players/{player_id}Delete a user record
Parameters
NameInRequiredType
app_idqueryyesstring
player_idpathyesstring
Responses
StatusDescriptionSchema
200OKDeletePlayerSuccessResponse
400Bad RequestGenericError
404Not FoundDeletePlayerNotFoundResponse
429Rate Limit ExceededRateLimiterError

Try it

Developer reference

Base URLhttps://onesignal.com/api/v1
Key endpoints
  • POST/notifications
  • GET/notifications
  • GET/apps