Reports
5 endpointsDelivery, geofence and survey figures — the same numbers the dashboard's Reports show. Every report takes a date range (start/end, Y-m-d, days in your workspace's time zone; the last 30 days by default, up to 366) and the dashboard's filters. The only scope a Production token has before customer services turns the rest on.
Get the summary#
/reports/summaryTotals for the range — deliveries, distinct devices reached, geofence entries and exits, matching campaigns and how many are active now, and registered devices — plus the same counts for each day.
Query parameters
on_enter, on_exit, fixed_timeactive, scheduled, paused, endedmessage, surveyResponses
200
{
"data": {
"totals": {
"delivered": 0,
"devices_reached": 0,
"geofence_entries": 0,
"geofence_exits": 0,
"campaigns": 0,
"active_campaigns": 0,
"registered_devices": 0
},
"daily": [
{
"date": "string",
"delivered": 0,
"devices_reached": 0,
"geofence_entries": 0,
"geofence_exits": 0
}
]
},
"meta": {
"start": "string",
"end": "string",
"timezone": "string"
}
}Response fields
401The token is missing, unknown, revoked or expired.
missing_tokeninvalid_tokentoken_expired
missing_tokenMissing bearer token.
invalid_tokenUnknown API token.
token_expiredThis token has expired. Issue a new one from Configuration › Platform API.
{
"error": {
"code": "missing_token",
"message": "Missing bearer token."
}
}403The token or workspace can't do this.
missing_abilitywrong_environmentworkspace_paused
missing_abilityThis token doesn't have the campaigns:write scope.
wrong_environmentThis is a Sandbox token: use the Sandbox API address. https://api.sandbox.bubbl.tech/platform/v1
workspace_pausedThis workspace is scheduled for deletion; its API access is paused.
{
"error": {
"code": "missing_ability",
"message": "This token doesn't have the campaigns:write scope."
}
}422Something in the request isn't valid. fields says what, with the dashboard's wording.
validation_failed
fields says what, with the dashboard's wording.validation_failedThe given data was invalid.
{
"error": {
"code": "validation_failed",
"message": "The given data was invalid.",
"fields": {
"name": [
"The name field is required."
]
}
}
}429Too many requests. Wait for the number of seconds in Retry-After.
rate_limitedtoo_many_failed_attempts
Retry-After.rate_limitedToo many requests. Slow down and try again shortly.
too_many_failed_attemptsToo many failed attempts. Try again shortly.
{
"error": {
"code": "rate_limited",
"message": "Too many requests. Slow down and try again shortly."
}
}curl 'https://api.bubbl.tech/platform/v1/reports/summary' \
-H 'Authorization: Bearer bubbl_YOUR_TOKEN' \
-H 'Accept: application/json'const response = await fetch('https://api.bubbl.tech/platform/v1/reports/summary', {
method: 'GET',
headers: {
Authorization: 'Bearer bubbl_YOUR_TOKEN',
Accept: 'application/json',
},
});
const data = await response.json();import requests
response = requests.request(
'GET',
'https://api.bubbl.tech/platform/v1/reports/summary',
headers={
'Authorization': 'Bearer bubbl_YOUR_TOKEN',
'Accept': 'application/json',
},
)
response.raise_for_status()
data = response.json()<?php
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.bubbl.tech/platform/v1/reports/summary', [
'headers' => [
'Authorization' => 'Bearer bubbl_YOUR_TOKEN',
'Accept' => 'application/json',
],
]);
$data = json_decode((string) $response->getBody(), true);Report on campaigns#
/reports/campaignsOne row per matching campaign: its status, type, how many locations it targets, deliveries in the range, and engagement (devices reached ÷ registered devices, as a percentage).
Query parameters
on_enter, on_exit, fixed_timeactive, scheduled, paused, endedmessage, surveyactive, scheduled, paused, ended, idle, unusedResponses
200
{
"data": [
{
"id": "string",
"name": "string",
"status": "active",
"type": "geo",
"targets": 0,
"delivered": 0,
"engagement": 0
}
],
"meta": {
"start": "string",
"end": "string",
"timezone": "string"
}
}Response fields
active, scheduled, paused, endedgeo, push401The token is missing, unknown, revoked or expired.
missing_tokeninvalid_tokentoken_expired
missing_tokenMissing bearer token.
invalid_tokenUnknown API token.
token_expiredThis token has expired. Issue a new one from Configuration › Platform API.
{
"error": {
"code": "missing_token",
"message": "Missing bearer token."
}
}403The token or workspace can't do this.
missing_abilitywrong_environmentworkspace_paused
missing_abilityThis token doesn't have the campaigns:write scope.
wrong_environmentThis is a Sandbox token: use the Sandbox API address. https://api.sandbox.bubbl.tech/platform/v1
workspace_pausedThis workspace is scheduled for deletion; its API access is paused.
{
"error": {
"code": "missing_ability",
"message": "This token doesn't have the campaigns:write scope."
}
}422Something in the request isn't valid. fields says what, with the dashboard's wording.
validation_failed
fields says what, with the dashboard's wording.validation_failedThe given data was invalid.
{
"error": {
"code": "validation_failed",
"message": "The given data was invalid.",
"fields": {
"name": [
"The name field is required."
]
}
}
}429Too many requests. Wait for the number of seconds in Retry-After.
rate_limitedtoo_many_failed_attempts
Retry-After.rate_limitedToo many requests. Slow down and try again shortly.
too_many_failed_attemptsToo many failed attempts. Try again shortly.
{
"error": {
"code": "rate_limited",
"message": "Too many requests. Slow down and try again shortly."
}
}curl 'https://api.bubbl.tech/platform/v1/reports/campaigns' \
-H 'Authorization: Bearer bubbl_YOUR_TOKEN' \
-H 'Accept: application/json'const response = await fetch('https://api.bubbl.tech/platform/v1/reports/campaigns', {
method: 'GET',
headers: {
Authorization: 'Bearer bubbl_YOUR_TOKEN',
Accept: 'application/json',
},
});
const data = await response.json();import requests
response = requests.request(
'GET',
'https://api.bubbl.tech/platform/v1/reports/campaigns',
headers={
'Authorization': 'Bearer bubbl_YOUR_TOKEN',
'Accept': 'application/json',
},
)
response.raise_for_status()
data = response.json()<?php
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.bubbl.tech/platform/v1/reports/campaigns', [
'headers' => [
'Authorization' => 'Bearer bubbl_YOUR_TOKEN',
'Accept' => 'application/json',
],
]);
$data = json_decode((string) $response->getBody(), true);Report on locations#
/reports/locationsOne row per matching location: whether an active campaign targets it, its groups, geofence entries and exits in the range, engagement (devices that entered ÷ registered devices, as a percentage) and the average dwell in minutes (null when no entry was followed by an exit).
Query parameters
on_enter, on_exit, fixed_timeactive, scheduled, paused, endedmessage, surveyactive, scheduled, paused, ended, idle, unusedResponses
200
{
"data": [
{
"id": "string",
"name": "string",
"status": "active",
"groups": [
"string"
],
"entries": 0,
"exits": 0,
"engagement": 0,
"dwell_minutes": 0
}
],
"meta": {
"start": "string",
"end": "string",
"timezone": "string"
}
}Response fields
active, idle401The token is missing, unknown, revoked or expired.
missing_tokeninvalid_tokentoken_expired
missing_tokenMissing bearer token.
invalid_tokenUnknown API token.
token_expiredThis token has expired. Issue a new one from Configuration › Platform API.
{
"error": {
"code": "missing_token",
"message": "Missing bearer token."
}
}403The token or workspace can't do this.
missing_abilitywrong_environmentworkspace_paused
missing_abilityThis token doesn't have the campaigns:write scope.
wrong_environmentThis is a Sandbox token: use the Sandbox API address. https://api.sandbox.bubbl.tech/platform/v1
workspace_pausedThis workspace is scheduled for deletion; its API access is paused.
{
"error": {
"code": "missing_ability",
"message": "This token doesn't have the campaigns:write scope."
}
}422Something in the request isn't valid. fields says what, with the dashboard's wording.
validation_failed
fields says what, with the dashboard's wording.validation_failedThe given data was invalid.
{
"error": {
"code": "validation_failed",
"message": "The given data was invalid.",
"fields": {
"name": [
"The name field is required."
]
}
}
}429Too many requests. Wait for the number of seconds in Retry-After.
rate_limitedtoo_many_failed_attempts
Retry-After.rate_limitedToo many requests. Slow down and try again shortly.
too_many_failed_attemptsToo many failed attempts. Try again shortly.
{
"error": {
"code": "rate_limited",
"message": "Too many requests. Slow down and try again shortly."
}
}curl 'https://api.bubbl.tech/platform/v1/reports/locations' \
-H 'Authorization: Bearer bubbl_YOUR_TOKEN' \
-H 'Accept: application/json'const response = await fetch('https://api.bubbl.tech/platform/v1/reports/locations', {
method: 'GET',
headers: {
Authorization: 'Bearer bubbl_YOUR_TOKEN',
Accept: 'application/json',
},
});
const data = await response.json();import requests
response = requests.request(
'GET',
'https://api.bubbl.tech/platform/v1/reports/locations',
headers={
'Authorization': 'Bearer bubbl_YOUR_TOKEN',
'Accept': 'application/json',
},
)
response.raise_for_status()
data = response.json()<?php
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.bubbl.tech/platform/v1/reports/locations', [
'headers' => [
'Authorization' => 'Bearer bubbl_YOUR_TOKEN',
'Accept' => 'application/json',
],
]);
$data = json_decode((string) $response->getBody(), true);Report on notifications#
/reports/notificationsOne row per matching notification: its status (from the campaigns it's on, or unused), type, sent (delivered plus failed push sends) and delivered in the range, and reach (devices reached ÷ registered devices, as a percentage).
Query parameters
on_enter, on_exit, fixed_timeactive, scheduled, paused, endedmessage, surveyactive, scheduled, paused, ended, idle, unusedResponses
200
{
"data": [
{
"id": "string",
"name": "string",
"status": "active",
"type": "message",
"sent": 0,
"delivered": 0,
"reach": 0
}
],
"meta": {
"start": "string",
"end": "string",
"timezone": "string"
}
}Response fields
active, scheduled, paused, ended, unusedmessage, survey401The token is missing, unknown, revoked or expired.
missing_tokeninvalid_tokentoken_expired
missing_tokenMissing bearer token.
invalid_tokenUnknown API token.
token_expiredThis token has expired. Issue a new one from Configuration › Platform API.
{
"error": {
"code": "missing_token",
"message": "Missing bearer token."
}
}403The token or workspace can't do this.
missing_abilitywrong_environmentworkspace_paused
missing_abilityThis token doesn't have the campaigns:write scope.
wrong_environmentThis is a Sandbox token: use the Sandbox API address. https://api.sandbox.bubbl.tech/platform/v1
workspace_pausedThis workspace is scheduled for deletion; its API access is paused.
{
"error": {
"code": "missing_ability",
"message": "This token doesn't have the campaigns:write scope."
}
}422Something in the request isn't valid. fields says what, with the dashboard's wording.
validation_failed
fields says what, with the dashboard's wording.validation_failedThe given data was invalid.
{
"error": {
"code": "validation_failed",
"message": "The given data was invalid.",
"fields": {
"name": [
"The name field is required."
]
}
}
}429Too many requests. Wait for the number of seconds in Retry-After.
rate_limitedtoo_many_failed_attempts
Retry-After.rate_limitedToo many requests. Slow down and try again shortly.
too_many_failed_attemptsToo many failed attempts. Try again shortly.
{
"error": {
"code": "rate_limited",
"message": "Too many requests. Slow down and try again shortly."
}
}curl 'https://api.bubbl.tech/platform/v1/reports/notifications' \
-H 'Authorization: Bearer bubbl_YOUR_TOKEN' \
-H 'Accept: application/json'const response = await fetch('https://api.bubbl.tech/platform/v1/reports/notifications', {
method: 'GET',
headers: {
Authorization: 'Bearer bubbl_YOUR_TOKEN',
Accept: 'application/json',
},
});
const data = await response.json();import requests
response = requests.request(
'GET',
'https://api.bubbl.tech/platform/v1/reports/notifications',
headers={
'Authorization': 'Bearer bubbl_YOUR_TOKEN',
'Accept': 'application/json',
},
)
response.raise_for_status()
data = response.json()<?php
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.bubbl.tech/platform/v1/reports/notifications', [
'headers' => [
'Authorization' => 'Bearer bubbl_YOUR_TOKEN',
'Accept' => 'application/json',
],
]);
$data = json_decode((string) $response->getBody(), true);Report on surveys#
/reports/surveysOne row per survey deployment (a survey notification on a campaign): the campaign and survey, what triggers it, how many questions it asks, and how many devices responded in the range.
Query parameters
on_enter, on_exit, fixed_timeactive, scheduled, paused, endedmessage, surveyactive, scheduled, paused, ended, idle, unusedResponses
200
{
"data": [
{
"id": "string",
"campaign_id": "string",
"campaign_name": "string",
"survey_id": "string",
"survey_name": "string",
"trigger_type": "on_enter",
"questions": 0,
"responses": 0,
"status": "active"
}
],
"meta": {
"start": "string",
"end": "string",
"timezone": "string"
}
}Response fields
on_enter, on_exit, fixed_timeactive, scheduled, paused, ended401The token is missing, unknown, revoked or expired.
missing_tokeninvalid_tokentoken_expired
missing_tokenMissing bearer token.
invalid_tokenUnknown API token.
token_expiredThis token has expired. Issue a new one from Configuration › Platform API.
{
"error": {
"code": "missing_token",
"message": "Missing bearer token."
}
}403The token or workspace can't do this.
missing_abilitywrong_environmentworkspace_paused
missing_abilityThis token doesn't have the campaigns:write scope.
wrong_environmentThis is a Sandbox token: use the Sandbox API address. https://api.sandbox.bubbl.tech/platform/v1
workspace_pausedThis workspace is scheduled for deletion; its API access is paused.
{
"error": {
"code": "missing_ability",
"message": "This token doesn't have the campaigns:write scope."
}
}422Something in the request isn't valid. fields says what, with the dashboard's wording.
validation_failed
fields says what, with the dashboard's wording.validation_failedThe given data was invalid.
{
"error": {
"code": "validation_failed",
"message": "The given data was invalid.",
"fields": {
"name": [
"The name field is required."
]
}
}
}429Too many requests. Wait for the number of seconds in Retry-After.
rate_limitedtoo_many_failed_attempts
Retry-After.rate_limitedToo many requests. Slow down and try again shortly.
too_many_failed_attemptsToo many failed attempts. Try again shortly.
{
"error": {
"code": "rate_limited",
"message": "Too many requests. Slow down and try again shortly."
}
}curl 'https://api.bubbl.tech/platform/v1/reports/surveys' \
-H 'Authorization: Bearer bubbl_YOUR_TOKEN' \
-H 'Accept: application/json'const response = await fetch('https://api.bubbl.tech/platform/v1/reports/surveys', {
method: 'GET',
headers: {
Authorization: 'Bearer bubbl_YOUR_TOKEN',
Accept: 'application/json',
},
});
const data = await response.json();import requests
response = requests.request(
'GET',
'https://api.bubbl.tech/platform/v1/reports/surveys',
headers={
'Authorization': 'Bearer bubbl_YOUR_TOKEN',
'Accept': 'application/json',
},
)
response.raise_for_status()
data = response.json()<?php
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.bubbl.tech/platform/v1/reports/surveys', [
'headers' => [
'Authorization' => 'Bearer bubbl_YOUR_TOKEN',
'Accept' => 'application/json',
],
]);
$data = json_decode((string) $response->getBody(), true);