Developer Hub

One API for all of US radio.

Every licensed US station, across AM, FM, LPFM, translator, and HD, resolves through one public endpoint to its identity, live now-playing, logo, and services. It resolves through to official radiodns.org and adds the AM / LPFM / translator layer they never covered. Free. CORS-open. No key. No signup. Build on it today.

GET one call, any bearer CORS *, call it from the browser No API key Live over DNS, what receivers actually see DNSSEC-signed to the root

01Try it live

This calls the real production API from your browser right now, the same requests your app will make. Pick an endpoint, edit the input, run it.

// pick an endpoint above and hit Run

02Resolve anything in one call

Give the resolver any bearer form: a coded FM/AM/HD name, an AM call sign, or a facility-<id> alias. Get back the normalized identity, live DNS status, the real SI service content, logo, and now-playing. Everything else is built on this.

# call sign, FM bearer, AM bearer, HD bearer, all resolve
curl "https://{host}/rdns/resolve?bearer=KAZM"
curl "https://{host}/rdns/resolve?bearer=10650.d4d2.da0.fm.radiodns.org"
curl "https://{host}/rdns/resolve?bearer=00780.1296.1a0.am.zerotrustradio.org"

From the browser, no key, no proxy

const r = await fetch(`https://{host}/rdns/resolve?bearer=${call}`);
const station = await r.json();
// station.identity, station.status, station.si_service?.logos,
// station.services, station.service_content, station.cname_target

03Drop-in widget & SDK

Add one script; render a live station card anywhere with a single attribute: logo, status, and a play button, isolated in Shadow DOM so it never fights your CSS.

<!-- once per page -->
<script src="https://{host}/static/uiq-embed.js" defer></script>

<!-- anywhere, as many as you like -->
<div data-uiq-station="KAZM"></div>
<div data-uiq-bearer="10650.d4d2.da0.fm.radiodns.org"></div>

Or drive it yourself. The same script exposes a tiny global:

UndertowIQ.resolve("KAZM").then(s => console.log(s.status));
UndertowIQ.mount(document.getElementById("slot"), "KAZM");
UndertowIQ.scan(container);  // (re)scan for data-uiq-* nodes

See the full widget with live demos on the Embed page.

04The receiver bridge

Here is the honest picture. A stock RadioDNS set builds a .radiodns.org bearer from the signal and does a DNS lookup, and for the ~40,000 US stations never registered there (and for all AM, which official RadioDNS never defined) that lookup returns nothing. You cannot reflash those sets. But any programmable receiver or app can call one endpoint with what it reads off-air and get the whole dial.

Give it the broadcast parameters. Get back the station. It builds the standard bearer, checks whether the station is registered on official radiodns.org, then falls back to our namespace, which covers every US station. Integrate once, support everything, not just the few registered officially.

# what a set reads off-air: PI, GCC (or ECC), frequency
GET /rdns/receiver/resolve?system=fm&pi=c460&gcc=ce1&freq=106.5
GET /rdns/receiver/resolve?system=am&pi=1296&ecc=a0&freq=780
GET /rdns/receiver/resolve?callsign=KAZM

# -> { bearer:{official, uiq}, official_radiodns:{registered},
#      source, station:{ logo_url, stream_url, now_playing{artwork_url}, services } }

Drop-in receiver SDK

One script gives you resolution plus a live receiver panel (logo, album art, now-playing, play), isolated in Shadow DOM. This is a working hybrid radio in three lines.

<script src="https://{host}/static/uiq-receiver.js"></script>

UIQReceiver.resolve({ system:'fm', pi:'c460', gcc:'ce1', freq:106.5 })
  .then(r => console.log(r.station, r.official_radiodns));

UIQReceiver.mount(document.getElementById('slot'), { callsign:'KAZM' });
GET /rdns/receiver/resolve
Broadcast params to full hybrid data, checking official radiodns.org and our namespace. The receiver entry point.
GET /rdns/tune?callsign=
Everything for one station in a single call: identity, logo, stream, live now-playing.
POST /v1/identity/resolve
Genoa-compatible identity surface for platforms that already probe it.
SI.xml · RadioSPI 3.1
Standard service information, consumable by any RadioDNS receiver.

05Why build on this

🗺️

Complete coverage

~33,000 identities, every AM, FM, LPFM, translator, and HD signal, computed from the public FCC license list. The only place the whole US dial resolves, including analog AM that official RadioDNS never defined.

Zero friction

No key, no signup, no rate-limit gate, CORS-open. Prototype from a browser console in 30 seconds; ship without a backend if you want to.

🔒

Real infrastructure

Authoritative nameservers coast to coast, DNSSEC-signed with a full chain of trust. Not a hobby zone. see the live network.

🤝

Neutral & honest

Held by no network, no ideology. We resolve through to official RadioDNS and add the layer it doesn't cover. our promises, in writing.

06Endpoint reference

Public, read-only, CORS *, cached ~60s. No authentication.

EndpointWhat it returnsCORS
GET /rdns/receiver/resolveBroadcast params (PI/GCC/freq) or call sign to full hybrid data, official + our namespace. The receiver bridge.
GET /rdns/tune?callsign=Identity, logo, stream, and live now-playing for one station in a single call.
GET /rdns/resolve?bearer=Identity, live DNS status, services, logo, SI content for any bearer/call sign.
GET /rdns/claim/lookup?call=The pre-built identity for a US call sign: bands, bearers, dormant/claimed state.
GET /rdns/np/get?station=Current now-playing (title / artist / art) for a station by call sign or facility.
GET /rdns/logo/get?station=The station's current logo URL on the edge CDN.
GET /rdns/namespace/liveLive namespace state: stations covered, claimed, nameservers, DNSSEC.
GET /rdns/health/dnsNS redundancy + DNSSEC validation/expiry across the managed zones.
GET /rdns/network/nodesLive network topology + replication monitor per authoritative node.
POST /v1/identity/resolveGenoa-compatible receiver entry point: bearer/identity to services.n/a

Build something with this? We want to hear about it. Get in touch.
More: The Standard · Embed & SDK · Lookup · Network · Our promise