Skip to main content
Five endpoints expose live radio scanner data from Broadcastify and OpenMHz.

GET /api/radio/top

Returns the current Broadcastify Top 50 live audio feeds, scraped and cached for 5 minutes.
Rate limit: 30 requests per minute per IP.

Response

An array of feed objects:
id
string
required
Broadcastify feed ID. Used to construct the stream URL.
listeners
number
required
Current listener count.
location
string
required
Geographic location label (e.g. "Los Angeles, CA").
name
string
required
Feed name (e.g. "LAPD Central Bureau").
category
string
required
Feed category (e.g. "Police")
stream_url
string
required
Direct MP3/AAC stream URL: https://broadcastify.cdnstream1.com/{id}

Example

curl http://localhost:8000/api/radio/top
[
  {
    "id": "12345",
    "listeners": 842,
    "location": "Los Angeles, CA",
    "name": "LAPD Central Bureau",
    "category": "Police",
    "stream_url": "https://broadcastify.cdnstream1.com/12345"
  }
]

GET /api/radio/openmhz/systems

Returns the full directory of OpenMHz trunked radio systems (450+ entries). Results are cached for 1 hour.
Rate limit: 30 requests per minute per IP.

Example

curl http://localhost:8000/api/radio/openmhz/systems
[
  {
    "id": "wmata",
    "name": "WMATA Metro",
    "lat": 38.9,
    "lng": -77.0,
    "state": "Maryland"
  }
]

GET /api/radio/openmhz/calls/

Returns recent trunked radio call recordings (.m4a audio bursts) for a specific OpenMHz system. Results are cached for 20 seconds.
Rate limit: 60 requests per minute per IP.

Path parameters

sys_name
string
required
OpenMHz system short name (e.g. wmata, sfpd). Obtain the full list from /api/radio/openmhz/systems.

Example

curl http://localhost:8000/api/radio/openmhz/calls/wmata
[
  {
    "id": "call_abc123",
    "url": "https://calls.openmhz.com/wmata/calls/call_abc123.m4a",
    "time": "2024-01-15T12:00:45Z",
    "talkgroup": 1001,
    "talkgroup_description": "Metro Operations"
  }
]

GET /api/radio/nearest

Finds the single closest OpenMHz trunked system to the given coordinates using Haversine distance.
Rate limit: 60 requests per minute per IP.

Query parameters

lat
number
required
Latitude in decimal degrees (−90 to 90).
lng
number
required
Longitude in decimal degrees (−180 to 180).

Example

curl "http://localhost:8000/api/radio/nearest?lat=38.9&lng=-77.0"
{
  "id": "wmata",
  "name": "WMATA Metro",
  "lat": 38.9,
  "lng": -77.0,
  "distance_miles": 0.4
}

GET /api/radio/nearest-list

Returns up to 20 nearest OpenMHz systems sorted by distance from the given coordinates.
Rate limit: 60 requests per minute per IP.

Query parameters

lat
number
required
Latitude in decimal degrees (−90 to 90).
lng
number
required
Longitude in decimal degrees (−180 to 180).
limit
number
default:"5"
Maximum number of systems to return. Accepts 1–20.

Example

curl "http://localhost:8000/api/radio/nearest-list?lat=38.9&lng=-77.0&limit=5"
[
  {
    "id": "wmata",
    "name": "WMATA Metro",
    "lat": 38.9,
    "lng": -77.0,
    "distance_miles": 0.4
  },
  {
    "id": "pg_county",
    "name": "Prince George's County MD",
    "lat": 38.85,
    "lng": -76.87,
    "distance_miles": 8.2
  }
]

Build docs developers (and LLMs) love