Workspace & shows
The workspace (network, subnetwork or solo show), its shows, plan, team, integrations and public profiles.
- GETList shows
- GETRetrieve a show
- PATCHUpdate a show's public profile
- GETRetrieve the plan
- GETRetrieve the team
- GETList subnetworks
- GETBuild public and app URLs
- PATCHUpdate the network's public profile
- PUTSet the network's default EMV rates
- GETList platform integrations
- GETRetrieve data freshness and refresh status
List shows
/v1/showsThe workspace's shows with profile, plan, connected platforms and public URLs.
category matches any of a show's categories (case-insensitive); search matches name, handle and description. Hidden shows (every category hidden on the profile) are left out unless include_hidden=true.
SDKlistener.shows.list()client.shows.list()
Query parameters
categorystring- Case-insensitive text filter.
searchstring include_hiddenbooleanDefault
false- 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 show
/v1/shows/{show_id}One show's full profile: hosts, categories, podcast metadata (RSS, Spotify and Apple ids), Spotify rating, sponsorship packages, past guests, collaborations, per-platform connection state and freshness, and public URLs.
SDKlistener.shows.retrieve()client.shows.retrieve()
Path parameters
- A show id in this workspace (see GET /v1/shows).
show_idstringrequired
Returns
200OK
idstringrequirednamestringrequiredplanstringrequiredpodcast_metadataobjectrequiredShow child attributesHide child attributes
app_urlstringrequiredcomputed_atstringrequiredcache_age_secondsnumberrequiredobjectstringrequiredhandlestringDefault
""imagestringdescriptionstringDefault
""authorstringDefault
""websitestringcategoriesarray of stringshidden_categoriesarray of stringsmain_platformstringagency_managedbooleanDefault
falsecreated_bystringcreated_atstringupdated_atstringhostsarray of objectsShow child attributesHide child attributes
show_host_sectionbooleanDefault
falsetalentarray of objectsShow child attributesHide child attributes
spotify_ratingobjectShow child attributesHide child attributes
platformsarray of objectsShow child attributesHide child attributes
connected_platformsarray of stringsfreshnessmap of objectShow child attributesHide child attributes
stale_platformsarray of stringssponsorship_packagesarray of objectscollaborationsarray of objectsShow child attributesHide child attributes
past_guestsarray of objectsShow child attributesHide child attributes
survey_dataobjectShow child attributesHide child attributes
last_cluster_updatestringlast_update_statsobjectepisode_countintegerpublic_urlstring
Errors
400parameter_invalid401credential_invalid403scope_missing404resource_not_found429rate_limited500internal_error
Update a show's public profile
/v1/shows/{show_id}Update public-profile fields shown on https://listener.com/{handle}: name, author, logo, about, categories (up to 5), main platform, featured YouTube video (URL or 11-character id), highlighted Spotify episode (URL or 22-character id), publishing schedule, brand colours (#hex) and website. Only the fields you send change.
Changing handle needs "confirm": true: it is slugified, checked for uniqueness, and the old public URL stops resolving (nothing redirects). Custom stats, display settings, hosts, collaborations and email are never touched. The response is the exact update map.
- Send
"dry_run": trueto get{"object": "dry_run", "would_write": …}without writing anything.
SDKlistener.shows.update()client.shows.update()
Path parameters
- A show id in this workspace (see GET /v1/shows).
show_idstringrequired
Headers
- Any unique string (≤ 255 chars). Replays within 24 h return the stored response with Idempotent-Replayed: true.
Idempotency-Keystring
Request body
application/jsonpodcast_namestringpodcast_authorstringpodcast_logostringaboutstring- Only shows whose categories contain one of these (case-insensitive substring).
categoriesarray of strings main_platformstringyoutube_videostringhighlighted_episodestringpublishing_schedulestringcustom_schedulestringprimary_colorstringsecondary_colorstringwebsitestring- Public URL handle (lowercase, hyphens).
handlestring - 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
Retrieve the plan
/v1/planThe resolved plan (explicit plan → subscription → network → free) and the premium platforms and features it unlocks. Check it before offering an integration the plan locks.
SDKlistener.plan.retrieve()client.plan.retrieve()
Returns
200OK
planstringrequiredplan_sourcestringrequiredOne ofexplicitsubscriptionis_networkagency_manageddefault_freeis_paidbooleanrequired- Platforms the app marks isPremium (locked on the free plan).
premium_platformsarray of stringsrequired - Premium platforms this plan cannot connect.
locked_platformsarray of stringsrequired - feature → available on this plan.
gated_featuresmap of booleanrequired writes_enabledbooleanrequiredcomputed_atstringrequiredcache_age_secondsnumberrequiredobjectstringrequired- show_id → resolved plan for each managed show.
shows_plansmap of string notestring
Errors
400parameter_invalid401credential_invalid403scope_missing404resource_not_found429rate_limited500internal_error
Retrieve the team
/v1/teamThe network team: accepted members, pending invites and talent invites per show. Emails are masked (j***@domain).
SDKlistener.team.retrieve()client.team.retrieve()
Returns
200OK
owner_uidstringrequiredmembersarray of objectsrequiredShow child attributesHide child attributes
pending_invitesarray of objectsrequiredShow child attributesHide child attributes
- Owner + accepted members.
team_sizeintegerrequired computed_atstringrequiredcache_age_secondsnumberrequiredobjectstringrequiredtalent_by_showarray of objectsShow child attributesHide child attributes
notestring
Errors
400parameter_invalid401credential_invalid403scope_missing404resource_not_found429rate_limited500internal_error
List subnetworks
/v1/subnetworksThe network's subnetworks (id, name, handle, show ids, activation state, public URL). Never returns credentials. Solo workspaces get an empty list with meta.note; a subnetwork reports parent_network_uid instead.
SDKlistener.subnetworks.list()client.subnetworks.list()
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
Build public and app URLs
/v1/urlsBuild the public share URL and in-app URL for a network, show, cluster, campaign, brand, report, chart or links page. id is the entity id (cluster id, campaign id, brand slug, report id, chart id); show_id is required for show, cluster and links pages. The entity is not checked for existence.
SDKlistener.urls.retrieve()client.urls.retrieve()
Query parameters
entitystringrequiredOne ofnetworkshowclustercampaignbrandreportchartlinkidstring- A show id in this workspace (see GET /v1/shows).
show_idstring
Returns
200OK
entitystringrequiredOne ofnetworkshowclustercampaignbrandreportchartlinkobjectstringrequiredidstringshow_idstringpublic_urlstringapp_urlstringnotestring
Errors
400parameter_invalid401credential_invalid403scope_missing404resource_not_found429rate_limited500internal_error
Update the network's public profile
/v1/networkUpdate the network's public profile shown on https://network.listener.com/{handle}: name, owner, website, contact email, about, focus, categories (up to 5), founded year, layout and the AI / reach-stats toggles. Only the fields you send change.
Changing handle (^[a-z0-9-]+$) needs "confirm": true; the old public URL stops resolving. Privacy, custom domain, brand colours and sponsors are never touched. Solo workspaces have no network profile (400).
- Send
"dry_run": trueto get{"object": "dry_run", "would_write": …}without writing anything.
SDKlistener.network.update()client.network.update()
Headers
- Any unique string (≤ 255 chars). Replays within 24 h return the stored response with Idempotent-Replayed: true.
Idempotency-Keystring
Request body
application/jsonnetwork_namestringnetwork_ownerstringnetwork_websitestringcontact_emailstringaboutstringmain_focusstring- Only shows whose categories contain one of these (case-insensitive substring).
categoriesarray of strings founded_yearstringpodcast_display_layoutstringOne ofgridlistshow_aibooleanshow_reach_statsboolean- Public URL handle (lowercase, hyphens).
handlestring - 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
Set the network's default EMV rates
/v1/network/default-emvSet the network-wide default EMV rates inherited by every cluster and campaign without its own override. CPMs are dollars per 1,000 impressions; like and comment rates are dollars each; every value must be a finite number ≥ 0. Needs "confirm": true because it changes EMV figures across the whole workspace.
- Send
"dry_run": trueto get{"object": "dry_run", "would_write": …}without writing anything.
SDKlistener.network.setDefaultEmv()client.network.set_default_emv()
Headers
- Any unique string (≤ 255 chars). Replays within 24 h return the stored response with Idempotent-Replayed: true.
Idempotency-Keystring
Request body
application/jsonlong_form_cpmnumberrequiredshort_form_cpmnumberrequiredlike_ratenumberrequiredcomment_ratenumberrequired- 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 platform integrations
/v1/integrationsOne row per show × platform (the 18 platforms of the Integrations page): connection state (connected, pending, disconnected), last update, staleness, how it can be refreshed (server, manual_request, none), whether a refresh needs confirm, and the last stored error.
platform accepts aliases; stale_only=true keeps rows older than 36 h. For the per-show rollup with cluster freshness and pending data requests use GET /v1/integrations/status.
SDKlistener.integrations.list()client.integrations.list()
Query parameters
- Limit to these show ids (default: every show in the workspace). Repeat the parameter or comma-separate values.
show_idsarray of strings - A platform name (e.g. youtube, spotify, applePodcasts, instagram).
platformstring statestringOne ofallconnectedpendingdisconnectedDefault
"all"stale_onlybooleanDefault
false- 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 data freshness and refresh status
/v1/integrations/statusPer show: the newest platform update, stale platforms grouped by how they can be refreshed, cluster refresh freshness (last run, failed nodes), pending Spotify / Apple data requests and the last cluster update stats. Check it before POST /v1/shows/{show_id}/platforms/{platform}/refresh, POST /v1/data-requests or a cluster refresh. include_cluster_freshness=false makes it cheaper.
SDKlistener.integrations.status()client.integrations.status()
Query parameters
- Limit to these show ids (default: every show in the workspace). Repeat the parameter or comma-separate values.
show_idsarray of strings include_cluster_freshnessbooleanDefault
true
Returns
200OK
showsarray of objectsrequiredShow child attributesHide child attributes
show_idsarray of stringsrequiredcomputed_atstringrequiredobjectstringrequired- Platforms stale on at least one show.
stale_platformsarray of strings - platform → oldest freshness across the scoped shows.
freshnessmap of objectShow child attributesHide child attributes
pending_request_countintegerDefault
0shows_with_stale_clustersintegerDefault
0missing_show_idsarray of stringscache_age_secondsnumberDefault
0notestring
Errors
400parameter_invalid401credential_invalid403scope_missing404resource_not_found429rate_limited500internal_error