← How It Works
Kestrel Listen

Public API — v1

The same data the public console shows you, available read-only for your own dashboards and integrations. No cost, no approval queue -- just a Kestrel Listen operator account.

Getting a key

  1. Register as an operator (this is the same registration used to run a sensor node -- you don't need to actually run one to get API access, but your registration does still go through the same short manual review).
  2. Once approved, log in at the operator login and open My Fleet.
  3. Under API Access, click Generate API key. The key is shown exactly once -- copy it somewhere safe immediately.

Using it

Send your key as a standard bearer token on every request:

curl -H "Authorization: Bearer YOUR_KEY_HERE" \
  https://listen.madrock.net:8443/join/api/v1/stats

One active key per account -- generating a new one from My Fleet immediately revokes the old one. If your account's approval is ever revoked, your key stops working automatically.

Endpoints

GET /join/api/v1/stats

Fleet-size counters and which nodes carry ADS-B/AIS. No parameters.

{
  "nodes_registered": 12,
  "operators_registered": 9,
  "adsb_node_slugs": ["vk5tcp-node-2", "..."],
  "adsb_borrowed": {"some-node": "source-node"},
  "ais_node_slugs": ["vk5wi-ptmoo"]
}

GET /join/api/v1/gnss-events

Active GNSS interference/spoofing incidents detected across the network. No station identity -- already public/aggregate. No parameters.

{
  "interference": [],
  "spoofing": [
    {
      "event_id": "...", "detected_at": "2026-08-21T12:29:12Z",
      "latitude_deg": -34.93, "longitude_deg": 138.26,
      "affected_signal": "003-1X", "constellation": "Galileo",
      "severity": "weak", "confidence": "multi-site-raim", "region": "AU-S"
    }
  ],
  "ts": "2026-08-22T01:02:59Z"
}

GET /join/api/v1/space-weather

Current geomagnetic K-index and any active alerts. No parameters.

{
  "snapshot": {"source": "bom-sws", "k_index": 1.0, "valid_time": "..."},
  "alerts": [],
  "ts": "..."
}

GET /join/api/v1/digimode-spots

Recent FT8/FT4 spots decoded by the network. Query params: hours (default 6, max 168) and mode (FT8 or FT4).

{
  "spots": [
    {
      "mode": "FT8", "freq_hz": 14074000, "snr_db": -12,
      "sender_call": "VK5XYZ", "sender_grid": "PF95",
      "receiver_grid": "PF95he", "message": "CQ VK5XYZ PF95",
      "spotted_at": "...", "node_slug": "vk5tcp-node-3", "site_name": "..."
    }
  ]
}

Questions or building something interesting with this? Contact Derek VK5TCP -- we'd like to hear about it. Back to the live console.