Now, ops and plans
There are three useful collections of ops available in the API:
- what’s on the air right now
- what ops recently finished
- plans for upcoming ops
While these all show on the same page on the website, these are separate
endpoints in the API. /now is designed to be frequently polled and shows
all ops on the air right now.
Now
GET /api/v1/now
The ops on the air right now.
The API's equivalent of /now. It returns all ops on the air right now. Poll it no more than once a minute, send If-None-Match, and honor the Cache-Control it returns.
Example
{
"generated_at": "2026-09-18T20:15:09Z",
"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"
}
]
}Ops
GET /api/v1/ops
Every op that went on the air, most recent first.
For frequent checking, please use /api/v1/now instead of filtering here for ops on the air. The first page of ?state=ended is the website's "recently completed".
| Parameter | In | Type | Meaning |
|---|---|---|---|
page | query | integer | The page, 1-based. |
per_page | query | integer | Items per page, at most 100. |
state | query | string, one of on_air, ended | Only ops in this state. |
Example
{
"data": [
{
"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"
}
],
"page": {
"number": 1,
"size": 20,
"total": 61,
"next_url": "https://aprsota.org/api/v1/ops?page=2"
}
}Plans
GET /api/v1/plans
Active plans, soonest first.
Plans whose time is still in the future, the same set /plans shows. Canceled plans don't show here, nor do plans that because ops on the air.
| Parameter | In | Type | Meaning |
|---|---|---|---|
page | query | integer | The page, 1-based. |
per_page | query | integer | Items per page, at most 100. |
Example
{
"data": [
{
"callsign": "K0TFU",
"station": "K0TFU-6",
"starts_at": "2026-09-19T18:00:00Z",
"description": "POTA US-0072",
"url": "https://aprsota.org/K0TFU"
}
],
"page": {
"number": 1,
"size": 20,
"total": 61,
"next_url": "https://aprsota.org/api/v1/ops?page=2"
}
}