Public API & downloads
Open access to the ON0 register of Belgian unmanned stations (repeaters, beacons, nodes and gateways): files for your radio, a JSON API, and the map to put on your own website. No account or key required.
Jump to: Downloads · All formats as JSON · JSON API · Embed the map
What you get
Exactly the same data as the public map and list — and nothing more. For privacy, positions are approximate: each site is placed at the centre of its 6-character Maidenhead locator (~2–3 km off), only the postcode + municipality is given, and no personal data (responsibles, exact address, internal notes) is ever included. Only active stations are listed.
Downloads
Step-by-step import instructions for each format are on the downloads page.
/api/public/downloads/chirpCHIRP — One memory per repeater output, with duplex and offset, CTCSS access tone and mode filled in, for any radio CHIRP supports. Uplink-only channels and receive-only sites are left out; digital modes CHIRP cannot program (DMR, NXDN, TETRA) are stored as FM with the real mode in the comment.
File on0-repeaters-chirp.csv · also at its first URL /api/public/repeaters.chirp.csv
/api/public/downloads/icomIcom — Icom's Repeater List: one entry per repeater output, grouped per band, with position, offset, tone and mode; D-STAR entries carry the port and gateway callsigns. Copy it to Csv/RptList/ on the radio's microSD card and import it as Repeater List, or import it in CS-705, CS-52 or CS-9700.
File ON0_BELGIUM_RPTLIST.csv · also at its first URL /api/public/repeaters.icom.csv
/api/public/downloads/yaesuYaesu — Yaesu's ADMS-14 (FT5D) memory file: headerless, 900 rows of 54 fields, the 2 m and 70 cm repeater outputs first and empty channels after, as the programmer exports it. Import it in ADMS-14 under Memories › File › Import. C4FM repeaters are DN; names are the callsigns.
File on0-repeaters-yaesu-adms14.csv · also at its first URL /api/public/repeaters.yaesu.csv
/api/public/downloads/csvCSV — Every public field, one row per frequency: callsign, association, output and input, shift, mode, network, multimode summary, CTCSS in and out, symbol rates, power, gain, polarisation, locator, town, approximate latitude/longitude, altitude, antenna height and status.
File on0-repeaters.csv · also at its first URL /api/public/repeaters.csv
All formats in one list (JSON)
Building an app, a club page or a script that offers the files? Read the list instead of hard-coding the formats: whatever is added later shows up there, with no change on your side.
/api/public/downloads/api/public/downloads/{id}id from the list, as an attachment; the file name comes in Content-Disposition (curl -OJ, wget --content-disposition), and /api/public/downloads/chirp.csv works too. Each file carries an ETag: ask again with If-None-Match (also from browser scripts) and you get 304 Not Modified until the register changes — no download when nothing changed. Unknown ids give a 404 that lists the valid ones.Example response (shortened)
{
"source": "https://on0.be",
"license": "ON0 register — public data, approximate locations (privacy-fuzzed).",
"docs": "https://on0.be/api-docs",
"howTo": "https://on0.be/downloads",
"formats": [
{
"id": "chirp",
"name": "CHIRP",
"description": "One memory per repeater output, …",
"software": ["CHIRP"],
"radios": ["any radio CHIRP supports (…)"],
"url": "https://on0.be/api/public/downloads/chirp",
"aliases": ["https://on0.be/api/public/repeaters.chirp.csv"],
"filename": "on0-repeaters-chirp.csv",
"mediaType": "text/csv",
"howTo": "https://on0.be/downloads#chirp"
},
…
],
"json": {
"repeaters": "https://on0.be/api/public/repeaters",
"repeater": "https://on0.be/api/public/repeaters/{callsign}"
}
}Why a list. New radio formats keep coming (each programmer has its own file). One list means the downloads page, the bar above the map and your code all learn about a new format at once. The file URLs never change: the first URL of each format (in aliases) keeps working next to the /api/public/downloads/{id} one.
JSON API
CORS-open (usable from the browser) and lightly cached (5 min). Repeaters are grouped by callsign; a station may run more than one site.
/api/public/repeaters{ source, license, count, repeaters: [...] }./api/public/repeaters/{callsign}/api/public/repeaters/ON0LG. Returns 404 if unknown.Example
curl https://on0.be/api/public/repeaters
curl https://on0.be/api/public/repeaters/ON0LG
curl https://on0.be/api/public/downloadsFields
frequencyMHz— the output (downlink) you listen to.inputMHz/shiftMHz— repeater uplink and its offset.direction—OUTPUT(downlink) orINPUT(uplink).modes— despite the plural, a single string: the active modes of a multimode channel joined by “ · ”, e.g.FM · CTCSS 79.7 · DMR BM CC1;nullwhen none are declared (then seemode).ctcssInHz/ctcssOutHz— access tone / sent tone;squelchOnlymeans none,toneBurstmeans 1750 Hz. AnctcssOutHzof0means no tone is transmitted, as opposed tonull= not stated.latitude/longitude— approximate (locator centre), never the exact position.online— whether the channel is currently on-air.
Embed the map on your site
Show the public map — the same one as on on0.be — on a club website, a forum or a wiki. Two ways, the same map: paste an <iframe>, or add our script and an <on0-map> tag.
1. The iframe — works everywhere
<iframe src="https://on0.be/embed/map?band=2m,70cm"
width="100%" height="480" style="border:0" loading="lazy"
title="Belgian repeaters — ON0 register"></iframe>Settings go in the URL, all optional; combine them with &:
| Parameter | Example | Meaning |
|---|---|---|
| band | 2m,70cm | Bands to show, comma-separated: 6m, 4m, 2m, 70cm, 23cm, 13cm, … Default: all. |
| assoc | UBA | Associations to show (UBA, VRA, ARC, OVRC, …). Default: all. |
| call | ON0LG | Zoom to this station on load and open its details. |
| center | 50.85,4.35 | Start position as latitude,longitude. Default: all of Belgium. |
| zoom | 9 | Start zoom (3–18), with center. |
| controls | filters,list | Show the filter panel (filters) and/or the map/list switch (list). Default: the map only. The filter panel takes room: give the iframe 650 px or more. |
The map fills the iframe: give it the height you want. Example — the 2 m and 70 cm UBA repeaters with the filters shown: /embed/map?band=2m,70cm&assoc=UBA&controls=filters
2. The script — the same map, easier to set up
<script src="https://on0.be/embed.js" defer></script>
<on0-map band="2m,70cm" assoc="UBA" height="480"></on0-map>
<script>
// Optional: react when a visitor clicks a station.
document.querySelector("on0-map").addEventListener("on0-select", (e) => {
console.log(e.detail.callsign);
});
</script>The <on0-map> tag takes the same settings as attributes, plus height: a number of pixels or a CSS height such as 100% or 60vh (default 480), or auto to follow the content — the map at 480 px, the list at its full length, without a scrollbar of its own. It fires on0-select when a visitor clicks a station (event.detail.callsign), for a page that wants to show its own details. Change an attribute and the map follows.
Why it works this way
- An iframe works everywhere. Any site builder that lets you paste HTML takes it (WordPress, Joomla, Google Sites, a forum), and your site needs no code or library of its own.
- The map stays on on0.be. Its data and its updates come from the register itself: a station that is added or changed shows on your page within five minutes, and there is no copy to maintain.
- The same privacy rules as the public map. Approximate positions (locator centre), town only, no personal data. The map cannot read anything on your page, and on0.be carries no ads or trackers.
- The script is optional. It builds that same iframe from attributes, and adds the automatic height and the click event. Some site builders refuse other sites’ scripts; the plain iframe always works.
- Only the map can be embedded. Other sites may frame
/embed/…and nothing else: every other on0.be page refuses to be shown inside another site, so the signed-in register can never be overlaid by a hostile page.
Terms
Free to use for the amateur-radio community. Locations are deliberately approximate — please don’t try to de-anonymise sites. Attribution to the ON0 register (on0.be) is appreciated; the embedded map carries its own link to on0.be — please leave it visible.