OneSignal REST API

The complete OneSignal REST API as OneSignal publishes it — OpenAPI 3.1.0, info.version 11.6, 39 paths and 59 operations covering messaging, users, subscriptions, segments, templates, custom events, inbox, exports, apps, API keys and audit logs. Harvested verbatim from https://documentation.onesignal.com/openapi.json on 2026-08-13; servers[] names https://api.onesignal.com.

OpenAPI Specification

onesignal-api-openapi.json Raw ↑
{
  "openapi": "3.1.0",
  "info": {
    "title": "api.onesignal.com",
    "version": "11.6"
  },
  "servers": [
    {
      "url": "https://api.onesignal.com"
    }
  ],
  "components": {
    "schemas": {
      "BasicErrorResponse": {
        "type": "object",
        "properties": {
          "errors": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "One or more human-readable error messages."
          },
          "success": {
            "type": "boolean",
            "description": "Present (and `false`) on some endpoints (notifications, templates, segments). Not emitted by every endpoint."
          },
          "reference": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Documentation URL fragments related to the error. Only emitted by the API-key auth error helpers."
          }
        }
      },
      "StructuredErrorItem": {
        "type": "object",
        "required": [
          "code",
          "title"
        ],
        "properties": {
          "code": {
            "type": "string",
            "description": "Stable error-code identifier. Use this for programmatic branching in your integration."
          },
          "title": {
            "type": "string",
            "description": "Human-readable error message intended for logs and operator-facing surfaces."
          },
          "meta": {
            "type": "object",
            "additionalProperties": true,
            "description": "Optional structured details about this specific error. The shape of `meta` varies by `code` — for example, the create-user `Conflict` code returns `{ conflicting_aliases: { [alias_label]: alias_id } }`."
          }
        }
      },
      "StructuredErrorResponse": {
        "type": "object",
        "properties": {
          "errors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StructuredErrorItem"
            }
          }
        }
      },
      "ApiKeyToken": {
        "type": "object",
        "description": "An API Key Token record (Rich Authentication Token). Different operations return different subsets of these fields:\n\n- **GET tokens** lists every field except `formatted_token`.\n- **POST tokens** (create) returns `token_id` and `formatted_token`.\n- **POST tokens/{id}/rotate** returns `formatted_token` only.\n- **PATCH tokens/{id}** updates the record; the response body is currently empty (consumers should re-fetch via GET).\n\n`formatted_token` is the actual REST API Key and is shown ONCE — OneSignal does not store it. Keep it secret.",
        "properties": {
          "token_id": {
            "type": "string",
            "format": "uuid",
            "description": "OneSignal-generated identifier for this API key. NOT the API key itself — use this to manage the key in subsequent calls."
          },
          "name": {
            "type": "string",
            "description": "Internal name set when the key was created or last updated. Maximum 128 characters."
          },
          "ip_allowlist_mode": {
            "type": "string",
            "enum": [
              "disabled",
              "explicit"
            ],
            "description": "When `explicit`, only requests from IP addresses matching `ip_allowlist` may use this key. Defaults to `disabled`."
          },
          "ip_allowlist": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Allowed CIDR ranges. Only enforced when `ip_allowlist_mode` is `explicit`."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "ISO-8601 timestamp when the key was created."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "ISO-8601 timestamp when the key was last updated."
          },
          "formatted_token": {
            "type": "string",
            "description": "The actual Rich Authentication Token (REST API Key). Returned in plaintext ONLY by the create and rotate endpoints, and ONLY immediately after that call. OneSignal does not store the secret — if you lose it, you must rotate the key. See [Rotate API Key](/reference/rotate-api-key)."
          }
        }
      },
      "TemplateResourceContent": {
        "type": "object",
        "description": "The content block of a template. Every field is nullable: a field is populated only when the corresponding channel feature is enabled for the template. For example, push fields (`isAndroid`, `isIos`, `headings`, ...) are populated for push templates; email fields (`isEmail`, `email_body`, ...) for email templates; and SMS fields (`isSMS`, `sms_from`, ...) for SMS templates. Cross-channel templates may have multiple feature blocks populated.",
        "properties": {
          "isAndroid": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "isIos": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "isMacOSX": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "isAdm": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "isAlexa": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "isWP": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "isWP_WNS": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "isChrome": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "isChromeWeb": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "isSafari": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "isFirefox": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "isEdge": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "isHuawei": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "headings": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": {
              "type": "string"
            },
            "description": "Map of language code to localized string. Keys are 2-letter ISO codes (e.g., `en`, `es`); values are the message text."
          },
          "subtitle": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": {
              "type": "string"
            },
            "description": "Map of language code to localized string. Keys are 2-letter ISO codes (e.g., `en`, `es`); values are the message text."
          },
          "contents": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": {
              "type": "string"
            },
            "description": "Map of language code to localized string. Keys are 2-letter ISO codes (e.g., `en`, `es`); values are the message text."
          },
          "global_image": {
            "type": [
              "string",
              "null"
            ],
            "description": "URL of the image to render with the push notification."
          },
          "url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Click-action URL for push notifications.",
            "format": "uri"
          },
          "isEmail": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "email_body": {
            "type": [
              "string",
              "null"
            ],
            "description": "HTML body of the email."
          },
          "email_subject": {
            "type": [
              "string",
              "null"
            ]
          },
          "email_preheader": {
            "type": [
              "string",
              "null"
            ]
          },
          "email_from_address": {
            "type": [
              "string",
              "null"
            ],
            "format": "email"
          },
          "email_from_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "email_reply_to_address": {
            "type": [
              "string",
              "null"
            ],
            "format": "email"
          },
          "email_bcc": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string",
              "format": "email"
            },
            "maxItems": 5,
            "description": "BCC recipients for the email template. Maximum 5 addresses. Only supported when the email service provider is OneSignal Email."
          },
          "disable_email_click_tracking": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "isSMS": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "sms_from": {
            "type": [
              "string",
              "null"
            ],
            "description": "Sender phone number in E.164 format."
          },
          "sms_media_urls": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string",
              "format": "uri"
            },
            "description": "Optional array of media URLs to attach to the SMS (MMS)."
          },
          "huawei_badge_add_num": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Increment value for the Huawei badge counter."
          },
          "huawei_badge_class": {
            "type": [
              "string",
              "null"
            ],
            "description": "Activity class associated with the Huawei badge counter."
          },
          "huawei_badge_set_num": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Absolute value to set the Huawei badge counter to."
          }
        }
      },
      "TemplateResource": {
        "type": "object",
        "required": [
          "id"
        ],
        "description": "A template record. The `content` block is a `TemplateResourceContent` whose populated fields depend on the template's channel(s).",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Template ID in UUID v4 format."
          },
          "name": {
            "type": "string",
            "description": "Internal label set when the template was created or last updated. Maximum 128 characters."
          },
          "channel": {
            "type": "string",
            "enum": [
              "push",
              "email",
              "SMS"
            ],
            "description": "The primary channel the template is configured for. Note: `SMS` is uppercased while the others are lowercased."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "ISO-8601 timestamp when the template was created."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "ISO-8601 timestamp when the template was last updated."
          },
          "content": {
            "$ref": "#/components/schemas/TemplateResourceContent"
          }
        }
      },
      "CreateUserConflictResponse": {
        "type": "object",
        "description": "Returned at HTTP 409 by POST `/apps/{app_id}/users` when the request's claimed identity (`aliases` or `external_id`) collides with an existing user. The structured meta block lists each colliding alias label and the alias ID that already identifies a different user.",
        "properties": {
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "code",
                "title"
              ],
              "properties": {
                "code": {
                  "type": "string",
                  "description": "Stable error code identifier. For this response: `Conflict`.",
                  "example": "Conflict"
                },
                "title": {
                  "type": "string",
                  "description": "Human-readable conflict description.",
                  "example": "Conflicting aliases"
                },
                "meta": {
                  "type": "object",
                  "description": "Structured details about the conflict.",
                  "properties": {
                    "conflicting_aliases": {
                      "type": "object",
                      "description": "Map of alias label to the alias ID that already identifies a different user. Use this to surface the specific conflict to the operator and decide whether to retry with a different alias.",
                      "additionalProperties": {
                        "type": "string"
                      },
                      "example": {
                        "external_id": "user-already-claimed-by-another-account",
                        "amazon_id": "amzn-id-already-bound"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "securitySchemes": {}
  },
  "security": [
    {}
  ],
  "paths": {
    "/apps": {
      "x-mcp": {
        "enabled": true
      },
      "get": {
        "summary": "View apps",
        "description": "Retrieve a list of all OneSignal apps associated with your account, including key app details like name, App ID, subscription counts, and timestamps. Useful for managing multiple apps through the OneSignal API.",
        "operationId": "view-apps",
        "x-codeSamples": [
          {
            "lang": "typescript",
            "label": "Node.js SDK",
            "source": "import Onesignal from '@onesignal/node-onesignal';\n\nconst configuration = Onesignal.createConfiguration({\n    organizationApiKey: 'YOUR_ORGANIZATION_API_KEY',\n});\nconst apiInstance = new Onesignal.DefaultApi(configuration);\n\ntry {\n  const response = await apiInstance.getApps();\n  console.log(response);\n} catch (e) {\n  if (e instanceof Onesignal.ApiException) {\n    // `e.errorMessages` flattens any error-envelope shape to a `string[]`;\n    // the raw parsed body remains on `e.body`.\n    console.error(\"getApps failed: HTTP \" + e.code, e.errorMessages);\n  } else {\n    throw e;\n  }\n}"
          },
          {
            "lang": "python",
            "label": "Python SDK",
            "source": "import onesignal\nfrom onesignal.api import default_api\nfrom onesignal.models import *\nfrom pprint import pprint\n\n# See configuration.py for a list of all supported configuration parameters.\n# Some of the OneSignal endpoints require ORGANIZATION_API_KEY token for authorization, while others require REST_API_KEY.\n# We recommend adding both of them in the configuration page so that you will not need to figure it out yourself.\nconfiguration = onesignal.Configuration(\n    rest_api_key = \"YOUR_REST_API_KEY\", # App REST API key required for most endpoints\n    organization_api_key = \"YOUR_ORGANIZATION_API_KEY\" # Organization key is only required for creating new apps and other top-level endpoints\n)\n\n\n# Enter a context with an instance of the API client\nwith onesignal.ApiClient(configuration) as api_client:\n    # Create an instance of the API class\n    api_instance = default_api.DefaultApi(api_client)\n\n    # example, this endpoint has no required or optional parameters\n    try:\n        # View apps\n        api_response = api_instance.get_apps()\n        pprint(api_response)\n    except onesignal.ApiException as e:\n        print(\"Exception when calling DefaultApi->get_apps: %s\\n\" % e)\n        print(\"Status Code: %s\" % e.status)\n        print(\"Response Body: %s\" % e.body)"
          },
          {
            "lang": "php",
            "label": "PHP SDK",
            "source": "<?php\nrequire_once(__DIR__ . '/vendor/autoload.php');\n\n\n// Configure Bearer authorization: organization_api_key\n$config = onesignal\\client\\Configuration::getDefaultConfiguration()\n                                                ->setRestApiKeyToken('YOUR_REST_API_KEY')\n                                                ->setOrganizationApiKeyToken('YOUR_ORGANIZATION_API_KEY');\n\n\n\n$apiInstance = new onesignal\\client\\Api\\DefaultApi(\n    // If you want use custom http client, pass your client which implements `GuzzleHttp\\ClientInterface`.\n    // This is optional, `GuzzleHttp\\Client` will be used as default.\n    new GuzzleHttp\\Client(),\n    $config\n);\n\ntry {\n    $result = $apiInstance->getApps();\n    print_r($result);\n} catch (\\onesignal\\client\\ApiException $e) {\n    echo 'Exception when calling DefaultApi->getApps: ', $e->getMessage(), PHP_EOL;\n    echo 'Status Code: ', $e->getCode(), PHP_EOL;\n    // getErrorMessages() flattens any error-envelope shape to a string[];\n    // the raw body remains on getResponseBody().\n    echo 'Error Messages: ', implode(', ', $e->getErrorMessages()), PHP_EOL;\n    echo 'Response Body: ', $e->getResponseBody(), PHP_EOL;\n} catch (\\Exception $e) {\n    echo 'Exception when calling DefaultApi->getApps: ', $e->getMessage(), PHP_EOL;\n}"
          },
          {
            "lang": "go",
            "label": "Go SDK",
            "source": "package main\n\nimport (\n    \"context\"\n    \"fmt\"\n    \"os\"\n\n    \"github.com/OneSignal/onesignal-go-api/v5\"\n)\n\nfunc main() {\n\n    configuration := onesignal.NewConfiguration()\n    apiClient := onesignal.NewAPIClient(configuration)\n\n    orgAuth := context.WithValue(context.Background(), onesignal.OrganizationApiKey, \"YOUR_ORGANIZATION_API_KEY\") // Organization API key is only required for creating new apps and other top-level endpoints\n\n    resp, r, err := apiClient.DefaultApi.GetApps(orgAuth).Execute()\n\n    if err != nil {\n        fmt.Fprintf(os.Stderr, \"Error when calling `DefaultApi.GetApps``: %v\\n\", err)\n        fmt.Fprintf(os.Stderr, \"Full HTTP response: %v\\n\", r)\n        if apiErr, ok := err.(*onesignal.GenericOpenAPIError); ok {\n            // ErrorMessages() flattens any error-envelope shape to a []string;\n            // the raw body remains on Body().\n            fmt.Fprintf(os.Stderr, \"Error Messages: %v\\n\", apiErr.ErrorMessages())\n            fmt.Fprintf(os.Stderr, \"Response Body: %s\\n\", apiErr.Body())\n        }\n    }\n    // response from `GetApps`: []App\n    fmt.Fprintf(os.Stdout, \"Response from `DefaultApi.GetApps`: %v\\n\", resp)\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby SDK",
            "source": "require 'onesignal'\n# setup authorization\nOneSignal.configure do |config|\n  # Configure Bearer authorization: organization_api_key\n  config.organization_api_key = 'YOUR_ORGANIZATION_API_KEY'\n\nend\n\napi_instance = OneSignal::DefaultApi.new\n\nbegin\n  # View apps\n  result = api_instance.get_apps\n  p result\nrescue OneSignal::ApiError => e\n  puts \"Error when calling DefaultApi->get_apps: #{e}\"\n  puts \"Status Code: #{e.code}\"\n  # `e.error_messages` flattens any error-envelope shape to an Array<String>;\n  # the raw body remains on `e.response_body`.\n  puts \"Error Messages: #{e.error_messages}\"\n  puts \"Response Body: #{e.response_body}\"\nend"
          },
          {
            "lang": "java",
            "label": "Java SDK",
            "source": "// Import classes:\nimport java.util.List;\nimport com.onesignal.client.ApiClient;\nimport com.onesignal.client.ApiException;\nimport com.onesignal.client.Configuration;\nimport com.onesignal.client.auth.*;\nimport com.onesignal.client.model.*;\nimport com.onesignal.client.api.DefaultApi;\n\npublic class Example {\n  public static void main(String[] args) {\n    ApiClient defaultClient = Configuration.getDefaultApiClient();\n    defaultClient.setBasePath(\"https://api.onesignal.com\");\n    \n    // Configure HTTP bearer authorization: organization_api_key\n    HttpBearerAuth organization_api_key = (HttpBearerAuth) defaultClient.getAuthentication(\"organization_api_key\");\n    organization_api_key.setBearerToken(\"YOUR_ORGANIZATION_API_KEY\");\n\n    DefaultApi apiInstance = new DefaultApi(defaultClient);\n    try {\n      List<App> result = apiInstance.getApps();\n      System.out.println(result);\n    } catch (ApiException e) {\n      System.err.println(\"Exception when calling DefaultApi#getApps\");\n      System.err.println(\"Status code: \" + e.getCode());\n      // getErrorMessages() flattens any error-envelope shape to a List<String>;\n      // the raw body remains on getResponseBody().\n      System.err.println(\"Error messages: \" + e.getErrorMessages());\n      System.err.println(\"Reason: \" + e.getResponseBody());\n      System.err.println(\"Response headers: \" + e.getResponseHeaders());\n      e.printStackTrace();\n    }\n  }\n}"
          },
          {
            "lang": "csharp",
            "label": "C# SDK",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing OneSignalApi.Api;\nusing OneSignalApi.Client;\nusing OneSignalApi.Model;\n\nnamespace Example\n{\n    public class GetAppsExample\n    {\n        public static void Main()\n        {\n            Configuration config = new Configuration();\n            config.BasePath = \"https://api.onesignal.com\";\n            // Configure Bearer token for authorization: organization_api_key\n            config.AccessToken = \"YOUR_ORGANIZATION_API_KEY\";\n\n            var apiInstance = new DefaultApi(config);\n\n            try\n            {\n                // View apps\n                List<App> result = apiInstance.GetApps();\n                Debug.WriteLine(result);\n            }\n            catch (ApiException  e)\n            {\n                Debug.Print(\"Exception when calling DefaultApi.GetApps: \" + e.Message );\n                Debug.Print(\"Status Code: \"+ e.ErrorCode);\n                // e.ErrorMessages flattens any error-envelope shape to an IReadOnlyList<string>;\n                // the raw body remains on e.ErrorContent.\n                Debug.Print(\"Error Messages: \" + string.Join(\", \", e.ErrorMessages));\n                Debug.Print(\"Response Body: \" + e.ErrorContent);\n                Debug.Print(e.StackTrace);\n            }\n        }\n    }\n}"
          },
          {
            "lang": "rust",
            "label": "Rust SDK",
            "source": "use onesignal_rust_api::apis::configuration::Configuration;\nuse onesignal_rust_api::apis::default_api;\n\n\n#[tokio::main]\nasync fn main() {\n    let mut configuration = Configuration::new();\n    configuration.organization_api_key_token = Some(\"YOUR_ORGANIZATION_API_KEY\".to_string());\n\n\n    match default_api::get_apps(&configuration).await {\n        Ok(resp) => println!(\"{:?}\", resp),\n        Err(e @ onesignal_rust_api::apis::Error::ResponseError(_)) => {\n            // `e.error_messages()` flattens any error-envelope shape to a Vec<String>;\n            // the raw response remains on the ResponseError variant.\n            eprintln!(\"get_apps failed: {:?}\", e.error_messages());\n        }\n        Err(e) => eprintln!(\"get_apps failed: {:?}\", e),\n    }\n}"
          }
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "description": "Your Organization API key with prefix `Key `. See [Keys & IDs](/docs/en/keys-and-ids).",
            "required": true,
            "schema": {
              "type": "string",
              "default": "Key YOUR_ORGANIZATION_API_KEY"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "description": "The OneSignal App ID in UUID v4 format.",
                        "type": "string"
                      },
                      "name": {
                        "description": "An internal name you set to help organize and track Apps. Maximum 128 characters.",
                        "type": "string"
                      },
                      "players": {
                        "description": "The total number of Subscriptions in the app. Omitted when `view=config` is passed.",
                        "type": "integer"
                      },
                      "messageable_players": {
                        "description": "The number of Subscriptions eligible to receive messages in the app. Omitted when `view=config` is passed.",
                        "type": "integer"
                      },
                      "created_at": {
                        "description": "The date and time the app was created.",
                        "type": "string"
                      },
                      "updated_at": {
                        "description": "The date and time the app was last updated.",
                        "type": "string"
                      },
                      "organization_id": {
                        "description": "The Organization ID in which the app was created.",
                        "type": "string"
                      },
                      "additional_data_is_root_payload": {
                        "description": "When `true`, custom additional data is sent at the root of the push payload instead of nested under a `custom` key (iOS only).",
                        "type": "boolean"
                      },
                      "gcm_key": {
                        "description": "**Legacy.** The deprecated Google Cloud Messaging (GCM/FCM legacy) server API key. Retained for backward compatibility; use `fcm_v1_service_account_json` instead.",
                        "type": "string"
                      },
                      "fcm_v1_service_account_json": {
                        "description": "Your FCM Service Account JSON file for Android push notifications. See [Android: Firebase Credentials](/docs/android-firebase-credentials).",
                        "type": "string"
                      },
                      "fcm_sender_id": {
                        "description": "The FCM Sender ID associated with your Firebase project.",
                        "type": "string"
                      },
                      "chrome_key": {
                        "description": "**Legacy.** The deprecated Google Chrome extension (GCM) API key. Retained for backward compatibility.",
                        "type": "string"
                      },
                      "chrome_web_key": {
                        "description": "Web push VAPID public key for Chrome web push notifications.",
                        "type": "string"
                      },
                      "chrome_web_origin": {
                        "description": "The HTTPS origin URL for your website. Required for web push notifications.",
                        "type": "string"
                      },
                      "chrome_web_gcm_sender_id": {
                        "description": "The GCM Sender ID used for web push notifications.",
                        "type": "string"
                      },
                      "chrome_web_default_notification_icon": {
                        "description": "The full HTTPS URL to your default notification icon. Should be a 256x256px PNG.",
                        "type": "string"
                      },
                      "chrome_web_sub_domain": {
                        "description": "The OneSignal subdomain for web push if not using your own origin.",
                        "type": "string"
                      },
                      "apns_env": {
                        "description": "The APNS environment: `production` or `development`. See [iOS SDK Setup](/docs/ios-sdk-setup).",
                        "type": "string"
                      },
                      "apns_certificates": {
                        "description": "The APNS p12 certificate for iOS push notifications.",
                        "type": "string"
                      },
                      "apns_p8": {
                        "description": "The APNs Auth Key (.p8) token-based credential for iOS push notifications.",
                        "type": "string"
                      },
                      "apns_team_id": {
                        "description": "The Apple Developer Team ID associated with the APNs Auth Key.",
                        "type": "string"
                      },
                      "apns_key_id": {
                        "description": "The Key ID of the APNs Auth Key (.p8).",
                        "type": "string"
                      },
                      "apns_bundle_id": {
                        "description": "The app bundle ID associated with the APNs Auth Key.",
                        "type": "string"
                      },
                      "safari_apns_certificate": {
                        "description": "The Safari APNs certificate, or \"OneSignal Provided Certificate\" when using a OneSignal-managed Safari certificate.",
                        "type": "string"
                      },
                      "safari_site_origin": {
                        "description": "The HTTPS origin URL configured for Safari web push.",
                        "type": "string"
                      },
                      "safari_push_id": {
                        "description": "The Safari Web Push ID (website push ID / certificate bundle ID).",
                        "type": "string"
                      },
                      "safari_icon_16_16": {
                        "description": "URL to the 16x16px Safari notification icon.",
                        "type": "string"
                      },
                      "safari_icon_32_32": {
                        "description": "URL to the 32x32px Safari notification icon.",
                        "type": "string"
                      },
                      "safari_icon_64_64": {
                        "description": "URL to the 64x64px Safari notification icon.",
                        "type": "string"
                      },
                      "safari_icon_128_128": {
                        "description": "URL to the 128x128px Safari notification icon.",
                        "type": "string"
                      },
                      "safari_icon_256_256": {
                        "description": "URL to the 256x256px Safari notification icon.",
                        "type": "string"
                      },
                      "site_name": {
                        "description": "The name of the website configured for web push.",
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request. Returned when the account or organization has more than 1000 apps (this endpoint is disabled above that limit), or when the Authorization key is missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BasicErrorResponse"
                },
                "example": {
                  "errors": [
                    "This API endpoint is d

# --- truncated at 32 KB (1236 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/onesignal/refs/heads/main/openapi/_original/onesignal-api-openapi.json