Operators
We identify an operator by their base call sign. Every SSID they transmit from is collapsed into a single identity.
Operator
GET /api/v1/operators/{callsign}
Information about an operator: identity, totals, a live op if there is one, and recent activity.
The totals are computed for all time; the full standings are in a separate scoreboard endpoint.
| Parameter | In | Type | Meaning |
|---|---|---|---|
callsign | path | string | The operator's base call. An SSID form or mixed case answers 301 to the canonical URL. required |
Example
{
"callsign": "K0TFU",
"first_heard_at": "2026-07-22T01:14:09Z",
"last_heard_at": "2026-09-18T19:17:02Z",
"totals": {
"points": 123,
"qsos": 45,
"ops_hosted": 12
},
"on_air": {
"callsign": "K0TFU",
"station": "K0TFU-6",
"number": 12,
"state": "on_air",
"description": "lunch at the lake",
"reference": {
"kind": "pota",
"code": "US-0072"
},
"grid": "DN40bs",
"position": {
"lat": 40.054167,
"lon": -111.525
},
"country": {
"code": "US",
"name": "United States of America"
},
"water": {
"kind": "lake",
"name": "Utah Lake"
},
"on_air_at": "2026-09-18T19:02:41Z",
"expires_at": "2026-09-18T20:17:00Z",
"ended_at": null,
"end_reason": null,
"signoff": null,
"qsos": 12,
"incomplete": 2,
"points": 11,
"url": "https://aprsota.org/K0TFU/ops/12",
"card_image_url": "https://aprsota.org/K0TFU/ops/12/card-3f9a1c2b7d4e.png"
},
"recent_ops": [
{
"callsign": "K0TFU",
"station": "K0TFU-6",
"number": 12,
"state": "on_air",
"description": "lunch at the lake",
"reference": {
"kind": "pota",
"code": "US-0072"
},
"grid": "DN40bs",
"position": {
"lat": 40.054167,
"lon": -111.525
},
"country": {
"code": "US",
"name": "United States of America"
},
"water": {
"kind": "lake",
"name": "Utah Lake"
},
"on_air_at": "2026-09-18T19:02:41Z",
"expires_at": "2026-09-18T20:17:00Z",
"ended_at": null,
"end_reason": null,
"signoff": null,
"qsos": 12,
"incomplete": 2,
"points": 11,
"url": "https://aprsota.org/K0TFU/ops/12",
"card_image_url": "https://aprsota.org/K0TFU/ops/12/card-3f9a1c2b7d4e.png"
}
],
"recent_qsos": [
{
"host": "K0TFU",
"host_station": "K0TFU-6",
"op_number": 12,
"chaser": "W1XYZ",
"chaser_station": "W1XYZ-5",
"number": 1,
"state": "confirmed",
"chased_at": "2026-09-18T19:14:19Z",
"beacon_at": "2026-09-18T19:15:02Z",
"confirmed_at": "2026-09-18T19:17:02Z",
"chase_text": "hi from the lake",
"qsl_text": "73",
"grid": "CN87xo",
"position": {
"lat": 40.054167,
"lon": -111.525
},
"country": {
"code": "US",
"name": "United States of America"
},
"water": {
"kind": "lake",
"name": "Utah Lake"
},
"points": 3,
"stamps": [
{
"kind": "ptt",
"title": "PTT",
"role": "host",
"points": 1,
"label": null
}
],
"combos": [],
"repeat": false,
"url": "https://aprsota.org/K0TFU/ops/12/qsos/W1XYZ",
"qsl_image_url": "https://aprsota.org/K0TFU/ops/12/qsos/W1XYZ/qsl-9b2e4d1f6a3c.png"
}
],
"url": "https://aprsota.org/K0TFU",
"image_url": "https://aprsota.org/K0TFU/og-1a2b3c4d5e6f.png"
}Scoreboard
The standings are their own API endpoint rather than part of the operator object, because they are computationally expensive to produce. Ask for them separately if you need them.
GET /api/v1/operators/{callsign}/scoreboard
The operator's standings on every board, for this month, this year, and all time.
The operator's positions on various leaderboards, one row per board the operator holds a value on, with the value in the board's own currency and the rank when on the board. Its own endpoint because its expensive to produce.
| Parameter | In | Type | Meaning |
|---|---|---|---|
callsign | path | string | The operator's base call. An SSID form or mixed case answers 301 to the canonical URL. required |
Example
{
"callsign": "K0TFU",
"windows": [
{
"kind": "month",
"from": "2026-09-01",
"to": "2026-09-30"
}
],
"rows": [
{
"board": {
"slug": "all-star",
"name": "All-Star",
"measure": "Points",
"unit": "points",
"url": "https://aprsota.org/leaderboards/all-star"
},
"cells": [
{
"value": 22,
"rank": 3
}
]
}
]
}