{"files":{"SKILL.md":"---\nname: aggregators-api-service\ndescription: \"Aggregators API Service API skill. Use when working with Aggregators API Service for podcast-bot, api, stats. Covers 51 endpoints.\"\nversion: 1.0.0\ngenerator: lapsh\n---\n\n# Aggregators API Service\nAPI version: 0.77-dadb296\n\n## Auth\nApiKey x-zeno-api-key in header | Bearer basic\n\n## Base URL\nhttps://api.zeno.fm\n\n## Setup\n1. Set Authorization header with Bearer token\n2. GET /podcast-bot/podcasts/list -- list podcasts\n3. POST /stats/mounts/{mount}/auth-cache/reload -- create first reload\n\n## Endpoints\n51 endpoints across 4 groups. See references/api-spec.lap for full details.\n\n### Podcast-bot\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /podcast-bot/podcasts/{podcastKey} | Get podcast |\n| PUT | /podcast-bot/podcasts/{podcastKey} | Update podcast info |\n| DELETE | /podcast-bot/podcasts/{podcastKey} | Delete podcast |\n| PUT | /podcast-bot/podcasts/{podcastKey}/recordingConfig | Update podcast recording configuration |\n| PUT | /podcast-bot/podcasts/{podcastKey}/processingPresets | Update podcast processing presets |\n| PUT | /podcast-bot/podcasts/{podcastKey}/interviewPresets | Update podcast interview extraction presets |\n| PUT | /podcast-bot/podcasts/{podcastKey}/episodes/{episodeKey}/unpublish | Unpublish podcast episode |\n| PUT | /podcast-bot/podcasts/{podcastKey}/episodes/{episodeKey}/publish | Publish podcast episode |\n| PUT | /podcast-bot/podcasts/{podcastKey}/aiAdsPresets | Update podcast AI Ads presets |\n| POST | /podcast-bot/workflows/process-file | Process file |\n| POST | /podcast-bot/podcasts/{podcastKey}/episodes/{episodeKey}/reprocess | Reprocess episode |\n| POST | /podcast-bot/podcasts/{podcastKey}/episodes/{episodeKey}/reprocess/custom | Reprocess episode with custom presets |\n| POST | /podcast-bot/podcasts/recording/create | Create recording podcast |\n| GET | /podcast-bot/workflows/{workflowId}/details | Get workflow details |\n| GET | /podcast-bot/podcasts/{podcastKey}/episodes | Get podcast episodes |\n| GET | /podcast-bot/podcasts/{podcastKey}/episodes/{episodeKey} | Get podcast episode |\n| DELETE | /podcast-bot/podcasts/{podcastKey}/episodes/{episodeKey} | Delete podcast episode |\n| GET | /podcast-bot/podcasts/{podcastKey}/episodes/{episodeKey}/metadata | Get metadata for a podcast episode |\n| GET | /podcast-bot/podcasts/{podcastKey}/episodes/{episodeKey}/adsMarkers | Get Ads markers info for a podcast episode |\n| GET | /podcast-bot/podcasts/{podcastKey}/episodes/interviews | Get podcast interviews |\n| GET | /podcast-bot/podcasts/list | List podcasts |\n| GET | /podcast-bot/jobs/podcasts/{podcastKey} | Get all processing jobs for a podcast |\n| GET | /podcast-bot/jobs/podcasts/{podcastKey}/episodes/{episodeKey} | Get processing jobs for a podcast episode |\n\n### Api\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /api/v2/podcasts/{podcastKey} | Get podcast |\n| PUT | /api/v2/podcasts/{podcastKey} | Update podcast |\n| DELETE | /api/v2/podcasts/{podcastKey} | Delete podcast |\n| GET | /api/v2/podcasts/{podcastKey}/episodes/{episodeKey} | Get podcast episode |\n| PUT | /api/v2/podcasts/{podcastKey}/episodes/{episodeKey} | Update podcast episode |\n| DELETE | /api/v2/podcasts/{podcastKey}/episodes/{episodeKey} | Delete podcast episode |\n| POST | /api/v2/stations/search | Search stations |\n| POST | /api/v2/stations/listener/location | Get top stations by listener location |\n| POST | /api/v2/podcasts/{podcastKey}/episodes/create | Create podcast episode |\n| POST | /api/v2/podcasts/search | Search podcasts |\n| POST | /api/v2/podcasts/create | Create podcast |\n| GET | /api/v2/stations/{stationKey} | Get station |\n| GET | /api/v2/stations/list | List stations |\n| GET | /api/v2/stations/languages | Get the list of Languages that can be used to filter stations in the search stations request |\n| GET | /api/v2/stations/genres | Get the list of Genres that can be used to filter stations in the search stations request |\n| GET | /api/v2/stations/countries | Get the list of Countries that can be used to filter stations in the search stations request |\n| GET | /api/v2/stations/browse | Browse all stations |\n| GET | /api/v2/podcasts/{podcastKey}/episodes | Get podcast episodes |\n| GET | /api/v2/podcasts/languages | Get the list of Languages that can be used to filter podcasts in the search podcasts request |\n| GET | /api/v2/podcasts/countries | Get the list of Countries that can be used to filter podcasts in the search podcasts request |\n| GET | /api/v2/podcasts/categories | Get the list of Categories that can be used to filter podcasts in the search podcasts request |\n\n### Stats\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /stats/mounts/{mount}/auth-cache/reload | Retrieve total numer of live stats for a specific mount |\n| POST | /stats/mounts/{mount}/auth-cache/reload/all | Retrieve total numer of live stats for a specific mount |\n| GET | /stats/mounts/{mount}/live/total | Retrieve total numer of live stats for a specific mount |\n\n### Partners\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /partners/streams | Get the partner information for a list of streams. |\n| GET | /partners/{partnerId}/ads/stats | Retrieve partner stats |\n| GET | /partners/streams/{streamId} | Get the stream partner information. |\n| GET | /partners/streams/{streamId}/tracks | Get the stream partner information. |\n\n## Common Questions\nMatch user requests to endpoints in references/api-spec.lap. Key patterns:\n- \"Get podcast details?\" -> GET /podcast-bot/podcasts/{podcastKey}\n- \"Update a podcast?\" -> PUT /podcast-bot/podcasts/{podcastKey}\n- \"Delete a podcast?\" -> DELETE /podcast-bot/podcasts/{podcastKey}\n- \"Get episode details?\" -> GET /api/v2/podcasts/{podcastKey}/episodes/{episodeKey}\n- \"Update a episode?\" -> PUT /api/v2/podcasts/{podcastKey}/episodes/{episodeKey}\n- \"Delete a episode?\" -> DELETE /api/v2/podcasts/{podcastKey}/episodes/{episodeKey}\n- \"Create a reload?\" -> POST /stats/mounts/{mount}/auth-cache/reload\n- \"Create a all?\" -> POST /stats/mounts/{mount}/auth-cache/reload/all\n- \"Create a process-file?\" -> POST /podcast-bot/workflows/process-file\n- \"Create a reprocess?\" -> POST /podcast-bot/podcasts/{podcastKey}/episodes/{episodeKey}/reprocess\n- \"Create a custom?\" -> POST /podcast-bot/podcasts/{podcastKey}/episodes/{episodeKey}/reprocess/custom\n- \"Create a create?\" -> POST /podcast-bot/podcasts/recording/create\n- \"Create a stream?\" -> POST /partners/streams\n- \"Create a search?\" -> POST /api/v2/stations/search\n- \"Create a location?\" -> POST /api/v2/stations/listener/location\n- \"List all total?\" -> GET /stats/mounts/{mount}/live/total\n- \"List all details?\" -> GET /podcast-bot/workflows/{workflowId}/details\n- \"List all episodes?\" -> GET /podcast-bot/podcasts/{podcastKey}/episodes\n- \"List all metadata?\" -> GET /podcast-bot/podcasts/{podcastKey}/episodes/{episodeKey}/metadata\n- \"List all adsMarkers?\" -> GET /podcast-bot/podcasts/{podcastKey}/episodes/{episodeKey}/adsMarkers\n- \"List all interviews?\" -> GET /podcast-bot/podcasts/{podcastKey}/episodes/interviews\n- \"List all list?\" -> GET /podcast-bot/podcasts/list\n- \"List all stats?\" -> GET /partners/{partnerId}/ads/stats\n- \"Get stream details?\" -> GET /partners/streams/{streamId}\n- \"List all tracks?\" -> GET /partners/streams/{streamId}/tracks\n- \"Get station details?\" -> GET /api/v2/stations/{stationKey}\n- \"List all languages?\" -> GET /api/v2/stations/languages\n- \"List all genres?\" -> GET /api/v2/stations/genres\n- \"List all countries?\" -> GET /api/v2/stations/countries\n- \"List all browse?\" -> GET /api/v2/stations/browse\n- \"List all categories?\" -> GET /api/v2/podcasts/categories\n- \"How to authenticate?\" -> See Auth section above\n\n## Response Tips\n- Check response schemas in references/api-spec.lap for field details\n- Paginated endpoints accept limit/offset or cursor parameters\n- Create/update endpoints return the modified resource on success\n\n## References\n- Full spec: See references/api-spec.lap for complete endpoint details, parameter tables, and response schemas\n\n> Generated from the official API spec by [LAP](https://lap.sh)\n","references/api-spec.lap":"@lap v0.3\n# Machine-readable API spec. Each @endpoint block is one API call.\n@api Aggregators API Service\n@base https://api.zeno.fm\n@version 0.76-ef1a2db\n@auth ApiKey x-zeno-api-key in header | Bearer basic\n@endpoints 51\n@hint download_for_search\n@toc podcast-bot(23), api(21), stats(3), partners(4)\n\n@group podcast-bot\n@endpoint GET /podcast-bot/podcasts/{podcastKey}\n@desc Get podcast\n@required {podcastKey: str}\n@returns(200) OK\n\n@endpoint PUT /podcast-bot/podcasts/{podcastKey}\n@desc Update podcast info\n@required {podcastKey: str, title: str, description: str, ownerName: str, ownerEmail: str, categories: [str], language: str}\n@optional {key: str, coverArtUrl: str, summary: str, link: str, explicit: bool, interviewPodcastKey: str}\n@returns(200) OK\n\n@endpoint DELETE /podcast-bot/podcasts/{podcastKey}\n@desc Delete podcast\n@required {podcastKey: str}\n@returns(200) OK\n\n@endpoint PUT /podcast-bot/podcasts/{podcastKey}/recordingConfig\n@desc Update podcast recording configuration\n@required {podcastKey: str, streamUrl: str # Recording audio stream, recordingSchedule: map{frequency!: str, daysOfWeek: [str], daysOfMonth: [int(int32)], startTime!: str, durationMinutes!: int(int64), timezone!: str} # Podcast Recording Schedule model}\n@optional {introAudioUrl: str # Edit based on intro audio. Required if outro is specified., outroAudioUrl: str # Edit based on outro audio. Required if intro is specified.}\n@returns(200) OK\n\n@endpoint PUT /podcast-bot/podcasts/{podcastKey}/processingPresets\n@desc Update podcast processing presets\n@required {podcastKey: str}\n@optional {removeBackgroundMusic: bool, introAudioUrl: str # Add intro audio to recorded episode, outroAudioUrl: str # Add outro audio to recorded episode, aiTitleSummary: bool # Generate episode title and summary}\n@returns(200) OK\n\n@endpoint PUT /podcast-bot/podcasts/{podcastKey}/interviewPresets\n@desc Update podcast interview extraction presets\n@required {podcastKey: str}\n@optional {extractInterviews: bool # Enable Interview Extraction, interviewPodcastName: str # Interview Podcast Name. Required if interview extraction is enabled, interviewMinLengthMinutes: int(int64) # Minimum Interview Length (minutes). Required if interview extraction is enabled}\n@returns(200) OK\n\n@endpoint PUT /podcast-bot/podcasts/{podcastKey}/episodes/{episodeKey}/unpublish\n@desc Unpublish podcast episode\n@required {podcastKey: str, episodeKey: str}\n@returns(200) OK\n\n@endpoint PUT /podcast-bot/podcasts/{podcastKey}/episodes/{episodeKey}/publish\n@desc Publish podcast episode\n@required {podcastKey: str, episodeKey: str}\n@returns(200) OK\n\n@endpoint PUT /podcast-bot/podcasts/{podcastKey}/aiAdsPresets\n@desc Update podcast AI Ads presets\n@required {podcastKey: str}\n@optional {removeAds: bool, insertProgrammaticAds: bool, adsFrequency: int(int64) # Required if insertProgrammaticAds is enabled}\n@returns(200) OK\n\n@endgroup\n\n@group api\n@endpoint GET /api/v2/podcasts/{podcastKey}\n@desc Get podcast\n@required {podcastKey: str}\n@returns(200) OK\n\n@endpoint PUT /api/v2/podcasts/{podcastKey}\n@desc Update podcast\n@required {podcastKey: str}\n@returns(200) OK\n\n@endpoint DELETE /api/v2/podcasts/{podcastKey}\n@desc Delete podcast\n@required {podcastKey: str}\n@returns(200) OK\n\n@endpoint GET /api/v2/podcasts/{podcastKey}/episodes/{episodeKey}\n@desc Get podcast episode\n@required {podcastKey: str, episodeKey: str}\n@returns(200) OK\n\n@endpoint PUT /api/v2/podcasts/{podcastKey}/episodes/{episodeKey}\n@desc Update podcast episode\n@required {podcastKey: str, episodeKey: str}\n@returns(200) OK\n\n@endpoint DELETE /api/v2/podcasts/{podcastKey}/episodes/{episodeKey}\n@desc Delete podcast episode\n@required {podcastKey: str, episodeKey: str}\n@returns(200) OK\n\n@endgroup\n\n@group stats\n@endpoint POST /stats/mounts/{mount}/auth-cache/reload\n@desc Retrieve total numer of live stats for a specific mount\n@required {mount: str}\n@returns(200) OK\n\n@endpoint POST /stats/mounts/{mount}/auth-cache/reload/all\n@desc Retrieve total numer of live stats for a specific mount\n@required {mount: str}\n@returns(200) OK\n\n@endgroup\n\n@group podcast-bot\n@endpoint POST /podcast-bot/workflows/process-file\n@desc Process file\n@optional {fileUrl: str, removeAds: bool, removeBackgroundMusic: bool, removeSilence: bool, normalizeAudioLevels: bool, aiAutoEnhance: bool, removeFillerWords: bool}\n@returns(200) OK\n\n@endpoint POST /podcast-bot/podcasts/{podcastKey}/episodes/{episodeKey}/reprocess\n@desc Reprocess episode\n@required {podcastKey: str, episodeKey: str}\n@returns(200) OK\n\n@endpoint POST /podcast-bot/podcasts/{podcastKey}/episodes/{episodeKey}/reprocess/custom\n@desc Reprocess episode with custom presets\n@required {podcastKey: str, episodeKey: str}\n@optional {cutIntroAudioUrl: str # Edit based on intro audio. Required if cutOutro is specified., cutOutroAudioUrl: str # Edit based on outro audio. Required if cutIntro is specified., addIntroAudioUrl: str # Add intro audio to recorded episode, addOutroAudioUrl: str # Add outro audio to recorded episode, aiTitleSummary: bool # Generate episode title and summary, removeBackgroundMusic: bool, removeAds: bool, extractInterviews: bool # Enable Interview Extraction, interviewMinLengthMinutes: int(int64) # Minimum Interview Length (minutes). Required if interview extraction is enabled}\n@returns(200) OK\n\n@endpoint POST /podcast-bot/podcasts/recording/create\n@desc Create recording podcast\n@required {podcast: map{key: str, title!: str, coverArtUrl: str, summary: str, description!: str, ownerName!: str, ownerEmail!: str, categories!: [str], language!: str, link: str, explicit: bool, interviewPodcastKey: str} # Podcast model, recordingConfig: map{streamUrl!: str, recordingSchedule!: map, introAudioUrl: str, outroAudioUrl: str} # Podcast Recording Config model}\n@optional {processingPresets: map{removeBackgroundMusic: bool, introAudioUrl: str, outroAudioUrl: str, aiTitleSummary: bool} # Podcast Processing Presets model, aiAdsConfig: map{removeAds: bool, insertProgrammaticAds: bool, adsFrequency: int(int64)} # Podcast AI Ads Config model, interviewConfig: map{extractInterviews: bool, interviewPodcastName: str, interviewMinLengthMinutes: int(int64)} # Podcast Interview Config model}\n@returns(200) OK\n\n@endgroup\n\n@group partners\n@endpoint POST /partners/streams\n@desc Get the partner information for a list of streams.\n@required {X-Auth-Token: str}\n@optional {currentTrack: bool=false}\n@returns(200) OK\n\n@endgroup\n\n@group api\n@endpoint POST /api/v2/stations/search\n@desc Search stations\n@optional {query: str, filters: map{country: [str], language: [str], genre: [str]} # Filters for station search, hitsPerPage: int(int32)=10, page: int(int32)=1, minSessions: int(int64)}\n@returns(200) OK\n\n@endpoint POST /api/v2/stations/listener/location\n@desc Get top stations by listener location\n@optional {maxResults: int(int32)=10, continents: [str], countries: [str]}\n@returns(200) OK\n\n@endpoint POST /api/v2/podcasts/{podcastKey}/episodes/create\n@desc Create podcast episode\n@required {podcastKey: str}\n@returns(200) OK\n\n@endpoint POST /api/v2/podcasts/search\n@desc Search podcasts\n@optional {query: str, filters: map{country: [str], language: [str], category: [str], podcastType: str} # Filters for podcast search, hitsPerPage: int(int32)=10, page: int(int32)=1}\n@returns(200) OK\n\n@endpoint POST /api/v2/podcasts/create\n@desc Create podcast\n@returns(200) OK\n\n@endgroup\n\n@group stats\n@endpoint GET /stats/mounts/{mount}/live/total\n@desc Retrieve total numer of live stats for a specific mount\n@required {Authorization: str # Authorization token, mount: str}\n@returns(200) OK\n\n@endgroup\n\n@group podcast-bot\n@endpoint GET /podcast-bot/workflows/{workflowId}/details\n@desc Get workflow details\n@required {workflowId: str}\n@returns(200) OK\n\n@endpoint GET /podcast-bot/podcasts/{podcastKey}/episodes\n@desc Get podcast episodes\n@required {podcastKey: str}\n@optional {limit: str, offset: str}\n@returns(200) OK\n\n@endpoint GET /podcast-bot/podcasts/{podcastKey}/episodes/{episodeKey}\n@desc Get podcast episode\n@required {podcastKey: str, episodeKey: str}\n@returns(200) OK\n\n@endpoint DELETE /podcast-bot/podcasts/{podcastKey}/episodes/{episodeKey}\n@desc Delete podcast episode\n@required {podcastKey: str, episodeKey: str}\n@returns(200) OK\n\n@endpoint GET /podcast-bot/podcasts/{podcastKey}/episodes/{episodeKey}/metadata\n@desc Get metadata for a podcast episode\n@required {podcastKey: str, episodeKey: str}\n@returns(200) OK\n\n@endpoint GET /podcast-bot/podcasts/{podcastKey}/episodes/{episodeKey}/adsMarkers\n@desc Get Ads markers info for a podcast episode\n@required {podcastKey: str, episodeKey: str}\n@returns(200) OK\n\n@endpoint GET /podcast-bot/podcasts/{podcastKey}/episodes/interviews\n@desc Get podcast interviews\n@required {podcastKey: str}\n@optional {limit: str, offset: str}\n@returns(200) OK\n\n@endpoint GET /podcast-bot/podcasts/list\n@desc List podcasts\n@optional {limit: str, offset: str}\n@returns(200) OK\n\n@endpoint GET /podcast-bot/jobs/podcasts/{podcastKey}\n@desc Get all processing jobs for a podcast\n@required {podcastKey: str}\n@returns(200) OK\n\n@endpoint GET /podcast-bot/jobs/podcasts/{podcastKey}/episodes/{episodeKey}\n@desc Get processing jobs for a podcast episode\n@required {podcastKey: str, episodeKey: str}\n@returns(200) OK\n\n@endgroup\n\n@group partners\n@endpoint GET /partners/{partnerId}/ads/stats\n@desc Retrieve partner stats\n@required {partnerId: str, from: str(date), to: str(date), x-zeno-api-key: str # Authorization token}\n@optional {type: str(DAILY/HOURLY/BREAKDOWN), page: int(int32)=0, size: int(int32)=10}\n@returns(200) OK\n\n@endpoint GET /partners/streams/{streamId}\n@desc Get the stream partner information.\n@required {streamId: str, X-Auth-Token: str}\n@optional {currentTrack: bool=false}\n@returns(200) OK\n\n@endpoint GET /partners/streams/{streamId}/tracks\n@desc Get the stream partner information.\n@required {streamId: str, X-Auth-Token: str}\n@returns(200) OK\n\n@endgroup\n\n@group api\n@endpoint GET /api/v2/stations/{stationKey}\n@desc Get station\n@required {stationKey: str}\n@returns(200) OK\n\n@endpoint GET /api/v2/stations/list\n@desc List stations\n@optional {page: int(int32)=1, hitsPerPage: int(int32)=10, minSessions: int(int64)}\n@returns(200) OK\n\n@endpoint GET /api/v2/stations/languages\n@desc Get the list of Languages that can be used to filter stations in the search stations request\n@returns(200) OK\n\n@endpoint GET /api/v2/stations/genres\n@desc Get the list of Genres that can be used to filter stations in the search stations request\n@returns(200) OK\n\n@endpoint GET /api/v2/stations/countries\n@desc Get the list of Countries that can be used to filter stations in the search stations request\n@returns(200) OK\n\n@endpoint GET /api/v2/stations/browse\n@desc Browse all stations\n@optional {limit: int(int64)=50, offset: int(int64)=0, mount_status: bool=false}\n@returns(200) OK\n\n@endpoint GET /api/v2/podcasts/{podcastKey}/episodes\n@desc Get podcast episodes\n@required {podcastKey: str}\n@optional {limit: str, offset: str}\n@returns(200) OK\n\n@endpoint GET /api/v2/podcasts/languages\n@desc Get the list of Languages that can be used to filter podcasts in the search podcasts request\n@returns(200) OK\n\n@endpoint GET /api/v2/podcasts/countries\n@desc Get the list of Countries that can be used to filter podcasts in the search podcasts request\n@returns(200) OK\n\n@endpoint GET /api/v2/podcasts/categories\n@desc Get the list of Categories that can be used to filter podcasts in the search podcasts request\n@returns(200) OK\n\n@endgroup\n\n@end\n"}}