Campaigns
Sponsorship campaigns, slots, cluster links, brand profiles and air checks.
- GETList campaigns
- POSTCreate a campaign
- GETRetrieve a campaign
- PATCHUpdate a campaign
- DELETEDelete a campaign
- GETCampaign timeline
- GETCampaign CPM insights
- POSTSet a campaign's status
- POSTAdd campaign slots
- PATCHUpdate a campaign slot
- PUTLink a cluster to a slot
- DELETEUnlink a slot's cluster
- GETList brands
- GETRetrieve a brand
- PUTCreate or update a brand
- GETList air checks
List campaigns
/v1/campaignsThe workspace's campaigns as the Campaigns page lists them: status, flight, goal progress, pacing, slots, reach by category and format, expected and delivered CPM, EMV, budget, unlinked slots, brand and public URL.
status filters after meta.status_counts are taken; brand matches name or slug; show_ids keeps campaigns with a slot or cluster on those shows; search matches title, brand and show names; sort_by is <key>:<asc|desc> (keys: startDate, endDate, status, createdAt, updatedAt, title, brand, reach, goal, pacing, cpm, budget, show). precision=summary (default) reads stored cluster summaries, fast but EMV, first-30-days and delivered CPM skip summary-only clusters; precision=nodes loads every linked cluster (slow on large networks).
SDKlistener.campaigns.list()client.campaigns.list()
Query parameters
- Status filter or value.
statusstringOne ofallupcomingactivecompletedDefault
"all" - Brand name or slug filter.
brandstring - Limit to these show ids (default: every show in the workspace). Repeat the parameter or comma-separate values.
show_idsarray of strings - Case-insensitive text filter.
searchstring unlinked_onlybooleanDefault
false- Sort field.
sort_bystringDefault
"startDate:desc" - summary (fast, stored totals) or a more precise, slower computation.
precisionstringOne ofsummarynodesDefault
"summary" - Page size, 1–100 (default 25).
limitintegerDefault
25 - Opaque cursor from the previous page's next_cursor.
cursorstring
Returns
200OK
objectstringrequiredurlstringrequireddataarray of objectsrequiredShow child attributesHide child attributes
has_morebooleanrequired- Pass as
next_cursorstringrequiredcursorto get the next page; null on the last page. - The result's non-list fields (window, coverage, freshness, totals, note …).
metaobjectrequiredShow child attributesHide child attributes
Errors
400parameter_invalid401credential_invalid403scope_missing404resource_not_found429rate_limited500internal_error
Create a campaign
/v1/campaignsCreate a campaign. At least one show must be referenced through show_goals, show_budgets or planned_episodes. Dates are YYYY-MM-DD and end_date must not precede start_date. When brand.name is set the brand profile is created or updated first and campaigns already sharing that brand get its details re-stamped (listed in warnings). A duplicate title + brand is a warning, not an error. No emails or notifications are sent.
- Send
"dry_run": trueto get{"object": "dry_run", "would_write": …}without writing anything.
SDKlistener.campaigns.create()client.campaigns.create()
Headers
- Any unique string (≤ 255 chars). Replays within 24 h return the stored response with Idempotent-Replayed: true.
Idempotency-Keystring
Request body
application/json- Title.
titlestringrequired - Free-text description.
descriptionstringDefault
"" - First day, YYYY-MM-DD (inclusive). With end_date, overrides time_range.
start_datestring - Last day, YYYY-MM-DD (inclusive). With start_date, overrides time_range.
end_datestring - Brand name or slug filter.
brandobjectShow child attributesHide child attributes
- Per-show view goals: {show_id: views}.
show_goalsmap of integer - Per-show budgets in dollars: {show_id: amount}.
show_budgetsmap of number - Total campaign budget in dollars.
total_budgetnumber - Per-platform goals: {platform: views}.
platform_goalsmap of integer - Campaign slots: [{show_id, title?, expected_impressions?, budget?}].
planned_episodesarray of objectsShow child attributesHide child attributes
- Limit to these show ids (default: every show in the workspace).
show_idsarray of strings - true returns exactly what would be written without writing anything (the API's test mode).
dry_runbooleanDefault
false
Returns
200OK
One of:
WriteResult
DryRun
Errors
400parameter_invalid401credential_invalid403scope_missing404resource_not_found409confirmation_required413body_too_large429rate_limited500internal_error
Retrieve a campaign
/v1/campaigns/{campaign_id}One campaign in full: headline KPIs (reach by category and format, engagement, expected vs delivered CPM, EMV with resolved settings, first-30-days estimate), fulfilment against goal and pacing, every slot with its linked cluster's reach, per-show breakdown, air-check summary, share settings, brand, activity log and URLs. Node-precise: every linked cluster is loaded.
SDKlistener.campaigns.retrieve()client.campaigns.retrieve()
Path parameters
- Campaign id (see GET /v1/campaigns).
campaign_idstringrequired
Query parameters
activity_limitintegerDefault
30
Returns
200OK
idstringrequiredtitlestringrequiredstatusstringrequiredOne ofupcomingactivecompletedstatus_labelstringrequiredbrandobjectrequiredShow child attributesHide child attributes
goalsobjectrequiredShow child attributesHide child attributes
pacingobjectrequiredShow child attributesHide child attributes
reachobjectrequiredShow child attributesHide child attributes
activity_logobjectrequiredShow child attributesHide child attributes
app_urlstringrequiredprecisionstringrequiredOne ofsummarynodesnonecomputed_atstringrequiredcache_age_secondsnumberrequiredobjectstringrequireddescriptionstringDefault
""status_is_manualbooleanDefault
falsestatus_updated_atstringstart_datestringend_datestringstart_is_fallbackbooleanDefault
falsedays_remainingintegerdays_until_startintegertimingstringhas_goalbooleanDefault
falsegoal_progress_pctnumbergoal_progress_clamped_pctnumberbudgetnumberDefault
0slot_budget_totalnumberDefault
0expected_impressionsnumberDefault
0expected_cpmnumberDefault
0delivered_cpmnumberDefault
0delivered_cpm_statusstringDefault
"pending"delivered_cpm_detailobjectformat_cpmobject- EMV block incl. resolved settings + settings_source.
emvobject engagementnumberDefault
0engagement_ratenumberDefault
0first_30_daysobjectlinked_show_idsarray of stringslinked_show_namesarray of stringsshow_countintegerDefault
0cluster_idsarray of stringsclusters_loadedintegerDefault
0clusters_missingarray of stringstotal_slotsintegerDefault
0linked_slotsintegerDefault
0unlinked_slot_countintegerDefault
0live_slotsintegerDefault
0slotsarray of objectsShow child attributesHide child attributes
show_breakdownarray of objectsShow child attributesHide child attributes
air_checksobjectexcluded_node_countintegerDefault
0excluded_node_ids_countintegerDefault
0featured_content_node_idstringmerged_fromarray of objectscopied_fromobjectcreated_viastringduplicateobjectshareobjectpublic_urlstringcreated_atstringupdated_atstringwarningsarray of stringsnotestring
Errors
400parameter_invalid401credential_invalid403scope_missing404resource_not_found429rate_limited500internal_error
Update a campaign
/v1/campaigns/{campaign_id}Update a campaign's title, description, dates, brand, goals, budgets, EMV settings or featured content. Only the fields you send change. brand fields merge into the campaign's brand; show_goals replaces the per-show goals and recomputes the total; emv_settings merges and is normalised. Renaming the brand re-stamps other campaigns of that brand (listed in warnings). clear_featured_content_node / clear_platform_goals remove those fields. Slots, cluster links and status have their own endpoints.
- Send
"dry_run": trueto get{"object": "dry_run", "would_write": …}without writing anything.
SDKlistener.campaigns.update()client.campaigns.update()
Path parameters
- Campaign id (see GET /v1/campaigns).
campaign_idstringrequired
Headers
- Any unique string (≤ 255 chars). Replays within 24 h return the stored response with Idempotent-Replayed: true.
Idempotency-Keystring
Request body
application/json- Title.
titlestring - Free-text description.
descriptionstring - First day, YYYY-MM-DD (inclusive). With end_date, overrides time_range.
start_datestring - Last day, YYYY-MM-DD (inclusive). With start_date, overrides time_range.
end_datestring - Brand name or slug filter.
brandobjectShow child attributesHide child attributes
- Per-show view goals: {show_id: views}.
show_goalsmap of integer - Per-show budgets in dollars: {show_id: amount}.
show_budgetsmap of number - Total campaign budget in dollars.
total_budgetnumber - Per-platform goals: {platform: views}.
platform_goalsmap of integer - Campaign `
emv_settingsobjectemvSettings(port ofnormalizeCampaignEmvSettings`).Show child attributesHide child attributes
featured_content_node_idstringclear_featured_content_nodebooleanDefault
falseclear_platform_goalsbooleanDefault
false- true returns exactly what would be written without writing anything (the API's test mode).
dry_runbooleanDefault
false
Returns
200OK
One of:
WriteResult
DryRun
Errors
400parameter_invalid401credential_invalid403scope_missing404resource_not_found409confirmation_required413body_too_large429rate_limited500internal_error
Delete a campaign
/v1/campaigns/{campaign_id}Permanently delete a campaign (no undo, no cascade) and report what it leaves behind: pending brand invites and shared reports that embed it. Send ?dry_run=true first to see them.
- Send
?dry_run=trueto get{"object": "dry_run", "would_write": …}without writing anything. - Requires
?confirm=true; without it the API answers 409confirmation_requiredwith the exactpreview.
SDKlistener.campaigns.delete()client.campaigns.delete()
Path parameters
- Campaign id (see GET /v1/campaigns).
campaign_idstringrequired
Query parameters
- true returns exactly what would be written without writing anything (the API's test mode).
dry_runbooleanDefault
false - Must be true to apply destructive or metered changes; without it the API answers 409 with a preview.
confirmbooleanDefault
false
Headers
- Any unique string (≤ 255 chars). Replays within 24 h return the stored response with Idempotent-Replayed: true.
Idempotency-Keystring
Returns
200OK
One of:
WriteResult
DryRun
Errors
400parameter_invalid401credential_invalid403scope_missing404resource_not_found409confirmation_required413body_too_large429rate_limited500internal_error
Campaign timeline
/v1/campaigns/{campaign_id}/timelineA campaign's reach series (total, audio, YouTube, social; daily buckets as the campaign chart draws them) and its EMV accrual over a window. window is 7d, 30d, 90d or all, or send start_date + end_date; chart_type is daily or cumulative. EMV points are thinned to at most 180 by summing whole weeks.
SDKlistener.campaigns.timeline()client.campaigns.timeline()
Path parameters
- Campaign id (see GET /v1/campaigns).
campaign_idstringrequired
Query parameters
- Reporting window.
windowstringOne of7d30d90dallDefault
"30d" - First day, YYYY-MM-DD (inclusive). With end_date, overrides time_range.
start_datestring - Last day, YYYY-MM-DD (inclusive). With start_date, overrides time_range.
end_datestring - daily values or a cumulative running total.
chart_typestringOne ofdailycumulativeDefault
"cumulative"
Returns
200OK
campaign_idstringrequiredtitlestringrequired- {time_range, chart_type, start, end, previous_start, previous_end} as the chart resolves it.
windowobjectrequired chart_typestringrequiredOne ofdailycumulativetotalsmap of numberrequired- vs the equal-length previous window; None for all-time.
growthmap of numberrequired reach_seriesarray of objectsrequiredShow child attributesHide child attributes
audio_seriesarray of objectsrequiredShow child attributesHide child attributes
youtube_seriesarray of objectsrequiredShow child attributesHide child attributes
social_seriesarray of objectsrequiredShow child attributesHide child attributes
events_countedintegerrequiredemv_seriesarray of objectsrequiredShow child attributesHide child attributes
emv_totalnumberrequiredprecisionstringrequiredOne ofsummarynodesnonecomputed_atstringrequiredcache_age_secondsnumberrequiredobjectstringrequiredemv_by_platformmap of numberemv_enabledbooleanDefault
falseemv_nodes_countedintegerDefault
0- True when the EMV series was thinned to ≤ 180 points by summing whole weeks.
emv_points_thinnedbooleanDefault
false warningsarray of stringspublic_urlstringnotestring
Errors
400parameter_invalid401credential_invalid403scope_missing404resource_not_found429rate_limited500internal_error
Campaign CPM insights
/v1/campaigns/{campaign_id}/cpm-insightsA campaign's expected vs delivered CPM per format and where it sits against the workspace's recent campaigns (median of the 12 most recent peers with a delivered CPM; within ±3 % counts as in line). Peers are the peer_limit most recently updated other campaigns, loaded at node precision. Delivered CPM is null until a campaign has delivered at least 25 % of its expected impressions.
SDKlistener.campaigns.cpmInsights()client.campaigns.cpm_insights()
Path parameters
- Campaign id (see GET /v1/campaigns).
campaign_idstringrequired
Query parameters
peer_limitintegerDefault
24
Returns
200OK
campaign_idstringrequiredtitlestringrequiredprecisionstringrequiredOne ofsummarynodesnonecomputed_atstringrequiredcache_age_secondsnumberrequiredobjectstringrequiredexpected_cpmnumberDefault
0delivered_cpmnumberDefault
0delivered_cpm_statusstringDefault
"pending"delivered_cpm_detailobjectformat_cpmobject- long_form / short_form delivered CPM vs the median of the 12 most recent peers with a CPM.
benchmarksmap of objectShow child attributesHide child attributes
peersarray of objectsShow child attributesHide child attributes
peers_consideredintegerDefault
0peers_with_cpmmap of integerworkspace_campaign_countintegerDefault
0warningsarray of stringspublic_urlstringnotestring
Errors
400parameter_invalid401credential_invalid403scope_missing404resource_not_found429rate_limited500internal_error
Set a campaign's status
/v1/campaigns/{campaign_id}/statusSet a campaign's manual status (upcoming, active, completed), or send "status": null to clear the override so the status follows the dates again. No other side effects.
- Send
"dry_run": trueto get{"object": "dry_run", "would_write": …}without writing anything.
SDKlistener.campaigns.setStatus()client.campaigns.set_status()
Path parameters
- Campaign id (see GET /v1/campaigns).
campaign_idstringrequired
Headers
- Any unique string (≤ 255 chars). Replays within 24 h return the stored response with Idempotent-Replayed: true.
Idempotency-Keystring
Request body
application/json- Status filter or value.
statusstringOne ofupcomingactivecompleted - true returns exactly what would be written without writing anything (the API's test mode).
dry_runbooleanDefault
false
Returns
200OK
One of:
WriteResult
DryRun
Errors
400parameter_invalid401credential_invalid403scope_missing404resource_not_found409confirmation_required413body_too_large429rate_limited500internal_error
Add campaign slots
/v1/campaigns/{campaign_id}/slotsAppend slots (planned episodes) to a campaign: a show plus optional title, expected_impressions, budget and linked_cluster_id each. Returns the new slot ids and the full slot list. A cluster already linked to another slot is refused (single-slot rule); up to 2,000 slots per campaign.
- Send
"dry_run": trueto get{"object": "dry_run", "would_write": …}without writing anything.
SDKlistener.campaigns.slots.create()client.campaigns.slots.create()
Path parameters
- Campaign id (see GET /v1/campaigns).
campaign_idstringrequired
Headers
- Any unique string (≤ 255 chars). Replays within 24 h return the stored response with Idempotent-Replayed: true.
Idempotency-Keystring
Request body
application/json- Campaign slots: [{show_id, title?, expected_impressions?, budget?}].
planned_episodesarray of objectsrequiredShow child attributesHide child attributes
- true returns exactly what would be written without writing anything (the API's test mode).
dry_runbooleanDefault
false
Returns
200OK
One of:
WriteResult
DryRun
Errors
400parameter_invalid401credential_invalid403scope_missing404resource_not_found409confirmation_required413body_too_large429rate_limited500internal_error
Update a campaign slot
/v1/campaigns/{campaign_id}/slots/{slot_id}Edit one slot's title, expected_impressions, budget or show_id. Setting impressions or budget pins the value so the app stops auto-distributing it. To change the linked cluster use PUT / DELETE /v1/campaigns/{campaign_id}/slots/{slot_id}/cluster.
- Send
"dry_run": trueto get{"object": "dry_run", "would_write": …}without writing anything.
SDKlistener.campaigns.slots.update()client.campaigns.slots.update()
Path parameters
- Campaign id (see GET /v1/campaigns).
campaign_idstringrequired - Campaign slot (planned episode) id from the campaign's slots.
slot_idstringrequired
Headers
- Any unique string (≤ 255 chars). Replays within 24 h return the stored response with Idempotent-Replayed: true.
Idempotency-Keystring
Request body
application/json- Title.
titlestring expected_impressionsintegerbudgetnumber- A show id in this workspace (see GET /v1/shows).
show_idstring - true returns exactly what would be written without writing anything (the API's test mode).
dry_runbooleanDefault
false
Returns
200OK
One of:
WriteResult
DryRun
Errors
400parameter_invalid401credential_invalid403scope_missing404resource_not_found409confirmation_required413body_too_large429rate_limited500internal_error
Link a cluster to a slot
/v1/campaigns/{campaign_id}/slots/{slot_id}/clusterLink an existing cluster (show_id + cluster_id, from GET /v1/clusters) to one campaign slot, attributing its reach to the campaign. A cluster already linked to another slot of the same campaign is refused (double-count guard). included_node_ids limits which of the cluster's nodes count. The cluster itself is never modified.
- Send
"dry_run": trueto get{"object": "dry_run", "would_write": …}without writing anything.
SDKlistener.campaigns.slots.linkCluster()client.campaigns.slots.link_cluster()
Path parameters
- Campaign id (see GET /v1/campaigns).
campaign_idstringrequired - Campaign slot (planned episode) id from the campaign's slots.
slot_idstringrequired
Headers
- Any unique string (≤ 255 chars). Replays within 24 h return the stored response with Idempotent-Replayed: true.
Idempotency-Keystring
Request body
application/json- Cluster id (see GET /v1/clusters).
cluster_idstringrequired - A show id in this workspace (see GET /v1/shows).
show_idstringrequired included_node_idsarray of strings- true returns exactly what would be written without writing anything (the API's test mode).
dry_runbooleanDefault
false
Returns
200OK
One of:
WriteResult
DryRun
Errors
400parameter_invalid401credential_invalid403scope_missing404resource_not_found409confirmation_required413body_too_large429rate_limited500internal_error
Unlink a slot's cluster
/v1/campaigns/{campaign_id}/slots/{slot_id}/clusterDetach the linked cluster from one campaign slot without deleting the slot. The cluster itself is never modified.
- Send
?dry_run=trueto get{"object": "dry_run", "would_write": …}without writing anything.
SDKlistener.campaigns.slots.unlinkCluster()client.campaigns.slots.unlink_cluster()
Path parameters
- Campaign id (see GET /v1/campaigns).
campaign_idstringrequired - Campaign slot (planned episode) id from the campaign's slots.
slot_idstringrequired
Query parameters
- true returns exactly what would be written without writing anything (the API's test mode).
dry_runbooleanDefault
false
Headers
- Any unique string (≤ 255 chars). Replays within 24 h return the stored response with Idempotent-Replayed: true.
Idempotency-Keystring
Returns
200OK
One of:
WriteResult
DryRun
Errors
400parameter_invalid401credential_invalid403scope_missing404resource_not_found409confirmation_required413body_too_large429rate_limited500internal_error
List brands
/v1/brandsThe workspace's advertisers (brand profiles plus every brand named on a campaign) with campaign counts, status mix, shows reached, aggregated reach, budget and CPM, EMV and the public brand page URL. search matches name, slug or domain; precision=summary (default) reads stored cluster summaries, nodes loads every linked cluster.
SDKlistener.brands.list()client.brands.list()
Query parameters
- Case-insensitive text filter.
searchstring - summary (fast, stored totals) or a more precise, slower computation.
precisionstringOne ofsummarynodesDefault
"summary" - Page size, 1–100 (default 25).
limitintegerDefault
25 - Opaque cursor from the previous page's next_cursor.
cursorstring
Returns
200OK
objectstringrequiredurlstringrequireddataarray of objectsrequiredShow child attributesHide child attributes
has_morebooleanrequired- Pass as
next_cursorstringrequiredcursorto get the next page; null on the last page. - The result's non-list fields (window, coverage, freshness, totals, note …).
metaobjectrequiredShow child attributesHide child attributes
Errors
400parameter_invalid401credential_invalid403scope_missing404resource_not_found429rate_limited500internal_error
Retrieve a brand
/v1/brands/{brand_slug}One brand's report as its public page computes it: totals (reach by category, budget, planned impressions, expected and delivered CPM), per-campaign rows, per-show performance, EMV, invites and a reach trend. The path also accepts the brand name. time_range (7d, 30d, 90d, all) and chart_type shape the trend; precision=nodes (default) loads every linked cluster, summary is faster but skips EMV.
SDKlistener.brands.retrieve()client.brands.retrieve()
Path parameters
- Brand slug (see GET /v1/brands).
brand_slugstringrequired
Query parameters
- 7d | 14d | 30d | 90d | 180d | 365d | all, or a quarter like 2026-Q2. Windows are UTC days anchored to today.
time_rangestringOne of7d30d90dallDefault
"all" - daily values or a cumulative running total.
chart_typestringOne ofdailycumulativeDefault
"cumulative" - summary (fast, stored totals) or a more precise, slower computation.
precisionstringOne ofsummarynodesDefault
"nodes"
Returns
200OK
slugstringrequirednamestringrequiredtotalsobjectrequiredcampaign_rowsarray of objectsrequiredshow_performancearray of objectsrequiredshowsarray of objectsrequired- {time_range, chart_type, points: [...]} from brand_trend_series.
trendobjectrequired precisionstringrequiredOne ofsummarynodesnoneapp_urlstringrequiredcomputed_atstringrequiredcache_age_secondsnumberrequiredobjectstringrequireddomainstringlogostringnotesstringhas_contactbooleanDefault
falsehas_brand_docbooleanDefault
false- The canonical campaignBrands doc (contact fields removed).
brand_docobject - brandInvites for this brand (emails masked).
invitesarray of objects campaign_idsarray of stringscampaign_countintegerDefault
0emv_totalnumberDefault
0emv_by_campaignmap of numberpublic_urlstringnotestring
Errors
400parameter_invalid401credential_invalid403scope_missing404resource_not_found429rate_limited500internal_error
Create or update a brand
/v1/brands/{brand_slug}Create or update a brand profile once for every campaign: name, logo, domain, contact, invite email, notes. Every campaign of the brand gets its brand details re-stamped in the same write; when more than one campaign is affected the request needs "confirm": true (the 409 preview and a dry run both list affected_campaign_ids).
- Send
"dry_run": trueto get{"object": "dry_run", "would_write": …}without writing anything.
SDKlistener.brands.upsert()client.brands.upsert()
Path parameters
brand_slugstringrequired
Headers
- Any unique string (≤ 255 chars). Replays within 24 h return the stored response with Idempotent-Replayed: true.
Idempotency-Keystring
Request body
application/json- Name.
namestringrequired logostringdomainstringcontactstringinvite_emailstringnotesstring- true returns exactly what would be written without writing anything (the API's test mode).
dry_runbooleanDefault
false - Must be true to apply destructive or metered changes; without it the API answers 409 with a preview.
confirmbooleanDefault
false
Returns
200OK
One of:
WriteResult
DryRun
Errors
400parameter_invalid401credential_invalid403scope_missing404resource_not_found409confirmation_required413body_too_large429rate_limited500internal_error
List air checks
/v1/air-checksAd-read verification rows, one per campaign placement, with status (detected, missing, pending, blocked, excluded), the transcript-capable targets (Spotify episode, long-form YouTube video), every brand mention found (collapsed into ad reads with YouTube timestamp links) and pre / mid / post placement. group_by (advertiser, publisher, campaign, show) adds groups in meta. Narrow with campaign_id, brand or show_id on large networks.
SDKlistener.airChecks.list()client.air_checks.list()
Query parameters
- Campaign id (see GET /v1/campaigns).
campaign_idstring - A show id in this workspace (see GET /v1/shows).
show_idstring - Brand name or slug filter.
brandstring - Status filter or value.
statusstringOne ofalldetectedmissingpendingblockedexcludedDefault
"all" - A platform name (e.g. youtube, spotify, applePodcasts, instagram).
platformstringOne ofspotifyyoutube - Group the results by this field.
group_bystringOne ofadvertiserpublishercampaignshow - Page size, 1–100 (default 25).
limitintegerDefault
25 - Opaque cursor from the previous page's next_cursor.
cursorstring
Returns
200OK
objectstringrequiredurlstringrequireddataarray of objectsrequiredShow child attributesHide child attributes
has_morebooleanrequired- Pass as
next_cursorstringrequiredcursorto get the next page; null on the last page. - The result's non-list fields (window, coverage, freshness, totals, note …).
metaobjectrequiredShow child attributesHide child attributes
Errors
400parameter_invalid401credential_invalid403scope_missing404resource_not_found429rate_limited500internal_error