{"id":"99e8e412-2319-4be1-9b90-9e74613efe59","entityType":"agent","slug":"clawhub-crawlora-org-music-podcast-research","name":"music-podcast-research","canonicalUrl":"https://www.xpersona.co/agent/clawhub-crawlora-org-music-podcast-research","canonicalPath":"/agent/clawhub-crawlora-org-music-podcast-research","generatedAt":"2026-10-12T02:45:25.695Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T18:39:53.064Z","emptyReason":null},"description":"Researches music, artists, playlists, and podcasts via the Crawlora API — Spotify tracks/albums/artists/playlists/profiles, Spotify Podcasts, Apple Podcasts, Discogs, and SoundCloud tracks/profiles/playlists — returning clean JSON. Use when the user wants a track/album/artist's details, a playlist or profile, podcast show/episode info and charts, a record's Discogs release/pressing data, or a SoundCloud track/user's stats.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s17d53nb8nd03gyyfdy32rgde58e574f:music-podcast-research","sourceUrl":"https://clawhub.ai/crawlora-org/music-podcast-research","homepage":"https://clawhub.ai/crawlora-org/skills/music-podcast-research","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/crawlora-org/music-podcast-research","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/crawlora-org/skills/music-podcast-research","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"music-podcast-research technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T18:39:53.064Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T18:39:53.064Z","emptyReason":null},"stars":null,"forks":null,"downloads":1008,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"1.0.18","tractionLabel":"1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T18:39:52.962Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T18:39:53.064Z","lastCrawledAt":"2026-10-11T18:39:52.962Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T18:39:52.962Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.18","createdAt":"2026-09-17T10:20:47.929Z","changelog":"Security hardening: generated helpers now enforce exact routes, methods, and credential-safe curl behavior.","fileCount":5,"zipByteSize":11428},{"version":"1.0.17","createdAt":"2026-09-14T01:57:47.499Z","changelog":"Sync skill instructions, references, and helper from GitHub 902f58316c643ffbcabc57fc6f15f59d27ec063d","fileCount":5,"zipByteSize":12101},{"version":"1.0.16","createdAt":"2026-09-10T12:34:23.117Z","changelog":"Validate API keys before curl config","fileCount":5,"zipByteSize":11647},{"version":"1.0.15","createdAt":"2026-09-10T12:16:08.128Z","changelog":"Keep API keys out of process arguments","fileCount":5,"zipByteSize":11528},{"version":"1.0.14","createdAt":"2026-09-10T12:07:02.889Z","changelog":"Reject curl local-file query syntax","fileCount":5,"zipByteSize":11484},{"version":"1.0.13","createdAt":"2026-09-10T11:59:34.705Z","changelog":"Stream helper request bodies through curl stdin","fileCount":5,"zipByteSize":11417},{"version":"1.0.11","createdAt":"2026-09-10T11:42:40.031Z","changelog":"Scope helper routes and remove secret-shaped key examples","fileCount":5,"zipByteSize":11316},{"version":"1.0.10","createdAt":"2026-09-10T06:55:26.798Z","changelog":"Migrate publisher from tonywangcn to crawlora-org for brand consistency with the plugins","fileCount":5,"zipByteSize":10464}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17d53nb8nd03gyyfdy32rgde58e574f:music-podcast-research","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17d53nb8nd03gyyfdy32rgde58e574f:music-podcast-research` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/crawlora-org/music-podcast-research before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-music-podcast-research/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-music-podcast-research/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-music-podcast-research/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-music-podcast-research/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-music-podcast-research/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-music-podcast-research/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-12T02:45:25.691Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-music-podcast-research/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-music-podcast-research/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-music-podcast-research/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-music-podcast-research/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T18:39:53.064Z","emptyReason":null},"readme":"Skill: music-podcast-research\n\nOwner: crawlora-org\n\nSummary: Researches music, artists, playlists, and podcasts via the Crawlora API — Spotify tracks/albums/artists/playlists/profiles, Spotify Podcasts, Apple Podcasts, Discogs, and SoundCloud tracks/profiles/playlists — returning clean JSON. Use when the user wants a track/album/artist's details, a playlist or profile, podcast show/episode info and charts, a record's Discogs release/pressing data, or a SoundCloud track/user's stats.\n\nTags: latest:1.0.18\n\nVersion history:\n\nv1.0.18 | 2026-09-17T10:20:47.929Z | user\n\nSecurity hardening: generated helpers now enforce exact routes, methods, and credential-safe curl behavior.\n\nv1.0.17 | 2026-09-14T01:57:47.499Z | user\n\nSync skill instructions, references, and helper from GitHub 902f58316c643ffbcabc57fc6f15f59d27ec063d\n\nv1.0.16 | 2026-09-10T12:34:23.117Z | user\n\nValidate API keys before curl config\n\nv1.0.15 | 2026-09-10T12:16:08.128Z | user\n\nKeep API keys out of process arguments\n\nv1.0.14 | 2026-09-10T12:07:02.889Z | user\n\nReject curl local-file query syntax\n\nv1.0.13 | 2026-09-10T11:59:34.705Z | user\n\nStream helper request bodies through curl stdin\n\nv1.0.11 | 2026-09-10T11:42:40.031Z | user\n\nScope helper routes and remove secret-shaped key examples\n\nv1.0.10 | 2026-09-10T06:55:26.798Z | user\n\nMigrate publisher from tonywangcn to crawlora-org for brand consistency with the plugins\n\nv1.0.9 | 2026-09-08T04:33:44.664Z | user\n\nRefresh stale REST examples, endpoint references, and Bash helper from crawlora-skills 1.17.1.\n\nv1.0.8 | 2026-09-07T13:36:29.339Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.7 | 2026-09-07T08:18:30.886Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.6 | 2026-09-07T06:43:25.124Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.5 | 2026-08-24T07:21:45.069Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.4 | 2026-08-24T06:34:44.393Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.3 | 2026-08-24T05:15:06.345Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.2 | 2026-08-14T18:33:05.446Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.1 | 2026-08-10T18:28:22.634Z | user\n\nSet categories\n\nv1.0.0 | 2026-08-10T18:02:42.068Z | auto\n\nInitial release for music-podcast-research\n\n- Research music, artists, playlists, and podcasts using the Crawlora API.\n- Supports Spotify (tracks, albums, artists, playlists, profiles), Spotify Podcasts, Apple Podcasts, and Discogs (releases/pressings data).\n- Returns clean and normalized JSON for all lookups.\n- Includes setup instructions for Crawlora API key and usage examples.\n- Provides endpoint references and typical usage scenarios for music and podcast research.\n\nArchive index:\n\nArchive v1.0.18: 5 files, 11428 bytes\n\nFiles: reference/endpoints.md (33054b), scripts/crawlora.sh (5982b), skill-card.md (1989b), SKILL.md (5956b), _meta.json (142b)\n\nFile v1.0.18:SKILL.md\n\n---\nname: music-podcast-research\ndescription: Researches music, artists, playlists, and podcasts via the Crawlora API — Spotify tracks/albums/artists/playlists/profiles, Spotify Podcasts, Apple Podcasts, Discogs, and SoundCloud tracks/profiles/playlists — returning clean JSON. Use when the user wants a track/album/artist's details, a playlist or profile, podcast show/episode info and charts, a record's Discogs release/pressing data, or a SoundCloud track/user's stats.\n---\n\n# Music & podcast research\n\nLook up tracks, albums, artists, playlists, and podcast shows/episodes across\nSpotify, Spotify Podcasts, Apple Podcasts, Discogs, and SoundCloud as\nnormalized JSON from the Crawlora API — no scraping streaming-app pages.\n\n## When to use this skill\n\n- \"Find this track/album/artist on Spotify\" / \"what's on this playlist?\"\n- \"Look up a Spotify user's public profile/playlists.\"\n- \"What podcasts/episodes are trending?\" (Spotify Podcasts, Apple Podcasts charts)\n- \"Get details for this podcast show/episode.\"\n- \"What pressings/releases exist for this record?\" (Discogs — vinyl/collector data)\n- \"Look up this SoundCloud track/user\" / \"how many plays/likes does this\n  track have?\" / \"what has this artist uploaded to SoundCloud?\"\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\n1. **Spotify** — search first: `/spotify/search` (or the scoped\n   `/spotify/tracks/search`, `/spotify/artists/search`, `/spotify/albums/search`,\n   `/spotify/playlists/search`, `/spotify/profiles/search`) with `q`. Detail\n   endpoints (`/spotify/track`, `/spotify/album`, `/spotify/artist`,\n   `/spotify/playlist`, `/spotify/profile`) accept **either** `id` or `uri`\n   (a Spotify URI like `spotify:track:...`) — pass whichever you have.\n   `/spotify/artist/related`, `/spotify/track/recommended`, and\n   `/spotify/track/similar-albums` cover discovery.\n2. **Spotify Podcasts** — `/spotify-podcasts/search`, `/spotify-podcasts/show`\n   (by `uri`), `/spotify-podcasts/show/episodes`, `/spotify-podcasts/charts`.\n3. **Apple Podcasts** — `/apple-podcasts/search` (`term`), `/apple-podcasts/show/{id}`,\n   `/apple-podcasts/show/{id}/episodes`, `/apple-podcasts/charts` /\n   `/apple-podcasts/charts/rankings` for what's popular by country.\n4. **Discogs** — `/discogs/search` (`q`, optional `type` = release/master/\n   artist/label) to find an id, then `/discogs/release/{id}`,\n   `/discogs/master/{id}`, `/discogs/artist/{id}`, `/discogs/label/{id}`\n   for detail (+ `/releases` sub-paths for an artist's/label's catalog).\n5. **SoundCloud** — `/soundcloud/search` (`query`) to find a track, then\n   `/soundcloud/track` (`url` — a track's full `permalink_url`) for its\n   full metadata and play/like/comment/repost counts. `/soundcloud/profile`\n   (`url` — a user's profile URL) gets bio and follower/track counts;\n   `/soundcloud/user-tracks` (`url`) lists that user's own uploads;\n   `/soundcloud/playlist` (`url`) gets a playlist/album's metadata and\n   full track list.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Spotify:\nscripts/crawlora.sh /spotify/search q=\"Daft Punk\" | jq '.'\nscripts/crawlora.sh /spotify/artist id=4tZwfgrHOc3mvqYlEYSvVi | jq '.'\n\n# Podcasts:\nscripts/crawlora.sh /apple-podcasts/search term=\"Reply All\" | jq '.'\nscripts/crawlora.sh /spotify-podcasts/charts | jq '.'\n\n# Discogs:\nscripts/crawlora.sh /discogs/search q=\"Random Access Memories\" type=release | jq '.'\nscripts/crawlora.sh /discogs/release/4818226 | jq '.'\n\n# SoundCloud:\nscripts/crawlora.sh /soundcloud/search query=\"lofi hip hop\" | jq '.'\nscripts/crawlora.sh /soundcloud/track url=\"https://soundcloud.com/artist/track-name\" | jq '.'\n```\n\nUse `scripts/crawlora.sh` for all requests; it keeps the API key out of command-line arguments.\n\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for every Spotify,\nSpotify Podcasts, Apple Podcasts, Discogs, and SoundCloud endpoint this\nskill uses.\n\n## Examples\n\n- **Artist deep-dive:** `/spotify/artist` + `/spotify/artist/albums` +\n  `/spotify/artist/related` for a full discography and similar-artist map.\n- **Podcast discovery:** `/spotify-podcasts/charts` or\n  `/apple-podcasts/charts` to find what's trending, then\n  `/spotify-podcasts/show/episodes` for a show's back catalog.\n- **Collector research:** `/discogs/search` for a release, then\n  `/discogs/release/{id}` for pressing details (format, year, label,\n  condition-relevant metadata).\n- **SoundCloud artist catalog:** `/soundcloud/profile` for a user's\n  follower/track counts, then `/soundcloud/user-tracks` for their own\n  uploads with per-track play/like/comment/repost counts.\n\n## Notes & limits\n\n- **Credits / pay-on-success:** billed only on `2xx`; free tier 2,000 credits/mo.\n  Key at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- **Public data only** — public catalog/profile/chart pages.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- **Spotify detail endpoints need an `id` or `uri`** — resolve one via the\n  matching `.../search` endpoint first if you only have a name.\n- **SoundCloud detail endpoints need a full `url`** (a track/playlist/user's\n  `permalink_url`, e.g. `https://soundcloud.com/artist/track-name`) —\n  there's no numeric-id lookup, so pull the URL from `/soundcloud/search`\n  results first if you only have a name.\n- Search endpoints are paginated (`limit`/`offset` or `page`) — walk pages\n  for full coverage.\n\nFile v1.0.18:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"music-podcast-research\",\n  \"version\": \"1.0.18\",\n  \"publishedAt\": 1789640447929\n}\n\nFile v1.0.18:reference/endpoints.md\n\n# music-podcast-research — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**58 endpoints across 5 platform group(s).**\n\n## Spotify (30)\n\n### `spotify_album`\n\n- **HTTP:** `GET /spotify/album`\n- **What:** Retrieve Spotify album details. Returns normalized Spotify Web Player album metadata and tracks from private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify album ID; `limit` (integer, optional) — Track limit, clamped to 1-50; `offset` (integer, optional) — Track offset; `uri` (string, optional) — Spotify album URI or open.spotify.com album URL\n\n### `spotify_album_tracks`\n\n- **HTTP:** `GET /spotify/album/tracks`\n- **What:** Retrieve Spotify album tracks. Returns normalized Spotify Web Player album tracks from private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify album ID; `limit` (integer, optional) — Track limit, clamped to 1-50; `offset` (integer, optional) — Track offset; `uri` (string, optional) — Spotify album URI or open.spotify.com album URL\n\n### `spotify_albums_search`\n\n- **HTTP:** `GET /spotify/albums/search`\n- **What:** Search Spotify albums. Returns normalized Spotify Web Player album search results for a search term. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `include_album_pre_releases` (boolean, optional) — Include album pre-release results; `include_audiobooks` (boolean, optional) — Include audiobook context where available; `include_authors` (boolean, optional) — Include authors; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `include_pre_releases` (boolean, optional) — Include pre-release results; `limit` (integer, optional) — Album result limit, clamped to 1-50; `number_of_top_results` (integer, optional) — Top result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_artist`\n\n- **HTTP:** `GET /spotify/artist`\n- **What:** Retrieve Spotify artist details. Returns normalized Spotify Web Player artist overview data from private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify artist ID; `uri` (string, optional) — Spotify artist URI or open.spotify.com artist URL\n\n### `spotify_artist_albums`\n\n- **HTTP:** `GET /spotify/artist/albums`\n- **What:** Retrieve Spotify artist albums. Returns artist discography items from Spotify Web Player private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify artist ID; `limit` (integer, optional) — Limit, clamped to 1-50; `offset` (integer, optional) — Offset; `order` (string, optional) — date_desc, date_asc, name_asc, or name_desc; `type` (string, optional) — album, single, compilation, appears_on, or all; `uri` (string, optional) — Spotify artist URI or open.spotify.com artist URL\n\n### `spotify_artist_playlists`\n\n- **HTTP:** `GET /spotify/artist/playlists`\n- **What:** Retrieve Spotify artist playlists. Returns artist playlists from Spotify Web Player private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify artist ID; `uri` (string, optional) — Spotify artist URI or open.spotify.com artist URL\n\n### `spotify_artist_related`\n\n- **HTTP:** `GET /spotify/artist/related`\n- **What:** Retrieve Spotify related artists. Returns related artists from Spotify Web Player private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify artist ID; `uri` (string, optional) — Spotify artist URI or open.spotify.com artist URL\n\n### `spotify_artists_search`\n\n- **HTTP:** `GET /spotify/artists/search`\n- **What:** Search Spotify artists. Returns normalized Spotify Web Player artist search results for a search term.\n- **Params:** `limit` (integer, optional) — Result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_audiobook`\n\n- **HTTP:** `GET /spotify/audiobook`\n- **What:** Retrieve Spotify audiobook details. Returns Spotify Web Player audiobook metadata from private Pathfinder responses. Spotify exposes audiobooks through show URIs.\n- **Params:** `id` (string, optional) — Spotify show ID; `uri` (string, optional) — Spotify audiobook/show URI or open.spotify.com show URL\n\n### `spotify_audiobook_chapters`\n\n- **HTTP:** `GET /spotify/audiobook/chapters`\n- **What:** Retrieve Spotify audiobook chapters. Returns audiobook chapters from Spotify Web Player private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify show ID; `limit` (integer, optional) — Chapter limit, clamped to 1-50; `offset` (integer, optional) — Chapter offset; `uri` (string, optional) — Spotify audiobook/show URI or open.spotify.com show URL\n\n### `spotify_audiobooks_search`\n\n- **HTTP:** `GET /spotify/audiobooks/search`\n- **What:** Search Spotify audiobooks. Returns normalized Spotify Web Player audiobook search results for a search term. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `include_album_pre_releases` (boolean, optional) — Include album pre-release results; `include_audiobooks` (boolean, optional) — Include audiobook results; `include_authors` (boolean, optional) — Include authors; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `include_pre_releases` (boolean, optional) — Include pre-release results; `limit` (integer, optional) — Audiobook result limit, clamped to 1-50; `number_of_top_results` (integer, optional) — Top result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_chapter`\n\n- **HTTP:** `GET /spotify/chapter`\n- **What:** Retrieve Spotify audiobook chapter details. Returns a Spotify chapter from the same private Pathfinder operation used for episodes and chapters.\n- **Params:** `id` (string, optional) — Spotify chapter/episode ID; `uri` (string, optional) — Spotify chapter or episode URI/URL\n\n### `spotify_episodes_search`\n\n- **HTTP:** `GET /spotify/episodes/search`\n- **What:** Search Spotify episodes. Returns normalized Spotify Web Player episode search results for a search term.\n- **Params:** `limit` (integer, optional) — Result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_featured_charts_by_country`\n\n- **HTTP:** `GET /spotify/featured-charts-by-country`\n- **What:** Retrieve Spotify featured charts by country. Returns normalized Spotify country hub content from Spotify's countryHubContent Pathfinder response. Defaults to the CHARTS content shelf for the requested country.\n- **Params:** `content_id` (string, optional) — Country hub content ID. Allowed: CHARTS, POPULAR_ALBUMS, POPULAR_ARTISTS, TRENDING_SONGS; `country_code` (string, optional) — Two-letter Spotify popular-in country code\n\n### `spotify_genre`\n\n- **HTTP:** `GET /spotify/genre`\n- **What:** Retrieve Spotify genre page. Returns normalized sections and items from Spotify's browsePage Pathfinder response for a Spotify genre or page URI.\n- **Params:** `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `page_limit` (integer, optional) — Page pagination limit, clamped to 1-50; `page_offset` (integer, optional) — Page pagination offset; `section_limit` (integer, optional) — Section pagination limit, clamped to 1-50; `section_offset` (integer, optional) — Section pagination offset; `uri` (string, optional) — Spotify genre or page URI\n\n### `spotify_home`\n\n- **HTTP:** `GET /spotify/home`\n- **What:** Retrieve Spotify home sections. Returns normalized shelves and items from Spotify's Web Player home Pathfinder response. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `facet` (string, optional) — Optional Spotify home facet; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `section_items_limit` (integer, optional) — Per-section item limit, clamped to 1-50; `sp_t` (string, optional) — Optional Spotify session token. A random UUID is generated when omitted; `time_zone` (string, optional) — IANA time zone used by Spotify home personalization\n\n### `spotify_playlist`\n\n- **HTTP:** `GET /spotify/playlist`\n- **What:** Retrieve Spotify playlist details. Returns normalized Spotify Web Player playlist metadata and items from Spotify's fetchPlaylist Pathfinder response. Provide either uri or id; defaults to a known public playlist when omitted.\n- **Params:** `enable_watch_feed_entrypoint` (boolean, optional) — Enable watch feed entrypoint; `id` (string, optional) — Spotify playlist ID. Used when uri is omitted; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `limit` (integer, optional) — Playlist item limit, clamped to 1-50; `offset` (integer, optional) — Playlist item offset; `uri` (string, optional) — Spotify playlist URI or open.spotify.com playlist URL\n\n### `spotify_playlists_search`\n\n- **HTTP:** `GET /spotify/playlists/search`\n- **What:** Search Spotify playlists. Returns normalized Spotify Web Player playlist search results for a search term. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `include_album_pre_releases` (boolean, optional) — Include album pre-release results; `include_audiobooks` (boolean, optional) — Include audiobook context where available; `include_authors` (boolean, optional) — Include authors; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `include_pre_releases` (boolean, optional) — Include pre-release results; `limit` (integer, optional) — Playlist result limit, clamped to 1-50; `number_of_top_results` (integer, optional) — Top result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_popular_by_country`\n\n- **HTTP:** `GET /spotify/popular-by-country`\n- **What:** Retrieve Spotify popular by country. Returns normalized Spotify country hub shelves from Spotify's countryHubsPage Pathfinder response. The country_code parameter accepts Spotify popular-in country codes from open.spotify.com/popular-in/us.\n- **Params:** `country_code` (string, optional) — Two-letter Spotify popular-in country code\n\n### `spotify_profile`\n\n- **HTTP:** `GET /spotify/profile`\n- **What:** Retrieve Spotify public profile. Returns normalized public profile metadata and preview playlists from Spotify's Web Player user-profile service. Provide username, uri, or url; defaults to Spotify's official profile.\n- **Params:** `artist_limit` (integer, optional) — Recently played artist limit, clamped to 0-50; `episode_limit` (integer, optional) — Embedded episode limit, clamped to 0-50; `playlist_limit` (integer, optional) — Embedded public playlist limit, clamped to 0-50; `uri` (string, optional) — Spotify user URI; `url` (string, optional) — open.spotify.com user URL; `username` (string, optional) — Spotify username\n\n### `spotify_profile_followers`\n\n- **HTTP:** `GET /spotify/profile/followers`\n- **What:** Retrieve Spotify public profile followers. Returns normalized public follower profiles from Spotify's Web Player user-profile service. Spotify exposes this as a public anonymous response for some profiles; private or restricted profiles may return an upstream error.\n- **Params:** `limit` (integer, optional) — Follower limit, clamped to 1-200; `offset` (integer, optional) — Follower offset applied locally; `uri` (string, optional) — Spotify user URI; `url` (string, optional) — open.spotify.com user URL; `username` (string, optional) — Spotify username\n\n### `spotify_profile_playlists`\n\n- **HTTP:** `GET /spotify/profile/playlists`\n- **What:** Retrieve Spotify public profile playlists. Returns normalized public playlists from Spotify's Web Player user-profile service. Provide username, uri, or url; defaults to Spotify's official profile.\n- **Params:** `limit` (integer, optional) — Playlist limit, clamped to 1-50; `offset` (integer, optional) — Playlist offset; `uri` (string, optional) — Spotify user URI; `url` (string, optional) — open.spotify.com user URL; `username` (string, optional) — Spotify username\n\n### `spotify_profiles_search`\n\n- **HTTP:** `GET /spotify/profiles/search`\n- **What:** Search Spotify profiles. Returns normalized Spotify Web Player profile search results for a search term. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `include_album_pre_releases` (boolean, optional) — Include album pre-release results; `include_audiobooks` (boolean, optional) — Include audiobook context where available; `include_authors` (boolean, optional) — Include authors; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `include_pre_releases` (boolean, optional) — Include pre-release results; `limit` (integer, optional) — Profile result limit, clamped to 1-50; `number_of_top_results` (integer, optional) — Top result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_search`\n\n- **HTTP:** `GET /spotify/search`\n- **What:** Search Spotify catalog. Returns normalized Spotify Web Player catalog search results across tracks, artists, albums, playlists, shows, episodes, audiobooks, and top results. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `include_album_pre_releases` (boolean, optional) — Include album pre-release results; `include_artist_has_concerts_field` (boolean, optional) — Include artist concert availability fields; `include_audiobooks` (boolean, optional) — Include audiobook results; `include_authors` (boolean, optional) — Include authors; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `include_pre_releases` (boolean, optional) — Include pre-release results; `is_prefix` (boolean, optional) — Treat the search term as a prefix; `limit` (integer, optional) — Result limit per section, clamped to 1-50; `number_of_top_results` (integer, optional) — Top result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_section`\n\n- **HTTP:** `GET /spotify/section`\n- **What:** Retrieve Spotify browse section. Returns normalized items from Spotify's browseSection Pathfinder response for a Spotify section URI.\n- **Params:** `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `limit` (integer, optional) — Section item limit, clamped to 1-50; `offset` (integer, optional) — Section item offset; `uri` (string, optional) — Spotify section URI\n\n### `spotify_shows_search`\n\n- **HTTP:** `GET /spotify/shows/search`\n- **What:** Search Spotify shows. Returns normalized Spotify Web Player show search results for a search term.\n- **Params:** `limit` (integer, optional) — Result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_track`\n\n- **HTTP:** `GET /spotify/track`\n- **What:** Retrieve Spotify track details. Returns normalized Spotify Web Player track metadata from Spotify's getTrack Pathfinder response. Provide either uri or id; defaults to a known public track when omitted.\n- **Params:** `id` (string, optional) — Spotify track ID. Used when uri is omitted; `uri` (string, optional) — Spotify track URI or open.spotify.com track URL\n\n### `spotify_track_recommended`\n\n- **HTTP:** `GET /spotify/track/recommended`\n- **What:** Retrieve Spotify recommended tracks. Returns normalized recommended Spotify entities from the internalLinkRecommenderTrack Pathfinder response.\n- **Params:** `id` (string, optional) — Spotify track ID. Used when uri is omitted; `limit` (integer, optional) — Recommendation limit, clamped to 1-50; `uri` (string, optional) — Spotify track URI or open.spotify.com track URL\n\n### `spotify_track_similar_albums`\n\n- **HTTP:** `GET /spotify/track/similar-albums`\n- **What:** Retrieve Spotify track similar albums. Returns normalized albums from the similarAlbumsBasedOnThisTrack Pathfinder response.\n- **Params:** `albums_only` (boolean, optional) — Request albums-only recommendations; `id` (string, optional) — Spotify track ID. Used when uri is omitted; `limit` (integer, optional) — Album limit, clamped to 1-50; `uri` (string, optional) — Spotify track URI or open.spotify.com track URL\n\n### `spotify_tracks_search`\n\n- **HTTP:** `GET /spotify/tracks/search`\n- **What:** Search Spotify tracks. Returns normalized Spotify Web Player track search results for a search term. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `include_album_pre_releases` (boolean, optional) — Include album pre-release results; `include_audiobooks` (boolean, optional) — Include audiobook context where available; `include_authors` (boolean, optional) — Include authors; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `include_pre_releases` (boolean, optional) — Include pre-release results; `limit` (integer, optional) — Track result limit, clamped to 1-50; `number_of_top_results` (integer, optional) — Top result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n## SpotifyPodcasts (8)\n\n### `spotify_podcasts_categories`\n\n- **HTTP:** `GET /spotify-podcasts/categories`\n- **What:** Retrieve Spotify Podcasts categories. Returns normalized Spotify podcast category sections and items from Spotify's all-categories browsePage Pathfinder response.\n- **Params:** `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `page_limit` (integer, optional) — Page pagination limit, clamped to 1-50; `page_offset` (integer, optional) — Page pagination offset; `section_limit` (integer, optional) — Section pagination limit, clamped to 1-50; `section_offset` (integer, optional) — Section pagination offset; `uri` (string, optional) — Spotify podcast categories page URI\n\n### `spotify_podcasts_charts`\n\n- **HTTP:** `GET /spotify-podcasts/charts`\n- **What:** Retrieve Spotify podcast charts. Returns normalized Spotify podcast chart rankings from podcastcharts.byspotify.com. The chart and region parameters are validated against Spotify's supported podcast chart slugs and countries. Category charts are available only in au, br, de, gb, mx, se, and us.\n- **Params:** `chart` (string, optional) — Chart slug. Allowed: top-podcasts, top-episodes, trending, arts, business, comedy, education, fiction, health-fitness, history, leisure, music, news, religion-spirituality, science, society-culture, sports, technology, true-crime, tv-film; `limit` (integer, optional) — Result limit, clamped to 1-100; `region` (string, optional) — Two-letter region code. Allowed: ar, au, at, br, ca, cl, co, dk, fi, fr, de, in, id, ie, it, jp, mx, nz, no, ph, pl, es, se, nl, gb, us\n\n### `spotify_podcasts_episode`\n\n- **HTTP:** `GET /spotify-podcasts/episode`\n- **What:** Retrieve Spotify podcast episode details. Returns normalized public episode metadata from Spotify's getEpisodeOrChapter Pathfinder response, with episode page, embed page, and anonymous oEmbed fallbacks when Pathfinder is unavailable. Provide either uri or id; defaults to a known public episode when omitted.\n- **Params:** `id` (string, optional) — Spotify episode ID. Used when uri is omitted; `uri` (string, optional) — Spotify episode URI or open.spotify.com episode URL\n\n### `spotify_podcasts_home`\n\n- **HTTP:** `GET /spotify-podcasts/home`\n- **What:** Retrieve Spotify Podcasts home. Returns normalized sections and items from Spotify's podcast home browsePage Pathfinder response.\n- **Params:** `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `page_limit` (integer, optional) — Page pagination limit, clamped to 1-50; `page_offset` (integer, optional) — Page pagination offset; `section_limit` (integer, optional) — Section pagination limit, clamped to 1-50; `section_offset` (integer, optional) — Section pagination offset; `uri` (string, optional) — Spotify page or genre URI\n\n### `spotify_podcasts_search`\n\n- **HTTP:** `GET /spotify-podcasts/search`\n- **What:** Search Spotify Podcasts. Returns normalized Spotify podcast shows, episodes, and top results for a search term.\n- **Params:** `include_album_pre_releases` (boolean, optional) — Include album pre-release results; `include_audiobooks` (boolean, optional) — Include audiobooks; `include_authors` (boolean, optional) — Include authors; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `include_pre_releases` (boolean, optional) — Include pre-release results; `limit` (integer, optional) — Result limit, clamped to 1-50; `number_of_top_results` (integer, optional) — Top result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Podcast search term\n\n### `spotify_podcasts_show`\n\n- **HTTP:** `GET /spotify-podcasts/show`\n- **What:** Retrieve Spotify podcast show metadata. Returns normalized podcast show metadata from Spotify Pathfinder.\n- **Params:** `include_content_capability_trait` (boolean, optional) — Include content capability trait; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `uri` (string, optional) — Spotify show URI\n\n### `spotify_podcasts_show_episodes`\n\n- **HTTP:** `GET /spotify-podcasts/show/episodes`\n- **What:** Retrieve Spotify podcast show episodes. Returns normalized podcast episodes for a Spotify show URI.\n- **Params:** `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `limit` (integer, optional) — Episode limit, clamped to 1-50; `offset` (integer, optional) — Episode offset; `uri` (string, optional) — Spotify show URI\n\n### `spotify_podcasts_show_recommendations`\n\n- **HTTP:** `GET /spotify-podcasts/show/recommendations`\n- **What:** Retrieve Spotify podcast recommendations. Returns normalized related Spotify shows and episodes from Spotify's show recommendations response.\n- **Params:** `uri` (string, optional) — Spotify show URI\n\n## ApplePodcasts (8)\n\n### `apple_podcasts_charts`\n\n- **HTTP:** `GET /apple-podcasts/charts`\n- **What:** Retrieve Apple Podcasts chart rankings. Returns Apple Podcasts show chart rankings from public iTunes RSS JSON feeds. Supported collections are `toppodcasts` and `topaudiopodcasts`.\n- **Params:** `category` (integer, optional) — Numeric Apple podcast genre ID; `collection` (string, optional) — Chart collection; `country` (string, optional) — Two-letter storefront country code; `limit` (integer, optional) — Number of chart items to return\n\n### `apple_podcasts_charts_rankings`\n\n- **HTTP:** `GET /apple-podcasts/charts/rankings`\n- **What:** Retrieve Apple Podcasts chart rankings by algorithm, type, and genre. Returns Apple Podcasts chart rankings from the modern podcasts.apple.com charts page, covering chart algorithms (`top`, `top-subscriber`, `top-series`) crossed with entity types (`podcasts`, `podcast-episodes`, `podcast-channels`) and an optional genre filter. A richer, differently-sourced capability than the legacy RSS-based `/apple-podcasts/charts` endpoint.\n- **Params:** `chart` (string, optional) — Chart algorithm. Allowed values: `top`, `top-subscriber`, `top-series`. Default `top`.; `country` (string, optional) — Two-letter storefront country code; `genre` (integer, optional) — Optional Apple Podcasts genre ID to filter the chart, e.g. 1303 for Comedy; `limit` (integer, optional) — Number of chart entries to return, default 24, max 200; `type` (string, optional) — Entity type. Allowed values: `podcasts`, `podcast-episodes`, `podcast-channels`. Default `podcasts`.\n\n### `apple_podcasts_episodes_search`\n\n- **HTTP:** `GET /apple-podcasts/episodes/search`\n- **What:** Search Apple Podcasts episodes. Returns normalized Apple Podcasts episodes from Apple's public iTunes Search API.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Number of episodes per page; `page` (integer, optional) — Search page number (1-based); `term` (string, **required**) — Search term\n\n### `apple_podcasts_new`\n\n- **HTTP:** `GET /apple-podcasts/new`\n- **What:** Retrieve Apple Podcasts curated \"New\" editorial shelves. Returns the curated editorial shelves from podcasts.apple.com/{country}/new (New Shows, New Seasons, New Trailers, Essentials, and other seasonal spotlights). Shelves that merely mirror a Charts Rankings query are omitted here since `/apple-podcasts/charts/rankings` already covers that data.\n- **Params:** `country` (string, optional) — Two-letter storefront country code\n\n### `apple_podcasts_search`\n\n- **HTTP:** `GET /apple-podcasts/search`\n- **What:** Search Apple Podcasts shows. Returns normalized Apple Podcasts shows from Apple's public iTunes Search API.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Number of shows per page; `page` (integer, optional) — Search page number (1-based); `term` (string, **required**) — Search term\n\n### `apple_podcasts_show`\n\n- **HTTP:** `GET /apple-podcasts/show/{id}`\n- **What:** Retrieve Apple Podcasts show details. Returns normalized show metadata from Apple's public iTunes Lookup API.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Podcasts show ID; `lang` (string, optional) — Result language tag\n\n### `apple_podcasts_show_episodes`\n\n- **HTTP:** `GET /apple-podcasts/show/{id}/episodes`\n- **What:** Retrieve Apple Podcasts show episodes. Returns a show and its public Apple Podcasts episodes from Apple's iTunes Lookup API.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Podcasts show ID; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Number of episodes to return\n\n### `apple_podcasts_show_related`\n\n- **HTTP:** `GET /apple-podcasts/show/{id}/related`\n- **What:** Retrieve Apple Podcasts \"You Might Also Like\" related shows. Returns the \"You Might Also Like\" rail for a single show, sourced from the modern podcasts.apple.com show page's listener-cohort recommendation data.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Podcasts show ID; `limit` (integer, optional) — Number of related shows to return, default 20, max 50\n\n## Discogs (7)\n\n### `discogs_artist`\n\n- **HTTP:** `GET /discogs/artist/{id}`\n- **What:** Get a Discogs artist profile. Returns a normalized Discogs artist profile: real name, bio, links, name variations, aliases, and group memberships. Credential-free official Discogs database data.\n- **Params:** `id` (string, **required**) — Discogs artist id\n\n### `discogs_artist_releases`\n\n- **HTTP:** `GET /discogs/artist/{id}/releases`\n- **What:** List a Discogs artist's releases. Returns an artist's paginated release/master credits (role, format, label, year, want/collection counts). Credential-free official Discogs database data.\n- **Params:** `id` (string, **required**) — Discogs artist id; `page` (integer, optional) — 1-based page number, default 1; `per_page` (integer, optional) — Results per page, default 50, max 100\n\n### `discogs_label`\n\n- **HTTP:** `GET /discogs/label/{id}`\n- **What:** Get a Discogs label profile. Returns a normalized Discogs label profile: profile text, contact info, parent label, and sub-labels. Credential-free official Discogs database data.\n- **Params:** `id` (string, **required**) — Discogs label id\n\n### `discogs_label_releases`\n\n- **HTTP:** `GET /discogs/label/{id}/releases`\n- **What:** List a Discogs label's releases. Returns a label's paginated release catalog (title, artist, format, catalog number, year). Credential-free official Discogs database data.\n- **Params:** `id` (string, **required**) — Discogs label id; `page` (integer, optional) — 1-based page number, default 1; `per_page` (integer, optional) — Results per page, default 50, max 100\n\n### `discogs_master`\n\n- **HTTP:** `GET /discogs/master/{id}`\n- **What:** Get a Discogs master release. Returns a normalized Discogs master release: the version-agnostic grouping of a release across pressings/reissues (artists, tracklist, genres/styles, videos, images, marketplace stats). Credential-free official Discogs database data.\n- **Params:** `id` (string, **required**) — Discogs master release id\n\n### `discogs_release`\n\n- **HTTP:** `GET /discogs/release/{id}`\n- **What:** Get a Discogs release. Returns a normalized Discogs release: artists, labels, formats, tracklist, credits, identifiers, videos, images, and community want/have/rating. Credential-free official Discogs database data (api.discogs.com).\n- **Params:** `id` (string, **required**) — Discogs release id\n\n### `discogs_search`\n\n- **HTTP:** `GET /discogs/search`\n- **What:** Search the Discogs database. Searches Discogs releases, masters, artists, and labels. Credential-free official Discogs database data.\n- **Params:** `page` (integer, optional) — 1-based page number, default 1; `per_page` (integer, optional) — Results per page, default 50, max 100; `q` (string, **required**) — Search query; `type` (string, optional) — Result type filter\n\n## SoundCloud (5)\n\n### `soundcloud_playlist`\n\n- **HTTP:** `GET /soundcloud/playlist`\n- **What:** Get a SoundCloud playlist or album's detail. Returns one playlist or album's metadata plus its full track list: owner, likes/reposts counts, and every track's title, artwork, and playback/likes counts. Public data sourced from SoundCloud's own JSON API.\n- **Params:** `url` (string, **required**) — Full soundcloud.com playlist/album URL (a playlist's permalink_url)\n\n### `soundcloud_profile`\n\n- **HTTP:** `GET /soundcloud/profile`\n- **What:** Get a SoundCloud user/artist profile. Returns one user/artist's profile: bio, avatar, followers/followings/track/playlist/likes counts, and verified status. Public data sourced from SoundCloud's own JSON API.\n- **Params:** `url` (string, **required**) — Full soundcloud.com user/artist profile URL\n\n### `soundcloud_search`\n\n- **HTTP:** `GET /soundcloud/search`\n- **What:** Search SoundCloud tracks. Returns tracks matching a query: title, artwork, playback/likes/comment/repost counts, and uploader. Public data sourced from SoundCloud's own JSON API.\n- **Params:** `limit` (integer, optional) — Number of tracks to return (default 20, max 50); `query` (string, **required**) — Search text\n\n### `soundcloud_track`\n\n- **HTTP:** `GET /soundcloud/track`\n- **What:** Get a SoundCloud track's detail. Returns one track's full metadata: title, artwork, description, genre, tags, playback/likes/comment/repost counts, and uploader. Public data sourced from SoundCloud's own JSON API.\n- **Params:** `url` (string, **required**) — Full soundcloud.com track URL (a track's permalink_url)\n\n### `soundcloud_user_tracks`\n\n- **HTTP:** `GET /soundcloud/user-tracks`\n- **What:** Get a SoundCloud user's own uploaded tracks. Returns a user/artist's own uploaded tracks, most recent first: title, artwork, playback/likes/comment/repost counts. Public data sourced from SoundCloud's own JSON API.\n- **Params:** `limit` (integer, optional) — Number of tracks to return (default 20, max 50); `url` (string, **required**) — Full soundcloud.com user/artist profile URL\n\nFile v1.0.18:skill-card.md\n\n## Description:\n\nResearches music, artists, playlists, and podcasts through the Crawlora API for Spotify, Spotify Podcasts, Apple Podcasts, Discogs, and SoundCloud, returning normalized JSON for catalog, profile, chart, episode, release, and track lookups.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[crawlora-org](https://clawhub.ai/user/crawlora-org)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and developers use this skill to look up public music, podcast, playlist, profile, chart, SoundCloud, and Discogs release data through Crawlora and receive normalized JSON suitable for agent responses or follow-up analysis.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Lookup terms and public profile URLs are sent to Crawlora's external API.\n\nMitigation: Use the skill only for public music, podcast, Discogs, Spotify, and SoundCloud lookups, and avoid sensitive or private profile information.\n\nRisk: The skill requires a Crawlora API key.\n\nMitigation: Keep CRAWLORA_API_KEY in the environment and do not hardcode, query-string, or commit it.\n\n## Reference(s):\n\n- [Endpoint reference](reference/endpoints.md)\n- [ClawHub skill page](https://clawhub.ai/crawlora-org/skills/music-podcast-research)\n- [Crawlora](https://crawlora.net)\n\n## Skill Output:\n\n**Output Type(s):** [JSON, Shell commands, Configuration, Guidance]\n\n**Output Format:** [JSON responses with Markdown guidance and inline shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Uses a Crawlora API key from CRAWLORA_API_KEY and is limited to documented read-only GET routes.]\n\n## Skill Version(s):\n\n1.0.18 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.17: 5 files, 12101 bytes\n\nFiles: reference/endpoints.md (33054b), scripts/crawlora.sh (6895b), skill-card.md (2496b), SKILL.md (5956b), _meta.json (142b)\n\nFile v1.0.17:SKILL.md\n\n---\nname: music-podcast-research\ndescription: Researches music, artists, playlists, and podcasts via the Crawlora API — Spotify tracks/albums/artists/playlists/profiles, Spotify Podcasts, Apple Podcasts, Discogs, and SoundCloud tracks/profiles/playlists — returning clean JSON. Use when the user wants a track/album/artist's details, a playlist or profile, podcast show/episode info and charts, a record's Discogs release/pressing data, or a SoundCloud track/user's stats.\n---\n\n# Music & podcast research\n\nLook up tracks, albums, artists, playlists, and podcast shows/episodes across\nSpotify, Spotify Podcasts, Apple Podcasts, Discogs, and SoundCloud as\nnormalized JSON from the Crawlora API — no scraping streaming-app pages.\n\n## When to use this skill\n\n- \"Find this track/album/artist on Spotify\" / \"what's on this playlist?\"\n- \"Look up a Spotify user's public profile/playlists.\"\n- \"What podcasts/episodes are trending?\" (Spotify Podcasts, Apple Podcasts charts)\n- \"Get details for this podcast show/episode.\"\n- \"What pressings/releases exist for this record?\" (Discogs — vinyl/collector data)\n- \"Look up this SoundCloud track/user\" / \"how many plays/likes does this\n  track have?\" / \"what has this artist uploaded to SoundCloud?\"\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\n1. **Spotify** — search first: `/spotify/search` (or the scoped\n   `/spotify/tracks/search`, `/spotify/artists/search`, `/spotify/albums/search`,\n   `/spotify/playlists/search`, `/spotify/profiles/search`) with `q`. Detail\n   endpoints (`/spotify/track`, `/spotify/album`, `/spotify/artist`,\n   `/spotify/playlist`, `/spotify/profile`) accept **either** `id` or `uri`\n   (a Spotify URI like `spotify:track:...`) — pass whichever you have.\n   `/spotify/artist/related`, `/spotify/track/recommended`, and\n   `/spotify/track/similar-albums` cover discovery.\n2. **Spotify Podcasts** — `/spotify-podcasts/search`, `/spotify-podcasts/show`\n   (by `uri`), `/spotify-podcasts/show/episodes`, `/spotify-podcasts/charts`.\n3. **Apple Podcasts** — `/apple-podcasts/search` (`term`), `/apple-podcasts/show/{id}`,\n   `/apple-podcasts/show/{id}/episodes`, `/apple-podcasts/charts` /\n   `/apple-podcasts/charts/rankings` for what's popular by country.\n4. **Discogs** — `/discogs/search` (`q`, optional `type` = release/master/\n   artist/label) to find an id, then `/discogs/release/{id}`,\n   `/discogs/master/{id}`, `/discogs/artist/{id}`, `/discogs/label/{id}`\n   for detail (+ `/releases` sub-paths for an artist's/label's catalog).\n5. **SoundCloud** — `/soundcloud/search` (`query`) to find a track, then\n   `/soundcloud/track` (`url` — a track's full `permalink_url`) for its\n   full metadata and play/like/comment/repost counts. `/soundcloud/profile`\n   (`url` — a user's profile URL) gets bio and follower/track counts;\n   `/soundcloud/user-tracks` (`url`) lists that user's own uploads;\n   `/soundcloud/playlist` (`url`) gets a playlist/album's metadata and\n   full track list.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Spotify:\nscripts/crawlora.sh /spotify/search q=\"Daft Punk\" | jq '.'\nscripts/crawlora.sh /spotify/artist id=4tZwfgrHOc3mvqYlEYSvVi | jq '.'\n\n# Podcasts:\nscripts/crawlora.sh /apple-podcasts/search term=\"Reply All\" | jq '.'\nscripts/crawlora.sh /spotify-podcasts/charts | jq '.'\n\n# Discogs:\nscripts/crawlora.sh /discogs/search q=\"Random Access Memories\" type=release | jq '.'\nscripts/crawlora.sh /discogs/release/4818226 | jq '.'\n\n# SoundCloud:\nscripts/crawlora.sh /soundcloud/search query=\"lofi hip hop\" | jq '.'\nscripts/crawlora.sh /soundcloud/track url=\"https://soundcloud.com/artist/track-name\" | jq '.'\n```\n\nUse `scripts/crawlora.sh` for all requests; it keeps the API key out of command-line arguments.\n\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for every Spotify,\nSpotify Podcasts, Apple Podcasts, Discogs, and SoundCloud endpoint this\nskill uses.\n\n## Examples\n\n- **Artist deep-dive:** `/spotify/artist` + `/spotify/artist/albums` +\n  `/spotify/artist/related` for a full discography and similar-artist map.\n- **Podcast discovery:** `/spotify-podcasts/charts` or\n  `/apple-podcasts/charts` to find what's trending, then\n  `/spotify-podcasts/show/episodes` for a show's back catalog.\n- **Collector research:** `/discogs/search` for a release, then\n  `/discogs/release/{id}` for pressing details (format, year, label,\n  condition-relevant metadata).\n- **SoundCloud artist catalog:** `/soundcloud/profile` for a user's\n  follower/track counts, then `/soundcloud/user-tracks` for their own\n  uploads with per-track play/like/comment/repost counts.\n\n## Notes & limits\n\n- **Credits / pay-on-success:** billed only on `2xx`; free tier 2,000 credits/mo.\n  Key at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- **Public data only** — public catalog/profile/chart pages.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- **Spotify detail endpoints need an `id` or `uri`** — resolve one via the\n  matching `.../search` endpoint first if you only have a name.\n- **SoundCloud detail endpoints need a full `url`** (a track/playlist/user's\n  `permalink_url`, e.g. `https://soundcloud.com/artist/track-name`) —\n  there's no numeric-id lookup, so pull the URL from `/soundcloud/search`\n  results first if you only have a name.\n- Search endpoints are paginated (`limit`/`offset` or `page`) — walk pages\n  for full coverage.\n\nFile v1.0.17:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"music-podcast-research\",\n  \"version\": \"1.0.17\",\n  \"publishedAt\": 1789351067499\n}\n\nFile v1.0.17:reference/endpoints.md\n\n# music-podcast-research — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**58 endpoints across 5 platform group(s).**\n\n## Spotify (30)\n\n### `spotify_album`\n\n- **HTTP:** `GET /spotify/album`\n- **What:** Retrieve Spotify album details. Returns normalized Spotify Web Player album metadata and tracks from private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify album ID; `limit` (integer, optional) — Track limit, clamped to 1-50; `offset` (integer, optional) — Track offset; `uri` (string, optional) — Spotify album URI or open.spotify.com album URL\n\n### `spotify_album_tracks`\n\n- **HTTP:** `GET /spotify/album/tracks`\n- **What:** Retrieve Spotify album tracks. Returns normalized Spotify Web Player album tracks from private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify album ID; `limit` (integer, optional) — Track limit, clamped to 1-50; `offset` (integer, optional) — Track offset; `uri` (string, optional) — Spotify album URI or open.spotify.com album URL\n\n### `spotify_albums_search`\n\n- **HTTP:** `GET /spotify/albums/search`\n- **What:** Search Spotify albums. Returns normalized Spotify Web Player album search results for a search term. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `include_album_pre_releases` (boolean, optional) — Include album pre-release results; `include_audiobooks` (boolean, optional) — Include audiobook context where available; `include_authors` (boolean, optional) — Include authors; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `include_pre_releases` (boolean, optional) — Include pre-release results; `limit` (integer, optional) — Album result limit, clamped to 1-50; `number_of_top_results` (integer, optional) — Top result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_artist`\n\n- **HTTP:** `GET /spotify/artist`\n- **What:** Retrieve Spotify artist details. Returns normalized Spotify Web Player artist overview data from private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify artist ID; `uri` (string, optional) — Spotify artist URI or open.spotify.com artist URL\n\n### `spotify_artist_albums`\n\n- **HTTP:** `GET /spotify/artist/albums`\n- **What:** Retrieve Spotify artist albums. Returns artist discography items from Spotify Web Player private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify artist ID; `limit` (integer, optional) — Limit, clamped to 1-50; `offset` (integer, optional) — Offset; `order` (string, optional) — date_desc, date_asc, name_asc, or name_desc; `type` (string, optional) — album, single, compilation, appears_on, or all; `uri` (string, optional) — Spotify artist URI or open.spotify.com artist URL\n\n### `spotify_artist_playlists`\n\n- **HTTP:** `GET /spotify/artist/playlists`\n- **What:** Retrieve Spotify artist playlists. Returns artist playlists from Spotify Web Player private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify artist ID; `uri` (string, optional) — Spotify artist URI or open.spotify.com artist URL\n\n### `spotify_artist_related`\n\n- **HTTP:** `GET /spotify/artist/related`\n- **What:** Retrieve Spotify related artists. Returns related artists from Spotify Web Player private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify artist ID; `uri` (string, optional) — Spotify artist URI or open.spotify.com artist URL\n\n### `spotify_artists_search`\n\n- **HTTP:** `GET /spotify/artists/search`\n- **What:** Search Spotify artists. Returns normalized Spotify Web Player artist search results for a search term.\n- **Params:** `limit` (integer, optional) — Result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_audiobook`\n\n- **HTTP:** `GET /spotify/audiobook`\n- **What:** Retrieve Spotify audiobook details. Returns Spotify Web Player audiobook metadata from private Pathfinder responses. Spotify exposes audiobooks through show URIs.\n- **Params:** `id` (string, optional) — Spotify show ID; `uri` (string, optional) — Spotify audiobook/show URI or open.spotify.com show URL\n\n### `spotify_audiobook_chapters`\n\n- **HTTP:** `GET /spotify/audiobook/chapters`\n- **What:** Retrieve Spotify audiobook chapters. Returns audiobook chapters from Spotify Web Player private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify show ID; `limit` (integer, optional) — Chapter limit, clamped to 1-50; `offset` (integer, optional) — Chapter offset; `uri` (string, optional) — Spotify audiobook/show URI or open.spotify.com show URL\n\n### `spotify_audiobooks_search`\n\n- **HTTP:** `GET /spotify/audiobooks/search`\n- **What:** Search Spotify audiobooks. Returns normalized Spotify Web Player audiobook search results for a search term. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `include_album_pre_releases` (boolean, optional) — Include album pre-release results; `include_audiobooks` (boolean, optional) — Include audiobook results; `include_authors` (boolean, optional) — Include authors; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `include_pre_releases` (boolean, optional) — Include pre-release results; `limit` (integer, optional) — Audiobook result limit, clamped to 1-50; `number_of_top_results` (integer, optional) — Top result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_chapter`\n\n- **HTTP:** `GET /spotify/chapter`\n- **What:** Retrieve Spotify audiobook chapter details. Returns a Spotify chapter from the same private Pathfinder operation used for episodes and chapters.\n- **Params:** `id` (string, optional) — Spotify chapter/episode ID; `uri` (string, optional) — Spotify chapter or episode URI/URL\n\n### `spotify_episodes_search`\n\n- **HTTP:** `GET /spotify/episodes/search`\n- **What:** Search Spotify episodes. Returns normalized Spotify Web Player episode search results for a search term.\n- **Params:** `limit` (integer, optional) — Result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_featured_charts_by_country`\n\n- **HTTP:** `GET /spotify/featured-charts-by-country`\n- **What:** Retrieve Spotify featured charts by country. Returns normalized Spotify country hub content from Spotify's countryHubContent Pathfinder response. Defaults to the CHARTS content shelf for the requested country.\n- **Params:** `content_id` (string, optional) — Country hub content ID. Allowed: CHARTS, POPULAR_ALBUMS, POPULAR_ARTISTS, TRENDING_SONGS; `country_code` (string, optional) — Two-letter Spotify popular-in country code\n\n### `spotify_genre`\n\n- **HTTP:** `GET /spotify/genre`\n- **What:** Retrieve Spotify genre page. Returns normalized sections and items from Spotify's browsePage Pathfinder response for a Spotify genre or page URI.\n- **Params:** `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `page_limit` (integer, optional) — Page pagination limit, clamped to 1-50; `page_offset` (integer, optional) — Page pagination offset; `section_limit` (integer, optional) — Section pagination limit, clamped to 1-50; `section_offset` (integer, optional) — Section pagination offset; `uri` (string, optional) — Spotify genre or page URI\n\n### `spotify_home`\n\n- **HTTP:** `GET /spotify/home`\n- **What:** Retrieve Spotify home sections. Returns normalized shelves and items from Spotify's Web Player home Pathfinder response. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `facet` (string, optional) — Optional Spotify home facet; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `section_items_limit` (integer, optional) — Per-section item limit, clamped to 1-50; `sp_t` (string, optional) — Optional Spotify session token. A random UUID is generated when omitted; `time_zone` (string, optional) — IANA time zone used by Spotify home personalization\n\n### `spotify_playlist`\n\n- **HTTP:** `GET /spotify/playlist`\n- **What:** Retrieve Spotify playlist details. Returns normalized Spotify Web Player playlist metadata and items from Spotify's fetchPlaylist Pathfinder response. Provide either uri or id; defaults to a known public playlist when omitted.\n- **Params:** `enable_watch_feed_entrypoint` (boolean, optional) — Enable watch feed entrypoint; `id` (string, optional) — Spotify playlist ID. Used when uri is omitted; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `limit` (integer, optional) — Playlist item limit, clamped to 1-50; `offset` (integer, optional) — Playlist item offset; `uri` (string, optional) — Spotify playlist URI or open.spotify.com playlist URL\n\n### `spotify_playlists_search`\n\n- **HTTP:** `GET /spotify/playlists/search`\n- **What:** Search Spotify playlists. Returns normalized Spotify Web Player playlist search results for a search term. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `include_album_pre_releases` (boolean, optional) — Include album pre-release results; `include_audiobooks` (boolean, optional) — Include audiobook context where available; `include_authors` (boolean, optional) — Include authors; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `include_pre_releases` (boolean, optional) — Include pre-release results; `limit` (integer, optional) — Playlist result limit, clamped to 1-50; `number_of_top_results` (integer, optional) — Top result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_popular_by_country`\n\n- **HTTP:** `GET /spotify/popular-by-country`\n- **What:** Retrieve Spotify popular by country. Returns normalized Spotify country hub shelves from Spotify's countryHubsPage Pathfinder response. The country_code parameter accepts Spotify popular-in country codes from open.spotify.com/popular-in/us.\n- **Params:** `country_code` (string, optional) — Two-letter Spotify popular-in country code\n\n### `spotify_profile`\n\n- **HTTP:** `GET /spotify/profile`\n- **What:** Retrieve Spotify public profile. Returns normalized public profile metadata and preview playlists from Spotify's Web Player user-profile service. Provide username, uri, or url; defaults to Spotify's official profile.\n- **Params:** `artist_limit` (integer, optional) — Recently played artist limit, clamped to 0-50; `episode_limit` (integer, optional) — Embedded episode limit, clamped to 0-50; `playlist_limit` (integer, optional) — Embedded public playlist limit, clamped to 0-50; `uri` (string, optional) — Spotify user URI; `url` (string, optional) — open.spotify.com user URL; `username` (string, optional) — Spotify username\n\n### `spotify_profile_followers`\n\n- **HTTP:** `GET /spotify/profile/followers`\n- **What:** Retrieve Spotify public profile followers. Returns normalized public follower profiles from Spotify's Web Player user-profile service. Spotify exposes this as a public anonymous response for some profiles; private or restricted profiles may return an upstream error.\n- **Params:** `limit` (integer, optional) — Follower limit, clamped to 1-200; `offset` (integer, optional) — Follower offset applied locally; `uri` (string, optional) — Spotify user URI; `url` (string, optional) — open.spotify.com user URL; `username` (string, optional) — Spotify username\n\n### `spotify_profile_playlists`\n\n- **HTTP:** `GET /spotify/profile/playlists`\n- **What:** Retrieve Spotify public profile playlists. Returns normalized public playlists from Spotify's Web Player user-profile service. Provide username, uri, or url; defaults to Spotify's official profile.\n- **Params:** `limit` (integer, optional) — Playlist limit, clamped to 1-50; `offset` (integer, optional) — Playlist offset; `uri` (string, optional) — Spotify user URI; `url` (string, optional) — open.spotify.com user URL; `username` (string, optional) — Spotify username\n\n### `spotify_profiles_search`\n\n- **HTTP:** `GET /spotify/profiles/search`\n- **What:** Search Spotify profiles. Returns normalized Spotify Web Player profile search results for a search term. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `include_album_pre_releases` (boolean, optional) — Include album pre-release results; `include_audiobooks` (boolean, optional) — Include audiobook context where available; `include_authors` (boolean, optional) — Include authors; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `include_pre_releases` (boolean, optional) — Include pre-release results; `limit` (integer, optional) — Profile result limit, clamped to 1-50; `number_of_top_results` (integer, optional) — Top result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_search`\n\n- **HTTP:** `GET /spotify/search`\n- **What:** Search Spotify catalog. Returns normalized Spotify Web Player catalog search results across tracks, artists, albums, playlists, shows, episodes, audiobooks, and top results. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `include_album_pre_releases` (boolean, optional) — Include album pre-release results; `include_artist_has_concerts_field` (boolean, optional) — Include artist concert availability fields; `include_audiobooks` (boolean, optional) — Include audiobook results; `include_authors` (boolean, optional) — Include authors; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `include_pre_releases` (boolean, optional) — Include pre-release results; `is_prefix` (boolean, optional) — Treat the search term as a prefix; `limit` (integer, optional) — Result limit per section, clamped to 1-50; `number_of_top_results` (integer, optional) — Top result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_section`\n\n- **HTTP:** `GET /spotify/section`\n- **What:** Retrieve Spotify browse section. Returns normalized items from Spotify's browseSection Pathfinder response for a Spotify section URI.\n- **Params:** `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `limit` (integer, optional) — Section item limit, clamped to 1-50; `offset` (integer, optional) — Section item offset; `uri` (string, optional) — Spotify section URI\n\n### `spotify_shows_search`\n\n- **HTTP:** `GET /spotify/shows/search`\n- **What:** Search Spotify shows. Returns normalized Spotify Web Player show search results for a search term.\n- **Params:** `limit` (integer, optional) — Result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_track`\n\n- **HTTP:** `GET /spotify/track`\n- **What:** Retrieve Spotify track details. Returns normalized Spotify Web Player track metadata from Spotify's getTrack Pathfinder response. Provide either uri or id; defaults to a known public track when omitted.\n- **Params:** `id` (string, optional) — Spotify track ID. Used when uri is omitted; `uri` (string, optional) — Spotify track URI or open.spotify.com track URL\n\n### `spotify_track_recommended`\n\n- **HTTP:** `GET /spotify/track/recommended`\n- **What:** Retrieve Spotify recommended tracks. Returns normalized recommended Spotify entities from the internalLinkRecommenderTrack Pathfinder response.\n- **Params:** `id` (string, optional) — Spotify track ID. Used when uri is omitted; `limit` (integer, optional) — Recommendation limit, clamped to 1-50; `uri` (string, optional) — Spotify track URI or open.spotify.com track URL\n\n### `spotify_track_similar_albums`\n\n- **HTTP:** `GET /spotify/track/similar-albums`\n- **What:** Retrieve Spotify track similar albums. Returns normalized albums from the similarAlbumsBasedOnThisTrack Pathfinder response.\n- **Params:** `albums_only` (boolean, optional) — Request albums-only recommendations; `id` (string, optional) — Spotify track ID. Used when uri is omitted; `limit` (integer, optional) — Album limit, clamped to 1-50; `uri` (string, optional) — Spotify track URI or open.spotify.com track URL\n\n### `spotify_tracks_search`\n\n- **HTTP:** `GET /spotify/tracks/search`\n- **What:** Search Spotify tracks. Returns normalized Spotify Web Player track search results for a search term. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `include_album_pre_releases` (boolean, optional) — Include album pre-release results; `include_audiobooks` (boolean, optional) — Include audiobook context where available; `include_authors` (boolean, optional) — Include authors; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `include_pre_releases` (boolean, optional) — Include pre-release results; `limit` (integer, optional) — Track result limit, clamped to 1-50; `number_of_top_results` (integer, optional) — Top result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n## SpotifyPodcasts (8)\n\n### `spotify_podcasts_categories`\n\n- **HTTP:** `GET /spotify-podcasts/categories`\n- **What:** Retrieve Spotify Podcasts categories. Returns normalized Spotify podcast category sections and items from Spotify's all-categories browsePage Pathfinder response.\n- **Params:** `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `page_limit` (integer, optional) — Page pagination limit, clamped to 1-50; `page_offset` (integer, optional) — Page pagination offset; `section_limit` (integer, optional) — Section pagination limit, clamped to 1-50; `section_offset` (integer, optional) — Section pagination offset; `uri` (string, optional) — Spotify podcast categories page URI\n\n### `spotify_podcasts_charts`\n\n- **HTTP:** `GET /spotify-podcasts/charts`\n- **What:** Retrieve Spotify podcast charts. Returns normalized Spotify podcast chart rankings from podcastcharts.byspotify.com. The chart and region parameters are validated against Spotify's supported podcast chart slugs and countries. Category charts are available only in au, br, de, gb, mx, se, and us.\n- **Params:** `chart` (string, optional) — Chart slug. Allowed: top-podcasts, top-episodes, trending, arts, business, comedy, education, fiction, health-fitness, history, leisure, music, news, religion-spirituality, science, society-culture, sports, technology, true-crime, tv-film; `limit` (integer, optional) — Result limit, clamped to 1-100; `region` (string, optional) — Two-letter region code. Allowed: ar, au, at, br, ca, cl, co, dk, fi, fr, de, in, id, ie, it, jp, mx, nz, no, ph, pl, es, se, nl, gb, us\n\n### `spotify_podcasts_episode`\n\n- **HTTP:** `GET /spotify-podcasts/episode`\n- **What:** Retrieve Spotify podcast episode details. Returns normalized public episode metadata from Spotify's getEpisodeOrChapter Pathfinder response, with episode page, embed page, and anonymous oEmbed fallbacks when Pathfinder is unavailable. Provide either uri or id; defaults to a known public episode when omitted.\n- **Params:** `id` (string, optional) — Spotify episode ID. Used when uri is omitted; `uri` (string, optional) — Spotify episode URI or open.spotify.com episode URL\n\n### `spotify_podcasts_home`\n\n- **HTTP:** `GET /spotify-podcasts/home`\n- **What:** Retrieve Spotify Podcasts home. Returns normalized sections and items from Spotify's podcast home browsePage Pathfinder response.\n- **Params:** `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `page_limit` (integer, optional) — Page pagination limit, clamped to 1-50; `page_offset` (integer, optional) — Page pagination offset; `section_limit` (integer, optional) — Section pagination limit, clamped to 1-50; `section_offset` (integer, optional) — Section pagination offset; `uri` (string, optional) — Spotify page or genre URI\n\n### `spotify_podcasts_search`\n\n- **HTTP:** `GET /spotify-podcasts/search`\n- **What:** Search Spotify Podcasts. Returns normalized Spotify podcast shows, episodes, and top results for a search term.\n- **Params:** `include_album_pre_releases` (boolean, optional) — Include album pre-release results; `include_audiobooks` (boolean, optional) — Include audiobooks; `include_authors` (boolean, optional) — Include authors; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `include_pre_releases` (boolean, optional) — Include pre-release results; `limit` (integer, optional) — Result limit, clamped to 1-50; `number_of_top_results` (integer, optional) — Top result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Podcast search term\n\n### `spotify_podcasts_show`\n\n- **HTTP:** `GET /spotify-podcasts/show`\n- **What:** Retrieve Spotify podcast show metadata. Returns normalized podcast show metadata from Spotify Pathfinder.\n- **Params:** `include_content_capability_trait` (boolean, optional) — Include content capability trait; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `uri` (string, optional) — Spotify show URI\n\n### `spotify_podcasts_show_episodes`\n\n- **HTTP:** `GET /spotify-podcasts/show/episodes`\n- **What:** Retrieve Spotify podcast show episodes. Returns normalized podcast episodes for a Spotify show URI.\n- **Params:** `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `limit` (integer, optional) — Episode limit, clamped to 1-50; `offset` (integer, optional) — Episode offset; `uri` (string, optional) — Spotify show URI\n\n### `spotify_podcasts_show_recommendations`\n\n- **HTTP:** `GET /spotify-podcasts/show/recommendations`\n- **What:** Retrieve Spotify podcast recommendations. Returns normalized related Spotify shows and episodes from Spotify's show recommendations response.\n- **Params:** `uri` (string, optional) — Spotify show URI\n\n## ApplePodcasts (8)\n\n### `apple_podcasts_charts`\n\n- **HTTP:** `GET /apple-podcasts/charts`\n- **What:** Retrieve Apple Podcasts chart rankings. Returns Apple Podcasts show chart rankings from public iTunes RSS JSON feeds. Supported collections are `toppodcasts` and `topaudiopodcasts`.\n- **Params:** `category` (integer, optional) — Numeric Apple podcast genre ID; `collection` (string, optional) — Chart collection; `country` (string, optional) — Two-letter storefront country code; `limit` (integer, optional) — Number of chart items to return\n\n### `apple_podcasts_charts_rankings`\n\n- **HTTP:** `GET /apple-podcasts/charts/rankings`\n- **What:** Retrieve Apple Podcasts chart rankings by algorithm, type, and genre. Returns Apple Podcasts chart rankings from the modern podcasts.apple.com charts page, covering chart algorithms (`top`, `top-subscriber`, `top-series`) crossed with entity types (`podcasts`, `podcast-episodes`, `podcast-channels`) and an optional genre filter. A richer, differently-sourced capability than the legacy RSS-based `/apple-podcasts/charts` endpoint.\n- **Params:** `chart` (string, optional) — Chart algorithm. Allowed values: `top`, `top-subscriber`, `top-series`. Default `top`.; `country` (string, optional) — Two-letter storefront country code; `genre` (integer, optional) — Optional Apple Podcasts genre ID to filter the chart, e.g. 1303 for Comedy; `limit` (integer, optional) — Number of chart entries to return, default 24, max 200; `type` (string, optional) — Entity type. Allowed values: `podcasts`, `podcast-episodes`, `podcast-channels`. Default `podcasts`.\n\n### `apple_podcasts_episodes_search`\n\n- **HTTP:** `GET /apple-podcasts/episodes/search`\n- **What:** Search Apple Podcasts episodes. Returns normalized Apple Podcasts episodes from Apple's public iTunes Search API.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Number of episodes per page; `page` (integer, optional) — Search page number (1-based); `term` (string, **required**) — Search term\n\n### `apple_podcasts_new`\n\n- **HTTP:** `GET /apple-podcasts/new`\n- **What:** Retrieve Apple Podcasts curated \"New\" editorial shelves. Returns the curated editorial shelves from podcasts.apple.com/{country}/new (New Shows, New Seasons, New Trailers, Essentials, and other seasonal spotlights). Shelves that merely mirror a Charts Rankings query are omitted here since `/apple-podcasts/charts/rankings` already covers that data.\n- **Params:** `country` (string, optional) — Two-letter storefront country code\n\n### `apple_podcasts_search`\n\n- **HTTP:** `GET /apple-podcasts/search`\n- **What:** Search Apple Podcasts shows. Returns normalized Apple Podcasts shows from Apple's public iTunes Search API.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Number of shows per page; `page` (integer, optional) — Search page number (1-based); `term` (string, **required**) — Search term\n\n### `apple_podcasts_show`\n\n- **HTTP:** `GET /apple-podcasts/show/{id}`\n- **What:** Retrieve Apple Podcasts show details. Returns normalized show metadata from Apple's public iTunes Lookup API.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Podcasts show ID; `lang` (string, optional) — Result language tag\n\n### `apple_podcasts_show_episodes`\n\n- **HTTP:** `GET /apple-podcasts/show/{id}/episodes`\n- **What:** Retrieve Apple Podcasts show episodes. Returns a show and its public Apple Podcasts episodes from Apple's iTunes Lookup API.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Podcasts show ID; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Number of episodes to return\n\n### `apple_podcasts_show_related`\n\n- **HTTP:** `GET /apple-podcasts/show/{id}/related`\n- **What:** Retrieve Apple Podcasts \"You Might Also Like\" related shows. Returns the \"You Might Also Like\" rail for a single show, sourced from the modern podcasts.apple.com show page's listener-cohort recommendation data.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Podcasts show ID; `limit` (integer, optional) — Number of related shows to return, default 20, max 50\n\n## Discogs (7)\n\n### `discogs_artist`\n\n- **HTTP:** `GET /discogs/artist/{id}`\n- **What:** Get a Discogs artist profile. Returns a normalized Discogs artist profile: real name, bio, links, name variations, aliases, and group memberships. Credential-free official Discogs database data.\n- **Params:** `id` (string, **required**) — Discogs artist id\n\n### `discogs_artist_releases`\n\n- **HTTP:** `GET /discogs/artist/{id}/releases`\n- **What:** List a Discogs artist's releases. Returns an artist's paginated release/master credits (role, format, label, year, want/collection counts). Credential-free official Discogs database data.\n- **Params:** `id` (string, **required**) — Discogs artist id; `page` (integer, optional) — 1-based page number, default 1; `per_page` (integer, optional) — Results per page, default 50, max 100\n\n### `discogs_label`\n\n- **HTTP:** `GET /discogs/label/{id}`\n- **What:** Get a Discogs label profile. Returns a normalized Discogs label profile: profile text, contact info, parent label, and sub-labels. Credential-free official Discogs database data.\n- **Params:** `id` (string, **required**) — Discogs label id\n\n### `discogs_label_releases`\n\n- **HTTP:** `GET /discogs/label/{id}/releases`\n- **What:** List a Discogs label's releases. Returns a label's paginated release catalog (title, artist, format, catalog number, year). Credential-free official Discogs database data.\n- **Params:** `id` (string, **required**) — Discogs label id; `page` (integer, optional) — 1-based page number, default 1; `per_page` (integer, optional) — Results per page, default 50, max 100\n\n### `discogs_master`\n\n- **HTTP:** `GET /discogs/master/{id}`\n- **What:** Get a Discogs master release. Returns a normalized Discogs master release: the version-agnostic grouping of a release across pressings/reissues (artists, tracklist, genres/styles, videos, images, marketplace stats). Credential-free official Discogs database data.\n- **Params:** `id` (string, **required**) — Discogs master release id\n\n### `discogs_release`\n\n- **HTTP:** `GET /discogs/release/{id}`\n- **What:** Get a Discogs release. Returns a normalized Discogs release: artists, labels, formats, tracklist, credits, identifiers, videos, images, and community want/have/rating. Credential-free official Discogs database data (api.discogs.com).\n- **Params:** `id` (string, **required**) — Discogs release id\n\n### `discogs_search`\n\n- **HTTP:** `GET /discogs/search`\n- **What:** Search the Discogs database. Searches Discogs releases, masters, artists, and labels. Credential-free official Discogs database data.\n- **Params:** `page` (integer, optional) — 1-based page number, default 1; `per_page` (integer, optional) — Results per page, default 50, max 100; `q` (string, **required**) — Search query; `type` (string, optional) — Result type filter\n\n## SoundCloud (5)\n\n### `soundcloud_playlist`\n\n- **HTTP:** `GET /soundcloud/playlist`\n- **What:** Get a SoundCloud playlist or album's detail. Returns one playlist or album's metadata plus its full track list: owner, likes/reposts counts, and every track's title, artwork, and playback/likes counts. Public data sourced from SoundCloud's own JSON API.\n- **Params:** `url` (string, **required**) — Full soundcloud.com playlist/album URL (a playlist's permalink_url)\n\n### `soundcloud_profile`\n\n- **HTTP:** `GET /soundcloud/profile`\n- **What:** Get a SoundCloud user/artist profile. Returns one user/artist's profile: bio, avatar, followers/followings/track/playlist/likes counts, and verified status. Public data sourced from SoundCloud's own JSON API.\n- **Params:** `url` (string, **required**) — Full soundcloud.com user/artist profile URL\n\n### `soundcloud_search`\n\n- **HTTP:** `GET /soundcloud/search`\n- **What:** Search SoundCloud tracks. Returns tracks matching a query: title, artwork, playback/likes/comment/repost counts, and uploader. Public data sourced from SoundCloud's own JSON API.\n- **Params:** `limit` (integer, optional) — Number of tracks to return (default 20, max 50); `query` (string, **required**) — Search text\n\n### `soundcloud_track`\n\n- **HTTP:** `GET /soundcloud/track`\n- **What:** Get a SoundCloud track's detail. Returns one track's full metadata: title, artwork, description, genre, tags, playback/likes/comment/repost counts, and uploader. Public data sourced from SoundCloud's own JSON API.\n- **Params:** `url` (string, **required**) — Full soundcloud.com track URL (a track's permalink_url)\n\n### `soundcloud_user_tracks`\n\n- **HTTP:** `GET /soundcloud/user-tracks`\n- **What:** Get a SoundCloud user's own uploaded tracks. Returns a user/artist's own uploaded tracks, most recent first: title, artwork, playback/likes/comment/repost counts. Public data sourced from SoundCloud's own JSON API.\n- **Params:** `limit` (integer, optional) — Number of tracks to return (default 20, max 50); `url` (string, **required**) — Full soundcloud.com user/artist profile URL\n\nFile v1.0.17:skill-card.md\n\n## Description:\n\nResearches music, artists, playlists, and podcasts via the Crawlora API, covering Spotify, Spotify Podcasts, Apple Podcasts, Discogs, and SoundCloud, and returns normalized JSON for catalog, profile, chart, release, and track research.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[crawlora-org](https://clawhub.ai/user/crawlora-org)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and agents use this skill to look up public music, podcast, playlist, profile, chart, and release metadata across supported platforms through Crawlora. It is useful for artist deep dives, playlist inspection, podcast discovery, Discogs collector research, and SoundCloud catalog checks.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Music, podcast, Discogs, Spotify, and SoundCloud queries are sent to Crawlora when the helper calls the API.\n\nMitigation: Use the skill only for queries you are comfortable sharing with Crawlora and avoid including sensitive user data in request parameters.\n\nRisk: The skill requires a Crawlora API key for live requests.\n\nMitigation: Store CRAWLORA_API_KEY in an environment variable or secret store, and do not hardcode, commit, or pass it in query arguments.\n\nRisk: Optional private Spotify session tokens may expose account context if deliberately supplied to supported endpoints.\n\nMitigation: Use anonymous/default requests where possible and supply private Spotify session tokens only after confirming that exposure is intended.\n\n## Reference(s):\n\n- [Endpoint reference](reference/endpoints.md)\n- [Crawlora](https://crawlora.net)\n- [Crawlora API base](https://api.crawlora.net/api/v1)\n- [ClawHub skill page](https://clawhub.ai/crawlora-org/skills/music-podcast-research)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with shell command examples and JSON API responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires CRAWLORA_API_KEY for live API requests; helper output is raw JSON suitable for jq or downstream summarization.]\n\n## Skill Version(s):\n\n1.0.17 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.16: 5 files, 11647 bytes\n\nFiles: reference/endpoints.md (33054b), scripts/crawlora.sh (5437b), skill-card.md (2071b), SKILL.md (5956b), _meta.json (142b)\n\nFile v1.0.16:SKILL.md\n\n---\nname: music-podcast-research\ndescription: Researches music, artists, playlists, and podcasts via the Crawlora API — Spotify tracks/albums/artists/playlists/profiles, Spotify Podcasts, Apple Podcasts, Discogs, and SoundCloud tracks/profiles/playlists — returning clean JSON. Use when the user wants a track/album/artist's details, a playlist or profile, podcast show/episode info and charts, a record's Discogs release/pressing data, or a SoundCloud track/user's stats.\n---\n\n# Music & podcast research\n\nLook up tracks, albums, artists, playlists, and podcast shows/episodes across\nSpotify, Spotify Podcasts, Apple Podcasts, Discogs, and SoundCloud as\nnormalized JSON from the Crawlora API — no scraping streaming-app pages.\n\n## When to use this skill\n\n- \"Find this track/album/artist on Spotify\" / \"what's on this playlist?\"\n- \"Look up a Spotify user's public profile/playlists.\"\n- \"What podcasts/episodes are trending?\" (Spotify Podcasts, Apple Podcasts charts)\n- \"Get details for this podcast show/episode.\"\n- \"What pressings/releases exist for this record?\" (Discogs — vinyl/collector data)\n- \"Look up this SoundCloud track/user\" / \"how many plays/likes does this\n  track have?\" / \"what has this artist uploaded to SoundCloud?\"\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\n1. **Spotify** — search first: `/spotify/search` (or the scoped\n   `/spotify/tracks/search`, `/spotify/artists/search`, `/spotify/albums/search`,\n   `/spotify/playlists/search`, `/spotify/profiles/search`) with `q`. Detail\n   endpoints (`/spotify/track`, `/spotify/album`, `/spotify/artist`,\n   `/spotify/playlist`, `/spotify/profile`) accept **either** `id` or `uri`\n   (a Spotify URI like `spotify:track:...`) — pass whichever you have.\n   `/spotify/artist/related`, `/spotify/track/recommended`, and\n   `/spotify/track/similar-albums` cover discovery.\n2. **Spotify Podcasts** — `/spotify-podcasts/search`, `/spotify-podcasts/show`\n   (by `uri`), `/spotify-podcasts/show/episodes`, `/spotify-podcasts/charts`.\n3. **Apple Podcasts** — `/apple-podcasts/search` (`term`), `/apple-podcasts/show/{id}`,\n   `/apple-podcasts/show/{id}/episodes`, `/apple-podcasts/charts` /\n   `/apple-podcasts/charts/rankings` for what's popular by country.\n4. **Discogs** — `/discogs/search` (`q`, optional `type` = release/master/\n   artist/label) to find an id, then `/discogs/release/{id}`,\n   `/discogs/master/{id}`, `/discogs/artist/{id}`, `/discogs/label/{id}`\n   for detail (+ `/releases` sub-paths for an artist's/label's catalog).\n5. **SoundCloud** — `/soundcloud/search` (`query`) to find a track, then\n   `/soundcloud/track` (`url` — a track's full `permalink_url`) for its\n   full metadata and play/like/comment/repost counts. `/soundcloud/profile`\n   (`url` — a user's profile URL) gets bio and follower/track counts;\n   `/soundcloud/user-tracks` (`url`) lists that user's own uploads;\n   `/soundcloud/playlist` (`url`) gets a playlist/album's metadata and\n   full track list.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Spotify:\nscripts/crawlora.sh /spotify/search q=\"Daft Punk\" | jq '.'\nscripts/crawlora.sh /spotify/artist id=4tZwfgrHOc3mvqYlEYSvVi | jq '.'\n\n# Podcasts:\nscripts/crawlora.sh /apple-podcasts/search term=\"Reply All\" | jq '.'\nscripts/crawlora.sh /spotify-podcasts/charts | jq '.'\n\n# Discogs:\nscripts/crawlora.sh /discogs/search q=\"Random Access Memories\" type=release | jq '.'\nscripts/crawlora.sh /discogs/release/4818226 | jq '.'\n\n# SoundCloud:\nscripts/crawlora.sh /soundcloud/search query=\"lofi hip hop\" | jq '.'\nscripts/crawlora.sh /soundcloud/track url=\"https://soundcloud.com/artist/track-name\" | jq '.'\n```\n\nUse `scripts/crawlora.sh` for all requests; it keeps the API key out of command-line arguments.\n\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for every Spotify,\nSpotify Podcasts, Apple Podcasts, Discogs, and SoundCloud endpoint this\nskill uses.\n\n## Examples\n\n- **Artist deep-dive:** `/spotify/artist` + `/spotify/artist/albums` +\n  `/spotify/artist/related` for a full discography and similar-artist map.\n- **Podcast discovery:** `/spotify-podcasts/charts` or\n  `/apple-podcasts/charts` to find what's trending, then\n  `/spotify-podcasts/show/episodes` for a show's back catalog.\n- **Collector research:** `/discogs/search` for a release, then\n  `/discogs/release/{id}` for pressing details (format, year, label,\n  condition-relevant metadata).\n- **SoundCloud artist catalog:** `/soundcloud/profile` for a user's\n  follower/track counts, then `/soundcloud/user-tracks` for their own\n  uploads with per-track play/like/comment/repost counts.\n\n## Notes & limits\n\n- **Credits / pay-on-success:** billed only on `2xx`; free tier 2,000 credits/mo.\n  Key at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- **Public data only** — public catalog/profile/chart pages.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- **Spotify detail endpoints need an `id` or `uri`** — resolve one via the\n  matching `.../search` endpoint first if you only have a name.\n- **SoundCloud detail endpoints need a full `url`** (a track/playlist/user's\n  `permalink_url`, e.g. `https://soundcloud.com/artist/track-name`) —\n  there's no numeric-id lookup, so pull the URL from `/soundcloud/search`\n  results first if you only have a name.\n- Search endpoints are paginated (`limit`/`offset` or `page`) — walk pages\n  for full coverage.\n\nFile v1.0.16:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"music-podcast-research\",\n  \"version\": \"1.0.16\",\n  \"publishedAt\": 1789043663117\n}\n\nFile v1.0.16:reference/endpoints.md\n\n# music-podcast-research — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**58 endpoints across 5 platform group(s).**\n\n## Spotify (30)\n\n### `spotify_album`\n\n- **HTTP:** `GET /spotify/album`\n- **What:** Retrieve Spotify album details. Returns normalized Spotify Web Player album metadata and tracks from private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify album ID; `limit` (integer, optional) — Track limit, clamped to 1-50; `offset` (integer, optional) — Track offset; `uri` (string, optional) — Spotify album URI or open.spotify.com album URL\n\n### `spotify_album_tracks`\n\n- **HTTP:** `GET /spotify/album/tracks`\n- **What:** Retrieve Spotify album tracks. Returns normalized Spotify Web Player album tracks from private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify album ID; `limit` (integer, optional) — Track limit, clamped to 1-50; `offset` (integer, optional) — Track offset; `uri` (string, optional) — Spotify album URI or open.spotify.com album URL\n\n### `spotify_albums_search`\n\n- **HTTP:** `GET /spotify/albums/search`\n- **What:** Search Spotify albums. Returns normalized Spotify Web Player album search results for a search term. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `include_album_pre_releases` (boolean, optional) — Include album pre-release results; `include_audiobooks` (boolean, optional) — Include audiobook context where available; `include_authors` (boolean, optional) — Include authors; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `include_pre_releases` (boolean, optional) — Include pre-release results; `limit` (integer, optional) — Album result limit, clamped to 1-50; `number_of_top_results` (integer, optional) — Top result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_artist`\n\n- **HTTP:** `GET /spotify/artist`\n- **What:** Retrieve Spotify artist details. Returns normalized Spotify Web Player artist overview data from private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify artist ID; `uri` (string, optional) — Spotify artist URI or open.spotify.com artist URL\n\n### `spotify_artist_albums`\n\n- **HTTP:** `GET /spotify/artist/albums`\n- **What:** Retrieve Spotify artist albums. Returns artist discography items from Spotify Web Player private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify artist ID; `limit` (integer, optional) — Limit, clamped to 1-50; `offset` (integer, optional) — Offset; `order` (string, optional) — date_desc, date_asc, name_asc, or name_desc; `type` (string, optional) — album, single, compilation, appears_on, or all; `uri` (string, optional) — Spotify artist URI or open.spotify.com artist URL\n\n### `spotify_artist_playlists`\n\n- **HTTP:** `GET /spotify/artist/playlists`\n- **What:** Retrieve Spotify artist playlists. Returns artist playlists from Spotify Web Player private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify artist ID; `uri` (string, optional) — Spotify artist URI or open.spotify.com artist URL\n\n### `spotify_artist_related`\n\n- **HTTP:** `GET /spotify/artist/related`\n- **What:** Retrieve Spotify related artists. Returns related artists from Spotify Web Player private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify artist ID; `uri` (string, optional) — Spotify artist URI or open.spotify.com artist URL\n\n### `spotify_artists_search`\n\n- **HTTP:** `GET /spotify/artists/search`\n- **What:** Search Spotify artists. Returns normalized Spotify Web Player artist search results for a search term.\n- **Params:** `limit` (integer, optional) — Result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_audiobook`\n\n- **HTTP:** `GET /spotify/audiobook`\n- **What:** Retrieve Spotify audiobook details. Returns Spotify Web Player audiobook metadata from private Pathfinder responses. Spotify exposes audiobooks through show URIs.\n- **Params:** `id` (string, optional) — Spotify show ID; `uri` (string, optional) — Spotify audiobook/show URI or open.spotify.com show URL\n\n### `spotify_audiobook_chapters`\n\n- **HTTP:** `GET /spotify/audiobook/chapters`\n- **What:** Retrieve Spotify audiobook chapters. Returns audiobook chapters from Spotify Web Player private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify show ID; `limit` (integer, optional) — Chapter limit, clamped to 1-50; `offset` (integer, optional) — Chapter offset; `uri` (string, optional) — Spotify audiobook/show URI or open.spotify.com show URL\n\n### `spotify_audiobooks_search`\n\n- **HTTP:** `GET /spotify/audiobooks/search`\n- **What:** Search Spotify audiobooks. Returns normalized Spotify Web Player audiobook search results for a search term. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `include_album_pre_releases` (boolean, optional) — Include album pre-release results; `include_audiobooks` (boolean, optional) — Include audiobook results; `include_authors` (boolean, optional) — Include authors; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `include_pre_releases` (boolean, optional) — Include pre-release results; `limit` (integer, optional) — Audiobook result limit, clamped to 1-50; `number_of_top_results` (integer, optional) — Top result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_chapter`\n\n- **HTTP:** `GET /spotify/chapter`\n- **What:** Retrieve Spotify audiobook chapter details. Returns a Spotify chapter from the same private Pathfinder operation used for episodes and chapters.\n- **Params:** `id` (string, optional) — Spotify chapter/episode ID; `uri` (string, optional) — Spotify chapter or episode URI/URL\n\n### `spotify_episodes_search`\n\n- **HTTP:** `GET /spotify/episodes/search`\n- **What:** Search Spotify episodes. Returns normalized Spotify Web Player episode search results for a search term.\n- **Params:** `limit` (integer, optional) — Result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_featured_charts_by_country`\n\n- **HTTP:** `GET /spotify/featured-charts-by-country`\n- **What:** Retrieve Spotify featured charts by country. Returns normalized Spotify country hub content from Spotify's countryHubContent Pathfinder response. Defaults to the CHARTS content shelf for the requested country.\n- **Params:** `content_id` (string, optional) — Country hub content ID. Allowed: CHARTS, POPULAR_ALBUMS, POPULAR_ARTISTS, TRENDING_SONGS; `country_code` (string, optional) — Two-letter Spotify popular-in country code\n\n### `spotify_genre`\n\n- **HTTP:** `GET /spotify/genre`\n- **What:** Retrieve Spotify genre page. Returns normalized sections and items from Spotify's browsePage Pathfinder response for a Spotify genre or page URI.\n- **Params:** `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `page_limit` (integer, optional) — Page pagination limit, clamped to 1-50; `page_offset` (integer, optional) — Page pagination offset; `section_limit` (integer, optional) — Section pagination limit, clamped to 1-50; `section_offset` (integer, optional) — Section pagination offset; `uri` (string, optional) — Spotify genre or page URI\n\n### `spotify_home`\n\n- **HTTP:** `GET /spotify/home`\n- **What:** Retrieve Spotify home sections. Returns normalized shelves and items from Spotify's Web Player home Pathfinder response. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `facet` (string, optional) — Optional Spotify home facet; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `section_items_limit` (integer, optional) — Per-section item limit, clamped to 1-50; `sp_t` (string, optional) — Optional Spotify session token. A random UUID is generated when omitted; `time_zone` (string, optional) — IANA time zone used by Spotify home personalization\n\n### `spotify_playlist`\n\n- **HTTP:** `GET /spotify/playlist`\n- **What:** Retrieve Spotify playlist details. Returns normalized Spotify Web Player playlist metadata and items from Spotify's fetchPlaylist Pathfinder response. Provide either uri or id; defaults to a known public playlist when omitted.\n- **Params:** `enable_watch_feed_entrypoint` (boolean, optional) — Enable watch feed entrypoint; `id` (string, optional) — Spotify playlist ID. Used when uri is omitted; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `limit` (integer, optional) — Playlist item limit, clamped to 1-50; `offset` (integer, optional) — Playlist item offset; `uri` (string, optional) — Spotify playlist URI or open.spotify.com playlist URL\n\n### `spotify_playlists_search`\n\n- **HTTP:** `GET /spotify/playlists/search`\n- **What:** Search Spotify playlists. Returns normalized Spotify Web Player playlist search results for a search term. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `include_album_pre_releases` (boolean, optional) — Include album pre-release results; `include_audiobooks` (boolean, optional) — Include audiobook context where available; `include_authors` (boolean, optional) — Include authors; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `include_pre_releases` (boolean, optional) — Include pre-release results; `limit` (integer, optional) — Playlist result limit, clamped to 1-50; `number_of_top_results` (integer, optional) — Top result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_popular_by_country`\n\n- **HTTP:** `GET /spotify/popular-by-country`\n- **What:** Retrieve Spotify popular by country. Returns normalized Spotify country hub shelves from Spotify's countryHubsPage Pathfinder response. The country_code parameter accepts Spotify popular-in country codes from open.spotify.com/popular-in/us.\n- **Params:** `country_code` (string, optional) — Two-letter Spotify popular-in country code\n\n### `spotify_profile`\n\n- **HTTP:** `GET /spotify/profile`\n- **What:** Retrieve Spotify public profile. Returns normalized public profile metadata and preview playlists from Spotify's Web Player user-profile service. Provide username, uri, or url; defaults to Spotify's official profile.\n- **Params:** `artist_limit` (integer, optional) — Recently played artist limit, clamped to 0-50; `episode_limit` (integer, optional) — Embedded episode limit, clamped to 0-50; `playlist_limit` (integer, optional) — Embedded public playlist limit, clamped to 0-50; `uri` (string, optional) — Spotify user URI; `url` (string, optional) — open.spotify.com user URL; `username` (string, optional) — Spotify username\n\n### `spotify_profile_followers`\n\n- **HTTP:** `GET /spotify/profile/followers`\n- **What:** Retrieve Spotify public profile followers. Returns normalized public follower profiles from Spotify's Web Player user-profile service. Spotify exposes this as a public anonymous response for some profiles; private or restricted profiles may return an upstream error.\n- **Params:** `limit` (integer, optional) — Follower limit, clamped to 1-200; `offset` (integer, optional) — Follower offset applied locally; `uri` (string, optional) — Spotify user URI; `url` (string, optional) — open.spotify.com user URL; `username` (string, optional) — Spotify username\n\n### `spotify_profile_playlists`\n\n- **HTTP:** `GET /spotify/profile/playlists`\n- **What:** Retrieve Spotify public profile playlists. Returns normalized public playlists from Spotify's Web Player user-profile service. Provide username, uri, or url; defaults to Spotify's official profile.\n- **Params:** `limit` (integer, optional) — Playlist limit, clamped to 1-50; `offset` (integer, optional) — Playlist offset; `uri` (string, optional) — Spotify user URI; `url` (string, optional) — open.spotify.com user URL; `username` (string, optional) — Spotify username\n\n### `spotify_profiles_search`\n\n- **HTTP:** `GET /spotify/profiles/search`\n- **What:** Search Spotify profiles. Returns normalized Spotify Web Player profile search results for a search term. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `include_album_pre_releases` (boolean, optional) — Include album pre-release results; `include_audiobooks` (boolean, optional) — Include audiobook context where available; `include_authors` (boolean, optional) — Include authors; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `include_pre_releases` (boolean, optional) — Include pre-release results; `limit` (integer, optional) — Profile result limit, clamped to 1-50; `number_of_top_results` (integer, optional) — Top result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_search`\n\n- **HTTP:** `GET /spotify/search`\n- **What:** Search Spotify catalog. Returns normalized Spotify Web Player catalog search results across tracks, artists, albums, playlists, shows, episodes, audiobooks, and top results. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `include_album_pre_releases` (boolean, optional) — Include album pre-release results; `include_artist_has_concerts_field` (boolean, optional) — Include artist concert availability fields; `include_audiobooks` (boolean, optional) — Include audiobook results; `include_authors` (boolean, optional) — Include authors; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `include_pre_releases` (boolean, optional) — Include pre-release results; `is_prefix` (boolean, optional) — Treat the search term as a prefix; `limit` (integer, optional) — Result limit per section, clamped to 1-50; `number_of_top_results` (integer, optional) — Top result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_section`\n\n- **HTTP:** `GET /spotify/section`\n- **What:** Retrieve Spotify browse section. Returns normalized items from Spotify's browseSection Pathfinder response for a Spotify section URI.\n- **Params:** `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `limit` (integer, optional) — Section item limit, clamped to 1-50; `offset` (integer, optional) — Section item offset; `uri` (string, optional) — Spotify section URI\n\n### `spotify_shows_search`\n\n- **HTTP:** `GET /spotify/shows/search`\n- **What:** Search Spotify shows. Returns normalized Spotify Web Player show search results for a search term.\n- **Params:** `limit` (integer, optional) — Result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_track`\n\n- **HTTP:** `GET /spotify/track`\n- **What:** Retrieve Spotify track details. Returns normalized Spotify Web Player track metadata from Spotify's getTrack Pathfinder response. Provide either uri or id; defaults to a known public track when omitted.\n- **Params:** `id` (string, optional) — Spotify track ID. Used when uri is omitted; `uri` (string, optional) — Spotify track URI or open.spotify.com track URL\n\n### `spotify_track_recommended`\n\n- **HTTP:** `GET /spotify/track/recommended`\n- **What:** Retrieve Spotify recommended tracks. Returns normalized recommended Spotify entities from the internalLinkRecommenderTrack Pathfinder response.\n- **Params:** `id` (string, optional) — Spotify track ID. Used when uri is omitted; `limit` (integer, optional) — Recommendation limit, clamped to 1-50; `uri` (string, optional) — Spotify track URI or open.spotify.com track URL\n\n### `spotify_track_similar_albums`\n\n- **HTTP:** `GET /spotify/track/similar-albums`\n- **What:** Retrieve Spotify track similar albums. Returns normalized albums from the similarAlbumsBasedOnThisTrack Pathfinder response.\n- **Params:** `albums_only` (boolean, optional) — Request albums-only recommendations; `id` (string, optional) — Spotify track ID. Used when uri is omitted; `limit` (integer, optional) — Album limit, clamped to 1-50; `uri` (string, optional) — Spotify track URI or open.spotify.com track URL\n\n### `spotify_tracks_search`\n\n- **HTTP:** `GET /spotify/tracks/search`\n- **What:** Search Spotify tracks. Returns normalized Spotify Web Player track search results for a search term. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `include_album_pre_releases` (boolean, optional) — Include album pre-release results; `include_audiobooks` (boolean, optional) — Include audiobook context where available; `include_authors` (boolean, optional) — Include authors; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `include_pre_releases` (boolean, optional) — Include pre-release results; `limit` (integer, optional) — Track result limit, clamped to 1-50; `number_of_top_results` (integer, optional) — Top result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n## SpotifyPodcasts (8)\n\n### `spotify_podcasts_categories`\n\n- **HTTP:** `GET /spotify-podcasts/categories`\n- **What:** Retrieve Spotify Podcasts categories. Returns normalized Spotify podcast category sections and items from Spotify's all-categories browsePage Pathfinder response.\n- **Params:** `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `page_limit` (integer, optional) — Page pagination limit, clamped to 1-50; `page_offset` (integer, optional) — Page pagination offset; `section_limit` (integer, optional) — Section pagination limit, clamped to 1-50; `section_offset` (integer, optional) — Section pagination offset; `uri` (string, optional) — Spotify podcast categories page URI\n\n### `spotify_podcasts_charts`\n\n- **HTTP:** `GET /spotify-podcasts/charts`\n- **What:** Retrieve Spotify podcast charts. Returns normalized Spotify podcast chart rankings from podcastcharts.byspotify.com. The chart and region parameters are validated against Spotify's supported podcast chart slugs and countries. Category charts are available only in au, br, de, gb, mx, se, and us.\n- **Params:** `chart` (string, optional) — Chart slug. Allowed: top-podcasts, top-episodes, trending, arts, business, comedy, education, fiction, health-fitness, history, leisure, music, news, religion-spirituality, science, society-culture, sports, technology, true-crime, tv-film; `limit` (integer, optional) — Result limit, clamped to 1-100; `region` (string, optional) — Two-letter region code. Allowed: ar, au, at, br, ca, cl, co, dk, fi, fr, de, in, id, ie, it, jp, mx, nz, no, ph, pl, es, se, nl, gb, us\n\n### `spotify_podcasts_episode`\n\n- **HTTP:** `GET /spotify-podcasts/episode`\n- **What:** Retrieve Spotify podcast episode details. Returns normalized public episode metadata from Spotify's getEpisodeOrChapter Pathfinder response, with episode page, embed page, and anonymous oEmbed fallbacks when Pathfinder is unavailable. Provide either uri or id; defaults to a known public episode when omitted.\n- **Params:** `id` (string, optional) — Spotify episode ID. Used when uri is omitted; `uri` (string, optional) — Spotify episode URI or open.spotify.com episode URL\n\n### `spotify_podcasts_home`\n\n- **HTTP:** `GET /spotify-podcasts/home`\n- **What:** Retrieve Spotify Podcasts home. Returns normalized sections and items from Spotify's podcast home browsePage Pathfinder response.\n- **Params:** `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `page_limit` (integer, optional) — Page pagination limit, clamped to 1-50; `page_offset` (integer, optional) — Page pagination offset; `section_limit` (integer, optional) — Section pagination limit, clamped to 1-50; `section_offset` (integer, optional) — Section pagination offset; `uri` (string, optional) — Spotify page or genre URI\n\n### `spotify_podcasts_search`\n\n- **HTTP:** `GET /spotify-podcasts/search`\n- **What:** Search Spotify Podcasts. Returns normalized Spotify podcast shows, episodes, and top results for a search term.\n- **Params:** `include_album_pre_releases` (boolean, optional) — Include album pre-release results; `include_audiobooks` (boolean, optional) — Include audiobooks; `include_authors` (boolean, optional) — Include authors; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `include_pre_releases` (boolean, optional) — Include pre-release results; `limit` (integer, optional) — Result limit, clamped to 1-50; `number_of_top_results` (integer, optional) — Top result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Podcast search term\n\n### `spotify_podcasts_show`\n\n- **HTTP:** `GET /spotify-podcasts/show`\n- **What:** Retrieve Spotify podcast show metadata. Returns normalized podcast show metadata from Spotify Pathfinder.\n- **Params:** `include_content_capability_trait` (boolean, optional) — Include content capability trait; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `uri` (string, optional) — Spotify show URI\n\n### `spotify_podcasts_show_episodes`\n\n- **HTTP:** `GET /spotify-podcasts/show/episodes`\n- **What:** Retrieve Spotify podcast show episodes. Returns normalized podcast episodes for a Spotify show URI.\n- **Params:** `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `limit` (integer, optional) — Episode limit, clamped to 1-50; `offset` (integer, optional) — Episode offset; `uri` (string, optional) — Spotify show URI\n\n### `spotify_podcasts_show_recommendations`\n\n- **HTTP:** `GET /spotify-podcasts/show/recommendations`\n- **What:** Retrieve Spotify podcast recommendations. Returns normalized related Spotify shows and episodes from Spotify's show recommendations response.\n- **Params:** `uri` (string, optional) — Spotify show URI\n\n## ApplePodcasts (8)\n\n### `apple_podcasts_charts`\n\n- **HTTP:** `GET /apple-podcasts/charts`\n- **What:** Retrieve Apple Podcasts chart rankings. Returns Apple Podcasts show chart rankings from public iTunes RSS JSON feeds. Supported collections are `toppodcasts` and `topaudiopodcasts`.\n- **Params:** `category` (integer, optional) — Numeric Apple podcast genre ID; `collection` (string, optional) — Chart collection; `country` (string, optional) — Two-letter storefront country code; `limit` (integer, optional) — Number of chart items to return\n\n### `apple_podcasts_charts_rankings`\n\n- **HTTP:** `GET /apple-podcasts/charts/rankings`\n- **What:** Retrieve Apple Podcasts chart rankings by algorithm, type, and genre. Returns Apple Podcasts chart rankings from the modern podcasts.apple.com charts page, covering chart algorithms (`top`, `top-subscriber`, `top-series`) crossed with entity types (`podcasts`, `podcast-episodes`, `podcast-channels`) and an optional genre filter. A richer, differently-sourced capability than the legacy RSS-based `/apple-podcasts/charts` endpoint.\n- **Params:** `chart` (string, optional) — Chart algorithm. Allowed values: `top`, `top-subscriber`, `top-series`. Default `top`.; `country` (string, optional) — Two-letter storefront country code; `genre` (integer, optional) — Optional Apple Podcasts genre ID to filter the chart, e.g. 1303 for Comedy; `limit` (integer, optional) — Number of chart entries to return, default 24, max 200; `type` (string, optional) — Entity type. Allowed values: `podcasts`, `podcast-episodes`, `podcast-channels`. Default `podcasts`.\n\n### `apple_podcasts_episodes_search`\n\n- **HTTP:** `GET /apple-podcasts/episodes/search`\n- **What:** Search Apple Podcasts episodes. Returns normalized Apple Podcasts episodes from Apple's public iTunes Search API.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Number of episodes per page; `page` (integer, optional) — Search page number (1-based); `term` (string, **required**) — Search term\n\n### `apple_podcasts_new`\n\n- **HTTP:** `GET /apple-podcasts/new`\n- **What:** Retrieve Apple Podcasts curated \"New\" editorial shelves. Returns the curated editorial shelves from podcasts.apple.com/{country}/new (New Shows, New Seasons, New Trailers, Essentials, and other seasonal spotlights). Shelves that merely mirror a Charts Rankings query are omitted here since `/apple-podcasts/charts/rankings` already covers that data.\n- **Params:** `country` (string, optional) — Two-letter storefront country code\n\n### `apple_podcasts_search`\n\n- **HTTP:** `GET /apple-podcasts/search`\n- **What:** Search Apple Podcasts shows. Returns normalized Apple Podcasts shows from Apple's public iTunes Search API.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Number of shows per page; `page` (integer, optional) — Search page number (1-based); `term` (string, **required**) — Search term\n\n### `apple_podcasts_show`\n\n- **HTTP:** `GET /apple-podcasts/show/{id}`\n- **What:** Retrieve Apple Podcasts show details. Returns normalized show metadata from Apple's public iTunes Lookup API.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Podcasts show ID; `lang` (string, optional) — Result language tag\n\n### `apple_podcasts_show_episodes`\n\n- **HTTP:** `GET /apple-podcasts/show/{id}/episodes`\n- **What:** Retrieve Apple Podcasts show episodes. Returns a show and its public Apple Podcasts episodes from Apple's iTunes Lookup API.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Podcasts show ID; `lang` (string, optional) — Result language tag; `limit` (integer, optional) — Number of episodes to return\n\n### `apple_podcasts_show_related`\n\n- **HTTP:** `GET /apple-podcasts/show/{id}/related`\n- **What:** Retrieve Apple Podcasts \"You Might Also Like\" related shows. Returns the \"You Might Also Like\" rail for a single show, sourced from the modern podcasts.apple.com show page's listener-cohort recommendation data.\n- **Params:** `country` (string, optional) — Two-letter storefront country code; `id` (string, **required**) — Apple Podcasts show ID; `limit` (integer, optional) — Number of related shows to return, default 20, max 50\n\n## Discogs (7)\n\n### `discogs_artist`\n\n- **HTTP:** `GET /discogs/artist/{id}`\n- **What:** Get a Discogs artist profile. Returns a normalized Discogs artist profile: real name, bio, links, name variations, aliases, and group memberships. Credential-free official Discogs database data.\n- **Params:** `id` (string, **required**) — Discogs artist id\n\n### `discogs_artist_releases`\n\n- **HTTP:** `GET /discogs/artist/{id}/releases`\n- **What:** List a Discogs artist's releases. Returns an artist's paginated release/master credits (role, format, label, year, want/collection counts). Credential-free official Discogs database data.\n- **Params:** `id` (string, **required**) — Discogs artist id; `page` (integer, optional) — 1-based page number, default 1; `per_page` (integer, optional) — Results per page, default 50, max 100\n\n### `discogs_label`\n\n- **HTTP:** `GET /discogs/label/{id}`\n- **What:** Get a Discogs label profile. Returns a normalized Discogs label profile: profile text, contact info, parent label, and sub-labels. Credential-free official Discogs database data.\n- **Params:** `id` (string, **required**) — Discogs label id\n\n### `discogs_label_releases`\n\n- **HTTP:** `GET /discogs/label/{id}/releases`\n- **What:** List a Discogs label's releases. Returns a label's paginated release catalog (title, artist, format, catalog number, year). Credential-free official Discogs database data.\n- **Params:** `id` (string, **required**) — Discogs label id; `page` (integer, optional) — 1-based page number, default 1; `per_page` (integer, optional) — Results per page, default 50, max 100\n\n### `discogs_master`\n\n- **HTTP:** `GET /discogs/master/{id}`\n- **What:** Get a Discogs master release. Returns a normalized Discogs master release: the version-agnostic grouping of a release across pressings/reissues (artists, tracklist, genres/styles, videos, images, marketplace stats). Credential-free official Discogs database data.\n- **Params:** `id` (string, **required**) — Discogs master release id\n\n### `discogs_release`\n\n- **HTTP:** `GET /discogs/release/{id}`\n- **What:** Get a Discogs release. Returns a normalized Discogs release: artists, labels, formats, tracklist, credits, identifiers, videos, images, and community want/have/rating. Credential-free official Discogs database data (api.discogs.com).\n- **Params:** `id` (string, **required**) — Discogs release id\n\n### `discogs_search`\n\n- **HTTP:** `GET /discogs/search`\n- **What:** Search the Discogs database. Searches Discogs releases, masters, artists, and labels. Credential-free official Discogs database data.\n- **Params:** `page` (integer, optional) — 1-based page number, default 1; `per_page` (integer, optional) — Results per page, default 50, max 100; `q` (string, **required**) — Search query; `type` (string, optional) — Result type filter\n\n## SoundCloud (5)\n\n### `soundcloud_playlist`\n\n- **HTTP:** `GET /soundcloud/playlist`\n- **What:** Get a SoundCloud playlist or album's detail. Returns one playlist or album's metadata plus its full track list: owner, likes/reposts counts, and every track's title, artwork, and playback/likes counts. Public data sourced from SoundCloud's own JSON API.\n- **Params:** `url` (string, **required**) — Full soundcloud.com playlist/album URL (a playlist's permalink_url)\n\n### `soundcloud_profile`\n\n- **HTTP:** `GET /soundcloud/profile`\n- **What:** Get a SoundCloud user/artist profile. Returns one user/artist's profile: bio, avatar, followers/followings/track/playlist/likes counts, and verified status. Public data sourced from SoundCloud's own JSON API.\n- **Params:** `url` (string, **required**) — Full soundcloud.com user/artist profile URL\n\n### `soundcloud_search`\n\n- **HTTP:** `GET /soundcloud/search`\n- **What:** Search SoundCloud tracks. Returns tracks matching a query: title, artwork, playback/likes/comment/repost counts, and uploader. Public data sourced from SoundCloud's own JSON API.\n- **Params:** `limit` (integer, optional) — Number of tracks to return (default 20, max 50); `query` (string, **required**) — Search text\n\n### `soundcloud_track`\n\n- **HTTP:** `GET /soundcloud/track`\n- **What:** Get a SoundCloud track's detail. Returns one track's full metadata: title, artwork, description, genre, tags, playback/likes/comment/repost counts, and uploader. Public data sourced from SoundCloud's own JSON API.\n- **Params:** `url` (string, **required**) — Full soundcloud.com track URL (a track's permalink_url)\n\n### `soundcloud_user_tracks`\n\n- **HTTP:** `GET /soundcloud/user-tracks`\n- **What:** Get a SoundCloud user's own uploaded tracks. Returns a user/artist's own uploaded tracks, most recent first: title, artwork, playback/likes/comment/repost counts. Public data sourced from SoundCloud's own JSON API.\n- **Params:** `limit` (integer, optional) — Number of tracks to return (default 20, max 50); `url` (string, **required**) — Full soundcloud.com user/artist profile URL\n\nFile v1.0.16:skill-card.md\n\n## Description:\n\nResearches music, artists, playlists, and podcasts via the Crawlora API -- Spotify tracks/albums/artists/playlists/profiles, Spotify Podcasts, Apple Podcasts, Discogs, and SoundCloud tracks/profiles/playlists -- returning clean JSON.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[crawlora-org](https://clawhub.ai/user/crawlora-org)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and agents use this skill to look up public music, artist, playlist, podcast, Discogs, and SoundCloud information and return normalized JSON for research workflows.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Music and podcast lookup inputs are sent to Crawlora using the user's Crawlora API key.\n\nMitigation: Use a scoped private API key, set it only through CRAWLORA_API_KEY, and monitor credit usage.\n\nRisk: Authenticated POST requests and undocumented nested paths may exceed the documented read-only endpoint expectations.\n\nMitigation: Use documented endpoint paths and GET requests by default; avoid POST or undocumented nested paths unless the publisher documents and justifies them.\n\n## Reference(s):\n\n- [Endpoint Reference](reference/endpoints.md)\n- [Crawlora API Base](https://api.crawlora.net/api/v1)\n- [Crawlora](https://crawlora.net)\n- [ClawHub Skill Page](https://clawhub.ai/crawlora-org/skills/music-podcast-research)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with shell command examples and JSON API responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires CRAWLORA_API_KEY and sends requests to the Crawlora API.]\n\n## Skill Version(s):\n\n1.0.16 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.15: 5 files, 11528 bytes\n\nFiles: reference/endpoints.md (33054b), scripts/crawlora.sh (5180b), skill-card.md (2041b), SKILL.md (5956b), _meta.json (142b)\n\nFile v1.0.15:SKILL.md\n\n---\nname: music-podcast-research\ndescription: Researches music, artists, playlists, and podcasts via the Crawlora API — Spotify tracks/albums/artists/playlists/profiles, Spotify Podcasts, Apple Podcasts, Discogs, and SoundCloud tracks/profiles/playlists — returning clean JSON. Use when the user wants a track/album/artist's details, a playlist or profile, podcast show/episode info and charts, a record's Discogs release/pressing data, or a SoundCloud track/user's stats.\n---\n\n# Music & podcast research\n\nLook up tracks, albums, artists, playlists, and podcast shows/episodes across\nSpotify, Spotify Podcasts, Apple Podcasts, Discogs, and SoundCloud as\nnormalized JSON from the Crawlora API — no scraping streaming-app pages.\n\n## When to use this skill\n\n- \"Find this track/album/artist on Spotify\" / \"what's on this playlist?\"\n- \"Look up a Spotify user's public profile/playlists.\"\n- \"What podcasts/episodes are trending?\" (Spotify Podcasts, Apple Podcasts charts)\n- \"Get details for this podcast show/episode.\"\n- \"What pressings/releases exist for this record?\" (Discogs — vinyl/collector data)\n- \"Look up this SoundCloud track/user\" / \"how many plays/likes does this\n  track have?\" / \"what has this artist uploaded to SoundCloud?\"\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\n1. **Spotify** — search first: `/spotify/search` (or the scoped\n   `/spotify/tracks/search`, `/spotify/artists/search`, `/spotify/albums/search`,\n   `/spotify/playlists/search`, `/spotify/profiles/search`) with `q`. Detail\n   endpoints (`/spotify/track`, `/spotify/album`, `/spotify/artist`,\n   `/spotify/playlist`, `/spotify/profile`) accept **either** `id` or `uri`\n   (a Spotify URI like `spotify:track:...`) — pass whichever you have.\n   `/spotify/artist/related`, `/spotify/track/recommended`, and\n   `/spotify/track/similar-albums` cover discovery.\n2. **Spotify Podcasts** — `/spotify-podcasts/search`, `/spotify-podcasts/show`\n   (by `uri`), `/spotify-podcasts/show/episodes`, `/spotify-podcasts/charts`.\n3. **Apple Podcasts** — `/apple-podcasts/search` (`term`), `/apple-podcasts/show/{id}`,\n   `/apple-podcasts/show/{id}/episodes`, `/apple-podcasts/charts` /\n   `/apple-podcasts/charts/rankings` for what's popular by country.\n4. **Discogs** — `/discogs/search` (`q`, optional `type` = release/master/\n   artist/label) to find an id, then `/discogs/release/{id}`,\n   `/discogs/master/{id}`, `/discogs/artist/{id}`, `/discogs/label/{id}`\n   for detail (+ `/releases` sub-paths for an artist's/label's catalog).\n5. **SoundCloud** — `/soundcloud/search` (`query`) to find a track, then\n   `/soundcloud/track` (`url` — a track's full `permalink_url`) for its\n   full metadata and play/like/comment/repost counts. `/soundcloud/profile`\n   (`url` — a user's profile URL) gets bio and follower/track counts;\n   `/soundcloud/user-tracks` (`url`) lists that user's own uploads;\n   `/soundcloud/playlist` (`url`) gets a playlist/album's metadata and\n   full track list.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Spotify:\nscripts/crawlora.sh /spotify/search q=\"Daft Punk\" | jq '.'\nscripts/crawlora.sh /spotify/artist id=4tZwfgrHOc3mvqYlEYSvVi | jq '.'\n\n# Podcasts:\nscripts/crawlora.sh /apple-podcasts/search term=\"Reply All\" | jq '.'\nscripts/crawlora.sh /spotify-podcasts/charts | jq '.'\n\n# Discogs:\nscripts/crawlora.sh /discogs/search q=\"Random Access Memories\" type=release | jq '.'\nscripts/crawlora.sh /discogs/release/4818226 | jq '.'\n\n# SoundCloud:\nscripts/crawlora.sh /soundcloud/search query=\"lofi hip hop\" | jq '.'\nscripts/crawlora.sh /soundcloud/track url=\"https://soundcloud.com/artist/track-name\" | jq '.'\n```\n\nUse `scripts/crawlora.sh` for all requests; it keeps the API key out of command-line arguments.\n\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for every Spotify,\nSpotify Podcasts, Apple Podcasts, Discogs, and SoundCloud endpoint this\nskill uses.\n\n## Examples\n\n- **Artist deep-dive:** `/spotify/artist` + `/spotify/artist/albums` +\n  `/spotify/artist/related` for a full discography and similar-artist map.\n- **Podcast discovery:** `/spotify-podcasts/charts` or\n  `/apple-podcasts/charts` to find what's trending, then\n  `/spotify-podcasts/show/episodes` for a show's back catalog.\n- **Collector research:** `/discogs/search` for a release, then\n  `/discogs/release/{id}` for pressing details (format, year, label,\n  condition-relevant metadata).\n- **SoundCloud artist catalog:** `/soundcloud/profile` for a user's\n  follower/track counts, then `/soundcloud/user-tracks` for their own\n  uploads with per-track play/like/comment/repost counts.\n\n## Notes & limits\n\n- **Credits / pay-on-success:** billed only on `2xx`; free tier 2,000 credits/mo.\n  Key at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- **Public data only** — public catalog/profile/chart pages.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- **Spotify detail endpoints need an `id` or `uri`** — resolve one via the\n  matching `.../search` endpoint first if you only have a name.\n- **SoundCloud detail endpoints need a full `url`** (a track/playlist/user's\n  `permalink_url`, e.g. `https://soundcloud.com/artist/track-name`) —\n  there's no numeric-id lookup, so pull the URL from `/soundcloud/search`\n  results first if you only have a name.\n- Search endpoints are paginated (`limit`/`offset` or `page`) — walk pages\n  for full coverage.\n\nFile v1.0.15:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"music-podcast-research\",\n  \"version\": \"1.0.15\",\n  \"publishedAt\": 1789042568128\n}\n\nFile v1.0.15:reference/endpoints.md\n\n# music-podcast-research — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**58 endpoints across 5 platform group(s).**\n\n## Spotify (30)\n\n### `spotify_album`\n\n- **HTTP:** `GET /spotify/album`\n- **What:** Retrieve Spotify album details. Returns normalized Spotify Web Player album metadata and tracks from private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify album ID; `limit` (integer, optional) — Track limit, clamped to 1-50; `offset` (integer, optional) — Track offset; `uri` (string, optional) — Spotify album URI or open.spotify.com album URL\n\n### `spotify_album_tracks`\n\n- **HTTP:** `GET /spotify/album/tracks`\n- **What:** Retrieve Spotify album tracks. Returns normalized Spotify Web Player album tracks from private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify album ID; `limit` (integer, optional) — Track limit, clamped to 1-50; `offset` (integer, optional) — Track offset; `uri` (string, optional) — Spotify album URI or open.spotify.com album URL\n\n### `spotify_albums_search`\n\n- **HTTP:** `GET /spotify/albums/search`\n- **What:** Search Spotify albums. Returns normalized Spotify Web Player album search results for a search term. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `include_album_pre_releases` (boolean, optional) — Include album pre-release results; `include_audiobooks` (boolean, optional) — Include audiobook context where available; `include_authors` (boolean, optional) — Include authors; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `include_pre_releases` (boolean, optional) — Include pre-release results; `limit` (integer, optional) — Album result limit, clamped to 1-50; `number_of_top_results` (integer, optional) — Top result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_artist`\n\n- **HTTP:** `GET /spotify/artist`\n- **What:** Retrieve Spotify artist details. Returns normalized Spotify Web Player artist overview data from private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify artist ID; `uri` (string, optional) — Spotify artist URI or open.spotify.com artist URL\n\n### `spotify_artist_albums`\n\n- **HTTP:** `GET /spotify/artist/albums`\n- **What:** Retrieve Spotify artist albums. Returns artist discography items from Spotify Web Player private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify artist ID; `limit` (integer, optional) — Limit, clamped to 1-50; `offset` (integer, optional) — Offset; `order` (string, optional) — date_desc, date_asc, name_asc, or name_desc; `type` (string, optional) — album, single, compilation, appears_on, or all; `uri` (string, optional) — Spotify artist URI or open.spotify.com artist URL\n\n### `spotify_artist_playlists`\n\n- **HTTP:** `GET /spotify/artist/playlists`\n- **What:** Retrieve Spotify artist playlists. Returns artist playlists from Spotify Web Player private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify artist ID; `uri` (string, optional) — Spotify artist URI or open.spotify.com artist URL\n\n### `spotify_artist_related`\n\n- **HTTP:** `GET /spotify/artist/related`\n- **What:** Retrieve Spotify related artists. Returns related artists from Spotify Web Player private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify artist ID; `uri` (string, optional) — Spotify artist URI or open.spotify.com artist URL\n\n### `spotify_artists_search`\n\n- **HTTP:** `GET /spotify/artists/search`\n- **What:** Search Spotify artists. Returns normalized Spotify Web Player artist search results for a search term.\n- **Params:** `limit` (integer, optional) — Result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_audiobook`\n\n- **HTTP:** `GET /spotify/audiobook`\n- **What:** Retrieve Spotify audiobook details. Returns Spotify Web Player audiobook metadata from private Pathfinder responses. Spotify exposes audiobooks through show URIs.\n- **Params:** `id` (string, optional) — Spotify show ID; `uri` (string, optional) — Spotify audiobook/show URI or open.spotify.com show URL\n\n### `spotify_audiobook_chapters`\n\n- **HTTP:** `GET /spotify/audiobook/chapters`\n- **What:** Retrieve Spotify audiobook chapters. Returns audiobook chapters from Spotify Web Player private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify show ID; `limit` (integer, optional) — Chapter limit, clamped to 1-50; `offset` (integer, optional) — Chapter offset; `uri` (string, optional) — Spotify audiobook/show URI or open.spotify.com show URL\n\n### `spotify_audiobooks_search`\n\n- **HTTP:** `GET /spotify/audiobooks/search`\n- **What:** Search Spotify audiobooks. Returns normalized Spotify Web Player audiobook search results for a search term. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `include_album_pre_releases` (boolean, optional) — Include album pre-release results; `include_audiobooks` (boolean, optional) — Include audiobook results; `include_authors` (boolean, optional) — Include authors; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `include_pre_releases` (boolean, optional) — Include pre-release results; `limit` (integer, optional) — Audiobook result limit, clamped to 1-50; `number_of_top_results` (integer, optional) — Top result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_chapter`\n\n- **HTTP:** `GET /spotify/chapter`\n- **What:** Retrieve Spotify audiobook chapter details. Returns a Spotify chapter from the same private Pathfinder operation used for episodes and chapters.\n- **Params:** `id` (string, optional) — Spotify chapter/episode ID; `uri` (string, optional) — Spotify chapter or episode URI/URL\n\n### `spotify_episodes_search`\n\n- **HTTP:** `GET /spotify/episodes/search`\n- **What:** Search Spotify episodes. Returns normalized Spotify Web Player episode search results for a search term.\n- **Params:** `limit` (integer, optional) — Result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_featured_charts_by_country`\n\n- **HTTP:** `GET /spotify/featured-charts-by-country`\n- **What:** Retrieve Spotify featured charts by country. Returns normalized Spotify country hub content from Spotify's countryHubContent Pathfinder response. Defaults to the CHARTS content shelf for the requested country.\n- **Params:** `content_id` (string, optional) — Country hub content ID. Allowed: CHARTS, POPULAR_ALBUMS, POPULAR_ARTISTS, TRENDING_SONGS; `country_code` (string, optional) — Two-letter Spotify popular-in country code\n\n### `spotify_genre`\n\n- **HTTP:** `GET /spotify/genre`\n- **What:** Retrieve Spotify genre page. Returns normalized sections and items from Spotify's browsePage Pathfinder response for a Spotify genre or page URI.\n- **Params:** `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `page_limit` (integer, optional) — Page pagination limit, clamped to 1-50; `page_offset` (integer, optional) — Page pagination offset; `section_limit` (integer, optional) — Section pagination limit, clamped to 1-50; `section_offset` (integer, optional) — Section pagination offset; `uri` (string, optional) — Spotify genre or page URI\n\n### `spotify_home`\n\n- **HTTP:** `GET /spotify/home`\n- **What:** Retrieve Spotify home sections. Returns normalized shelves and items from Spotify's Web Player home Pathfinder response. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `facet` (string, optional) — Optional Spotify home facet; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `section_items_limit` (integer, optional) — Per-section item limit, clamped to 1-50; `sp_t` (string, optional) — Optional Spotify session token. A random UUID is generated when omitted; `time_zone` (string, optional) — IANA time zone used by Spotify home personalization\n\n### `spotify_playlist`\n\n- **HTTP:** `GET /spotify/playlist`\n- **What:** Retrieve Spotify playlist details. Returns normalized Spotify Web Player playlist metadata and items from Spotify's fetchPlaylist Pathfinder response. Provide either uri or id; defaults to a known public playlist when omitted.\n- **Params:** `enable_watch_feed_entrypoint` (boolean, optional) — Enable watch feed entrypoint; `id` (string, optional) — Spotify playlist ID. Used when uri is omitted; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `limit` (integer, optional) — Playlist item limit, clamped to 1-50; `offset` (integer, optional) — Playlist item offset; `uri` (string, optional) — Spotify playlist URI or open.spotify.com playlist URL\n\n### `spotify_playlists_search`\n\n- **HTTP:** `GET /spotify/playlists/search`\n- **What:** Search Spotify playlists. Returns normalized Spotify Web Player playlist search results for a search term. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `include_album_pre_releases` (boolean, optional) — Include album pre-release results; `include_audiobooks` (boolean, optional) — Include audiobook context where available; `include_authors` (boolean, optional) — Include authors; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `include_pre_releases` (boolean, optional) — Include pre-release results; `limit` (integer, optional) — Playlist result limit, clamped to 1-50; `number_of_top_results` (integer, optional) — Top result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_popular_by_country`\n\n- **HTTP:** `GET /spotify/popular-by-country`\n- **What:** Retrieve Spotify popular by country. Returns normalized Spotify country hub shelves from Spotify's countryHubsPage Pathfinder response. The country_code parameter accepts Spotify popular-in country codes from open.spotify.com/popular-in/us.\n- **Params:** `country_code` (string, optional) — Two-letter Spotify popular-in country code\n\n### `spotify_profile`\n\n- **HTTP:** `GET /spotify/profile`\n- **What:** Retrieve Spotify public profile. Returns normalized public profile metadata and preview playlists from Spotify's Web Player user-profile service. Provide username, uri, or url; defaults to Spotify's official profile.\n- **Params:** `artist_limit` (integer, optional) — Recently played artist limit, clamped to 0-50; `episode_limit` (integer, opt\n\nArchive v1.0.14: 5 files, 11484 bytes\n\nFiles: reference/endpoints.md (33054b), scripts/crawlora.sh (4855b), skill-card.md (2279b), SKILL.md (5988b), _meta.json (142b)\n\nArchive v1.0.13: 5 files, 11417 bytes\n\nFiles: reference/endpoints.md (33054b), scripts/crawlora.sh (4555b), skill-card.md (2495b), SKILL.md (5988b), _meta.json (142b)\n\nArchive v1.0.11: 5 files, 11316 bytes\n\nFiles: reference/endpoints.md (33054b), scripts/crawlora.sh (4507b), skill-card.md (2319b), SKILL.md (5988b), _meta.json (142b)\n\nArchive v1.0.10: 5 files, 10464 bytes\n\nFiles: reference/endpoints.md (33054b), scripts/crawlora.sh (2005b), skill-card.md (2043b), SKILL.md (5962b), _meta.json (142b)\n\nArchive v1.0.9: 5 files, 10411 bytes\n\nFiles: reference/endpoints.md (33054b), scripts/crawlora.sh (1870b), skill-card.md (2083b), SKILL.md (5962b), _meta.json (141b)\n\nArchive v1.0.8: 5 files, 10422 bytes\n\nFiles: reference/endpoints.md (33054b), scripts/crawlora.sh (1796b), skill-card.md (2242b), SKILL.md (5962b), _meta.json (141b)","readmeExcerpt":"Skill: music-podcast-research Owner: crawlora-org Summary: Researches music, artists, playlists, and podcasts via the Crawlora API — Spotify tracks/albums/artists/playlists/profiles, Spotify Podcasts, Apple Podcasts, Discogs, and SoundCloud tracks/profiles/playlists — returning clean JSON. Use when the user wants a track/album/artist's details, a playlist or profile, podcast show/episode info and charts, a record's D","codeSnippets":[],"executableExamples":[{"language":"sh","snippet":"# Spotify:\nscripts/crawlora.sh /spotify/search q=\"Daft Punk\" | jq '.'\nscripts/crawlora.sh /spotify/artist id=4tZwfgrHOc3mvqYlEYSvVi | jq '.'\n\n# Podcasts:\nscripts/crawlora.sh /apple-podcasts/search term=\"Reply All\" | jq '.'\nscripts/crawlora.sh /spotify-podcasts/charts | jq '.'\n\n# Discogs:\nscripts/crawlora.sh /discogs/search q=\"Random Access Memories\" type=release | jq '.'\nscripts/crawlora.sh /discogs/release/4818226 | jq '.'\n\n# SoundCloud:\nscripts/crawlora.sh /soundcloud/search query=\"lofi hip hop\" | jq '.'\nscripts/crawlora.sh /soundcloud/track url=\"https://soundcloud.com/artist/track-name\" | jq '.'"},{"language":"sh","snippet":"# Spotify:\nscripts/crawlora.sh /spotify/search q=\"Daft Punk\" | jq '.'\nscripts/crawlora.sh /spotify/artist id=4tZwfgrHOc3mvqYlEYSvVi | jq '.'\n\n# Podcasts:\nscripts/crawlora.sh /apple-podcasts/search term=\"Reply All\" | jq '.'\nscripts/crawlora.sh /spotify-podcasts/charts | jq '.'\n\n# Discogs:\nscripts/crawlora.sh /discogs/search q=\"Random Access Memories\" type=release | jq '.'\nscripts/crawlora.sh /discogs/release/4818226 | jq '.'\n\n# SoundCloud:\nscripts/crawlora.sh /soundcloud/search query=\"lofi hip hop\" | jq '.'\nscripts/crawlora.sh /soundcloud/track url=\"https://soundcloud.com/artist/track-name\" | jq '.'"},{"language":"sh","snippet":"# Spotify:\nscripts/crawlora.sh /spotify/search q=\"Daft Punk\" | jq '.'\nscripts/crawlora.sh /spotify/artist id=4tZwfgrHOc3mvqYlEYSvVi | jq '.'\n\n# Podcasts:\nscripts/crawlora.sh /apple-podcasts/search term=\"Reply All\" | jq '.'\nscripts/crawlora.sh /spotify-podcasts/charts | jq '.'\n\n# Discogs:\nscripts/crawlora.sh /discogs/search q=\"Random Access Memories\" type=release | jq '.'\nscripts/crawlora.sh /discogs/release/4818226 | jq '.'\n\n# SoundCloud:\nscripts/crawlora.sh /soundcloud/search query=\"lofi hip hop\" | jq '.'\nscripts/crawlora.sh /soundcloud/track url=\"https://soundcloud.com/artist/track-name\" | jq '.'"},{"language":"sh","snippet":"# Spotify:\nscripts/crawlora.sh /spotify/search q=\"Daft Punk\" | jq '.'\nscripts/crawlora.sh /spotify/artist id=4tZwfgrHOc3mvqYlEYSvVi | jq '.'\n\n# Podcasts:\nscripts/crawlora.sh /apple-podcasts/search term=\"Reply All\" | jq '.'\nscripts/crawlora.sh /spotify-podcasts/charts | jq '.'\n\n# Discogs:\nscripts/crawlora.sh /discogs/search q=\"Random Access Memories\" type=release | jq '.'\nscripts/crawlora.sh /discogs/release/4818226 | jq '.'\n\n# SoundCloud:\nscripts/crawlora.sh /soundcloud/search query=\"lofi hip hop\" | jq '.'\nscripts/crawlora.sh /soundcloud/track url=\"https://soundcloud.com/artist/track-name\" | jq '.'"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: music-podcast-research\ndescription: Researches music, artists, playlists, and podcasts via the Crawlora API — Spotify tracks/albums/artists/playlists/profiles, Spotify Podcasts, Apple Podcasts, Discogs, and SoundCloud tracks/profiles/playlists — returning clean JSON. Use when the user wants a track/album/artist's details, a playlist or profile, podcast show/episode info and charts, a record's Discogs release/pressing data, or a SoundCloud track/user's stats.\n---\n\n# Music & podcast research\n\nLook up tracks, albums, artists, playlists, and podcast shows/episodes across\nSpotify, Spotify Podcasts, Apple Podcasts, Discogs, and SoundCloud as\nnormalized JSON from the Crawlora API — no scraping streaming-app pages.\n\n## When to use this skill\n\n- \"Find this track/album/artist on Spotify\" / \"what's on this playlist?\"\n- \"Look up a Spotify user's public profile/playlists.\"\n- \"What podcasts/episodes are trending?\" (Spotify Podcasts, Apple Podcasts charts)\n- \"Get details for this podcast show/episode.\"\n- \"What pressings/releases exist for this record?\" (Discogs — vinyl/collector data)\n- \"Look up this SoundCloud track/user\" / \"how many plays/likes does this\n  track have?\" / \"what has this artist uploaded to SoundCloud?\"\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\n1. **Spotify** — search first: `/spotify/search` (or the scoped\n   `/spotify/tracks/search`, `/spotify/artists/search`, `/spotify/albums/search`,\n   `/spotify/playlists/search`, `/spotify/profiles/search`) with `q`. Detail\n   endpoints (`/spotify/track`, `/spotify/album`, `/spotify/artist`,\n   `/spotify/playlist`, `/spotify/profile`) accept **either** `id` or `uri`\n   (a Spotify URI like `spotify:track:...`) — pass whichever you have.\n   `/spotify/artist/related`, `/spotify/track/recommended`, and\n   `/spotify/track/similar-albums` cover discovery.\n2. **Spotify Podcasts** — `/spotify-podcasts/search`, `/spotify-podcasts/show`\n   (by `uri`), `/spotify-podcasts/show/episodes`, `/spotify-podcasts/charts`.\n3. **Apple Podcasts** — `/apple-podcasts/search` (`term`), `/apple-podcasts/show/{id}`,\n   `/apple-podcasts/show/{id}/episodes`, `/apple-podcasts/charts` /\n   `/apple-podcasts/charts/rankings` for what's popular by country.\n4. **Discogs** — `/discogs/search` (`q`, optional `type` = release/master/\n   artist/label) to find an id, then `/discogs/release/{id}`,\n   `/discogs/master/{id}`, `/discogs/artist/{id}`, `/discogs/label/{id}`\n   for detail (+ `/releases` sub-paths for an artist's/label's catalog).\n5. **SoundCloud** — `/soundcloud/search` (`query`) to find a track, then\n   `/soundcloud/track` (`url` — a track's fu"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"music-podcast-research\",\n  \"version\": \"1.0.18\",\n  \"publishedAt\": 1789640447929\n}"},{"path":"reference/endpoints.md","content":"# music-podcast-research — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**58 endpoints across 5 platform group(s).**\n\n## Spotify (30)\n\n### `spotify_album`\n\n- **HTTP:** `GET /spotify/album`\n- **What:** Retrieve Spotify album details. Returns normalized Spotify Web Player album metadata and tracks from private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify album ID; `limit` (integer, optional) — Track limit, clamped to 1-50; `offset` (integer, optional) — Track offset; `uri` (string, optional) — Spotify album URI or open.spotify.com album URL\n\n### `spotify_album_tracks`\n\n- **HTTP:** `GET /spotify/album/tracks`\n- **What:** Retrieve Spotify album tracks. Returns normalized Spotify Web Player album tracks from private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify album ID; `limit` (integer, optional) — Track limit, clamped to 1-50; `offset` (integer, optional) — Track offset; `uri` (string, optional) — Spotify album URI or open.spotify.com album URL\n\n### `spotify_albums_search`\n\n- **HTTP:** `GET /spotify/albums/search`\n- **What:** Search Spotify albums. Returns normalized Spotify Web Player album search results for a search term. The endpoint fetches anonymous Spotify credentials at request time; caller-supplied Spotify bearer or client tokens are not required.\n- **Params:** `include_album_pre_releases` (boolean, optional) — Include album pre-release results; `include_audiobooks` (boolean, optional) — Include audiobook context where available; `include_authors` (boolean, optional) — Include authors; `include_episode_content_ratings_v2` (boolean, optional) — Include Spotify episode content ratings v2; `include_pre_releases` (boolean, optional) — Include pre-release results; `limit` (integer, optional) — Album result limit, clamped to 1-50; `number_of_top_results` (integer, optional) — Top result limit, clamped to 1-50; `offset` (integer, optional) — Search offset; `q` (string, **required**) — Search term\n\n### `spotify_artist`\n\n- **HTTP:** `GET /spotify/artist`\n- **What:** Retrieve Spotify artist details. Returns normalized Spotify Web Player artist overview data from private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify artist ID; `uri` (string, optional) — Spotify artist URI or open.spotify.com artist URL\n\n### `spotify_artist_albums`\n\n- **HTTP:** `GET /spotify/artist/albums`\n- **What:** Retrieve Spotify artist albums. Returns artist discography items from Spotify Web Player private Pathfinder responses.\n- **Params:** `id` (string, optional) — Spotify artist ID; `limit` (in"},{"path":"skill-card.md","content":"## Description:\n\nResearches music, artists, playlists, and podcasts through the Crawlora API for Spotify, Spotify Podcasts, Apple Podcasts, Discogs, and SoundCloud, returning normalized JSON for catalog, profile, chart, episode, release, and track lookups.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[crawlora-org](https://clawhub.ai/user/crawlora-org)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and developers use this skill to look up public music, podcast, playlist, profile, chart, SoundCloud, and Discogs release data through Crawlora and receive normalized JSON suitable for agent responses or follow-up analysis.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Lookup terms and public profile URLs are sent to Crawlora's external API.\n\nMitigation: Use the skill only for public music, podcast, Discogs, Spotify, and SoundCloud lookups, and avoid sensitive or private profile information.\n\nRisk: The skill requires a Crawlora API key.\n\nMitigation: Keep CRAWLORA_API_KEY in the environment and do not hardcode, query-string, or commit it.\n\n## Reference(s):\n\n- [Endpoint reference](reference/endpoints.md)\n- [ClawHub skill page](https://clawhub.ai/crawlora-org/skills/music-podcast-research)\n- [Crawlora](https://crawlora.net)\n\n## Skill Output:\n\n**Output Type(s):** [JSON, Shell commands, Configuration, Guidance]\n\n**Output Format:** [JSON responses with Markdown guidance and inline shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Uses a Crawlora API key from CRAWLORA_API_KEY and is limited to documented read-only GET routes.]\n\n## Skill Version(s):\n\n1.0.18 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1544,"uniquenessScore":37,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T18:39:53.064Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T18:39:53.064Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-12T02:45:25.695Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}