--- title: "Send Targeted App Pushes" slug: "send-targeted-app-pushes-api" description: "Explains the Targeted App Push API's POST endpoint for sending pushes to up to 50 identified users, covering identifiers, Android/iOS payloads, and deep links." tags: ["send targeted app pushes", "targeted app push api"] updated: 2026-11-03T10:41:18Z published: 2026-11-03T10:41:18Z canonical: "academy.insiderone.com/send-targeted-app-pushes-api" --- > ## Documentation Index > Fetch the complete documentation index at: https://academy.insiderone.com/llms.txt > Use this file to discover all available pages before exploring further. # Send Targeted App Pushes The Targeted App Push API, also known as sending a push notification through the API, is a POST endpoint for delivering app push notifications directly to identified users by identifier, such as email, phone number, or UUID, rather than through a campaign segment. It supports rich media, deep links, carousel and slider advanced push types, action buttons (CTA), and per-platform configuration for iOS and Android. Use it for real-time, user-specific notifications such as order status updates from your backend system or price drop alerts on a user's wishlist item. You can access analytics for targeted push notifications sent via this API through **Reports** > **Mobile App Analytics** > **App Push API Campaigns** on InOne. ## Endpoint and Headers > **POST** https://mobile.useinsider.com/api/v2/notification/user [](https://developers.insiderone.com/#09dc41c6-8deb-4793-9a92-74ae79ad49b4) > Visit our Postman collection to test this request. | Header | Sample Value | Description | | --- | --- | --- | | Content-Type | application/json | This header specifies the media type of the resource. | ## Body Parameters | Parameter | Description | Data Type | Required | | --- | --- | --- | --- | | api_key | Your API key. Refer to [API Authentication Tokens](https://academy.insiderone.com/docs/api-authentication-tokens) to get your API key. | String | Yes | | async | True: The request is queued and HTTP 202 {"message":"Async request accepted"} returns. The notification send results are not in the response. False (default): HTTP 200 returns send reports with success/error counts. | Boolean | No | | delivery_devices | Which devices of each user receive the pushes in this request. last_active sends the push only to the user's last active device. all_devices sends the push to every device of the user. Default: last_active. Leave the key out instead of sending an empty string. | String | No | | notifications | The array of notification object that includes the push data | Array | Yes | | identifiers | The object that contains the unique identifier of the user. The key can be an identifier such as email, phone_number, or uuid. *E.g., "phone_number": "+651234567890".* | Object | Yes | | camp_id | ID of the campaign that can be used to retrieve the statistics of the push notification via Statistics API. You can set any campaign ID. | Integer | Yes | | camp_name | Name of the push notification | String | Yes | | title | Title of the push notification | String | Yes | | message | Content of the push notification | String | Yes | | image_url | URL of the image in rich push notifications | String | No | | action_buttons | Array of action button (CTA) objects to show on the push notification. You can add up to three buttons. See the action_buttons parameters below. | Array | No | | GFC_enabled | When set to *true*, the Targeted Push API enforces your pushed global frequency cap (GFC). Each successful API push increments the user’s GFC counter by one. If the user has already reached the GFC limit, the API blocks the send. The user is excluded, no message is sent, and the count is not incremented. The default value is set to *false*. Even if GFC_enabled is set to *false*, the user's counter is still incremented. | Boolean | No | | skip_gfc_counter | When set to true, the push is sent without being counted toward the user's daily app push global frequency cap (GFC). The default value is false: every push sent through this API is counted. | Boolean | No | | ttl | Expiration time of the push notification in seconds | Integer | No | | operating_system | Which platform receives this notification: all, ios, or android. Set it on each notification. Default: all. | String | No | | android | Object for Android details | Object | No | | channel_id | ID of the channel | Integer | No | | ios | Object for iOS details | Object | No | | thread_id | ID of the notification thread | Integer | No | | deep_link | Key/value pairs to be passed to the application in the push payload. The most common use of deep links is sending the user to the selected landing page when they open the push notification. | Object | No | | sound | Name of the custom sound file in your app to play a custom sound | String | No | | badge | Badge for iOS | Integer | No | | content-available | (iOS only) *true* sends the notifications with content--available=1, but the notification does not appear. This can be used to execute background tasks remotely. | Boolean | No | | mutable-content | (iOS only) *true* sends the notification with mutable-content=1 and updates the current screen app pushes. This can be used to update app push notification content that was sent incorrectly on the user's screen. | Boolean | No | > The image_url is required for **rich** push notifications, but **not** for **text-only** push notifications. To add key-value pairs to the deep_link object, you can use the following deep link keys depending on its type: - ins_dl_internal for an internal deep link, - ins_dl_external for an external deep link, - ins_dl_url_scheme for a URL scheme deep link, - ins_dl_json for a JSON deep link. The URL in the value should always start with https://. ## Sample Body The sample body below is for sending a push notification with user-level reporting by providing an API key, a set of report attributes (such as email, phone number, device info, and app version), and notification details including identifiers, campaign info, title, message, image, time-to-live, opt-in checks, plus platform-specific settings for Android and iOS (e.g., sound, thread ID, badge, and deep links). > Set delivery_devices to all_devices to send the push to every device of the user. delivery_devices applies to every notification in the request. Use operating_system on each notification to limit it to iOS or Android devices. *camp_id* allows you to list your app push notifications in the Message Center and get campaign-based reporting of your Push API campaigns. When replacing the sample values in the payload, make sure to use a unique campaign ID value in the *camp_id* key. ```json {  "api_key": "your_api_key_here",  "async": false,  "delivery_devices": "all_devices",  "notifications": [    {      "identifiers": {        "INSIDER.uuid": "ios-user-uuid-12345",        "INSIDER.phone_number": "+65123456789",        "INSIDER.email": "iosuser@insiderone.com"      },      "camp_id": 1001,      "camp_name": "Campaign iOS",      "title": "Push notification for iOS user",      "message": "Hello, this is a push notification",      "image_url": "https://insiderone.com/image.jpg",      "ttl": 3600,      "operating_system": "ios",      "ios": {        "deep_link": {          "screen": "product",          "product_id": "12345"        },        "mutable-content": true,        "content-available": true,        "thread-id": 1,        "badge": 1,        "sound": "default"      }    },    {      "identifiers": {        "INSIDER.uuid": "ios-user-uuid-12345",        "INSIDER.phone_number": "+65123456789",        "INSIDER.email": "iosuser@insiderone.com"      },      "camp_id": 1002,      "camp_name": "Campaign Android",      "title": "Push notification for Android user",      "message": "Hello, this is a notification",      "image_url": "https://insiderone.com/image.jpg",      "ttl": 3600,      "operating_system": "android",      "android": {        "deep_link": {          "screen": "product",          "product_id": "67890"        },        "sound": "default",        "channel_id": 1      }    }  ] } ``` Add advanced_push_payload in *notifications* if you would like to use Advanced Pushes*.* The advanced_push_type value can be a *carousel* or *slider*. The following are the parameters of the advanced_push_payload. | Parameter | Definition | Data Type | Required | | --- | --- | --- | --- | | advanced_push_type | Type of the advanced push: carousel or slider | String | Yes | | advanced_push_items | Details of the advanced push | Array | Yes | | image_url | URL of the image in rich push notifications | String | Yes | | deep_links | Key/value pairs to be passed to the application in the push payload. The most common use of deep links is sending the user to the selected landing page when they open the push notification. | Object | No | | description | Description for your push | String | Yes | | headline | Title for your push | String | Yes | | id | ID of your push | Integer | Yes | For further details on advanced pushes, refer to [Send advanced app pushes API](/v1/docs/api-reference-send-advanced-app-pushes). ```json {  "api_key": "Your API Key goes here",  "delivery_devices": "all_devices",  "report_attributes": [    "INSIDER.carrier",    "INSIDER.idfa",    "INSIDER.name",    "INSIDER.surname",    "INSIDER.gender",    "INSIDER.age",    "INSIDER.birthday",    "INSIDER.email",    "INSIDER.phone_number",    "INSIDER.language",    "INSIDER.email_optin",    "INSIDER.sms_optin",    "INSIDER.push_optin",    "INSIDER.location_optin",    "INSIDER.insider_id",    "INSIDER.environment",    "INSIDER.idfa",    "INSIDER.device_token",    "INSIDER.udid",    "INSIDER.model",    "INSIDER.carrier",    "INSIDER.app_version",    "INSIDER.os_version",    "INSIDER.screen_width",    "INSIDER.screen_height",    "INSIDER.platform",    "INSIDER.timezone",    "INSIDER.device_language",    "INSIDER.sdk_version",    "INSIDER.last_ip",    "INSIDER.package_name"  ],  "notifications": [    {      "identifiers": {        "INSIDER.email": "example@gmail.com",        "INSIDER.phone_number": "+9059713551597135123",        "INSIDER.uuid": "5971351231234567"      },      "advanced_push_payload": {        "advanced_push_type": "carousel",        "advanced_push_items": [          {            "image_url": "https://your_image_url.jpg",            "deep_links": {              "your_deeplink_key": "value1"            },            "description": "Description for the item 1",            "headline": "Title for the item 1",            "id": 1          },          {            "image_url": "https://your_image_url.jpg",            "deep_links": {              "your_deeplink_key": "value2"            },            "description": "Description for the item 2",            "headline": "Title for the item 2",            "id": 2          },          {            "image_url": "https://your_image_url.jpg",            "deep_links": {              "your_deeplink_key": "value3"            },            "description": "Description for the item 3",            "headline": "Title for the item 3",            "id": 3          }        ]      },      "camp_id": 1,      "camp_name": "Your push notification campaign name goes here",      "title": "Your push notification title goes here",      "message": "Your push content goes here",      "image_url": "https://your_image_url.jpg",      "ttl": 1,      "operating_system": "all",      "android": {        "channel_id": 1,        "sound": "sound_check",        "deep_link": {          "ins_dl_internal": "https://www.deeplink.useinsider"        }      },      "ios": {        "thread-id": 13,        "badge": 1,        "content-available": false,        "mutable-content": true,        "sound": "sound_check",        "deep_link": {          "ins_dl_internal": "https://www.deeplink.useinsider"        }      }    }  ] } ``` You can replace the **advanced_push_payload.advanced_push_items[n].deep_links.your_deeplink_key** with a custom deep link key, or use one of the following default keys: **ins_dl_internal**, i**ns_dl_external**, **ins_dl_url_scheme**, or **ins_dl_json**. Add action_buttons in *notifications* if you want to add action buttons (CTA) to your push notification. Each button includes text and the deep links passed to your application when the user taps it. The following are the parameters of the action_buttons objects. | Parameter | Definition | Data Type | Required | | --- | --- | --- | --- | | text | Text of the button. Leading and trailing spaces are removed. The maximum length depends on the number of buttons in the push. It is 48 characters for 1 button, 20 characters each for 2 buttons, and 11 characters each for 3 buttons. Characters are counted as Unicode code points, so some emoji count as more than one character. | String | Yes | | deep_links | Key/value pairs to be passed to the application when the user taps the button. It must contain at least one key. You can use ins_dl_internal, ins_dl_external, ins_dl_url_scheme, or a custom key. ins_dl_json is not supported. All values must be strings. | Object | Yes | > [!NOTE] > - The buttons are shown in the order of the action_buttons array. > - To use action_buttons, set camp_id to a value greater than 0. Button clicks are attributed to the campaign through camp_id. > - action_buttons cannot be used together with advanced_push_payload (carousel or slider). > - When action_buttons is used, the ios.deep_link and android.deep_link objects cannot contain the push_buttons or category keys. These keys are reserved for the buttons. > - Button deep links are sent as they are. Personalization such as {{attribute}} is not applied to them. > - The action buttons are visible depending on your SDK version. The minimum required SDK versions are: > - iOS 13.10.0 > - Android 14.9.1 > - Flutter 3.17.0 > - React Native 6.8.0 Below is a sample body for sending a push notification with **two action buttons**. ```json {  "api_key": "your_api_key_here",  "delivery_devices": "all_devices",  "notifications": [    {      "identifiers": {        "INSIDER.email": "user@insiderone.com"      },      "camp_id": 1003,      "camp_name": "Campaign with action buttons",      "title": "Your order is ready",      "message": "Pick it up today or schedule a delivery.",      "image_url": "https://insiderone.com/image.jpg",      "ttl": 3600,      "operating_system": "all",      "android": {        "channel_id": 1,        "deep_link": {          "ins_dl_internal": "https://www.deeplink.useinsider/orders"        }      },      "ios": {        "deep_link": {          "ins_dl_internal": "https://www.deeplink.useinsider/orders"        }      },      "action_buttons": [        {          "text": "Track order",          "deep_links": {            "ins_dl_internal": "https://www.deeplink.useinsider/orders/track"          }        },        {          "text": "Get help",          "deep_links": {            "ins_dl_external": "https://insiderone.com/help"          }        }      ]    }  ] } ``` ## Sample Responses #### 200 OK You will receive the following response if you send your request using the **report_attributes** array. *insider_id* represents the profile ID in user profiles. ```json {    "successes": [        {            "INSIDER.age": null,            "INSIDER.app_version": "4.0",            "INSIDER.birthday": null,            "INSIDER.carrier": "mycarrier",            "INSIDER.device_language": "en",            "INSIDER.device_token": "d07951020f3835bbc303084ecda3746170cfb5d696ddcc55b6",            "INSIDER.email": "sample@mail.com",            "INSIDER.email_optin": null,            "INSIDER.environment": "production",            "INSIDER.gender": null,            "INSIDER.idfa": "AF3CCF3F-0V8E-6571-B296-E9BDFF7",            "INSIDER.insider_id": "940E4A98F309288AAC8C4",            "INSIDER.language": null,            "INSIDER.last_ip": null,            "INSIDER.location_optin": false,            "INSIDER.model": "iPhone 11",            "INSIDER.name": "John Smith",            "INSIDER.os_version": "14.7.1",            "INSIDER.package_name": "com.useinsider.iGurmeV3",            "INSIDER.phone_number": "+65123456789",            "INSIDER.platform": "iOS",            "INSIDER.push_optin": true,            "INSIDER.screen_height": null,            "INSIDER.screen_width": null,            "INSIDER.sdk_version": "10.6.0-RN-4.0.0",            "INSIDER.sms_optin": null,            "INSIDER.surname": null,            "INSIDER.timezone": "Europe/Helsinki",            "INSIDER.udid": "98BB170F5078F309288AAC8C4"        }    ],    "errors": {} } ``` You will receive the following response if you send your request without the **report_attributes** array. ```json {    "successes": [        {            "INSIDER.device_token": "d07951020f3084ecd4d3deda3746170cfb5d69672c055b6"        }    ],    "errors": {} } ``` In some cases, the request returns a 200 response, but the app pushes cannot be sent to users. The following list displays the reasons for these cases. | noUserErr | "NoUserFound" | | --- | --- | | optOutErr | "OptOut" | | unregisteredErr | "Unregistered" | | userGloballyCappedErr | "UserGloballyCapped" | | userGloballyCappedForInappErr | "UserGloballyCappedForInapp" | | invalidCertificateErr | "InvalidCertificate" | #### 400 Bad Request The following response returns if your request is missing an identifier. ```json {    "error": "empty_insider_identifiers",    "message": "'insider_identifiers' object need to have at least one identifier" } ``` #### 400 Bad Request The following response returns if the notifications array is empty. ```json {  "error": "invalid_notifications",  "message": "'notifications' is empty, add some notification objects" } ``` #### 400 Bad Request The following response returns if the array has more than 20 objects. ```json {  "error": "invalid_notifications",  "message": "'notifications' can't have more than 20 objects" } ``` #### 400 Bad Request The following response returns if the deep link is blacklisted. The "aps" key cannot be used in the deep link. You need to remove the "aps" word from the deep link. ```json {  "error": "blacklisted_deeplink",  "message": "deepLink can't contain 'aps' key" } ``` #### 400 Bad Request The following response returns if the camp ID or channel ID is a negative integer. ```json {  "error": "negative_integer",  "message": "camp_id' and/or 'channel_id' must be greater than zero" } ``` #### 400 Bad Request The following response returns if the advanced push type is invalid. ```json {  "error": "invalid_advanced_push_type",  "message": "'advanced_push_type' must be either Carousel or Slider" } ``` #### 400 Bad Request The following response returns if delivery_devices is not last_active or all_devices. An empty string also returns this error. ```json {  "error": "invalid_delivery_devices",  "message": "'delivery_devices' must be one of: 'last_active', 'all_devices'" } ``` #### 400 Bad Request The following response returns if operating_system is not all, ios, or android. ```json {  "error": "invalid_operating_system",  "message": "'operating_system' must be one of: 'all', 'ios', 'android'" } ``` #### 400 Bad Request The following response returns if the certificate is invalid. Refer to [Push Certificates](https://academy.insiderone.com/docs/mobile-app-settings-push-certificates) to see how to add push certificates for iOS, Android, and Huawei. ```json {  "error": "invalid_certificate",  "message": "You do not have a validated certificate. Please check Certificate section under Insider's Settings." } ``` #### 400 Bad Request The following response returns if action_buttons breaks one of its rules, e.g., more than three buttons, an empty button text, a button text over the character limit, or a button without deep links. The message names the button and the rule. ```json {  "error": "invalid_action_buttons",  "message": "action_buttons[0].text exceeds 20 characters for 2 button(s)" } ``` #### 400 Bad Request The following response returns if action_buttons is used and camp_id is missing or 0. ```json {  "error": "camp_id_required_for_action_buttons",  "message": "'camp_id' must be greater than zero when 'action_buttons' is used" } ``` #### 400 Bad Request The following response returns if action_buttons and advanced_push_payload are used in the same notification. ```json {  "error": "action_buttons_with_advanced_push",  "message": "'action_buttons' can't be used together with 'advanced_push_payload'" } ``` #### 400 Bad Request The following response returns if the push notification with its action buttons is too large to be delivered. ```json {  "error": "action_buttons_payload_too_large",  "message": "push payload with action_buttons is 4125 bytes, limit is 4000 bytes; shorten title, message, deep links or button texts" } ``` #### 403 Forbidden The following response returns if a button deep link uses a domain that is not in your Domain Allow List. ```json {  "error": "Some of the URL domains are invalid or not allowed." } ``` #### 401 Unauthorized The following response returns if the API key is either empty or incorrect. Refer to [API Authentication Tokens](https://academy.insiderone.com/docs/api-authentication-tokens) to get your API key. ```json {    "error": "bad_api_key",    "message": "'api_key' is either empty or wrong. You can get your API key from Insider Dashboard" } ``` ### Error reference Use this table to identify and resolve the errors this endpoint returns. Each row shows the status code, the response body you receive, what causes it, and how to fix it. | Status | JSON response | Cause | Fix | | --- | --- | --- | --- | | **400 Bad Request** | { "error": "empty_insider_identifiers", "message": "'insider_identifiers' object need to have at least one identifier" } | The insider_identifiers object is present but empty, so the request does not name a recipient. | Include at least one identifier, e.g., email, phone_number, or uuid. | | **400 Bad Request** | { "error": "invalid_notifications", "message": "'notifications' is empty, add some notification objects" } | The notifications array is empty. | Add at least one notification object to the array. | | **400 Bad Request** | { "error": "invalid_notifications", "message": "'notifications' can't have more than 20 objects" } | The notifications array holds more than 20 objects. | Send a maximum of 20 notification objects per request, and split larger sends across several requests. | | **400 Bad Request** | { "error": "blacklisted_deeplink", "message": "deepLink can't contain 'aps' key" } | The deep link contains the string aps, which is reserved by the Apple Push Notification service payload format. | Remove aps from the deep link. If the token is part of a query parameter or path segment, rename it. | | **400 Bad Request** | { "error": "negative_integer", "message": "camp_id' and/or 'channel_id' must be greater than zero" } | camp_id or channel_id is zero or negative. An uninitialized variable in the calling code is the usual reason. | Send positive integers for both values, taken from the campaign and channel records in your panel. | | **400 Bad Request** | { "error": "invalid_advanced_push_type", "message": "'advanced_push_type' must be either Carousel or Slider" } | advanced_push_type holds a value other than Carousel or Slider. The values are case-sensitive. | Set advanced_push_type to Carousel or Slider, matching the capitalization exactly. | | **400 Bad Request** | { "error": "invalid_certificate", "message": "You do not have a validated certificate. Please check the Certificate section under Insider's Settings." } | No validated push certificate exists for the target platform. The request is otherwise well-formed, so this failure is configuration, not payload. | Add and validate the certificate for iOS, Android, or Huawei. See Push Certificates. | | **401 Unauthorized** | { "error": "bad_api_key", "message": "'api_key' is either empty or wrong. You can get your API key from Insider Dashboard" } | The API key is missing or incorrect. | Send a current API key from your panel. See API Authentication Tokens. | | **400 Bad Request** | { "error": "invalid_action_buttons", "message": "action_buttons can't have more than 3 buttons" } | action_buttons holds more than three objects. | Send a maximum of three buttons. | | **400 Bad Request** | { "error": "invalid_action_buttons", "message": "action_buttons[0].text is empty" } | The button text is missing or holds only spaces or invisible characters. The index shows which button. | Add a visible text to the button. | | **400 Bad Request** | { "error": "invalid_action_buttons", "message": "action_buttons[0].text exceeds 48 characters for 1 button(s)" } | The button text is longer than the limit for the number of buttons: 48 for 1 button, 20 for 2 buttons, and 11 for 3 buttons. | Shorten the button text, or send fewer buttons. | | **400 Bad Request** | { "error": "invalid_action_buttons", "message": "action_buttons[0].deep_links needs at least one deep link" } | The button has no deep_links object, or the object is empty. | Add at least one deep link key to the button. | | **400 Bad Request** | { "error": "invalid_action_buttons", "message": "action_buttons[0].deep_links: ins_dl_json is not supported in action_buttons deep_links" } | The button uses the ins_dl_json deep link key. | Use ins_dl_internal, ins_dl_external, ins_dl_url_scheme, or a custom key. | | **400 Bad Request** | { "error": "invalid_action_buttons", "message": "action_buttons[0].deep_links: …" } | A button deep link breaks a general deep link rule. The message after the colon is one of the following: "deeplink key is empty or contains space", "deeplink key is restricted: " (variant_id, camp_id, camp_type, inapp_id, dismiss_type, source), "deeplink value for must be a valid URL" (ins_dl_internal and ins_dl_external values must start with http:// or https://), or "deeplink value is empty for key: ". | Correct the deep link named in the message. | | **400 Bad Request** | { "error": "invalid_action_buttons", "message": "action_buttons exceed 2048 bytes once rendered" } | The buttons together are too large. | Shorten the button texts or deep links. | | **400 Bad Request** | { "error": "invalid_action_buttons", "message": "ios.deep_link can't contain 'push_buttons' or 'category' when action_buttons is used" } | The ios.deep_link or android.deep_link object uses a key that is reserved for the buttons. | Remove or rename the push_buttons and category keys. | | **400 Bad Request** | { "error": "invalid_payload", "message": "Can't parse payload, check your keys and data types" } | A button text or a button deep link value is not a string, e.g., a number or an object. | Send text and every deep_links value as strings. | | **400 Bad Request** | { "error": "camp_id_required_for_action_buttons", "message": "'camp_id' must be greater than zero when 'action_buttons' is used" } | action_buttons is used without a camp_id greater than 0. Button clicks cannot be attributed without it. | Send a positive camp_id. | | **400 Bad Request** | { "error": "action_buttons_with_advanced_push", "message": "'action_buttons' can't be used together with 'advanced_push_payload'" } | The notification has both action_buttons and advanced_push_payload. | Send either action buttons or a carousel/slider push, not both. | | **400 Bad Request** | { "error": "action_buttons_payload_too_large", "message": "push payload with action_buttons is 4125 bytes, limit is 4000 bytes; shorten title, message, deep links or button texts" } | The push notification, with its buttons, is larger than the limit that iOS and Android accept. | Shorten the title, message, deep links, or button texts. | | **400 Bad Request** | { "error": "invalid_delivery_devices", "message": "'delivery_devices' must be one of: 'last_active', 'all_devices'" } | delivery_devices is not last_active or all_devices. An empty string also returns this error. | Send last_active or all_devices, or leave the key out. | | **400 Bad Request** | { "error": "invalid_operating_system", "message": "'operating_system' must be one of: 'all', 'ios', 'android'" } | operating_system is not all, ios, or android. | Send all, ios, or android in operating_system, or leave the key out. | | **403 Forbidden** | { "error": "Some of the URL domains are invalid or not allowed." } | A button deep link uses a domain that is not in your Domain Allow List. | Use an allowed domain, or add the domain to your Domain Allow List. | | **429 Too Many Requests** | *No response body is published for this status code.* | You exceeded the rate limit of 10,000 requests per minute for this endpoint. Send Advanced App Pushes uses the same path with a separate limit of 1,000 requests per minute. | Throttle your client and retry with exponential backoff. Batch up to 20 notification objects per request to reduce request volume. | ### Fail Records Messages | Message | Definition | | --- | --- | | InvalidRegistration (Android) | Check the format of the registration passed to the server. Make sure it matches the registration token the client app receives from registering with FCM. Do not truncate or add additional characters. | | NotRegistered (Android) | The user uninstalled the app, and it is no longer reachable. | | MismatchSenderId (Android) | Google Sender ID used in the integration and the FCM Server Key do not belong to the same parent Google Account. | | BadDeviceToken (iOS) | The application and the app environment do not match. One is in development, and the other is in the production environment. | | DeviceTokenNotForTopic (iOS) | Push notification certificate topic and the application package name do not match. | | Unregistered (iOS) | The user uninstalled the app and is no longer reachable. | ## Limitations - All functions must be executed with a simple **HTTPS POST** request. - The **API key** should be provided in the request body. If the key is incorrect, no operation will be executed. - The rate limit is **10000** requests per minute. - Each request can include up to **50** user **identifiers**, meaning the targeted push can be sent to up to 50 users. - You must complete the identifier integration with the Insider SDK's user object for your platforms. See [Android](https://academy.insiderone.com/docs/android-user-object#set-login-attribute), [iOS](https://academy.insiderone.com/docs/ios-user-object#set-login-attribute), [React Native](https://academy.insiderone.com/docs/react-native-user-object#set-login-attribute), [Flutter](https://academy.insiderone.com/docs/flutter-user-object#set-login-attribute), and [Cordova](https://academy.insiderone.com/docs/cordova-user-object#set-login-attribute) for further details. - The *camp ID* value should be greater than 0. *camp ID* is required when action_buttons is used. - The *preferred_type* value can be *slider* or *carousel*. - The *Android channel ID* value should be greater than 0. - Each push notification can include up to **three** action buttons. - The maximum button text length is 48 characters for 1 button, 20 characters for 2 buttons, and 11 characters for 3 buttons. - When delivery_devices is all_devices, operating_system filters each device by its own platform. A user with one iOS and one Android device receives the push only on the iOS device when operating_system is ios. - When delivery_devices is last_active and the user's last active device is not on the selected platform, the user does not receive the push. - Sending to ios or android only requires a validated push certificate for that platform. - The new keys do not change campaign reporting. Statistics are counted as before. - delivery_devices is set once per request and applies to every notification in it. operating_system is set separately on each notification. > The default limit shown here is a standard baseline. If your use case requires higher capacity, feel free to reach out to the Insider One team. We can adjust it to fit your needs. ## Related - [Send Bulk App Pushes](/send-bulk-app-pushes-api.md) - [Send Advanced App Pushes](/send-advanced-app-pushes-api.md) - [FAQ about App APIs](/faq-app-apis.md) - [API Authentication Tokens](/api-authentication-tokens.md) - [API Rate Limits](/api-rate-limits.md) - [API Status and Error Codes](/api-status-and-error-codes.md) - [Insider One APIs in Postman](/insider-apis-in-postman.md) - [App Push](/app-push.md)