> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://developers.beehiiv.com/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developers.beehiiv.com/_mcp/server. # List podcasts OAuth Scope: podcasts:read GET https://api.beehiiv.com/v2/publications/{publicationId}/podcasts Retrieve all podcasts belonging to a specific publication. Reference: https://developers.beehiiv.com/api-reference/podcasts/list-podcasts ## Authentication - `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer `, where token is your auth token. ## Request ### Path parameters - `publicationId` (string, required) — The prefixed ID of the publication object ### Query parameters - `limit` (integer, optional) — A limit on the number of objects to be returned. The limit can range between 1 and 100, and the default is 10. - `cursor` (string, optional) — **Cursor-based pagination (recommended)**: Use this opaque cursor token to fetch the next page of results. Obtain the value from `next_cursor` in a previous response. - `page` (integer, optional) — **Offset-based pagination (deprecated)**: Page number for offset-based pagination. Please migrate to cursor-based pagination using the `cursor` parameter. - `status` (enum, optional) — Optionally filter the results by the status of the podcast.`draft` - No episodes have been published.`live` - Published and active.`archived` - The podcast is no longer active. - Allowed values: `draft`, `live`, `archived` ## Response ### 200 OK - `data` (list of PodcastShow, required) — A list of podcasts for this publication. - `limit` (integer, optional) — The limit placed on the results. If no limit was specified in the request, this defaults to 10. - `page` (integer, optional, default: 1) — **Offset pagination only**: The page number the results are from. Only present when using deprecated offset-based pagination. - `total_pages` (integer, optional) — **Offset pagination only**: The total number of pages. Only present when using deprecated offset-based pagination. - `has_more` (boolean, optional) — **Cursor pagination only**: Indicates whether there are more results available after the current page. Only present when using cursor-based pagination. - `next_cursor` (string, optional) — **Cursor pagination only**: The cursor token to use for fetching the next page of results. Null when has_more is false. Only present when using cursor-based pagination. - `total_results` (integer, optional) — The total number of results from all pages. ## Errors ### 400 Bad Request Error Bad Request - `status` (integer, required) - `statusText` (string, required) - `errors` (list of ErrorDetail, required) ### 401 Unauthorized Error Unauthorized. The API key or OAuth access token is missing, invalid, or expired. - `status` (integer, required) - `statusText` (string, required) - `errors` (list of ErrorDetail, required) ### 403 Forbidden Error Forbidden - `status` (integer, required) - `statusText` (string, required) - `errors` (list of ErrorDetail, required) ### 404 Not Found Error Resource Not Found - `status` (integer, required) - `statusText` (string, required) - `errors` (list of ErrorDetail, required) ### 429 Too Many Requests Error Rate Limit Exceeded - `status` (integer, required) - `statusText` (string, required) - `errors` (list of ErrorDetail, required) ### 500 Internal Server Error Internal Server Error - `status` (integer, required) - `statusText` (string, required) - `errors` (list of ErrorDetail, required) ## Types ### PodcastShow - `id` (string, required) — The prefixed ID of the podcast. - `created` (integer, required) — The time the podcast was created. Measured in seconds since the Unix epoch. - `slug` (string, required) — The URL slug of the podcast. - `description` (string, required) — The description of the podcast. - `categories` (list of string, required) — Selected categories for the podcast, ordered by display position. Subcategories include the parent name (e.g. `News-Politics`). - `artwork_url` (string, required) — The URL of the podcast artwork. Empty string when no artwork is set. - `status` (enum, required) — The status of the podcast.`draft` - No episodes have been published. `live` - Published and active.`archived` - The podcast is no longer active. - Allowed values: `draft`, `live`, `archived` - `language` (string, required) — The ISO 639-1 two-letter language code for the podcast (e.g. `en`, `es`). - `title` (string, required) — The title of the podcast. - `author` (string, required) — The author of the podcast. Defaults to the publication name. - `type` (enum, required) — The type of the podcast.`episodic` - Episodes can be consumed in any order.`serial` - Episodes are intended to be consumed in order. - Allowed values: `episodic`, `serial` - `imported` (boolean, required) — Whether the podcast was created via an import. - `copyright` (string, required) — The copyright text for the podcast. Defaults to the publication name. - `explicit` (boolean, required) — Whether the podcast is marked as explicit. - `publishing_frequency` (integer, optional) — The most common interval, in whole days, between consecutive published episodes (the statistical mode of day gaps). Gaps are measured using each episode's display date — the custom display date if set, otherwise the scheduled time, otherwise the publish date, otherwise the creation date. Null when fewer than two published episodes exist or a frequency has not been calculated yet. - `website_url` (string, optional) — The website URL associated with the podcast. - `platform_links` (map from string to string, optional) — Platform distribution URLs keyed by platform name (e.g. `apple`, `spotify`, `youtube`). Present only for public podcasts. Platforms without a URL are null. Omitted for premium podcasts (limited to paid tiers), which use a private RSS feed with a unique URL per eligible subscriber. ### ErrorDetail - `message` (string, required) - `code` (string, required) ## Examples **Response** ```json { "data": [ { "id": "pod_00000000-0000-0000-0000-000000000000", "created": 1712534400, "slug": "morning_brief", "description": "Daily news for builders.", "categories": [ "News" ], "artwork_url": "https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/artwork.png", "status": "live", "language": "en", "title": "Morning Brief", "author": "Jane Doe", "type": "episodic", "imported": false, "copyright": "Jane Doe", "explicit": false, "publishing_frequency": 7, "website_url": "https://example.com", "platform_links": { "apple": "https://podcasts.apple.com/us/podcast/example-show/id1234567890", "spotify": "https://open.spotify.com/show/1234567890abcdefghijklmn", "youtube": null, "pocket_casts": null, "overcast": null, "castro": null, "iheart_radio": null, "amazon_music": null, "tunein": null } } ], "limit": 10, "has_more": false, "next_cursor": null } ``` **SDK Code** ```python import requests url = "https://api.beehiiv.com/v2/publications/pub_00000000-0000-0000-0000-000000000000/podcasts" headers = {"Authorization": "Bearer "} response = requests.get(url, headers=headers) print(response.json()) ``` ```javascript const url = 'https://api.beehiiv.com/v2/publications/pub_00000000-0000-0000-0000-000000000000/podcasts'; const options = {method: 'GET', headers: {Authorization: 'Bearer '}}; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.beehiiv.com/v2/publications/pub_00000000-0000-0000-0000-000000000000/podcasts" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.beehiiv.com/v2/publications/pub_00000000-0000-0000-0000-000000000000/podcasts") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.beehiiv.com/v2/publications/pub_00000000-0000-0000-0000-000000000000/podcasts") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://api.beehiiv.com/v2/publications/pub_00000000-0000-0000-0000-000000000000/podcasts', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.beehiiv.com/v2/publications/pub_00000000-0000-0000-0000-000000000000/podcasts"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.beehiiv.com/v2/publications/pub_00000000-0000-0000-0000-000000000000/podcasts")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ``` > Build your audience with beehiiv's API and SDKs. Create new subscribers and posts, get real-time notifications of subscription activity, and more.