Campaigns
7 endpointsWhen and to whom your notifications go out. A geo campaign targets locations (directly or via location groups) and fires when a device enters or leaves one; a push campaign sends at fixed times to an audience of segments (or everyone). Notifications are added afterwards — see Notifications, nested under a campaign.
List campaigns#
/campaignsNewest first, with their targeting (location, group and segment ids).
Query parameters
An opaque value from a previous page's meta.next_cursor. Omit for the first page.
How many to return, up to 100.
20Only campaigns updated at or after this ISO 8601 timestamp.
Responses
200
{
"data": [
{
"id": "0192f0a4-6b1e-7c3a-9d2f-5e8b1a4d4001",
"name": "Morning coffee offer",
"type": "geo",
"status": "scheduled",
"starts_at": "2026-10-04T23:00:00+00:00",
"ends_at": "2026-10-31T23:59:59+00:00",
"timezone": "Europe/London",
"paused": false,
"frequency_cap_count": 1,
"frequency_cap_period": "day",
"targeting": {
"location_ids": [
"0192f0a4-6b1e-7c3a-9d2f-5e8b1a4d3001"
],
"location_group_ids": [],
"segmentation_ids": [],
"segment_match": "any"
},
"created_at": "2026-09-20T09:12:00+00:00",
"updated_at": "2026-09-27T14:03:00+00:00"
}
],
"meta": {
"next_cursor": null
}
}Response fields
401The token is missing, unknown, revoked or expired.
missing_tokeninvalid_tokentoken_revokedtoken_expired
missing_tokenMissing bearer token.
invalid_tokenUnknown API token. Check it was copied in full, and that it is for this environment.
token_revokedThe token "Zapier" was revoked on 2026-10-06 at 18:27 UTC. Issue a new one from Configuration › Platform API.
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_abilityplatform_api_not_enabledwrong_environmentworkspace_paused
missing_abilityThis token doesn't have the campaigns:write scope.
platform_api_not_enabledThe full Platform API isn't enabled for this workspace yet. Contact customer services to turn it on.
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.
invalid_parameterinvalid_cursor
fields says what, with the dashboard's wording.invalid_parameterupdated_since must be a valid date.
invalid_cursorThat cursor is invalid or has expired.
{
"error": {
"code": "invalid_parameter",
"message": "updated_since must be a valid date.",
"fields": {
"updated_since": [
"Must be a valid date."
]
}
}
}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/campaigns?limit=20' \
-H 'Authorization: Bearer bubbl_YOUR_TOKEN' \
-H 'Accept: application/json'const response = await fetch('https://api.bubbl.tech/platform/v1/campaigns?limit=20', {
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/campaigns?limit=20',
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/campaigns?limit=20', [
'headers' => [
'Authorization' => 'Bearer bubbl_YOUR_TOKEN',
'Accept' => 'application/json',
],
]);
$data = json_decode((string) $response->getBody(), true);Create a campaign#
/campaignsA geo campaign needs at least one of location_ids/location_group_ids/ location_group_names and can't take segmentation_ids; a push campaign is the other way round. Groups can be given by id (see Location groups) or by the name the import gave them (properties.group), or both. starts_at/ends_at are Y-m-d (a push campaign runs for one day) or Y-m-d H:i in the campaign's own timezone; a bare Y-m-d start is midnight there. Neither can be before today in Production; in a Sandbox they can, so test data can include ended campaigns. No notifications yet — add them afterwards (see Notifications).
There are no drafts: a campaign runs as soon as it's created. Its status follows from its dates and paused: scheduled before starts_at, active while it runs, paused, or ended after ends_at. To set one up before it goes out, give it a future starts_at, or pause it straight after creating it and publish it when it's ready.
Headers
A unique value (e.g. a UUID) for this change. A retry with the same key within 24 hours gets the first response back, with Idempotent-Replayed: true, instead of making the change again.
Request body
application/jsonStoreCampaignRequestrequiredgeo, pushAfrica/Abidjan, Africa/Accra, Africa/Addis_Ababa, Africa/Algiers, Africa/Asmara, Africa/Bamako, Africa/Bangui, Africa/Banjul, Africa/Bissau, Africa/Blantyre, Africa/Brazzaville, Africa/Bujumbura, Africa/Cairo, Africa/Casablanca, Africa/Ceuta, Africa/Conakry, Africa/Dakar, Africa/Dar_es_Salaam, Africa/Djibouti, Africa/Douala, Africa/El_Aaiun, Africa/Freetown, Africa/Gaborone, Africa/Harare, Africa/Johannesburg, Africa/Juba, Africa/Kampala, Africa/Khartoum, Africa/Kigali, Africa/Kinshasa, Africa/Lagos, Africa/Libreville, Africa/Lome, Africa/Luanda, Africa/Lubumbashi, Africa/Lusaka, Africa/Malabo, Africa/Maputo, Africa/Maseru, Africa/Mbabane, Africa/Mogadishu, Africa/Monrovia, Africa/Nairobi, Africa/Ndjamena, Africa/Niamey, Africa/Nouakchott, Africa/Ouagadougou, Africa/Porto-Novo, Africa/Sao_Tome, Africa/Tripoli, Africa/Tunis, Africa/Windhoek, America/Adak, America/Anchorage, America/Anguilla, America/Antigua, America/Araguaina, America/Argentina/Buenos_Aires, America/Argentina/Catamarca, America/Argentina/Cordoba, America/Argentina/Jujuy, America/Argentina/La_Rioja, America/Argentina/Mendoza, America/Argentina/Rio_Gallegos, America/Argentina/Salta, America/Argentina/San_Juan, America/Argentina/San_Luis, America/Argentina/Tucuman, America/Argentina/Ushuaia, America/Aruba, America/Asuncion, America/Atikokan, America/Bahia, America/Bahia_Banderas, America/Barbados, America/Belem, America/Belize, America/Blanc-Sablon, America/Boa_Vista, America/Bogota, America/Boise, America/Cambridge_Bay, America/Campo_Grande, America/Cancun, America/Caracas, America/Cayenne, America/Cayman, America/Chicago, America/Chihuahua, America/Ciudad_Juarez, America/Costa_Rica, America/Coyhaique, America/Creston, America/Cuiaba, America/Curacao, America/Danmarkshavn, America/Dawson, America/Dawson_Creek, America/Denver, America/Detroit, America/Dominica, America/Edmonton, America/Eirunepe, America/El_Salvador, America/Fort_Nelson, America/Fortaleza, America/Glace_Bay, America/Goose_Bay, America/Grand_Turk, America/Grenada, America/Guadeloupe, America/Guatemala, America/Guayaquil, America/Guyana, America/Halifax, America/Havana, America/Hermosillo, America/Indiana/Indianapolis, America/Indiana/Knox, America/Indiana/Marengo, America/Indiana/Petersburg, America/Indiana/Tell_City, America/Indiana/Vevay, America/Indiana/Vincennes, America/Indiana/Winamac, America/Inuvik, America/Iqaluit, America/Jamaica, America/Juneau, America/Kentucky/Louisville, America/Kentucky/Monticello, America/Kralendijk, America/La_Paz, America/Lima, America/Los_Angeles, America/Lower_Princes, America/Maceio, America/Managua, America/Manaus, America/Marigot, America/Martinique, America/Matamoros, America/Mazatlan, America/Menominee, America/Merida, America/Metlakatla, America/Mexico_City, America/Miquelon, America/Moncton, America/Monterrey, America/Montevideo, America/Montserrat, America/Nassau, America/New_York, America/Nome, America/Noronha, America/North_Dakota/Beulah, America/North_Dakota/Center, America/North_Dakota/New_Salem, America/Nuuk, America/Ojinaga, America/Panama, America/Paramaribo, America/Phoenix, America/Port-au-Prince, America/Port_of_Spain, America/Porto_Velho, America/Puerto_Rico, America/Punta_Arenas, America/Rankin_Inlet, America/Recife, America/Regina, America/Resolute, America/Rio_Branco, America/Santarem, America/Santiago, America/Santo_Domingo, America/Sao_Paulo, America/Scoresbysund, America/Sitka, America/St_Barthelemy, America/St_Johns, America/St_Kitts, America/St_Lucia, America/St_Thomas, America/St_Vincent, America/Swift_Current, America/Tegucigalpa, America/Thule, America/Tijuana, America/Toronto, America/Tortola, America/Vancouver, America/Whitehorse, America/Winnipeg, America/Yakutat, Antarctica/Casey, Antarctica/Davis, Antarctica/DumontDUrville, Antarctica/Macquarie, Antarctica/Mawson, Antarctica/McMurdo, Antarctica/Palmer, Antarctica/Rothera, Antarctica/Syowa, Antarctica/Troll, Antarctica/Vostok, Arctic/Longyearbyen, Asia/Aden, Asia/Almaty, Asia/Amman, Asia/Anadyr, Asia/Aqtau, Asia/Aqtobe, Asia/Ashgabat, Asia/Atyrau, Asia/Baghdad, Asia/Bahrain, Asia/Baku, Asia/Bangkok, Asia/Barnaul, Asia/Beirut, Asia/Bishkek, Asia/Brunei, Asia/Chita, Asia/Colombo, Asia/Damascus, Asia/Dhaka, Asia/Dili, Asia/Dubai, Asia/Dushanbe, Asia/Famagusta, Asia/Gaza, Asia/Hebron, Asia/Ho_Chi_Minh, Asia/Hong_Kong, Asia/Hovd, Asia/Irkutsk, Asia/Jakarta, Asia/Jayapura, Asia/Jerusalem, Asia/Kabul, Asia/Kamchatka, Asia/Karachi, Asia/Kathmandu, Asia/Khandyga, Asia/Kolkata, Asia/Krasnoyarsk, Asia/Kuala_Lumpur, Asia/Kuching, Asia/Kuwait, Asia/Macau, Asia/Magadan, Asia/Makassar, Asia/Manila, Asia/Muscat, Asia/Nicosia, Asia/Novokuznetsk, Asia/Novosibirsk, Asia/Omsk, Asia/Oral, Asia/Phnom_Penh, Asia/Pontianak, Asia/Pyongyang, Asia/Qatar, Asia/Qostanay, Asia/Qyzylorda, Asia/Riyadh, Asia/Sakhalin, Asia/Samarkand, Asia/Seoul, Asia/Shanghai, Asia/Singapore, Asia/Srednekolymsk, Asia/Taipei, Asia/Tashkent, Asia/Tbilisi, Asia/Tehran, Asia/Thimphu, Asia/Tokyo, Asia/Tomsk, Asia/Ulaanbaatar, Asia/Urumqi, Asia/Ust-Nera, Asia/Vientiane, Asia/Vladivostok, Asia/Yakutsk, Asia/Yangon, Asia/Yekaterinburg, Asia/Yerevan, Atlantic/Azores, Atlantic/Bermuda, Atlantic/Canary, Atlantic/Cape_Verde, Atlantic/Faroe, Atlantic/Madeira, Atlantic/Reykjavik, Atlantic/South_Georgia, Atlantic/St_Helena, Atlantic/Stanley, Australia/Adelaide, Australia/Brisbane, Australia/Broken_Hill, Australia/Darwin, Australia/Eucla, Australia/Hobart, Australia/Lindeman, Australia/Lord_Howe, Australia/Melbourne, Australia/Perth, Australia/Sydney, Europe/Amsterdam, Europe/Andorra, Europe/Astrakhan, Europe/Athens, Europe/Belgrade, Europe/Berlin, Europe/Bratislava, Europe/Brussels, Europe/Bucharest, Europe/Budapest, Europe/Busingen, Europe/Chisinau, Europe/Copenhagen, Europe/Dublin, Europe/Gibraltar, Europe/Guernsey, Europe/Helsinki, Europe/Isle_of_Man, Europe/Istanbul, Europe/Jersey, Europe/Kaliningrad, Europe/Kirov, Europe/Kyiv, Europe/Lisbon, Europe/Ljubljana, Europe/London, Europe/Luxembourg, Europe/Madrid, Europe/Malta, Europe/Mariehamn, Europe/Minsk, Europe/Monaco, Europe/Moscow, Europe/Oslo, Europe/Paris, Europe/Podgorica, Europe/Prague, Europe/Riga, Europe/Rome, Europe/Samara, Europe/San_Marino, Europe/Sarajevo, Europe/Saratov, Europe/Simferopol, Europe/Skopje, Europe/Sofia, Europe/Stockholm, Europe/Tallinn, Europe/Tirane, Europe/Ulyanovsk, Europe/Vaduz, Europe/Vatican, Europe/Vienna, Europe/Vilnius, Europe/Volgograd, Europe/Warsaw, Europe/Zagreb, Europe/Zurich, Indian/Antananarivo, Indian/Chagos, Indian/Christmas, Indian/Cocos, Indian/Comoro, Indian/Kerguelen, Indian/Mahe, Indian/Maldives, Indian/Mauritius, Indian/Mayotte, Indian/Reunion, Pacific/Apia, Pacific/Auckland, Pacific/Bougainville, Pacific/Chatham, Pacific/Chuuk, Pacific/Easter, Pacific/Efate, Pacific/Fakaofo, Pacific/Fiji, Pacific/Funafuti, Pacific/Galapagos, Pacific/Gambier, Pacific/Guadalcanal, Pacific/Guam, Pacific/Honolulu, Pacific/Kanton, Pacific/Kiritimati, Pacific/Kosrae, Pacific/Kwajalein, Pacific/Majuro, Pacific/Marquesas, Pacific/Midway, Pacific/Nauru, Pacific/Niue, Pacific/Norfolk, Pacific/Noumea, Pacific/Pago_Pago, Pacific/Palau, Pacific/Pitcairn, Pacific/Pohnpei, Pacific/Port_Moresby, Pacific/Rarotonga, Pacific/Saipan, Pacific/Tahiti, Pacific/Tarawa, Pacific/Tongatapu, Pacific/Wake, Pacific/Wallis, UTCday, week, month, nullOr by name, as the import's properties.group made them (Campaigns resolves them to ids).
any, all, nullOnly the campaign's own bounds — the trait's attachments.*.* rules are the dashboard form's, for a field this endpoint doesn't accept (notifications are added afterwards, through the nested resource).
Responses
201
{
"data": {
"id": "0192f0a4-6b1e-7c3a-9d2f-5e8b1a4d4001",
"name": "Morning coffee offer",
"type": "geo",
"status": "scheduled",
"starts_at": "2026-10-04T23:00:00+00:00",
"ends_at": "2026-10-31T23:59:59+00:00",
"timezone": "Europe/London",
"paused": false,
"frequency_cap_count": 1,
"frequency_cap_period": "day",
"targeting": {
"location_ids": [
"0192f0a4-6b1e-7c3a-9d2f-5e8b1a4d3001"
],
"location_group_ids": [],
"segmentation_ids": [],
"segment_match": "any"
},
"created_at": "2026-09-20T09:12:00+00:00",
"updated_at": "2026-09-27T14:03:00+00:00"
}
}Response fields
401The token is missing, unknown, revoked or expired.
missing_tokeninvalid_tokentoken_revokedtoken_expired
missing_tokenMissing bearer token.
invalid_tokenUnknown API token. Check it was copied in full, and that it is for this environment.
token_revokedThe token "Zapier" was revoked on 2026-10-06 at 18:27 UTC. Issue a new one from Configuration › Platform API.
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_abilityplatform_api_not_enabledwrong_environmentworkspace_pausedlimit_exceededtrial_ended
missing_abilityThis token doesn't have the campaigns:write scope.
platform_api_not_enabledThe full Platform API isn't enabled for this workspace yet. Contact customer services to turn it on.
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.
limit_exceededYou've reached the limit for max_campaigns.
trial_endedYour free trial has ended. Buy through AWS Marketplace to create or run campaigns.
{
"error": {
"code": "missing_ability",
"message": "This token doesn't have the campaigns:write scope."
}
}409A request with the same Idempotency-Key is still running (retry after Retry-After seconds), or the change conflicts with something that depends on it.
request_in_progress
Idempotency-Key is still running (retry after Retry-After seconds), or the change conflicts with something that depends on it.request_in_progressThis request is still being handled. Try again shortly.
{
"error": {
"code": "request_in_progress",
"message": "This request is still being handled. Try again shortly."
}
}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 -X POST 'https://api.bubbl.tech/platform/v1/campaigns' \
-H 'Authorization: Bearer bubbl_YOUR_TOKEN' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
--data '{
"name": "Morning coffee offer",
"type": "geo",
"timezone": "Europe/London",
"starts_at": "2026-10-05",
"ends_at": "2026-10-31",
"location_ids": [
"0192f0a4-6b1e-7c3a-9d2f-5e8b1a4d3001"
],
"location_group_ids": [],
"frequency_cap_count": 1,
"frequency_cap_period": "day"
}'const response = await fetch('https://api.bubbl.tech/platform/v1/campaigns', {
method: 'POST',
headers: {
Authorization: 'Bearer bubbl_YOUR_TOKEN',
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'Morning coffee offer',
type: 'geo',
timezone: 'Europe/London',
starts_at: '2026-10-05',
ends_at: '2026-10-31',
location_ids: [
'0192f0a4-6b1e-7c3a-9d2f-5e8b1a4d3001',
],
location_group_ids: [],
frequency_cap_count: 1,
frequency_cap_period: 'day',
}),
});
const data = await response.json();import requests
response = requests.request(
'POST',
'https://api.bubbl.tech/platform/v1/campaigns',
headers={
'Authorization': 'Bearer bubbl_YOUR_TOKEN',
'Accept': 'application/json',
'Content-Type': 'application/json',
},
json={
'name': 'Morning coffee offer',
'type': 'geo',
'timezone': 'Europe/London',
'starts_at': '2026-10-05',
'ends_at': '2026-10-31',
'location_ids': [
'0192f0a4-6b1e-7c3a-9d2f-5e8b1a4d3001',
],
'location_group_ids': [],
'frequency_cap_count': 1,
'frequency_cap_period': 'day',
},
)
response.raise_for_status()
data = response.json()<?php
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.bubbl.tech/platform/v1/campaigns', [
'headers' => [
'Authorization' => 'Bearer bubbl_YOUR_TOKEN',
'Accept' => 'application/json',
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'Morning coffee offer',
'type' => 'geo',
'timezone' => 'Europe/London',
'starts_at' => '2026-10-05',
'ends_at' => '2026-10-31',
'location_ids' => [
'0192f0a4-6b1e-7c3a-9d2f-5e8b1a4d3001',
],
'location_group_ids' => [],
'frequency_cap_count' => 1,
'frequency_cap_period' => 'day',
],
]);
$data = json_decode((string) $response->getBody(), true);Get a campaign#
/campaigns/{campaign}Path parameters
The campaign ID
Responses
200
{
"data": {
"id": "0192f0a4-6b1e-7c3a-9d2f-5e8b1a4d4001",
"name": "Morning coffee offer",
"type": "geo",
"status": "scheduled",
"starts_at": "2026-10-04T23:00:00+00:00",
"ends_at": "2026-10-31T23:59:59+00:00",
"timezone": "Europe/London",
"paused": false,
"frequency_cap_count": 1,
"frequency_cap_period": "day",
"targeting": {
"location_ids": [
"0192f0a4-6b1e-7c3a-9d2f-5e8b1a4d3001"
],
"location_group_ids": [],
"segmentation_ids": [],
"segment_match": "any"
},
"created_at": "2026-09-20T09:12:00+00:00",
"updated_at": "2026-09-27T14:03:00+00:00"
}
}Response fields
401The token is missing, unknown, revoked or expired.
missing_tokeninvalid_tokentoken_revokedtoken_expired
missing_tokenMissing bearer token.
invalid_tokenUnknown API token. Check it was copied in full, and that it is for this environment.
token_revokedThe token "Zapier" was revoked on 2026-10-06 at 18:27 UTC. Issue a new one from Configuration › Platform API.
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_abilityplatform_api_not_enabledwrong_environmentworkspace_paused
missing_abilityThis token doesn't have the campaigns:write scope.
platform_api_not_enabledThe full Platform API isn't enabled for this workspace yet. Contact customer services to turn it on.
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."
}
}404Nothing with that ID in this workspace.
not_found
not_foundNo such resource in this workspace.
{
"error": {
"code": "not_found",
"message": "No such resource in this workspace."
}
}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/campaigns/{campaign}' \
-H 'Authorization: Bearer bubbl_YOUR_TOKEN' \
-H 'Accept: application/json'const response = await fetch('https://api.bubbl.tech/platform/v1/campaigns/{campaign}', {
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/campaigns/{campaign}',
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/campaigns/{campaign}', [
'headers' => [
'Authorization' => 'Bearer bubbl_YOUR_TOKEN',
'Accept' => 'application/json',
],
]);
$data = json_decode((string) $response->getBody(), true);Update a campaign#
/campaigns/{campaign}The whole campaign is resubmitted (not a partial patch) — the same rules as creating one apply again.
Path parameters
The campaign ID
Headers
A unique value (e.g. a UUID) for this change. A retry with the same key within 24 hours gets the first response back, with Idempotent-Replayed: true, instead of making the change again.
Request body
application/jsonUpdateCampaignRequestrequiredgeo, pushAfrica/Abidjan, Africa/Accra, Africa/Addis_Ababa, Africa/Algiers, Africa/Asmara, Africa/Bamako, Africa/Bangui, Africa/Banjul, Africa/Bissau, Africa/Blantyre, Africa/Brazzaville, Africa/Bujumbura, Africa/Cairo, Africa/Casablanca, Africa/Ceuta, Africa/Conakry, Africa/Dakar, Africa/Dar_es_Salaam, Africa/Djibouti, Africa/Douala, Africa/El_Aaiun, Africa/Freetown, Africa/Gaborone, Africa/Harare, Africa/Johannesburg, Africa/Juba, Africa/Kampala, Africa/Khartoum, Africa/Kigali, Africa/Kinshasa, Africa/Lagos, Africa/Libreville, Africa/Lome, Africa/Luanda, Africa/Lubumbashi, Africa/Lusaka, Africa/Malabo, Africa/Maputo, Africa/Maseru, Africa/Mbabane, Africa/Mogadishu, Africa/Monrovia, Africa/Nairobi, Africa/Ndjamena, Africa/Niamey, Africa/Nouakchott, Africa/Ouagadougou, Africa/Porto-Novo, Africa/Sao_Tome, Africa/Tripoli, Africa/Tunis, Africa/Windhoek, America/Adak, America/Anchorage, America/Anguilla, America/Antigua, America/Araguaina, America/Argentina/Buenos_Aires, America/Argentina/Catamarca, America/Argentina/Cordoba, America/Argentina/Jujuy, America/Argentina/La_Rioja, America/Argentina/Mendoza, America/Argentina/Rio_Gallegos, America/Argentina/Salta, America/Argentina/San_Juan, America/Argentina/San_Luis, America/Argentina/Tucuman, America/Argentina/Ushuaia, America/Aruba, America/Asuncion, America/Atikokan, America/Bahia, America/Bahia_Banderas, America/Barbados, America/Belem, America/Belize, America/Blanc-Sablon, America/Boa_Vista, America/Bogota, America/Boise, America/Cambridge_Bay, America/Campo_Grande, America/Cancun, America/Caracas, America/Cayenne, America/Cayman, America/Chicago, America/Chihuahua, America/Ciudad_Juarez, America/Costa_Rica, America/Coyhaique, America/Creston, America/Cuiaba, America/Curacao, America/Danmarkshavn, America/Dawson, America/Dawson_Creek, America/Denver, America/Detroit, America/Dominica, America/Edmonton, America/Eirunepe, America/El_Salvador, America/Fort_Nelson, America/Fortaleza, America/Glace_Bay, America/Goose_Bay, America/Grand_Turk, America/Grenada, America/Guadeloupe, America/Guatemala, America/Guayaquil, America/Guyana, America/Halifax, America/Havana, America/Hermosillo, America/Indiana/Indianapolis, America/Indiana/Knox, America/Indiana/Marengo, America/Indiana/Petersburg, America/Indiana/Tell_City, America/Indiana/Vevay, America/Indiana/Vincennes, America/Indiana/Winamac, America/Inuvik, America/Iqaluit, America/Jamaica, America/Juneau, America/Kentucky/Louisville, America/Kentucky/Monticello, America/Kralendijk, America/La_Paz, America/Lima, America/Los_Angeles, America/Lower_Princes, America/Maceio, America/Managua, America/Manaus, America/Marigot, America/Martinique, America/Matamoros, America/Mazatlan, America/Menominee, America/Merida, America/Metlakatla, America/Mexico_City, America/Miquelon, America/Moncton, America/Monterrey, America/Montevideo, America/Montserrat, America/Nassau, America/New_York, America/Nome, America/Noronha, America/North_Dakota/Beulah, America/North_Dakota/Center, America/North_Dakota/New_Salem, America/Nuuk, America/Ojinaga, America/Panama, America/Paramaribo, America/Phoenix, America/Port-au-Prince, America/Port_of_Spain, America/Porto_Velho, America/Puerto_Rico, America/Punta_Arenas, America/Rankin_Inlet, America/Recife, America/Regina, America/Resolute, America/Rio_Branco, America/Santarem, America/Santiago, America/Santo_Domingo, America/Sao_Paulo, America/Scoresbysund, America/Sitka, America/St_Barthelemy, America/St_Johns, America/St_Kitts, America/St_Lucia, America/St_Thomas, America/St_Vincent, America/Swift_Current, America/Tegucigalpa, America/Thule, America/Tijuana, America/Toronto, America/Tortola, America/Vancouver, America/Whitehorse, America/Winnipeg, America/Yakutat, Antarctica/Casey, Antarctica/Davis, Antarctica/DumontDUrville, Antarctica/Macquarie, Antarctica/Mawson, Antarctica/McMurdo, Antarctica/Palmer, Antarctica/Rothera, Antarctica/Syowa, Antarctica/Troll, Antarctica/Vostok, Arctic/Longyearbyen, Asia/Aden, Asia/Almaty, Asia/Amman, Asia/Anadyr, Asia/Aqtau, Asia/Aqtobe, Asia/Ashgabat, Asia/Atyrau, Asia/Baghdad, Asia/Bahrain, Asia/Baku, Asia/Bangkok, Asia/Barnaul, Asia/Beirut, Asia/Bishkek, Asia/Brunei, Asia/Chita, Asia/Colombo, Asia/Damascus, Asia/Dhaka, Asia/Dili, Asia/Dubai, Asia/Dushanbe, Asia/Famagusta, Asia/Gaza, Asia/Hebron, Asia/Ho_Chi_Minh, Asia/Hong_Kong, Asia/Hovd, Asia/Irkutsk, Asia/Jakarta, Asia/Jayapura, Asia/Jerusalem, Asia/Kabul, Asia/Kamchatka, Asia/Karachi, Asia/Kathmandu, Asia/Khandyga, Asia/Kolkata, Asia/Krasnoyarsk, Asia/Kuala_Lumpur, Asia/Kuching, Asia/Kuwait, Asia/Macau, Asia/Magadan, Asia/Makassar, Asia/Manila, Asia/Muscat, Asia/Nicosia, Asia/Novokuznetsk, Asia/Novosibirsk, Asia/Omsk, Asia/Oral, Asia/Phnom_Penh, Asia/Pontianak, Asia/Pyongyang, Asia/Qatar, Asia/Qostanay, Asia/Qyzylorda, Asia/Riyadh, Asia/Sakhalin, Asia/Samarkand, Asia/Seoul, Asia/Shanghai, Asia/Singapore, Asia/Srednekolymsk, Asia/Taipei, Asia/Tashkent, Asia/Tbilisi, Asia/Tehran, Asia/Thimphu, Asia/Tokyo, Asia/Tomsk, Asia/Ulaanbaatar, Asia/Urumqi, Asia/Ust-Nera, Asia/Vientiane, Asia/Vladivostok, Asia/Yakutsk, Asia/Yangon, Asia/Yekaterinburg, Asia/Yerevan, Atlantic/Azores, Atlantic/Bermuda, Atlantic/Canary, Atlantic/Cape_Verde, Atlantic/Faroe, Atlantic/Madeira, Atlantic/Reykjavik, Atlantic/South_Georgia, Atlantic/St_Helena, Atlantic/Stanley, Australia/Adelaide, Australia/Brisbane, Australia/Broken_Hill, Australia/Darwin, Australia/Eucla, Australia/Hobart, Australia/Lindeman, Australia/Lord_Howe, Australia/Melbourne, Australia/Perth, Australia/Sydney, Europe/Amsterdam, Europe/Andorra, Europe/Astrakhan, Europe/Athens, Europe/Belgrade, Europe/Berlin, Europe/Bratislava, Europe/Brussels, Europe/Bucharest, Europe/Budapest, Europe/Busingen, Europe/Chisinau, Europe/Copenhagen, Europe/Dublin, Europe/Gibraltar, Europe/Guernsey, Europe/Helsinki, Europe/Isle_of_Man, Europe/Istanbul, Europe/Jersey, Europe/Kaliningrad, Europe/Kirov, Europe/Kyiv, Europe/Lisbon, Europe/Ljubljana, Europe/London, Europe/Luxembourg, Europe/Madrid, Europe/Malta, Europe/Mariehamn, Europe/Minsk, Europe/Monaco, Europe/Moscow, Europe/Oslo, Europe/Paris, Europe/Podgorica, Europe/Prague, Europe/Riga, Europe/Rome, Europe/Samara, Europe/San_Marino, Europe/Sarajevo, Europe/Saratov, Europe/Simferopol, Europe/Skopje, Europe/Sofia, Europe/Stockholm, Europe/Tallinn, Europe/Tirane, Europe/Ulyanovsk, Europe/Vaduz, Europe/Vatican, Europe/Vienna, Europe/Vilnius, Europe/Volgograd, Europe/Warsaw, Europe/Zagreb, Europe/Zurich, Indian/Antananarivo, Indian/Chagos, Indian/Christmas, Indian/Cocos, Indian/Comoro, Indian/Kerguelen, Indian/Mahe, Indian/Maldives, Indian/Mauritius, Indian/Mayotte, Indian/Reunion, Pacific/Apia, Pacific/Auckland, Pacific/Bougainville, Pacific/Chatham, Pacific/Chuuk, Pacific/Easter, Pacific/Efate, Pacific/Fakaofo, Pacific/Fiji, Pacific/Funafuti, Pacific/Galapagos, Pacific/Gambier, Pacific/Guadalcanal, Pacific/Guam, Pacific/Honolulu, Pacific/Kanton, Pacific/Kiritimati, Pacific/Kosrae, Pacific/Kwajalein, Pacific/Majuro, Pacific/Marquesas, Pacific/Midway, Pacific/Nauru, Pacific/Niue, Pacific/Norfolk, Pacific/Noumea, Pacific/Pago_Pago, Pacific/Palau, Pacific/Pitcairn, Pacific/Pohnpei, Pacific/Port_Moresby, Pacific/Rarotonga, Pacific/Saipan, Pacific/Tahiti, Pacific/Tarawa, Pacific/Tongatapu, Pacific/Wake, Pacific/Wallis, UTCday, week, month, nullOr by name, as the import's properties.group made them (Campaigns resolves them to ids).
any, all, nullOnly the campaign's own bounds — the trait's attachments.*.* rules are the dashboard form's, for a field this endpoint doesn't accept (notifications are added afterwards, through the nested resource).
Responses
200
{
"data": {
"id": "0192f0a4-6b1e-7c3a-9d2f-5e8b1a4d4001",
"name": "Morning coffee offer (October)",
"type": "geo",
"status": "scheduled",
"starts_at": "2026-10-04T23:00:00+00:00",
"ends_at": "2026-10-31T23:59:59+00:00",
"timezone": "Europe/London",
"paused": false,
"frequency_cap_count": 1,
"frequency_cap_period": "day",
"targeting": {
"location_ids": [
"0192f0a4-6b1e-7c3a-9d2f-5e8b1a4d3001"
],
"location_group_ids": [],
"segmentation_ids": [],
"segment_match": "any"
},
"created_at": "2026-09-20T09:12:00+00:00",
"updated_at": "2026-09-27T14:03:00+00:00"
}
}Response fields
401The token is missing, unknown, revoked or expired.
missing_tokeninvalid_tokentoken_revokedtoken_expired
missing_tokenMissing bearer token.
invalid_tokenUnknown API token. Check it was copied in full, and that it is for this environment.
token_revokedThe token "Zapier" was revoked on 2026-10-06 at 18:27 UTC. Issue a new one from Configuration › Platform API.
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_abilityplatform_api_not_enabledwrong_environmentworkspace_paused
missing_abilityThis token doesn't have the campaigns:write scope.
platform_api_not_enabledThe full Platform API isn't enabled for this workspace yet. Contact customer services to turn it on.
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."
}
}404Nothing with that ID in this workspace.
not_found
not_foundNo such resource in this workspace.
{
"error": {
"code": "not_found",
"message": "No such resource in this workspace."
}
}409A request with the same Idempotency-Key is still running (retry after Retry-After seconds), or the change conflicts with something that depends on it.
request_in_progress
Idempotency-Key is still running (retry after Retry-After seconds), or the change conflicts with something that depends on it.request_in_progressThis request is still being handled. Try again shortly.
{
"error": {
"code": "request_in_progress",
"message": "This request is still being handled. Try again shortly."
}
}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 -X PATCH 'https://api.bubbl.tech/platform/v1/campaigns/{campaign}' \
-H 'Authorization: Bearer bubbl_YOUR_TOKEN' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
--data '{
"name": "Morning coffee offer (October)",
"type": "geo",
"timezone": "Europe/London",
"starts_at": "2026-10-05",
"ends_at": "2026-10-31",
"location_ids": [
"0192f0a4-6b1e-7c3a-9d2f-5e8b1a4d3001"
],
"location_group_ids": [],
"frequency_cap_count": 1,
"frequency_cap_period": "day"
}'const response = await fetch('https://api.bubbl.tech/platform/v1/campaigns/{campaign}', {
method: 'PATCH',
headers: {
Authorization: 'Bearer bubbl_YOUR_TOKEN',
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'Morning coffee offer (October)',
type: 'geo',
timezone: 'Europe/London',
starts_at: '2026-10-05',
ends_at: '2026-10-31',
location_ids: [
'0192f0a4-6b1e-7c3a-9d2f-5e8b1a4d3001',
],
location_group_ids: [],
frequency_cap_count: 1,
frequency_cap_period: 'day',
}),
});
const data = await response.json();import requests
response = requests.request(
'PATCH',
'https://api.bubbl.tech/platform/v1/campaigns/{campaign}',
headers={
'Authorization': 'Bearer bubbl_YOUR_TOKEN',
'Accept': 'application/json',
'Content-Type': 'application/json',
},
json={
'name': 'Morning coffee offer (October)',
'type': 'geo',
'timezone': 'Europe/London',
'starts_at': '2026-10-05',
'ends_at': '2026-10-31',
'location_ids': [
'0192f0a4-6b1e-7c3a-9d2f-5e8b1a4d3001',
],
'location_group_ids': [],
'frequency_cap_count': 1,
'frequency_cap_period': 'day',
},
)
response.raise_for_status()
data = response.json()<?php
$client = new \GuzzleHttp\Client();
$response = $client->request('PATCH', 'https://api.bubbl.tech/platform/v1/campaigns/{campaign}', [
'headers' => [
'Authorization' => 'Bearer bubbl_YOUR_TOKEN',
'Accept' => 'application/json',
'Content-Type' => 'application/json',
],
'json' => [
'name' => 'Morning coffee offer (October)',
'type' => 'geo',
'timezone' => 'Europe/London',
'starts_at' => '2026-10-05',
'ends_at' => '2026-10-31',
'location_ids' => [
'0192f0a4-6b1e-7c3a-9d2f-5e8b1a4d3001',
],
'location_group_ids' => [],
'frequency_cap_count' => 1,
'frequency_cap_period' => 'day',
],
]);
$data = json_decode((string) $response->getBody(), true);Delete a campaign#
/campaigns/{campaign}Path parameters
The campaign ID
Headers
A unique value (e.g. a UUID) for this change. A retry with the same key within 24 hours gets the first response back, with Idempotent-Replayed: true, instead of making the change again.
Responses
200
{
"data": {
"id": "0192f0a4-6b1e-7c3a-9d2f-5e8b1a4d4001",
"deleted": true
}
}Response fields
401The token is missing, unknown, revoked or expired.
missing_tokeninvalid_tokentoken_revokedtoken_expired
missing_tokenMissing bearer token.
invalid_tokenUnknown API token. Check it was copied in full, and that it is for this environment.
token_revokedThe token "Zapier" was revoked on 2026-10-06 at 18:27 UTC. Issue a new one from Configuration › Platform API.
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_abilityplatform_api_not_enabledwrong_environmentworkspace_paused
missing_abilityThis token doesn't have the campaigns:write scope.
platform_api_not_enabledThe full Platform API isn't enabled for this workspace yet. Contact customer services to turn it on.
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."
}
}404Nothing with that ID in this workspace.
not_found
not_foundNo such resource in this workspace.
{
"error": {
"code": "not_found",
"message": "No such resource in this workspace."
}
}409A request with the same Idempotency-Key is still running (retry after Retry-After seconds), or the change conflicts with something that depends on it.
request_in_progress
Idempotency-Key is still running (retry after Retry-After seconds), or the change conflicts with something that depends on it.request_in_progressThis request is still being handled. Try again shortly.
{
"error": {
"code": "request_in_progress",
"message": "This request is still being handled. Try again shortly."
}
}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 -X DELETE 'https://api.bubbl.tech/platform/v1/campaigns/{campaign}' \
-H 'Authorization: Bearer bubbl_YOUR_TOKEN' \
-H 'Accept: application/json'const response = await fetch('https://api.bubbl.tech/platform/v1/campaigns/{campaign}', {
method: 'DELETE',
headers: {
Authorization: 'Bearer bubbl_YOUR_TOKEN',
Accept: 'application/json',
},
});
const data = await response.json();import requests
response = requests.request(
'DELETE',
'https://api.bubbl.tech/platform/v1/campaigns/{campaign}',
headers={
'Authorization': 'Bearer bubbl_YOUR_TOKEN',
'Accept': 'application/json',
},
)
response.raise_for_status()
data = response.json()<?php
$client = new \GuzzleHttp\Client();
$response = $client->request('DELETE', 'https://api.bubbl.tech/platform/v1/campaigns/{campaign}', [
'headers' => [
'Authorization' => 'Bearer bubbl_YOUR_TOKEN',
'Accept' => 'application/json',
],
]);
$data = json_decode((string) $response->getBody(), true);Publish a campaign#
/campaigns/{campaign}/publishResumes a paused campaign (paused → false). A new campaign isn't paused (there are no drafts), so publishing it changes nothing; it runs from its starts_at.
Path parameters
The campaign ID
Headers
A unique value (e.g. a UUID) for this change. A retry with the same key within 24 hours gets the first response back, with Idempotent-Replayed: true, instead of making the change again.
Responses
200
{
"data": {
"id": "0192f0a4-6b1e-7c3a-9d2f-5e8b1a4d4001",
"name": "Morning coffee offer",
"type": "geo",
"status": "scheduled",
"starts_at": "2026-10-04T23:00:00+00:00",
"ends_at": "2026-10-31T23:59:59+00:00",
"timezone": "Europe/London",
"paused": false,
"frequency_cap_count": 1,
"frequency_cap_period": "day",
"targeting": {
"location_ids": [
"0192f0a4-6b1e-7c3a-9d2f-5e8b1a4d3001"
],
"location_group_ids": [],
"segmentation_ids": [],
"segment_match": "any"
},
"created_at": "2026-09-20T09:12:00+00:00",
"updated_at": "2026-09-27T14:03:00+00:00"
}
}Response fields
401The token is missing, unknown, revoked or expired.
missing_tokeninvalid_tokentoken_revokedtoken_expired
missing_tokenMissing bearer token.
invalid_tokenUnknown API token. Check it was copied in full, and that it is for this environment.
token_revokedThe token "Zapier" was revoked on 2026-10-06 at 18:27 UTC. Issue a new one from Configuration › Platform API.
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_abilityplatform_api_not_enabledwrong_environmentworkspace_pausedlimit_exceededtrial_ended
missing_abilityThis token doesn't have the campaigns:write scope.
platform_api_not_enabledThe full Platform API isn't enabled for this workspace yet. Contact customer services to turn it on.
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.
limit_exceededYou've reached the limit for max_campaigns.
trial_endedYour free trial has ended. Buy through AWS Marketplace to create or run campaigns.
{
"error": {
"code": "missing_ability",
"message": "This token doesn't have the campaigns:write scope."
}
}404Nothing with that ID in this workspace.
not_found
not_foundNo such resource in this workspace.
{
"error": {
"code": "not_found",
"message": "No such resource in this workspace."
}
}409A request with the same Idempotency-Key is still running (retry after Retry-After seconds), or the change conflicts with something that depends on it.
request_in_progress
Idempotency-Key is still running (retry after Retry-After seconds), or the change conflicts with something that depends on it.request_in_progressThis request is still being handled. Try again shortly.
{
"error": {
"code": "request_in_progress",
"message": "This request is still being handled. Try again shortly."
}
}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 -X POST 'https://api.bubbl.tech/platform/v1/campaigns/{campaign}/publish' \
-H 'Authorization: Bearer bubbl_YOUR_TOKEN' \
-H 'Accept: application/json'const response = await fetch('https://api.bubbl.tech/platform/v1/campaigns/{campaign}/publish', {
method: 'POST',
headers: {
Authorization: 'Bearer bubbl_YOUR_TOKEN',
Accept: 'application/json',
},
});
const data = await response.json();import requests
response = requests.request(
'POST',
'https://api.bubbl.tech/platform/v1/campaigns/{campaign}/publish',
headers={
'Authorization': 'Bearer bubbl_YOUR_TOKEN',
'Accept': 'application/json',
},
)
response.raise_for_status()
data = response.json()<?php
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.bubbl.tech/platform/v1/campaigns/{campaign}/publish', [
'headers' => [
'Authorization' => 'Bearer bubbl_YOUR_TOKEN',
'Accept' => 'application/json',
],
]);
$data = json_decode((string) $response->getBody(), true);Pause a campaign#
/campaigns/{campaign}/pausePath parameters
The campaign ID
Headers
A unique value (e.g. a UUID) for this change. A retry with the same key within 24 hours gets the first response back, with Idempotent-Replayed: true, instead of making the change again.
Responses
200
{
"data": {
"id": "0192f0a4-6b1e-7c3a-9d2f-5e8b1a4d4001",
"name": "Morning coffee offer",
"type": "geo",
"status": "paused",
"starts_at": "2026-10-04T23:00:00+00:00",
"ends_at": "2026-10-31T23:59:59+00:00",
"timezone": "Europe/London",
"paused": true,
"frequency_cap_count": 1,
"frequency_cap_period": "day",
"targeting": {
"location_ids": [
"0192f0a4-6b1e-7c3a-9d2f-5e8b1a4d3001"
],
"location_group_ids": [],
"segmentation_ids": [],
"segment_match": "any"
},
"created_at": "2026-09-20T09:12:00+00:00",
"updated_at": "2026-09-27T14:03:00+00:00"
}
}Response fields
401The token is missing, unknown, revoked or expired.
missing_tokeninvalid_tokentoken_revokedtoken_expired
missing_tokenMissing bearer token.
invalid_tokenUnknown API token. Check it was copied in full, and that it is for this environment.
token_revokedThe token "Zapier" was revoked on 2026-10-06 at 18:27 UTC. Issue a new one from Configuration › Platform API.
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_abilityplatform_api_not_enabledwrong_environmentworkspace_paused
missing_abilityThis token doesn't have the campaigns:write scope.
platform_api_not_enabledThe full Platform API isn't enabled for this workspace yet. Contact customer services to turn it on.
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."
}
}404Nothing with that ID in this workspace.
not_found
not_foundNo such resource in this workspace.
{
"error": {
"code": "not_found",
"message": "No such resource in this workspace."
}
}409A request with the same Idempotency-Key is still running (retry after Retry-After seconds), or the change conflicts with something that depends on it.
request_in_progress
Idempotency-Key is still running (retry after Retry-After seconds), or the change conflicts with something that depends on it.request_in_progressThis request is still being handled. Try again shortly.
{
"error": {
"code": "request_in_progress",
"message": "This request is still being handled. Try again shortly."
}
}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 -X POST 'https://api.bubbl.tech/platform/v1/campaigns/{campaign}/pause' \
-H 'Authorization: Bearer bubbl_YOUR_TOKEN' \
-H 'Accept: application/json'const response = await fetch('https://api.bubbl.tech/platform/v1/campaigns/{campaign}/pause', {
method: 'POST',
headers: {
Authorization: 'Bearer bubbl_YOUR_TOKEN',
Accept: 'application/json',
},
});
const data = await response.json();import requests
response = requests.request(
'POST',
'https://api.bubbl.tech/platform/v1/campaigns/{campaign}/pause',
headers={
'Authorization': 'Bearer bubbl_YOUR_TOKEN',
'Accept': 'application/json',
},
)
response.raise_for_status()
data = response.json()<?php
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.bubbl.tech/platform/v1/campaigns/{campaign}/pause', [
'headers' => [
'Authorization' => 'Bearer bubbl_YOUR_TOKEN',
'Accept' => 'application/json',
],
]);
$data = json_decode((string) $response->getBody(), true);