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.
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
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"
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
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.
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 } }
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' });
~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.
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.
Authoritative nameservers coast to coast, DNSSEC-signed with a full chain of trust. Not a hobby zone. see the live network.
Held by no network, no ideology. We resolve through to official RadioDNS and add the layer it doesn't cover. our promises, in writing.
Public, read-only, CORS *, cached ~60s. No authentication.
| Endpoint | What it returns | CORS |
|---|---|---|
| GET /rdns/receiver/resolve | Broadcast 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/live | Live namespace state: stations covered, claimed, nameservers, DNSSEC. | ✓ |
| GET /rdns/health/dns | NS redundancy + DNSSEC validation/expiry across the managed zones. | ✓ |
| GET /rdns/network/nodes | Live network topology + replication monitor per authoritative node. | ✓ |
| POST /v1/identity/resolve | Genoa-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