{"openapi":"3.1.0","info":{"title":"Radioguide Data API","version":"2.3.0","summary":"100,000+ radio stations with checked streams, now playing, radio charts and Radioguide Channels.","description":"Station data from Radioguide.fm for apps, websites, cars, TVs and hardware radios.\n\nAuthenticate with your key in the `X-Api-Key` header (or `Authorization: Bearer`). Every response has the shape `{\"data\": ..., \"meta\": {...}}` and the headers `X-Plan`, `X-Quota-Limit`, `X-Quota-Remaining` and `X-Rate-Limit-*`.\n\nFree plan: non-commercial use only, and show \"Powered by Radioguide.fm\" with a link to https://www.radioguide.fm wherever you use the data (the response meta contains the text). See the terms: https://www.radioguide.fm/api/terms","termsOfService":"https://www.radioguide.fm/api/terms","contact":{"name":"Radioguide.fm","url":"https://www.radioguide.fm/api/licence","email":"info@radioguide.fm"}},"servers":[{"url":"https://www.radioguide.fm/api/v2","description":"Production"}],"security":[{"ApiKey":[]},{"Bearer":[]}],"tags":[{"name":"Stations","description":"Search, list and detail of stations with streams, health and images."},{"name":"Now playing","description":"Current and recent tracks per station, read from the streams."},{"name":"Charts","description":"Most played songs and artists on the radio, per country and genre."},{"name":"Channels","description":"Radioguide Channels: our own channels with new music from independent artists."},{"name":"Playlists","description":"Radioguide Playlists: made every day from what radio stations worldwide play (world, per country, per genre, hidden gems), with their Spotify links."},{"name":"Ontdekt","description":"Radioguide Ontdekt: new artists, with the same free rotation for every admitted track and an editorial playlist that cannot be bought."},{"name":"Reference","description":"Countries, regions, genres and languages with station counts."},{"name":"Sync","description":"Change feed, full export and webhooks for keeping your own copy up to date."},{"name":"Account","description":"Your plan, limits and usage."},{"name":"Prerolls","description":"Ad-supported plans: the audio ad to play before a stream, its tracking URLs and VAST. See https://www.radioguide.fm/api#prerolls."}],"paths":{"/stations":{"get":{"operationId":"listStations","tags":["Stations"],"summary":"List and filter stations","description":"Stations matching all filters. `q` matches the start of the name (use /search for ranked matches anywhere in the name). Pages beyond `meta.max_page` (at most 10,000 results deep) are not served: narrow the filters or use the export.","parameters":[{"name":"q","in":"query","description":"Station name, matches from the start.","schema":{"type":"string","maxLength":100},"example":"radio 1"},{"$ref":"#/components/parameters/country"},{"$ref":"#/components/parameters/genre"},{"$ref":"#/components/parameters/language"},{"name":"ids","in":"query","description":"Comma-separated station ids.","schema":{"type":"string"}},{"name":"sort","in":"query","description":"Order: name (default), id, popular (editors), listeners (all-time listeners), new (newest first).","schema":{"type":"string","enum":["name","id","popular","listeners","new"]}},{"$ref":"#/components/parameters/page"},{"$ref":"#/components/parameters/per_page"}],"x-min-plan":"free","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Station"}},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"},"pages":{"type":"integer"},"has_more":{"type":"boolean"},"max_page":{"type":"integer"}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/search":{"get":{"operationId":"searchStations","tags":["Stations"],"summary":"Ranked station search","description":"Best matches first: exact name, name starts with, a word starts with, name contains; popular stations and working streams rank higher. Each result has a `score`.","parameters":[{"name":"q","in":"query","description":"Search text (2 to 100 characters).","required":true,"schema":{"type":"string","minLength":2,"maxLength":100},"example":"jazz"},{"$ref":"#/components/parameters/country"},{"$ref":"#/components/parameters/genre"},{"$ref":"#/components/parameters/language"},{"$ref":"#/components/parameters/limit"}],"x-min-plan":"free","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/Station"}],"properties":{"score":{"type":"number"}}}},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/stations/{id}":{"get":{"operationId":"getStation","tags":["Stations"],"summary":"Station detail","description":"One station with every stream URL. The primary stream carries its health: `ok` and the last check from the Developer plan, codec, bitrate and 30-day uptime from the Pro plan.","parameters":[{"name":"id","in":"path","required":true,"description":"Station id (24 hex characters).","schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"example":"64f1c2a9e4b0a1b2c3d4e5f6"}],"x-min-plan":"free","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/StationDetail"},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/stations/{id}/stream":{"get":{"operationId":"getStream","tags":["Prerolls"],"summary":"Stream link (with preroll)","description":"The stream link of a station. On ad-supported plans a signed link plus the preroll to play first (audio file, duration, tracking URLs, VAST); on required plans the link opens after the preroll impression. Optional plans: add preroll=1.","parameters":[{"name":"id","in":"path","required":true,"description":"Station id (24 hex characters).","schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"example":"64f1c2a9e4b0a1b2c3d4e5f6"},{"name":"format","in":"query","description":"Stream field: mp3, aac, ios or android (default: primary stream).","schema":{"type":"string","enum":["mp3","aac","ios","android"]}},{"name":"preroll","in":"query","description":"Optional plans: 1 = add a preroll.","schema":{"type":"string","enum":["1"]}},{"name":"country","in":"query","description":"Listener country (ISO 3166-1 alpha-2) for ad targeting; default the station country.","schema":{"type":"string","pattern":"^[A-Za-z]{2}$"}},{"name":"lang","in":"query","description":"Listener language (ISO 639-1) for ad targeting.","schema":{"type":"string"}}],"x-min-plan":"free","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/StreamLink"},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/stations/{id}/now-playing":{"get":{"operationId":"getNowPlaying","tags":["Now playing"],"summary":"Now playing and recent tracks of a station","description":"The current track (null when the station sends no titles) and the last tracks. `history` up to 10 (Developer), 50 (Pro) or 100 (Business).","parameters":[{"name":"id","in":"path","required":true,"description":"Station id (24 hex characters).","schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"example":"64f1c2a9e4b0a1b2c3d4e5f6"},{"name":"history","in":"query","description":"Number of recent tracks.","schema":{"type":"integer","minimum":0,"maximum":100},"example":10}],"x-min-plan":"api_developer","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/NowPlayingStation"},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/now-playing":{"get":{"operationId":"getNowPlayingMany","tags":["Now playing"],"summary":"Now playing for several stations","description":"Current track of up to 50 stations in one call.","parameters":[{"name":"ids","in":"query","description":"Up to 50 comma-separated station ids.","required":true,"schema":{"type":"string"}}],"x-min-plan":"api_developer","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","properties":{"station_id":{"type":"string"},"now_playing":{"oneOf":[{"$ref":"#/components/schemas/Track"},{"type":"null"}]}}}},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/stations/{id}/similar":{"get":{"operationId":"getSimilar","tags":["Stations"],"summary":"Similar stations","description":"Same genre in the same country first, then the same genre elsewhere, most listened first.","parameters":[{"name":"id","in":"path","required":true,"description":"Station id (24 hex characters).","schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"example":"64f1c2a9e4b0a1b2c3d4e5f6"},{"name":"limit","in":"query","description":"Number of stations (1-25).","schema":{"type":"integer","minimum":1,"maximum":25},"example":10}],"x-min-plan":"free","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Station"}},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/stations/{id}/images":{"get":{"operationId":"getImages","tags":["Stations"],"summary":"Logo sizes and pictures","description":"The logo as uploaded and as square PNG in 64, 128, 256 and 512 pixels (for logos we host), plus the station's pictures with their dimensions.","parameters":[{"name":"id","in":"path","required":true,"description":"Station id (24 hex characters).","schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"example":"64f1c2a9e4b0a1b2c3d4e5f6"}],"x-min-plan":"free","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Images"},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/popular":{"get":{"operationId":"getPopular","tags":["Stations"],"summary":"Popular stations","description":"Most play starts on Radioguide in the last `days` days (`meta.source` = listening), or all-time listeners when there are no listening statistics yet (`meta.source` = hits).","parameters":[{"$ref":"#/components/parameters/country"},{"$ref":"#/components/parameters/genre"},{"name":"days","in":"query","description":"Period in days (1-30).","schema":{"type":"integer","minimum":1,"maximum":30},"example":7},{"$ref":"#/components/parameters/limit"}],"x-min-plan":"free","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/Station"}],"properties":{"plays":{"type":["integer","null"]}}}},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{"source":{"type":"string","enum":["listening","hits"]}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/trending":{"get":{"operationId":"getTrending","tags":["Stations"],"summary":"Trending stations","description":"Biggest rise in play starts compared with the period before. Empty until listening statistics are available.","parameters":[{"$ref":"#/components/parameters/country"},{"$ref":"#/components/parameters/genre"},{"name":"days","in":"query","description":"Period in days (1-14).","schema":{"type":"integer","minimum":1,"maximum":14},"example":7},{"$ref":"#/components/parameters/limit"}],"x-min-plan":"free","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/Station"}],"properties":{"trend":{"type":"object","properties":{"plays":{"type":"integer"},"previous":{"type":"integer"},"growth":{"type":["number","null"]}}}}}},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/countries":{"get":{"operationId":"listCountries","tags":["Reference"],"summary":"Countries","description":"Countries with their number of stations.","x-min-plan":"free","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Country"}},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/regions":{"get":{"operationId":"listRegions","tags":["Reference"],"summary":"Regions","description":"Countries with their states or provinces (where we have them) and station counts.","parameters":[{"$ref":"#/components/parameters/country"}],"x-min-plan":"free","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Region"}},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/genres":{"get":{"operationId":"listGenres","tags":["Reference"],"summary":"Genres","description":"Genres (slugs for the genre filter) with their number of stations.","x-min-plan":"free","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Genre"}},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/languages":{"get":{"operationId":"listLanguages","tags":["Reference"],"summary":"Languages","description":"Broadcast languages (ISO 639-1) with an estimated number of stations: the station's own language where known, otherwise the main language of its country.","x-min-plan":"free","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Language"}},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/charts":{"get":{"operationId":"getCharts","tags":["Charts"],"summary":"Radio charts","description":"Most played songs (or artists) on the radio stations we follow, from their now-playing data.","parameters":[{"name":"type","in":"query","description":"songs (default) or artists.","schema":{"type":"string","enum":["songs","artists"]}},{"$ref":"#/components/parameters/country"},{"$ref":"#/components/parameters/genre"},{"name":"days","in":"query","description":"Period in days (1-30).","schema":{"type":"integer","minimum":1,"maximum":30},"example":7},{"$ref":"#/components/parameters/limit"}],"x-min-plan":"api_developer","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/ChartSong"},{"$ref":"#/components/schemas/ChartArtist"}]}},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/songs/{key}":{"get":{"operationId":"getSong","tags":["Charts"],"summary":"Song","description":"Plays per day (30 days), countries and the stations that play the song most (14 days).","parameters":[{"name":"key","in":"path","required":true,"description":"Song key from the charts or now playing.","schema":{"type":"string","pattern":"^[a-z0-9-]{1,160}$"},"example":"the-weeknd-blinding-lights"}],"x-min-plan":"api_developer","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Song"},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/artists/{key}":{"get":{"operationId":"getArtist","tags":["Charts"],"summary":"Artist","description":"Top songs, plays per day, countries and stations of an artist.","parameters":[{"name":"key","in":"path","required":true,"description":"Artist key from the charts.","schema":{"type":"string","pattern":"^[a-z0-9-]{1,160}$"},"example":"the-weeknd"}],"x-min-plan":"api_developer","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Artist"},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/channels":{"get":{"operationId":"listChannels","tags":["Channels"],"summary":"Radioguide Channels","description":"Our channels with the track playing now. Everyone hears the same track at the same moment.","x-min-plan":"free","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/Channel"}],"properties":{"now_playing":{"oneOf":[{"$ref":"#/components/schemas/ChannelTrack"},{"type":"null"}]}}}},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/channels/{slug}":{"get":{"operationId":"getChannel","tags":["Channels"],"summary":"Channel with schedule","description":"Now playing (with `offset`, seconds into the track), the next tracks with their start times, and the recent ones.","parameters":[{"name":"slug","in":"path","required":true,"description":"Channel slug.","schema":{"type":"string","pattern":"^[a-z0-9-]+$"},"example":"hits"},{"name":"next","in":"query","description":"Upcoming tracks (0-20).","schema":{"type":"integer","minimum":0,"maximum":20},"example":10},{"name":"recent","in":"query","description":"Recent tracks (0-20).","schema":{"type":"integer","minimum":0,"maximum":20},"example":5}],"x-min-plan":"free","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/ChannelDetail"},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/playlists":{"get":{"operationId":"listPlaylists","tags":["Playlists"],"summary":"Radioguide Playlists","description":"The published playlists with their public Spotify link (`spotify_url`, an open.spotify.com link that phones open in the Spotify app) once they are on the official Radioguide Spotify account.","parameters":[{"name":"kind","in":"query","description":"special, country or genre.","schema":{"type":"string","enum":["special","country","genre"]}},{"name":"country","in":"query","description":"Only the playlist of this country (ISO 3166-1 alpha-2).","schema":{"type":"string","pattern":"^[A-Za-z]{2}$"}},{"name":"genre","in":"query","description":"Only the playlist of this genre (key as in `genre`).","schema":{"type":"string"}},{"name":"lang","in":"query","description":"Language of titles and descriptions (ISO 639-1, default en).","schema":{"type":"string"}}],"x-min-plan":"free","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Playlist"}},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/playlists/{id}":{"get":{"operationId":"getPlaylist","tags":["Playlists"],"summary":"Playlist with tracks","description":"One playlist with its tracks; `spotify_id` / `spotify_url` per track where it was found on Spotify.","parameters":[{"name":"id","in":"path","required":true,"description":"Playlist id from /playlists.","schema":{"type":"string","pattern":"^[a-z0-9-]+$"},"example":"world"},{"name":"lang","in":"query","description":"Language of title and description (ISO 639-1, default en).","schema":{"type":"string"}}],"x-min-plan":"free","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/PlaylistDetail"},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/ontdekt/block":{"get":{"operationId":"getOntdektBlock","tags":["Ontdekt"],"summary":"Ontdek block","description":"New tracks sent in by artists, picked the same way as the block on Radioguide.fm: every admitted track gets the same free rotation; boosted tracks get extra places and must show `label` (Sponsored). Send the events of your listeners with the `token` of each card to POST /ontdekt/events.","parameters":[{"$ref":"#/components/parameters/genre"},{"$ref":"#/components/parameters/country"},{"name":"slots","in":"query","description":"Number of cards (1-6).","schema":{"type":"integer","minimum":1,"maximum":6},"example":3}],"x-min-plan":"free","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/OntdektCard"}},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{"events_url":{"type":"string"},"events":{"type":"array","items":{"type":"string"}}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/ontdekt/playlist":{"get":{"operationId":"getOntdektPlaylist","tags":["Ontdekt"],"summary":"Playlist Radioguide Ontdekt","description":"The editorial playlist Radioguide Ontdekt with the audio of each track. A place in this list cannot be bought. Plays of these tracks count as organic: send their events without a token.","x-min-plan":"free","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/OntdektPlaylist"},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/changes":{"get":{"operationId":"getChanges","tags":["Sync"],"summary":"Change feed","description":"Stations created, updated or removed, oldest first, for incremental sync. Start with the export (or /stations), then poll with `since`; afterwards pass the `meta.next_cursor` of the previous answer as `cursor`. Changes are kept 90 days and checked every 15 minutes.","parameters":[{"name":"cursor","in":"query","description":"Id of the last change you processed.","schema":{"type":"string","pattern":"^[a-f0-9]{24}$"}},{"name":"since","in":"query","description":"ISO 8601 date or unix time (used when there is no cursor).","schema":{"type":"string"},"example":"2026-10-01T00:00:00Z"},{"name":"types","in":"query","description":"Comma-separated: created, updated, removed.","schema":{"type":"string"}},{"name":"include","in":"query","description":"station = add the current station object to created / updated changes.","schema":{"type":"string","enum":["station"]}},{"name":"limit","in":"query","description":"Changes per call (1-1000).","schema":{"type":"integer","minimum":1,"maximum":1000},"example":500}],"x-min-plan":"api_business","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Change"}},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{"next_cursor":{"type":["string","null"]},"has_more":{"type":"boolean"},"oldest_available":{"type":["string","null"]}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/export":{"get":{"operationId":"getExport","tags":["Sync"],"summary":"Full export","description":"All active stations at Business field level as gzipped NDJSON (one JSON object per line), rebuilt every night.","x-min-plan":"api_business","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"string","format":"binary","contentMediaType":"application/gzip"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/me":{"get":{"operationId":"getMe","tags":["Account"],"summary":"Your plan and usage","description":"Plan, limits and calls today of the project the key belongs to.","x-min-plan":"free","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Me"},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/ontdekt/events":{"post":{"operationId":"postOntdektEvents","tags":["Ontdekt"],"summary":"Listener events of Ontdekt tracks","description":"Events of the listeners of your app: imp (card seen), play, c30 (30 seconds heard), c80 (80% heard), save, share, rep (played again on another day). Counted once per device, track and event per day; the source (free or sponsored) is read from the signed token only. Bursts per device are left out.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OntdektEvents"}}}},"x-min-plan":"free","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","properties":{"received":{"type":"integer"},"counted":{"type":"integer"}}},"meta":{"allOf":[{"$ref":"#/components/schemas/Meta"}],"properties":{}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/vast":{"get":{"operationId":"getVast","tags":["Prerolls"],"summary":"Preroll as VAST 4.1","description":"A preroll for a station as VAST 4.1 InLine for players and SDKs that speak VAST. The stream link is in Extension type=\"radioguide\" > StreamUrl. Also at /api/v1/vast. With t (preroll.vast) or s (a stream link) no key is needed.","parameters":[{"name":"station","in":"query","description":"Station id (with a key).","schema":{"type":"string","pattern":"^[a-f0-9]{24}$"}},{"name":"key","in":"query","description":"Your API key (or the X-Api-Key header).","schema":{"type":"string"}},{"name":"t","in":"query","description":"Preroll token from preroll.vast.","schema":{"type":"string"}},{"name":"s","in":"query","description":"Stream link token (the part after /s/).","schema":{"type":"string"}},{"$ref":"#/components/parameters/country"}],"x-min-plan":"free","responses":{"200":{"description":"VAST 4.1; an empty <VAST/> means no ad.","content":{"application/xml":{"schema":{"type":"string"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}}},"webhooks":{"station.created":{"post":{"summary":"A station became available","description":"Business plan. Signed with X-Radioguide-Signature: t=<unix time>,v1=<HMAC-SHA256 of \"<t>.<raw body>\" with your webhook secret>. Answer 2xx within 5 seconds; failed deliveries are retried after 1 minute, 5 minutes, 30 minutes, 2, 6 and 12 hours.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}}},"responses":{"200":{"description":"Received"}}}},"station.updated":{"post":{"summary":"Name, streams, logo, genres, region or website of a station changed","description":"Business plan. Signed with X-Radioguide-Signature: t=<unix time>,v1=<HMAC-SHA256 of \"<t>.<raw body>\" with your webhook secret>. Answer 2xx within 5 seconds; failed deliveries are retried after 1 minute, 5 minutes, 30 minutes, 2, 6 and 12 hours.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}}},"responses":{"200":{"description":"Received"}}}},"station.removed":{"post":{"summary":"A station was removed","description":"Business plan. Signed with X-Radioguide-Signature: t=<unix time>,v1=<HMAC-SHA256 of \"<t>.<raw body>\" with your webhook secret>. Answer 2xx within 5 seconds; failed deliveries are retried after 1 minute, 5 minutes, 30 minutes, 2, 6 and 12 hours.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}}},"responses":{"200":{"description":"Received"}}}},"stream.down":{"post":{"summary":"The stream of a watched station stopped working","description":"Business plan. Signed with X-Radioguide-Signature: t=<unix time>,v1=<HMAC-SHA256 of \"<t>.<raw body>\" with your webhook secret>. Answer 2xx within 5 seconds; failed deliveries are retried after 1 minute, 5 minutes, 30 minutes, 2, 6 and 12 hours.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}}},"responses":{"200":{"description":"Received"}}}},"stream.up":{"post":{"summary":"The stream of a watched station works again","description":"Business plan. Signed with X-Radioguide-Signature: t=<unix time>,v1=<HMAC-SHA256 of \"<t>.<raw body>\" with your webhook secret>. Answer 2xx within 5 seconds; failed deliveries are retried after 1 minute, 5 minutes, 30 minutes, 2, 6 and 12 hours.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}}},"responses":{"200":{"description":"Received"}}}},"now_playing.changed":{"post":{"summary":"A new track started on a watched station","description":"Business plan. Signed with X-Radioguide-Signature: t=<unix time>,v1=<HMAC-SHA256 of \"<t>.<raw body>\" with your webhook secret>. Answer 2xx within 5 seconds; failed deliveries are retried after 1 minute, 5 minutes, 30 minutes, 2, 6 and 12 hours.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}}},"responses":{"200":{"description":"Received"}}}}},"components":{"securitySchemes":{"ApiKey":{"type":"apiKey","in":"header","name":"X-Api-Key"},"Bearer":{"type":"http","scheme":"bearer"}},"parameters":{"country":{"name":"country","in":"query","description":"ISO 3166-1 alpha-2 country code.","schema":{"type":"string","pattern":"^[A-Za-z]{2}$"},"example":"NL"},"genre":{"name":"genre","in":"query","description":"Genre slug, see /genres.","schema":{"type":"string"},"example":"jazz"},"language":{"name":"language","in":"query","description":"ISO 639-1 language code, see /languages.","schema":{"type":"string","pattern":"^[a-z]{2}$"},"example":"de"},"page":{"name":"page","in":"query","description":"Page number.","schema":{"type":"integer","minimum":1,"default":1}},"per_page":{"name":"per_page","in":"query","description":"Results per page (plan maximum: 25 Free, 100 Developer and Pro, 250 Business).","schema":{"type":"integer","minimum":1,"default":25}},"limit":{"name":"limit","in":"query","description":"Number of results (up to the plan's page size).","schema":{"type":"integer","minimum":1,"default":25}}},"responses":{"BadRequest":{"description":"A parameter is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"Missing, invalid or revoked key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Forbidden":{"description":"Not in your plan, the key is not allowed from this origin, the project is suspended or the IP is blocked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"TooManyRequests":{"description":"Per-minute or daily limit reached. See the X-Rate-Limit-* and X-Quota-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Meta":{"type":"object","properties":{"attribution":{"type":"string","description":"Free plan only: the credit to show with a link."},"attribution_html":{"type":"string"}}},"Error":{"type":"object","properties":{"name":{"type":"string"},"message":{"type":"string"},"code":{"type":"integer"},"status":{"type":"integer"}}},"Station":{"type":"object","required":["id","name"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"country":{"type":["string","null"],"description":"ISO 3166-1 alpha-2"},"genres":{"type":"array","items":{"type":"string"}},"languages":{"type":"array","items":{"type":"string"},"description":"ISO 639-1"},"stream_url":{"type":"string","description":"Primary stream."},"page_url":{"type":"string"},"logo_url":{"type":["string","null"],"description":"Developer and up."},"website":{"type":["string","null"],"description":"Developer and up."},"stream_ok":{"type":["boolean","null"],"description":"Developer and up."},"stream_checked_at":{"type":["string","null"],"format":"date-time"},"stream_secure":{"type":"boolean"},"updated_at":{"type":["string","null"],"format":"date-time"},"uptime_30d":{"type":["number","null"],"description":"Pro and up: share of successful checks in 30 days, percent."},"bitrate":{"type":["integer","null"],"description":"Pro and up."},"description":{"type":["string","null"],"description":"Pro and up."},"now_playing":{"oneOf":[{"$ref":"#/components/schemas/Track"},{"type":"null"}],"description":"Pro and up."},"claimed":{"type":"boolean","description":"Business: the station owner verified the page."},"links":{"type":["array","null"],"description":"Business."},"schedule":{"type":["array","null"],"description":"Business."}}},"StationDetail":{"allOf":[{"$ref":"#/components/schemas/Station"}],"properties":{"genre_names":{"type":"array","items":{"type":"string"}},"region":{"type":"object","properties":{"id":{"type":["string","null"]},"slug":{"type":["string","null"]},"name":{"type":["string","null"]}}},"streams":{"type":"array","items":{"$ref":"#/components/schemas/Stream"}},"images":{"$ref":"#/components/schemas/Images"},"created_at":{"type":["string","null"],"format":"date-time"},"ads":{"type":"string","enum":["required","optional"],"description":"Ad-supported plans only."},"preroll":{"oneOf":[{"$ref":"#/components/schemas/Preroll"},{"type":"null"}],"description":"Ad-supported plans: play it before any of the stream links (they are signed then)."},"stream_expires_in":{"type":["integer","null"]},"playlist_url":{"type":["string","null"],"description":".m3u with the preroll first and the stream second."}}},"StreamLink":{"type":"object","properties":{"station_id":{"type":"string"},"ads":{"type":"string","enum":["required","optional","none"]},"stream":{"type":"object","properties":{"url":{"type":"string"},"format":{"type":["string","null"]},"signed":{"type":"boolean"},"requires_preroll":{"type":"boolean","description":"The link opens after the impression of the preroll (otherwise HTTP 402)."},"expires_in":{"type":["integer","null"]}}},"preroll":{"oneOf":[{"$ref":"#/components/schemas/Preroll"},{"type":"null"}]},"playlist_url":{"type":["string","null"],"description":".m3u with the preroll first and the stream second, for simple players."}}},"Preroll":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string","description":"Audio file. Play it unaltered before the stream."},"mime_type":{"type":"string"},"duration":{"type":["integer","null"],"description":"Seconds."},"skippable_after":{"type":["integer","null"],"description":"No skip button before this many seconds; null = not skippable."},"label":{"type":"string"},"advertiser":{"type":"string"},"click_url":{"type":["string","null"]},"tracking":{"type":"object","description":"GET these URLs from the listener's device: impression and start when it starts, the quartiles and complete as it plays, skip when skipped.","properties":{"impression":{"type":"string"},"start":{"type":"string"},"firstQuartile":{"type":"string"},"midpoint":{"type":"string"},"thirdQuartile":{"type":"string"},"complete":{"type":"string"},"skip":{"type":"string"}}},"vast":{"type":"string","description":"The same preroll as VAST 4.1."},"expires_in":{"type":"integer"}}},"Stream":{"type":"object","properties":{"url":{"type":"string"},"format":{"type":"string","enum":["mp3","aac","ogg","hls","playlist","other"]},"secure":{"type":"boolean"},"primary":{"type":"boolean"},"health":{"oneOf":[{"$ref":"#/components/schemas/Health"},{"type":"null"}],"description":"Developer and up, primary stream only."}}},"Health":{"type":"object","properties":{"ok":{"type":["boolean","null"]},"last_checked_at":{"type":["string","null"],"format":"date-time"},"down_since":{"type":["string","null"],"format":"date-time"},"codec":{"type":["string","null"],"description":"Pro and up."},"content_type":{"type":["string","null"]},"bitrate":{"type":["integer","null"]},"response_ms":{"type":["integer","null"]},"uptime_30d":{"type":["number","null"]}}},"Images":{"type":"object","properties":{"logo":{"type":["object","null"],"properties":{"original":{"type":"object","properties":{"url":{"type":"string"},"width":{"type":["integer","null"]},"height":{"type":["integer","null"]}}},"sizes":{"type":"object","description":"Pixel size => PNG URL (64, 128, 256, 512).","additionalProperties":{"type":"string"}}}},"pictures":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"width":{"type":["integer","null"]},"height":{"type":["integer","null"]}}}}}},"Track":{"type":"object","properties":{"artist":{"type":["string","null"]},"title":{"type":"string"},"song_key":{"type":["string","null"],"description":"Key for /songs/{key}; null for ads, jingles and titles without artist."},"song_url":{"type":["string","null"]},"since":{"type":["string","null"],"format":"date-time"}}},"NowPlayingStation":{"type":"object","properties":{"station_id":{"type":"string"},"now_playing":{"oneOf":[{"$ref":"#/components/schemas/Track"},{"type":"null"}]},"checked_at":{"type":["string","null"],"format":"date-time"},"metadata_available":{"type":["boolean","null"]},"recent":{"type":"array","items":{"type":"object","properties":{"artist":{"type":["string","null"]},"title":{"type":"string"},"song_key":{"type":["string","null"]},"song_url":{"type":["string","null"]},"played_at":{"type":["string","null"],"format":"date-time"}}}}}},"Country":{"type":"object","properties":{"country":{"type":"string"},"name":{"type":["string","null"]},"slug":{"type":["string","null"]},"stations":{"type":"integer"}}},"Region":{"type":"object","properties":{"country":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"stations":{"type":"integer"},"states":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"stations":{"type":"integer"}}}}}},"Genre":{"type":"object","properties":{"genre":{"type":"string"},"title":{"type":"string"},"stations":{"type":"integer"}}},"Language":{"type":"object","properties":{"language":{"type":"string"},"name":{"type":"string"},"stations":{"type":"integer"}}},"ChartSong":{"type":"object","properties":{"rank":{"type":"integer"},"song_key":{"type":"string"},"artist":{"type":"string"},"title":{"type":"string"},"featured":{"type":"array","items":{"type":"string"}},"artist_key":{"type":"string"},"plays":{"type":"integer"},"stations":{"type":"integer"},"previous_rank":{"type":["integer","null"]},"url":{"type":"string"}}},"ChartArtist":{"type":"object","properties":{"rank":{"type":"integer"},"artist_key":{"type":"string"},"name":{"type":"string"},"plays":{"type":"integer"},"songs":{"type":"integer"},"url":{"type":"string"}}},"Song":{"type":"object","properties":{"song_key":{"type":"string"},"artist":{"type":"string"},"title":{"type":"string"},"plays_30d":{"type":"integer"},"plays_per_day":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"plays":{"type":"integer"}}}},"countries":{"type":"array","items":{"type":"object","properties":{"country":{"type":"string"},"plays":{"type":"integer"}}}},"stations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"plays_14d":{"type":"integer"},"url":{"type":"string"}}}}}},"Artist":{"type":"object","properties":{"artist_key":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"},"total_plays":{"type":"integer"},"songs":{"type":"array","items":{"type":"object","properties":{"song_key":{"type":"string"},"title":{"type":"string"},"plays_30d":{"type":"integer"}}}}}},"Channel":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"main":{"type":"boolean"},"description":{"type":"string"},"color":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"cover_url":{"type":["string","null"]},"url":{"type":"string"}}},"ChannelTrack":{"type":"object","properties":{"track_id":{"type":"string"},"title":{"type":"string"},"artist":{"type":"string"},"track_url":{"type":["string","null"]},"artist_url":{"type":["string","null"]},"audio_url":{"type":["string","null"],"description":"MP3 of the track; play it from starts_at (or offset) to stay in sync with the channel."},"cover_url":{"type":["string","null"]},"duration":{"type":"number"},"starts_at":{"type":["string","null"],"format":"date-time"}}},"ChannelDetail":{"allOf":[{"$ref":"#/components/schemas/Channel"}],"properties":{"now_playing":{"oneOf":[{"allOf":[{"$ref":"#/components/schemas/ChannelTrack"}],"properties":{"offset":{"type":"number"}}},{"type":"null"}]},"schedule":{"type":"array","items":{"$ref":"#/components/schemas/ChannelTrack"}},"recent":{"type":"array","items":{"$ref":"#/components/schemas/ChannelTrack"}}}},"Playlist":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["special","country","genre"]},"country":{"type":["string","null"]},"genre":{"type":["string","null"]},"title":{"type":"string"},"description":{"type":"string"},"tracks_count":{"type":"integer"},"version":{"type":"integer"},"updated_at":{"type":["string","null"],"format":"date-time"},"url":{"type":"string"},"cover_url":{"type":"string"},"spotify_url":{"type":["string","null"],"description":"Public playlist on the official Radioguide Spotify account; null until it is there."},"spotify_id":{"type":["string","null"]}}},"PlaylistTrack":{"type":"object","properties":{"rank":{"type":"integer"},"song_key":{"type":"string"},"artist":{"type":"string"},"title":{"type":"string"},"artist_key":{"type":"string"},"featured":{"type":"array","items":{"type":"string"}},"plays":{"type":"integer"},"stations":{"type":"integer"},"previous_rank":{"type":["integer","null"]},"url":{"type":"string"},"spotify_id":{"type":["string","null"]},"spotify_url":{"type":["string","null"]}}},"PlaylistDetail":{"allOf":[{"$ref":"#/components/schemas/Playlist"}],"properties":{"tracks":{"type":"array","items":{"$ref":"#/components/schemas/PlaylistTrack"}}}},"OntdektCard":{"type":"object","properties":{"id":{"type":"string"},"artist":{"type":"string"},"title":{"type":"string"},"genre":{"type":["string","null"]},"country":{"type":["string","null"]},"audio_url":{"type":["string","null"]},"cover_url":{"type":["string","null"]},"url":{"type":["string","null"]},"sponsored":{"type":"boolean"},"label":{"type":["string","null"],"description":"Show this label (Sponsored) on the card when it is not null."},"token":{"type":"string","description":"Signed source of the card (valid today and tomorrow); send it with every event of this card."}}},"OntdektPlaylist":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"version":{"type":"integer"},"url":{"type":"string"},"tracks":{"type":"array","items":{"type":"object","properties":{"rank":{"type":"integer"},"id":{"type":["string","null"]},"song_key":{"type":"string"},"artist":{"type":"string"},"title":{"type":"string"},"audio_url":{"type":["string","null"]},"cover_url":{"type":["string","null"]},"url":{"type":"string"}}}}}},"OntdektEvents":{"type":"object","required":["device","events"],"properties":{"device":{"type":"string","pattern":"^[A-Za-z0-9_-]{8,64}$","description":"Random id per app install (no personal data)."},"events":{"type":"array","maxItems":50,"items":{"type":"object","required":["id","event"],"properties":{"id":{"type":"string","pattern":"^[a-f0-9]{24}$"},"event":{"type":"string","enum":["imp","play","c30","c80","save","share","rep"]},"token":{"type":"string","description":"The token of the card; empty for plays from the playlist (organic)."}}}}}},"Change":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string","enum":["created","updated","removed"]},"station_id":{"type":"string"},"fields":{"type":"array","items":{"type":"string","enum":["name","slug","region","genres","streams","website","logo"]}},"at":{"type":["string","null"],"format":"date-time"},"station":{"oneOf":[{"$ref":"#/components/schemas/Station"},{"type":"null"}],"description":"With include=station."}}},"Me":{"type":"object","properties":{"project":{"type":"string"},"plan":{"type":"string"},"limits":{"type":"object"},"used_today":{"type":"integer"},"key":{"type":"object","properties":{"prefix":{"type":"string"},"label":{"type":["string","null"]}}}}},"WebhookEvent":{"type":"object","required":["id","event","created_at","data"],"properties":{"id":{"type":"string","description":"Delivery id, the same on retries."},"event":{"type":"string","enum":["station.created","station.updated","station.removed","stream.down","stream.up","now_playing.changed","station.bulk_changed","ping"]},"created_at":{"type":["string","null"],"format":"date-time"},"data":{"type":"object"}}}}}}