# Radio Browser Scraper: Internet Radio Stations & Streams (`recordsdata/radio-browser-stations-scraper`) Actor

Scrape Radio Browser: 59,985 internet radio stations with direct stream URLs, genre tags, country, language, codec, bitrate and votes. Filter by genre, country, language and bitrate. Export CSV, Excel, JSON, XML. No login or API key. Empty searches are never charged.

- **URL**: https://apify.com/recordsdata/radio-browser-stations-scraper.md
- **Developed by:** [RecordsData](https://apify.com/recordsdata) (community)
- **Categories:** Videos, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

<p align="center">
  <img src="https://api.apify.com/v2/key-value-stores/AAm3a1h3Z9nYfrvh9/records/banner?v=3" alt="RecordsData" width="100%" />
</p>

## Radio Browser Scraper: Internet Radio Stations & Streams

> **Radio Browser Scraper exports internet radio stations from radio-browser.info as CSV, Excel, JSON or XML. Each row has the resolved stream URL, genre tags, country, language, codec, bitrate, votes and the result of the last health check. Filter by genre, country, language and bitrate. No login and no API key. Priced at $0.02 per station on the free plan, with nothing charged for empty searches.**

Radio Browser Scraper pulls station data from the open radio-browser.info database, which listed 59,985 working-or-broken stations, 240 countries with stations and 12,446 tags when we checked on 2026-10-04. It is built for radio app developers, smart speaker and in-car teams, and media researchers who need playable stream URLs instead of a raw database dump.

### 📻 What does Radio Browser Scraper do?

- Finds radio stations by genre tag (jazz, news, rock, classical), country code, language, name text or minimum bitrate.
- Returns the final stream URL after redirects, so the link is ready to embed in a player.
- Hides stations whose stream failed the last automated check (switch on by default).
- Sorts by votes, clicks, trending, name or bitrate.
- Exports a country directory and a genre-tag directory with station counts for market sizing.
- Runs on the public Radio Browser API and rotates across three official mirrors when one is slow.

### 📊 What data can you extract from Radio Browser?

| Field | Description |
|---|---|
| `stationId` | Radio Browser station UUID |
| `name` | Station name |
| `streamUrl` | Resolved direct stream URL |
| `homepage`, `faviconUrl` | Station website and logo |
| `tags` | Genre tags, up to 12 (omitted when the station has none) |
| `country`, `countryCode`, `state` | Location |
| `languages` | Broadcast languages (omitted when not listed) |
| `votes`, `clickCount`, `clickTrend` | Popularity signals |
| `codec`, `bitrateKbps` | Audio format and quality |
| `isOnline`, `lastCheckedAt` | Result and time of the last health check |
| `latitude`, `longitude` | Geo coordinates, or "Not Disclosed" |
| `url`, `scrapedAt` | Radio Browser history page and scrape time |
| `stationCount` | Directory rows only: stations per country or tag |

### 🧾 Sample output of the radio station export

This is a real row from our own cloud run on 2026-10-04 (jazz stations in the US, sorted by votes):

```json
{
  "recordType": "station",
  "stationId": "d1a54d2e-623e-4970-ab11-35f7b56c5ec3",
  "name": "Classic Vinyl HD",
  "streamUrl": "https://icecast.walmradio.com:8443/classic",
  "homepage": "https://walmradio.com/classic",
  "faviconUrl": "https://icecast.walmradio.com:8443/classic.jpg",
  "tags": ["1930", "1940", "1950", "1960", "beautiful music", "big band", "classic hits", "crooners", "easy", "easy listening", "hd", "jazz"],
  "country": "The United States Of America",
  "countryCode": "US",
  "state": "New York NY",
  "languages": ["english"],
  "votes": 305547,
  "clickCount": 769,
  "clickTrend": 769,
  "codec": "MP3",
  "bitrateKbps": 320,
  "isOnline": true,
  "lastCheckedAt": "2026-10-01T10:47:08Z",
  "latitude": 40.75166,
  "longitude": -73.97538,
  "url": "https://www.radio-browser.info/history/d1a54d2e-623e-4970-ab11-35f7b56c5ec3",
  "scrapedAt": "2026-10-04T04:12:52.412Z"
}
```

In that run, 10 of 10 rows were delivered, every station was unique, and no column was empty for all rows. The run took about 3 seconds of runtime.

### 💰 How much does it cost to scrape Radio Browser?

Pay per event. You are billed only for rows that were saved to your dataset. Failed requests, empty searches and invalid input are never billed.

| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
| Station record (one station) | $0.020 | $0.01964 | $0.01909 | $0.01855 |
| Directory row (one country or tag) | $0.010 | $0.010 | $0.010 | $0.010 |

Examples at free plan prices: 10 stations cost $0.20, **1,000 stations cost $20.00** (1,000 x $0.02), and 1,000 directory rows (countries or tags) cost $10.00. On the Gold tier, 1,000 stations cost $18.55. We ran a 10-station test and the platform recorded exactly 10 station-record events. You can cap spend with the Maximum cost per run setting; the actor stops cleanly at your limit.

### 🚀 How to scrape Radio Browser in 3 steps

1. Open the actor and click **Try for free**.
2. Set a genre tag, country code or language, pick a sort order and set **Max Items**.
3. Click **Start**, then download the dataset as CSV, Excel, JSON or XML.

### ⚙️ Radio Browser Scraper input

| Field | Default | Meaning |
|---|---|---|
| `tag` | `jazz` | Genre tag filter. Empty means all genres. |
| `countryCode` | empty | Two-letter ISO code such as US, DE, MX. |
| `language` | empty | Language name such as english or spanish. |
| `stationName` | empty | Name contains this text. |
| `minBitrate` | 0 | Minimum bitrate in kbps. |
| `onlyWorking` | true | Skip stations that failed the last check. |
| `sortBy` | `votes` | votes, clickcount, clicktrend, name or bitrate. |
| `includeCountries`, `includeTags` | false | Add directory rows. |
| `maxItems` | 10 | Rows to deliver. Free Apify users are capped at 10. |

```json
{ "tag": "jazz", "countryCode": "US", "sortBy": "votes", "maxItems": 100 }
```

### 📦 Radio Browser Scraper output

One dataset row per station, country or tag. The `recordType` field says which. Fields that a station does not have (for example `languages`) are left out instead of being filled with empty values. If a search matches nothing, the run ends successfully with a status message and charges nothing. If the Radio Browser API cannot be reached on any mirror, the run fails with a clear message and charges nothing.

### 🆚 Radio Browser Scraper vs alternatives

Competitor features and prices read from their public Apify Store pages on 2026-10-09. "Not stated" means the listing does not mention it.

| Capability | This actor | benthepythondev | fortuitous_pirate |
|---|---|---|---|
| Filters | Name, tag, country, language, bitrate | Name, country | Name, tag, country, language |
| Working-only filter | Yes | Not stated | Not stated |
| Health check per row | Yes | Yes | Not stated |
| Directories | Countries, tags | Not stated | Tags, by country |
| Zero-result run | Not charged | Fails run | Not stated |
| Price per 1,000 | $20 | $1.60 to $2 | $10 |

Both rivals cost less per row. Our price adds the working-only filter, bitrate filter and five sort modes. For a raw keyword dump, a cheaper actor fits better.

### 🎯 Radio Browser Scraper use cases

- **Radio apps and websites:** seed and refresh a station catalog per market with working streams.
- **Smart speakers and cars:** build preset lists per country, filtered to high-bitrate streams.
- **Media research:** compare genre and country coverage using the directory rows.
- **Broadcast monitoring:** track votes and click trend for your own stations over time.

### 🔌 Run Radio Browser Scraper via API, schedule and integrations

```bash
curl -X POST "https://api.apify.com/v2/acts/RecordsData~radio-browser-stations-scraper/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"tag":"jazz","countryCode":"US","maxItems":10}'
```

Schedule nightly refreshes in Apify, or connect to Zapier, Make, n8n, Google Sheets and Airbyte. AI agents can also call it through MCP, see the next section.

### 🤖 Radio Browser Scraper MCP server for AI agents (Claude, Cursor, VS Code)

Connect this actor to any MCP client through the Apify MCP server. Use this URL, which exposes only this actor as a tool:

`https://mcp.apify.com?tools=RecordsData/radio-browser-stations-scraper`

Config for clients that take a JSON MCP config:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=RecordsData/radio-browser-stations-scraper"
    }
  }
}
```

Example agent prompt: "Use the Radio Browser Scraper to find the 20 most voted working jazz stations in the US with a bitrate of at least 128 kbps, and give me each name, stream URL and codec."

An agent should choose this tool when it needs playable internet radio stream URLs and station metadata filtered by genre, country, language or bitrate. The input takes the same fields as the actor, so keep `maxItems` small for quick agent runs.

### ⚖️ Is it legal to scrape Radio Browser?

Radio Browser is a community open-data project with a public API. The actor uses that API with a descriptive user agent and spreads requests across the official mirrors, as the project asks. The data describes public radio stations, not people. You remain responsible for how you use stream URLs and station metadata, including each broadcaster's terms.

### ❓ Frequently asked questions

#### Are the Radio Browser stream URLs playable directly?

The Radio Browser Scraper returns the stream URL resolved after redirects in `streamUrl`, so it is ready to embed in a player. Each row also carries `isOnline` and `lastCheckedAt` from the Radio Browser network's last automated health check. A station can still go offline after that check, so keep your player ready to handle failures.

#### How many stations does Radio Browser have?

On 2026-10-04 the public radio-browser.info stats endpoint reported 59,985 stations, 7,182 of them flagged broken, across 240 countries with stations and 687 languages. The Radio Browser Scraper hides stations whose last check failed by default, using the `onlyWorking` switch, so a default run returns only working streams.

#### How do I get only high-quality radio streams?

Set `minBitrate` in the Radio Browser Scraper to 128 or 320 kbps and keep `onlyWorking` switched on. You can also sort by `bitrate` to get the highest-quality streams first. Each row reports the `codec` and `bitrateKbps` fields, for example MP3 at 320 kbps in the sample row, so you can filter further after export.

#### Why did the Radio Browser Scraper return 0 results?

Your filters matched no station. Try a broader genre tag, remove the language filter, or turn `onlyWorking` off. The Radio Browser Scraper run still succeeds, shows a status message explaining that nothing matched, and charges nothing, because only rows saved to the dataset are billed.

#### Am I charged for failed or empty Radio Browser runs?

No. The Radio Browser Scraper bills only rows that were saved to your dataset, and it never bills error rows, empty searches or invalid input. If the Radio Browser API cannot be reached on any of its mirrors, the run fails with a clear message and charges nothing. You can also cap spend with the Maximum cost per run setting.

#### Can I get all radio stations in the world?

Yes. Leave all filters empty in the Radio Browser Scraper and set a large `maxItems`. Paid Apify plans allow up to 1,000,000 rows per run, while free plan users are capped at 10 rows. At $0.02 per station on the free plan tier, 1,000 stations cost $20, so set a Maximum cost per run for large exports.

#### Can I try the Radio Browser Scraper for free?

Yes. Free Apify plan users get a 10-row preview per run with the Radio Browser Scraper, which costs $0.20 at the Free plan station price of $0.02. New Apify accounts also include free monthly credit, so you can test the filters and the output format before running a larger export.

#### Can I export a list of radio countries or genres?

Yes. Turn on `includeCountries` or `includeTags` in the Radio Browser Scraper to get one directory row per country or genre tag, each with its `stationCount`. Each directory row costs $0.01, and these rows are useful for market sizing and for finding the exact tag names to use in a later station search.

### 🎵 Want more music and media data? Other RecordsData scrapers

- [Deezer Music Scraper](https://apify.com/RecordsData/deezer-music-scraper)
- [Apple Podcasts Scraper](https://apify.com/RecordsData/apple-podcasts-scraper)
- [Kworb Music Charts Scraper](https://apify.com/RecordsData/kworb-music-charts-scraper)

### 🛟 Support

Found a bug or a missing field? Open the Issues tab on this actor's page, or write to contact.punkrecordsdata@gmail.com. Custom solutions are available on request.

Last updated: 2026-10-07

# Actor input Schema

## `includeStations` (type: `boolean`):

Set true to scrape radio stations (name, stream URL, tags, country, language, codec, bitrate, votes) matching the filters below.

## `stationName` (type: `string`):

Keep only stations whose name contains this text, for example BBC or Jazz FM. Leave empty for any name.

## `tag` (type: `string`):

Genre tag to filter stations by, for example jazz, news, rock or classical. Leave empty for all genres.

## `countryCode` (type: `string`):

Two-letter ISO country code to filter stations by, for example US, DE or MX. Leave empty for all countries.

## `language` (type: `string`):

Broadcast language name to filter by, for example english or spanish. Leave empty for all languages.

## `minBitrate` (type: `integer`):

Keep only streams at or above this bitrate in kbps, for example 128 or 320. Use 0 for any bitrate.

## `onlyWorking` (type: `boolean`):

Hide stations whose stream failed the last automated health check, so every row is likely to play.

## `sortBy` (type: `string`):

Order of station results: most voted, most clicked, trending, name A-Z or highest bitrate.

## `includeCountries` (type: `boolean`):

Set true to also export one row per country with its station count (billed as a directory row).

## `includeTags` (type: `boolean`):

Set true to also export one row per genre tag with its station count, top 2,000 tags (billed as a directory row).

## `maxItems` (type: `integer`):

Maximum number of rows to deliver, stations and directory rows together. Free Apify users are limited to 10 rows; paid users can set up to 1,000,000.

## Actor input object example

```json
{
  "includeStations": true,
  "stationName": "",
  "tag": "jazz",
  "countryCode": "",
  "language": "",
  "minBitrate": 0,
  "onlyWorking": true,
  "sortBy": "votes",
  "includeCountries": false,
  "includeTags": false,
  "maxItems": 10
}
```

# Actor output Schema

## `overview` (type: `string`):

Key fields per row

## `fullData` (type: `string`):

Complete dataset with all fields

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("recordsdata/radio-browser-stations-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("recordsdata/radio-browser-stations-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call recordsdata/radio-browser-stations-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,recordsdata/radio-browser-stations-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/sUX5vcBw1JXQCE1h0/builds/DfyecfUufwD2kPWal/openapi.json
