openapi: 3.0.3 info: title: TuneIn Streaming API (OPML/RadioTime) description: > The TuneIn Streaming API (backed by opml.radiotime.com) provides access to TuneIn's directory of internet radio stations, podcasts, sports audio, news, and music. Callers can browse categories, search for stations, describe specific stations or shows, and retrieve stream URLs for playback. Responses are available in OPML (XML) or JSON format. No authentication is required for the public streaming API. version: 1.0.0 contact: name: TuneIn Support url: https://help.tunein.com/ x-unofficial-docs: https://tunein-api.corehacked.com/ servers: - url: https://opml.radiotime.com description: TuneIn OPML / RadioTime public endpoint paths: /browse.ashx: get: operationId: browseDirectory summary: Browse the TuneIn directory description: > Browse TuneIn's directory of radio stations, podcasts, sports, news, and music by category. Returns an OPML (XML) or JSON listing of categories or stations depending on the parameters supplied. parameters: - name: c in: query description: > Browse category. Valid values: local, music, talk, sports, lang, podcast. The "local" category returns streaming results directly; the others return further menu options. required: false schema: type: string enum: - local - music - talk - sports - lang - podcast - name: id in: query description: > Identifier of a country or continent for location-scoped browsing (e.g. r0, r101217). Used with categories that support geographic filtering. required: false schema: type: string example: r101217 - name: filter in: query description: > Language category filter. Format is "letter:text", e.g. "s:popular" or "p:show". Used by the lang category to narrow results. required: false schema: type: string example: s:popular - name: render in: query description: > Response format override. Set to "json" to receive JSON instead of the default XML/OPML response. required: false schema: type: string enum: - json responses: '200': description: > OPML (XML) or JSON listing of categories or stations. When no category is specified the root directory is returned. Station outlines include type, text, URL, bitrate, reliability, guide_id, subtext, genre_id, formats, show_id, image, current_track, now_playing_id, and preset_id attributes. content: application/xml: example: | Browse 200 application/json: schema: $ref: '#/components/schemas/BrowseResponse' /search.ashx: get: operationId: searchDirectory summary: Search for stations, shows, and podcasts description: > Search the TuneIn directory for radio stations, shows, topics, and podcasts. Returns an OPML (XML) or JSON list of matching results. The query parameter must be URL-encoded. Returns a "No results" outline element when no matches are found. parameters: - name: query in: query description: > Search term. Must be URL-encoded (e.g. "GitFM" becomes "GitFM", multi-word queries should encode spaces as "+"). required: true schema: type: string example: BBC Radio 4 - name: render in: query description: > Response format override. Set to "json" to receive JSON instead of the default XML/OPML response. required: false schema: type: string enum: - json responses: '200': description: > OPML (XML) or JSON list of matching stations/shows. Each result outline may include: type, text, URL, guide_id, image, bitrate, reliability, genre_id, formats, playing, item attributes. When no results are found, returns an outline of type "text" with a "No results for [query]" message. content: application/xml: example: | Search 200 application/json: schema: $ref: '#/components/schemas/SearchResponse' /describe.ashx: get: operationId: describeStation summary: Get detailed metadata for a station or show description: > Returns detailed metadata about a specific TuneIn station, show, topic, or podcast identified by its guide_id. The response includes over 60 fields covering broadcast details, geographic data, content classifications, monetization flags, and social sharing capabilities. parameters: - name: id in: query description: > Station or show identifier as returned in guide_id or preset_id outline attributes (e.g. s42069). required: true schema: type: string example: s42069 - name: render in: query description: > Response format override. Set to "json" to receive JSON instead of the default XML/OPML response. required: false schema: type: string enum: - json responses: '200': description: > Detailed station or show metadata wrapped in an OPML structure. content: application/xml: example: | Describe 200 application/json: schema: $ref: '#/components/schemas/DescribeResponse' /tune.ashx: get: operationId: tuneStation summary: Get the streaming playlist file for a station or show description: > Returns a .m3u playlist file that can be used to stream the specified station or show. The id parameter is obtained from the outline URL or guide_id attributes returned by browse, search, or describe. The response is a direct file download. parameters: - name: id in: query description: > Tune identifier obtained from outline objects (e.g. s12345 for a station). Use the id value embedded in the outline URL attribute from browse or search results. required: true schema: type: string example: s12345 - name: sid in: query description: > Show or topic identifier (e.g. p1234567). Used alongside the id parameter for shows and topics. Purpose partially undocumented. required: false schema: type: string example: p1234567 responses: '200': description: > An M3U playlist file containing the streaming URL(s) for the requested station or show. Use a media player or streaming library to parse and play the returned stream URLs. content: audio/x-mpegurl: example: | #EXTM3U http://stream.example.com/live components: schemas: BrowseOutline: type: object description: A single item in an OPML browse response (JSON rendering) properties: type: type: string description: Outline type (e.g. "link", "audio", "text") text: type: string description: Display name of the category or station URL: type: string format: uri description: URL to browse further or tune to the station key: type: string description: Category identifier key guide_id: type: string description: Unique TuneIn station or show identifier preset_id: type: string description: Preset identifier bitrate: type: integer description: Stream bitrate in kbps reliability: type: integer description: Stream reliability percentage (0-100) genre_id: type: string description: Genre classification code formats: type: string description: Audio format (e.g. "mp3", "aac") show_id: type: string description: Show identifier image: type: string format: uri description: Station or show image URL current_track: type: string description: Currently playing track title now_playing_id: type: string description: Now-playing metadata identifier subtext: type: string description: Secondary display text BrowseResponse: type: object properties: head: type: object properties: title: type: string example: Browse status: type: integer example: 200 body: type: object properties: outline: type: array items: $ref: '#/components/schemas/BrowseOutline' SearchOutline: type: object description: A single search result item (JSON rendering) properties: type: type: string description: Outline type (e.g. "audio", "link", "text") text: type: string description: Display name of the station or show URL: type: string format: uri description: Tune URL for the station or show guide_id: type: string description: Unique TuneIn identifier image: type: string format: uri description: Station or show image URL bitrate: type: integer description: Stream bitrate in kbps reliability: type: integer description: Stream reliability percentage (0-100) genre_id: type: string description: Genre classification code formats: type: string description: Audio format (e.g. "mp3") playing: type: string description: Currently playing content item: type: string description: Item classification (e.g. "station", "show") SearchResponse: type: object properties: head: type: object properties: title: type: string example: Search status: type: integer example: 200 body: type: object properties: outline: type: array items: $ref: '#/components/schemas/SearchOutline' StationDetails: type: object description: Detailed station or show metadata (JSON rendering of describe response) properties: guide_id: type: string description: Unique TuneIn station identifier preset_id: type: string description: Preset identifier name: type: string description: Station name call_sign: type: string description: Broadcast call sign (e.g. "WXYZ") slogan: type: string description: Station slogan or tagline frequency: type: string description: Broadcast frequency (e.g. "96.2") band: type: string description: Broadcast band (e.g. "FM", "AM") url: type: string format: uri description: Tune URL for the station detail_url: type: string format: uri description: TuneIn web page URL for the station tunein_url: type: string format: uri description: TuneIn canonical URL logo: type: string format: uri description: Station logo image URL location: type: string description: City and state/country location description: type: string description: Station description genre_id: type: string description: Genre classification code genre_name: type: string description: Human-readable genre name language: type: string description: Primary broadcast language country_region_id: type: string description: Country or region identifier tz: type: string description: Timezone name tz_offset: type: integer description: Timezone offset in minutes from UTC is_available: type: boolean description: Whether the station is currently available is_music: type: boolean description: Whether the station primarily plays music has_song: type: boolean description: Whether song metadata is available has_schedule: type: boolean description: Whether a program schedule is available ad_eligible: type: boolean description: Whether the station is eligible for advertising preroll_ad_eligible: type: boolean description: Whether preroll ads can be served companion_ad_eligible: type: boolean description: Whether companion ads can be served video_preroll_ad_eligible: type: boolean description: Whether video preroll ads can be served fb_share: type: boolean description: Whether Facebook sharing is enabled twitter_share: type: boolean description: Whether Twitter/X sharing is enabled song_share: type: boolean description: Whether song-level sharing is enabled content_classification: type: string description: Content classification label is_family_content: type: boolean description: Whether the content is family-friendly is_mature_content: type: boolean description: Whether the content is mature/adult can_cast: type: boolean description: Whether the station supports Chromecast nielsen_eligible: type: boolean description: Whether the station is eligible for Nielsen tracking live_seek_stream: type: boolean description: Whether live seek/time-shift is supported seek_disabled: type: boolean description: Whether seeking is disabled DescribeResponse: type: object properties: head: type: object properties: title: type: string example: Describe status: type: integer example: 200 body: type: object properties: outline: $ref: '#/components/schemas/StationDetails'