openapi: 3.0.3
info:
title: Radio Browser API
description: |
Radio Browser is a free community-driven directory of internet radio
stations. The API exposes the complete station database along with
metadata (countries, languages, codecs, tags, states) and supports
click counting, voting, and station submission.
Servers are reached through a round-robin DNS pool. Resolve
`all.api.radio-browser.info` to obtain the list of mirrors, then call
one of them (for example `de1.api.radio-browser.info`). The base URL
`api.radio-browser.info` also resolves to one of the active mirrors.
Clients MUST send a descriptive `User-Agent` header in the form
`appname/appversion`. Voting is throttled to one vote per station per
IP every 10 minutes. Click counts are aggregated once per station per
IP per 24 hours.
version: "0.7.44"
contact:
name: Radio Browser
url: https://www.radio-browser.info/
license:
name: AGPL-3.0
url: https://www.gnu.org/licenses/agpl-3.0.html
servers:
- url: https://de1.api.radio-browser.info
description: Germany 1 mirror
- url: https://nl1.api.radio-browser.info
description: Netherlands 1 mirror
- url: https://at1.api.radio-browser.info
description: Austria 1 mirror
- url: https://all.api.radio-browser.info
description: Round-robin pool entry (resolve via DNS)
tags:
- name: Stations
description: Browse, search, and list radio stations.
- name: Categories
description: Aggregated counts of countries, languages, tags, codecs, and states.
- name: Interactions
description: Click counting, voting, and station submission.
- name: Service
description: Server stats, mirror discovery, and configuration.
paths:
/json/stations:
get:
tags: [Stations]
operationId: listStations
summary: List All Stations
description: Return the full collection of radio stations as JSON.
parameters:
- $ref: '#/components/parameters/Offset'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/HideBroken'
responses:
'200':
description: Array of station objects.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Station'
/json/stations/search:
get:
tags: [Stations]
operationId: searchStations
summary: Search Stations
description: Advanced search across the station database using multiple optional filters.
parameters:
- in: query
name: name
schema: { type: string }
description: Match station name (substring, case-insensitive).
- in: query
name: nameExact
schema: { type: boolean, default: false }
- in: query
name: country
schema: { type: string }
- in: query
name: countrycode
schema: { type: string, description: ISO 3166-1 alpha-2 country code. }
- in: query
name: state
schema: { type: string }
- in: query
name: language
schema: { type: string }
- in: query
name: tag
schema: { type: string }
- in: query
name: tagList
schema: { type: string, description: Comma-separated tag list. }
- in: query
name: codec
schema: { type: string }
- in: query
name: bitrateMin
schema: { type: integer, minimum: 0 }
- in: query
name: bitrateMax
schema: { type: integer, minimum: 0 }
- in: query
name: order
schema:
type: string
enum: [name, url, homepage, favicon, tags, country, state, language, votes, codec, bitrate, lastcheckok, lastchecktime, clicktimestamp, clickcount, clicktrend, random]
- in: query
name: reverse
schema: { type: boolean, default: false }
- $ref: '#/components/parameters/Offset'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/HideBroken'
responses:
'200':
description: Filtered list of stations.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Station'
/json/stations/byuuid:
get:
tags: [Stations]
operationId: getStationsByUuid
summary: Get Stations By UUID
description: Return the stations matching the supplied station UUIDs.
parameters:
- in: query
name: uuids
required: true
schema: { type: string }
description: One UUID or a comma-separated list of UUIDs.
responses:
'200':
description: Array of matching stations.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Station'
/json/stations/byname/{searchterm}:
get:
tags: [Stations]
operationId: getStationsByName
summary: Get Stations By Name
parameters:
- in: path
name: searchterm
required: true
schema: { type: string }
responses:
'200':
description: Stations whose name matches the search term.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Station' }
/json/stations/bycountry/{searchterm}:
get:
tags: [Stations]
operationId: getStationsByCountry
summary: Get Stations By Country
parameters:
- in: path
name: searchterm
required: true
schema: { type: string }
responses:
'200':
description: Stations registered in the given country.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Station' }
/json/stations/bycountrycodeexact/{searchterm}:
get:
tags: [Stations]
operationId: getStationsByCountryCode
summary: Get Stations By Country Code
parameters:
- in: path
name: searchterm
required: true
schema: { type: string, description: ISO 3166-1 alpha-2 country code. }
responses:
'200':
description: Stations matching the country code exactly.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Station' }
/json/stations/bylanguage/{searchterm}:
get:
tags: [Stations]
operationId: getStationsByLanguage
summary: Get Stations By Language
parameters:
- in: path
name: searchterm
required: true
schema: { type: string }
responses:
'200':
description: Stations broadcasting in the given language.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Station' }
/json/stations/bytag/{searchterm}:
get:
tags: [Stations]
operationId: getStationsByTag
summary: Get Stations By Tag
parameters:
- in: path
name: searchterm
required: true
schema: { type: string }
responses:
'200':
description: Stations tagged with the given keyword.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Station' }
/json/stations/bycodec/{searchterm}:
get:
tags: [Stations]
operationId: getStationsByCodec
summary: Get Stations By Codec
parameters:
- in: path
name: searchterm
required: true
schema: { type: string }
responses:
'200':
description: Stations using the given audio codec.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Station' }
/json/stations/byurl:
get:
tags: [Stations]
operationId: getStationsByUrl
summary: Get Stations By Stream URL
parameters:
- in: query
name: url
required: true
schema: { type: string, format: uri }
responses:
'200':
description: Stations registered with the given stream URL.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Station' }
/json/stations/topclick:
get:
tags: [Stations]
operationId: getTopClickStations
summary: Get Top Clicked Stations
parameters:
- in: path
name: rowcount
schema: { type: integer, minimum: 1 }
required: false
responses:
'200':
description: Stations ranked by click count.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Station' }
/json/stations/topvote:
get:
tags: [Stations]
operationId: getTopVoteStations
summary: Get Top Voted Stations
responses:
'200':
description: Stations ranked by vote count.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Station' }
/json/stations/lastclick:
get:
tags: [Stations]
operationId: getLastClickStations
summary: Get Recently Clicked Stations
responses:
'200':
description: Stations sorted by most recent click.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Station' }
/json/stations/lastchange:
get:
tags: [Stations]
operationId: getLastChangeStations
summary: Get Recently Changed Stations
responses:
'200':
description: Stations sorted by most recent change.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Station' }
/json/stations/broken:
get:
tags: [Stations]
operationId: getBrokenStations
summary: Get Broken Stations
responses:
'200':
description: Stations whose latest health check failed.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Station' }
/json/countries:
get:
tags: [Categories]
operationId: listCountries
summary: List Countries
description: List all countries with the number of stations per country.
responses:
'200':
description: Country aggregates.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Category' }
/json/countrycodes:
get:
tags: [Categories]
operationId: listCountryCodes
summary: List Country Codes
responses:
'200':
description: ISO 3166-1 country code aggregates.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Category' }
/json/states:
get:
tags: [Categories]
operationId: listStates
summary: List States
description: List all states/regions with station counts.
responses:
'200':
description: State aggregates.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/StateCategory' }
/json/languages:
get:
tags: [Categories]
operationId: listLanguages
summary: List Languages
responses:
'200':
description: Language aggregates.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Category' }
/json/tags:
get:
tags: [Categories]
operationId: listTags
summary: List Tags
responses:
'200':
description: Tag aggregates.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Category' }
/json/codecs:
get:
tags: [Categories]
operationId: listCodecs
summary: List Codecs
responses:
'200':
description: Codec aggregates.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Category' }
/json/url/{stationuuid}:
get:
tags: [Interactions]
operationId: clickStation
summary: Click Station
description: |
Register a play (click) for the given station and return the resolved
stream URL. Clients SHOULD call this every time the user starts
playback. Counted once per IP per station per 24 hours.
parameters:
- in: path
name: stationuuid
required: true
schema: { type: string, format: uuid }
responses:
'200':
description: Click acknowledged.
content:
application/json:
schema:
$ref: '#/components/schemas/ClickResult'
/json/vote/{stationuuid}:
get:
tags: [Interactions]
operationId: voteStation
summary: Vote For Station
description: Vote for a station. Throttled to one vote per station per IP every 10 minutes.
parameters:
- in: path
name: stationuuid
required: true
schema: { type: string, format: uuid }
responses:
'200':
description: Vote outcome.
content:
application/json:
schema:
$ref: '#/components/schemas/StatusResult'
/json/add:
post:
tags: [Interactions]
operationId: addStation
summary: Submit Station
description: Submit a new radio station to the directory.
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/StationSubmission'
application/json:
schema:
$ref: '#/components/schemas/StationSubmission'
responses:
'200':
description: Submission result.
content:
application/json:
schema:
$ref: '#/components/schemas/AddStationResult'
/json/stats:
get:
tags: [Service]
operationId: getStats
summary: Get Service Stats
responses:
'200':
description: Service statistics.
content:
application/json:
schema:
$ref: '#/components/schemas/Stats'
/json/servers:
get:
tags: [Service]
operationId: listServers
summary: List Mirror Servers
responses:
'200':
description: Known mirror servers.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/MirrorServer' }
/json/config:
get:
tags: [Service]
operationId: getConfig
summary: Get Server Config
responses:
'200':
description: Server configuration values.
content:
application/json:
schema:
type: object
additionalProperties: true
/json/checks:
get:
tags: [Service]
operationId: listChecks
summary: List Station Checks
description: List recent stream-health check results.
parameters:
- $ref: '#/components/parameters/Offset'
- $ref: '#/components/parameters/Limit'
responses:
'200':
description: Check records.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/StationCheck' }
/json/clicks:
get:
tags: [Service]
operationId: listClicks
summary: List Click Events
parameters:
- $ref: '#/components/parameters/Offset'
- $ref: '#/components/parameters/Limit'
responses:
'200':
description: Click records.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/StationClick' }
components:
parameters:
Offset:
in: query
name: offset
schema: { type: integer, minimum: 0, default: 0 }
description: Starting offset for pagination.
Limit:
in: query
name: limit
schema: { type: integer, minimum: 0, default: 100000 }
description: Maximum rows to return.
HideBroken:
in: query
name: hidebroken
schema: { type: boolean, default: false }
description: Exclude stations whose last health check failed.
schemas:
Station:
type: object
description: A radio station entry in the Radio Browser directory.
properties:
changeuuid: { type: string, format: uuid }
stationuuid: { type: string, format: uuid }
serveruuid: { type: string, format: uuid, nullable: true }
name: { type: string }
url: { type: string, format: uri }
url_resolved: { type: string, format: uri }
homepage: { type: string, format: uri }
favicon: { type: string, format: uri }
tags: { type: string, description: Comma-separated tag list. }
country: { type: string }
countrycode: { type: string, description: ISO 3166-1 alpha-2. }
iso_3166_2: { type: string }
state: { type: string }
language: { type: string, description: Comma-separated language list. }
languagecodes: { type: string, description: Comma-separated ISO 639 codes. }
votes: { type: integer }
lastchangetime: { type: string }
lastchangetime_iso8601: { type: string, format: date-time }
codec: { type: string }
bitrate: { type: integer, description: Kilobits per second. }
hls: { type: integer, enum: [0, 1] }
lastcheckok: { type: integer, enum: [0, 1] }
lastchecktime: { type: string }
lastchecktime_iso8601: { type: string, format: date-time }
lastcheckoktime: { type: string }
lastcheckoktime_iso8601: { type: string, format: date-time }
lastlocalchecktime: { type: string }
lastlocalchecktime_iso8601: { type: string, format: date-time }
clicktimestamp: { type: string }
clicktimestamp_iso8601: { type: string, format: date-time, nullable: true }
clickcount: { type: integer }
clicktrend: { type: integer }
ssl_error: { type: integer, enum: [0, 1] }
geo_lat: { type: number, format: float, nullable: true }
geo_long: { type: number, format: float, nullable: true }
geo_distance: { type: number, format: float, nullable: true }
has_extended_info: { type: boolean }
Category:
type: object
description: An aggregate count of stations for a category (country, language, tag, or codec).
properties:
name: { type: string }
stationcount: { type: integer }
StateCategory:
allOf:
- $ref: '#/components/schemas/Category'
- type: object
properties:
country: { type: string }
ClickResult:
type: object
properties:
ok: { type: boolean }
message: { type: string }
stationuuid: { type: string, format: uuid }
name: { type: string }
url: { type: string, format: uri }
StatusResult:
type: object
properties:
ok: { type: boolean }
message: { type: string }
StationSubmission:
type: object
required: [name, url]
properties:
name: { type: string }
url: { type: string, format: uri }
homepage: { type: string, format: uri }
favicon: { type: string, format: uri }
country: { type: string }
countrycode: { type: string }
state: { type: string }
language: { type: string }
tags: { type: string }
geo_lat: { type: number, format: float }
geo_long: { type: number, format: float }
AddStationResult:
type: object
properties:
ok: { type: boolean }
message: { type: string }
uuid: { type: string, format: uuid }
Stats:
type: object
properties:
supported_version: { type: integer }
software_version: { type: string }
status: { type: string }
stations: { type: integer }
stations_broken: { type: integer }
tags: { type: integer }
clicks_last_hour: { type: integer }
clicks_last_day: { type: integer }
languages: { type: integer }
countries: { type: integer }
MirrorServer:
type: object
properties:
ip: { type: string }
name: { type: string }
StationCheck:
type: object
properties:
checkuuid: { type: string, format: uuid }
stationuuid: { type: string, format: uuid }
source: { type: string }
codec: { type: string }
bitrate: { type: integer }
hls: { type: integer }
ok: { type: integer, enum: [0, 1] }
timestamp: { type: string }
timestamp_iso8601: { type: string, format: date-time }
urlcache: { type: string, format: uri }
metainfo_overrides_database: { type: integer }
public: { type: integer, nullable: true }
name: { type: string, nullable: true }
description: { type: string, nullable: true }
tags: { type: string, nullable: true }
countrycode: { type: string, nullable: true }
homepage: { type: string, nullable: true }
favicon: { type: string, nullable: true }
loadbalancer: { type: integer, nullable: true }
do_not_index: { type: integer, nullable: true }
countrysubdivisioncode: { type: string, nullable: true }
server_software: { type: string, nullable: true }
sampling: { type: integer, nullable: true }
timing_ms: { type: integer }
languagecodes: { type: string, nullable: true }
ssl_error: { type: integer }
geo_lat: { type: number, format: float, nullable: true }
geo_long: { type: number, format: float, nullable: true }
StationClick:
type: object
properties:
stationuuid: { type: string, format: uuid }
clickuuid: { type: string, format: uuid }
clicktimestamp_iso8601: { type: string, format: date-time }
clicktimestamp: { type: string }