--- title: "Monitor campaigns & users by pulling data periodically" slug: "api-data-monitor" updated: 2026-05-29T13:39:29Z published: 2026-06-05T12:54:43Z canonical: "docs.xtremepush.com/api-data-monitor" --- > ## Documentation Index > Fetch the complete documentation index at: https://docs.xtremepush.com/llms.txt > Use this file to discover all available pages before exploring further. # Monitor campaigns & users by pulling data periodically Learn how to use the API to learn more about campaigns, devices and user profiles There are a range of methods available to you to pull data related to campaigns and users to whom you have sent campaigns. Some common use cases are outlined below. ## Check that a campaign is live The simplest method related to campaigns is the [campaign info](ref:campaign-info) method. This is commonly used to check that campaign templates are live and to validate content before executing them: ```shell curl --request POST \  --url https://external-api.xtremepush.com/api/external/info/campaign \  --header 'Accept: application/json' \  --header 'Content-Type: application/json' \  --data '{    "apptoken": "APP_TOKEN",    "id": "CAMPAIGN_ID"  }' ``` You can use it with select options if you only need to check certain params: ```shell curl --request POST \  --url https://external-api.xtremepush.com/api/external/info/campaign \  --header 'Accept: application/json' \  --header 'Content-Type: application/json' \  --data '{    "apptoken": "APP_TOKEN",    "id": "CAMPAIGN_ID",    "select": ["active", "messages", "push_text"]  }' ``` This is an example response for an active campaign template with iOS and Android push content: ```JSON {    "success": true,    "code": 200,    "model": {        "active": 0,        "messages": {            "1": {                "push_text": "Hi {{first_name}}, {{amount}} has been debited from your account. Tap here if you did not approve this."            },            "2": {                "push_text": "Hi {{first_name}}, {{amount}} has been debited from your account. Tap here if you did not approve this."            },            "3": {                "push_text": null            },            "6": {                "push_text": null            },            "4": [],            "7": [],            "8": [],            "9": [],            "10": [],            "11": []        }    } } ``` ## Check for errors or information for a specific campaign If you want to periodically check on delivery of a campaign to individual users you can use the [push to device list method](ref:push-list-device). The example below will return any error messages for notifications that failed to deliver referenced by the Xtremepush device ID: ```JSON curl --request POST \  --url https://external-api.xtremepush.com/api/external/list/push-devices \  --header 'Accept: application/json' \  --header 'Content-Type: application/json' \  --data '{    "apptoken": "APP_TOKEN",    "condition": [      ["campaign_id", "=", "CAMPAIGN_ID"],      ["error", "=" , 1]    ],    "select": ["campaign_id", "action_id", "message", "create_time", "device_id", "error_message"],    "order": ["id DESC", "create_time"],    "limit": 50,    "offset": 0  }' ``` The response will show if a message failed to deliver and can help you understand the reason, such as the application being uninstalled on a user's device, which is one of the most common reasons for an individual push to fail. Example response with an application uninstall error below: ```JSON {  "code": 200,  "success": true,  "data": [{    "action_id": 759147,    "campaign_id": 245624,    "create_time": 1464355910,    "device_id": 459923,    "error_message": "Application is Uninstalled"  }], } ``` In the case of profile-based channels (such as email, or SMS) you can use the following request to review individual errors. This does not use the device ID. ```JSON curl --request POST \  --url https://external-api.xtremepush.com/api/external/list/push-devices \  --header 'Accept: application/json' \  --header 'Content-Type: application/json' \  --data '{    "apptoken": "APP_TOKEN",    "condition": [      ["campaign_id", "=", "CAMPAIGN_ID"],      ["error", "=" , 1]    ],    "select": ["campaign_id", "action_id", "message_type_name", "message_params", "create_time", "error", "error_message"],    "order": ["id DESC", "create_time"],    "limit": 50,    "offset": 0  }' ``` This example response shows an active campaign template with email content, where some emails could not be sent due to missing required parameters: ```JSON {  "success": true,  "code": 200,  "data": [{    "action_id": 313049676,    "campaign_id": 9661067,    "create_time": 1561385901,    "error": 1,    "error_message": "Required values are not set",    "message_params": {"first_name": "Sam", "ref_number": "1234", "user.email": "[[email protected]](mailto:[email protected])"},    "message_type_name": "email"  }, {    "action_id": 311506802,    "campaign_id": 9661067,    "create_time": 1561314578,    "error": 1,    "error_message": "Required values are not set",    "message_params": {"user.email": "[[email protected]](mailto:[email protected])"},    "message_type_name": "email"  }] } ``` You can get info on delivered messages only by changing the error condition to `["error", "=" , 0]`. Removing the `select` param would give all info for recent successful messages. If you want data on opened messages then you can use an `["open", "=" , 1]` condition to filter for data in opened messages. For example: ```JSON curl --request POST \  --url https://external-api.xtremepush.com/api/external/list/push-devices \  --header 'Accept: application/json' \  --header 'Content-Type: application/json' \  --data '{    "apptoken": "o7Sea-OzAGHtJeJHuD53Obyl8sbMuFTk",    "condition": [      ["campaign_id", "=", "53573097"],      ["open", "=" , 1]    ],    "select": ["campaign_id", "message", "create_time", "open_time", "device_id"],    "order": ["id DESC", "create_time"],    "limit": 50,    "offset": 0  }' ``` Sample response below: ```JSON {  "success": true,  "code": 200,  "data": [{    "campaign_id": 53573097,    "device_id": 1914404819,    "open_time": 1620187760,    "create_time": 1619887871  }, {    "campaign_id": 53573097,    "device_id": 1914404819,    "open_time": 1619801909,    "create_time": 1619801469  }] } ``` The device ID in the above examples is the Xtremepush device ID, but you could also include the user ID in your request (`"user_id"`). ## Get information on devices You can query the [device info or list methods](ref:api-device) to get information on devices, for instance, to check if devices are still addressable for push notifications. To check a specific Xtremepush device ID you can use the [device info](ref:device-info) endpoint with a request such as the following: ```JSON curl --request POST \  --url https://external-api.xtremepush.com/api/external/info/device \  --header 'Accept: application/json' \  --header 'Content-Type: application/json' \  --data '{    "apptoken": "APP_TOKEN",    "id": 626393090  }' ``` This will allow you to get useful information on the device such as: if it is currently addressable for push notifications (active & addressable == 1 ), when the app was last opened on this device (`open_time`), other available IDs like IDFA or Android Ad ID, device info etc. Sample response below: ```JSON {  "success": true,  "code": 200,  "model": {    "id": 626393090,    "project_id": PROJECT_ID,    "application_id": 4069,    "profile_id": "11e9c59d08df7bd3b7090a22275e6966",    "create_time": 1566561386,    "deactivate_time": null,    "open_time": 1566577961,    "token": "60549f4dc442ce5eb101158da3240d1990a1f5fbbd96ce1d957f20e69421f8ed",    "push_sender_id": null,    "push_keys": null,    "active": 1,    "addressable": 1,    "subscription": 1,    "type": "ios",    "environment": "production",    "email": null,    "email_addressable": 0,    "email_subscription": 1,    "device_id": "73F81292-7A1F-4EBF-B01E-1783B3D46C21",    "device_idfv": "73F81292-7A1F-4EBF-B01E-1783B3D46C21",    "device_idfa": "4BD39DFC-198A-484C-A372-B5CA588FF9F2",    "device_adid": null,    "device_type": "iPhone",    "device_model": "iPhone10,5",    "device_model_name": "iPhone 8 Plus",    "device_os": "12.4",    "user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",    "name": "Maria’s iPhone",    "timezone": "Europe/Dublin",    "country": "IE",    "language": "en",    "language_app": "",    "browser": null,    "browser_type": null,    "browser_version": null,    "browser_opt_version": null,    "browser_os_version": null,    "browser_os_opt_version": null,    "carrier_name": "vodafone IE",    "app_version": "1.0",    "lib_version": "i-23082019-aib",    "sw_version": null,    "external_id": "AN_ID_FROM_YOUR_SYSTEM",    "ga_id": null,    "key": "TLhYyU-2Qk6sSo3qfSnVsF02ecoGYely",    "geo": 0,    "import": 0  } } ``` If you want to periodically check all devices to maintain data on addressable users then you can use the [list devices endpoint](ref:device-list) with pagination and the fields you need: ```JSON curl --request POST \  --url https://external-api.xtremepush.com/api/external/list/device \  --header 'Accept: application/json' \  --header 'Content-Type: application/json' \  --data '{    "apptoken": "APP_TOKEN",    "select": ["active", "addressable", "external_id", "id", "open_time", "type"],    "order": ["id DESC", "create_time"],    "limit": 50,    "offset": 0  }' ``` Sample response below: ```JSON {  "success": true,  "code": 200,  "data": [{    "id": 2453832008,    "open_time": 1623233688,    "active": 1,    "addressable": 1,    "type": "android",    "external_id": null  }, {    "id": 2452826033,    "open_time": 1623134275,    "active": 1,    "addressable": 0,    "type": "web",    "external_id": null  }] } ``` ## Get information on user profiles If you want to periodically check all profiles to maintain data on addressable/subscribed users then you can use the [list profile method](ref:user-profile-list) with pagination and the fields you need. For example, the following call will check for users that are email addressable but are not subscribed for email: ```JSON curl --request POST \  --url https://external-api.xtremepush.com/api/external/list/profile \  --header 'Accept: application/json' \  --header 'Content-Type: application/json' \  --data '{    "apptoken": "APP_TOKEN",    "select": ["email", "email_addressable", "email_subscription", "user_id"],    "condition": [      ["email_subscription", "=", 0],      ["email_addressable", "=", 1]],    "order": ["id ASC", "id"],    "limit": 50,    "offset": 0  }' ``` Sample response below: ```JSON {  "success": true,  "code": 200,  "data": [{    "user_id": "1235",    "email": "[email protected]",    "email_addressable": 1,    "email_subscription": 0  }] } ```