4

Now, ops and plans

There are three useful collections of ops available in the API:

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.

Returns
a now object
Token
required
Cache
Cache-Control: private, max-age=30
Errors
401 unauthorized, 429 rate_limited

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".

ParameterInTypeMeaning
pagequeryintegerThe page, 1-based.
per_pagequeryintegerItems per page, at most 100.
statequerystring, one of on_air, endedOnly ops in this state.
Returns
a op_page object
Token
required
Cache
Cache-Control: private, max-age=60
Errors
400 bad_request, 401 unauthorized, 429 rate_limited

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.

ParameterInTypeMeaning
pagequeryintegerThe page, 1-based.
per_pagequeryintegerItems per page, at most 100.
Returns
a plan_page object
Token
required
Cache
Cache-Control: private, max-age=60
Errors
400 bad_request, 401 unauthorized, 429 rate_limited

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"
  }
}