Callboard for developers
Show which nets are on the air, a net's live status, and whether a station is logged, on your own site or app. The API is free and read-only, and needs no key or account.
It serves only what Callboard's public board and live pages already show anyone: nets, their schedules and how to join, and each session's live status. Notes, locations, what an assistant heard and anything else net control keeps private never leave Callboard.
Live status badge
The quickest way to show a net's status is an image. Put it on a club website, a newsletter or a net directory, and it stays current on its own.
| When | The badge says |
|---|---|
| The net is on the air | Callboard · On the air · 14 checked in |
| The net is scheduled | Callboard · Next: Tue 7:00 PM CDT (in the net's own time zone) |
| The net hasn't met in six weeks | Callboard · Not meeting lately |
| No such net, or it isn't scheduled yet | Callboard · Not on the schedule |
The image is at https://callboard.club/badge/<net>.svg, where <net> is the last part of the net's Callboard address (callboard.club/app/#/n/<net>). Link it to the net's live page, where anyone can check whether they're logged:
<a href="https://callboard.club/app/#/n/tristate-allstar/live">
<img src="https://callboard.club/badge/tristate-allstar.svg"
alt="Tri-State AllStar Net: live status on Callboard" height="20">
</a>
Net owners can copy this code, already filled in, from Share this net on their net's page in Callboard.
NetFinder and other directories
A net's owners can add its NetFinder listing in Callboard. The net's page then links to the listing, the API includes the listing name, and a directory can find the net by it. There are two ways for a directory to show live status:
By the Callboard net (recommended)
The directory stores the net's Callboard name with the listing, entered by whoever manages the listing, and uses /badge/<net>.svg as above. Because the listing's own manager chose the net, nobody else can attach a different net to it.
By the listing, with no setup
https://callboard.club/badge/netfinder/<listing>.svg works for every NetFinder listing, so one line in the listing page template covers the whole directory. It shows the badge of the Callboard net whose owners named that listing. When no net names it, or more than one does, the image is a transparent 1 by 1 pixel, so the listing shows nothing.
A listing named in Callboard is the net owners' own claim; Callboard doesn't check it with NetFinder. When both sides point at each other (the listing stores the Callboard net, and the Callboard net names the listing), the link is confirmed. /v1/netfinder/<listing> below returns every net that names a listing, so a directory can check.
The API
Every endpoint is GET (or HEAD) under this address. Responses are JSON, and any website may call them from the browser (CORS is open).
https://callboard.club/functions/v1/public/v1
| Endpoint | What it answers |
|---|---|
/nets | Nets on the air now (onAir) and starting in the next 24 hours (upcoming). Filters: node= (AllStarLink, EchoLink or IRLP node number), kind= (repeater, simplex, hf, allstar, echolink, irlp, dmr, dstar, ysf, m17, gmrs), service= (ham or gmrs), hours= (0 to 168). |
/nets/<net> | One net and its live session: how many are logged, who's up, who's next, how many are waiting, the script phase and who holds net control. When it's off the air, when it meets next. |
/nets/<net>/checkins/<call> | Is this station logged, where is it in line, is it up. K1XQZ/M matches K1XQZ. |
/checkins/<call> | Every net on the air where this station is logged. |
/netfinder/<listing> | The nets whose owners named this NetFinder listing, each with its live status. Usually one; treat more than one as unsettled. |
/nets/<net>/badge.svg, /netfinder/<listing>/badge.svg | The badge images above, at their longer addresses. |
/ | The API's name, version and a link to this page. Handy as a reachability check. |
Example: one net
curl https://callboard.club/functions/v1/public/v1/nets/tristate-allstar
{
"v": 1,
"generatedAt": "2026-11-03T00:10:04.000Z",
"net": {
"id": "net-tristate", "slug": "tristate-allstar", "name": "Tri-State AllStar Net",
"service": "ham", "status": "active", "description": "Weekly roundtable on the hub.",
"schedule": { "weekdays": [1], "time": "20:00", "tz": "America/New_York", "durationMin": 60 },
"access": [
{ "kind": "allstar", "label": "Node 1999", "detail": "Hub", "node": 1999 },
{ "kind": "repeater", "label": "147.090 MHz +0.6, tone 100.0" }
],
"groups": [{ "key": "rf", "title": "On the repeater" }, { "key": "allstar", "title": "AllStar" }],
"netfinder": "tri-state-allstar-net"
},
"session": {
"id": "net-tristate-2026-11-03T01:00", "status": "live", "startedAt": "2026-11-03T00:59:12.000Z",
"count": 14,
"upNow": { "id": "c-7f3a", "call": "W1XQZ", "name": "Ann" },
"phase": { "index": 4, "title": "AllStar check-ins", "kind": "checkins" },
"nextUp": { "id": "c-91b0", "call": "K1XQZ", "name": "Bob" },
"waiting": 6, "traffic": 1, "control": "K1NCS", "assistant": false
},
"next": null
}
sessionisnullwhen the net is off the air;nextthen hasstartsAtandendsAtin UTC (or isnullfor a net that hasn't met lately).session.statusisliveorpractice. Show a practice run as practice, never as on the air.statusisscheduled,activeordormant(no session in six weeks). Proposed and archived nets aren't listed.schedule.timeis wall time inschedule.tz. UsestartsAtfor reminders.
Example: is a station logged?
curl https://callboard.club/functions/v1/public/v1/nets/tristate-allstar/checkins/K1XQZ
{
"v": 1, "generatedAt": "2026-11-03T00:10:04.000Z",
"net": "tristate-allstar", "netName": "Tri-State AllStar Net", "call": "K1XQZ",
"onAir": true, "sessionId": "net-tristate-2026-11-03T01:00",
"state": "waiting", "place": 1, "ahead": 0,
"group": { "key": "allstar", "title": "AllStar" },
"upNow": { "id": "c-7f3a", "call": "W1XQZ", "name": "Ann" }
}
state is off (net not on the air), notLogged, waiting, recheck, up, done or out. place (1 is next) and ahead are set only while waiting or re-checking.
Using it well
- Caching. Lists may be cached for 15 seconds, a live net for 5, badges for 30. Every answer has an
ETag; send it back inIf-None-Matchand an unchanged answer comes back as an empty304. - Polling. Directory lists: when the page opens, then at most once a minute. A net on the air, on screen: every 5 to 10 seconds. Nothing in the background.
- Errors look like
{ "v": 1, "error": { "code": "not_found", "message": "…" } }, with400for a bad request and404for an unknown net or version. If we ever add a rate limit, it will answer429withRetry-After. - Versions. The version is in the address (
/v1) and in every answer. Within v1 we only add fields and values, so ignore the ones you don't know. A breaking change gets/v2, and/v1keeps working for at least six months after. - Callsigns in these answers are public on Callboard's live pages already. Don't collect them into a separate database of who checks in where.
Questions
Building something with Callboard, or need something the API doesn't have yet? Write to support@cygnusstrategy.com. Use of the API is covered by the Terms of Use.