Podchaser GraphQL API for podcast data, discovery, episodes, creators, and sponsorship information.
/plugin marketplace add vm0-ai/api0/plugin install api0@api0This skill inherits all available tools. When active, it can use any tool Claude has access to.
Access comprehensive podcast data including shows, episodes, creators, networks, charts, and sponsorship information via GraphQL.
Official docs:
https://api-docs.podchaser.com/docs/overview
Use this skill when you need to:
Set environment variables:
export PODCHASER_CLIENT_ID="your-client-id"
export PODCHASER_CLIENT_SECRET="your-client-secret"
Important: Due to a Claude Code bug, environment variables are silently cleared when pipes are used directly. Wrap the command containing
$VARinbash -c '...', keepjqoutside.
Request an access token (valid for 1 year) and save to a temp file:
bash -c 'curl -s -X POST "https://api.podchaser.com/graphql" --header "Content-Type: application/json" -d "{\"query\": \"mutation { requestAccessToken(input: { grant_type: CLIENT_CREDENTIALS, client_id: \\\"$PODCHASER_CLIENT_ID\\\", client_secret: \\\"$PODCHASER_CLIENT_SECRET\\\" }) { access_token token_type expires_in } }\"}"' | jq -r '.data.requestAccessToken.access_token' > /tmp/podchaser_token.txt
Verify the token was saved:
cat /tmp/podchaser_token.txt | head -c 50
Search for podcasts by keyword:
bash -c 'curl -s -X POST "https://api.podchaser.com/graphql" --header "Content-Type: application/json" --header "Authorization: Bearer $(cat /tmp/podchaser_token.txt)" -d '"'"'{"query": "{ podcasts(searchTerm: \"technology\", first: 5) { paginatorInfo { count } data { id title description author { name } } } }"}'"'"'' | jq .
Get detailed information about a specific podcast by ID:
Note: The
typefield is required in the identifier. UsePODCHASERfor Podchaser IDs,APPLE_PODCASTSfor Apple IDs, orSPOTIFYfor Spotify IDs.
bash -c 'curl -s -X POST "https://api.podchaser.com/graphql" --header "Content-Type: application/json" --header "Authorization: Bearer $(cat /tmp/podchaser_token.txt)" -d '"'"'{"query": "{ podcast(identifier: { id: \"717178\", type: PODCHASER }) { id title description url imageUrl language ratingAverage ratingCount author { name } categories { title } } }"}'"'"'' | jq .
Search for episodes across all podcasts:
bash -c 'curl -s -X POST "https://api.podchaser.com/graphql" --header "Content-Type: application/json" --header "Authorization: Bearer $(cat /tmp/podchaser_token.txt)" -d '"'"'{"query": "{ episodes(searchTerm: \"AI\", first: 5) { paginatorInfo { count } data { id title description airDate length podcast { title } } } }"}'"'"'' | jq .
Get episodes for a specific podcast:
bash -c 'curl -s -X POST "https://api.podchaser.com/graphql" --header "Content-Type: application/json" --header "Authorization: Bearer $(cat /tmp/podchaser_token.txt)" -d '"'"'{"query": "{ podcast(identifier: { id: \"717178\", type: PODCHASER }) { id title episodes(first: 10) { data { id title description airDate length } } } }"}'"'"'' | jq .
Get detailed information about a specific episode:
bash -c 'curl -s -X POST "https://api.podchaser.com/graphql" --header "Content-Type: application/json" --header "Authorization: Bearer $(cat /tmp/podchaser_token.txt)" -d '"'"'{"query": "{ episode(identifier: { id: \"789012\", type: PODCHASER }) { id title description airDate length url imageUrl podcast { id title } } }"}'"'"'' | jq .
Categories are available as a field on podcast objects. Get categories for a specific podcast:
bash -c 'curl -s -X POST "https://api.podchaser.com/graphql" --header "Content-Type: application/json" --header "Authorization: Bearer $(cat /tmp/podchaser_token.txt)" -d '"'"'{"query": "{ podcast(identifier: { id: \"717178\", type: PODCHASER }) { title categories { title slug } } }"}'"'"'' | jq .
Get podcasts in a specific category:
bash -c 'curl -s -X POST "https://api.podchaser.com/graphql" --header "Content-Type: application/json" --header "Authorization: Bearer $(cat /tmp/podchaser_token.txt)" -d '"'"'{"query": "{ podcasts(filters: { categories: [\"technology\"] }, first: 10) { data { id title description ratingAverage } } }"}'"'"'' | jq .
Get Apple Podcasts chart data:
bash -c 'curl -s -X POST "https://api.podchaser.com/graphql" --header "Content-Type: application/json" --header "Authorization: Bearer $(cat /tmp/podchaser_token.txt)" -d '"'"'{"query": "{ podcasts(filters: { hasAppleChartRank: true }, sort: { sortBy: APPLE_CHART_RANK, direction: ASC }, first: 10) { data { id title appleChartRank } } }"}'"'"'' | jq .
Search for podcast creators:
bash -c 'curl -s -X POST "https://api.podchaser.com/graphql" --header "Content-Type: application/json" --header "Authorization: Bearer $(cat /tmp/podchaser_token.txt)" -d '"'"'{"query": "{ creators(searchTerm: \"Joe Rogan\", first: 5) { data { pcid name bio credits { data { podcast { title } } } } } }"}'"'"'' | jq .
Check how many points a query will cost before executing:
bash -c 'curl -s -X POST "https://api.podchaser.com/graphql/cost" --header "Content-Type: application/json" --header "Authorization: Bearer $(cat /tmp/podchaser_token.txt)" -d '"'"'{"query": "{ podcasts(searchTerm: \"tech\", first: 10) { data { id title description episodes(first: 5) { data { id title } } } } }"}'"'"'' | jq .
| Query | Description |
|---|---|
podcast(identifier: {id: "...", type: PODCHASER}) | Get single podcast by ID |
podcasts(searchTerm: "...", first: N) | Search podcasts |
episode(identifier: {id: "...", type: PODCHASER}) | Get single episode by ID |
episodes(searchTerm: "...", first: N) | Search episodes |
creators(searchTerm: "...", first: N) | Search creators/hosts |
networks(searchTerm: "...", first: N) | Search podcast networks |
chartCategories(platform: APPLE_PODCASTS) | List chart categories (requires paid plan) |
The type field is required when using identifier to fetch a podcast or episode:
| Type | Description |
|---|---|
PODCHASER | Podchaser internal ID |
APPLE_PODCASTS | Apple Podcasts ID |
SPOTIFY | Spotify ID |
| Field | Type | Description |
|---|---|---|
id | ID | Unique identifier |
title | String | Podcast title |
description | String | Podcast description |
url | String | Podcast website URL |
imageUrl | String | Cover art URL |
language | String | Primary language |
ratingAverage | Float | Average user rating |
ratingCount | Int | Number of ratings |
author | Creator | Podcast author/creator |
categories | [Category] | Associated categories |
episodes(first: N) | EpisodeList | Podcast episodes (paginated) |
| Field | Type | Description |
|---|---|---|
id | ID | Unique identifier |
title | String | Episode title |
description | String | Episode description |
airDate | Date | Publication date |
length | Int | Duration in seconds |
url | String | Episode URL |
imageUrl | String | Episode artwork URL |
podcast | Podcast | Parent podcast |
| Field | Type | Description |
|---|---|---|
pcid | String | Unique identifier |
name | String | Creator name |
bio | String | Biography |
imageUrl | String | Profile image URL |
credits | CreditList | Podcast appearances |
| Filter | Values |
|---|---|
categories | Category slugs |
language | ISO language codes |
hasAppleChartRank | Boolean |
hasSpotifyChartRank | Boolean |
| sortBy | Description |
|---|---|
RELEVANCE | Search relevance |
POPULARITY | Overall popularity |
RATING | User rating |
APPLE_CHART_RANK | Apple ranking |
SPOTIFY_CHART_RANK | Spotify ranking |
LATEST_EPISODE | Most recent episode |
X-Podchaser-Points-Remaining: Available pointsX-Podchaser-Query-Cost: Points consumedExample costs:
/graphql/cost endpoint to estimate query cost before executionlimited_scope: true (1 hour expiry)Retry-After header on 429 responses