KK7-NQN Repeater Project — API Documentation

Last updated: August 8th 2025

This API serves live data collected by the KK7-NQN logger. All endpoints return application/json; charset=utf-8 and support CORS with Access-Control-Allow-Origin: *.

Endpoints

1) https://kk7nqn.net/api/callsign_transcriptions.php

Returns transcripts. Works in two modes:

Query Parameters

ParamTypeDefaultDescription
callsignstringFilter by callsign (case-insensitive). Enables “callsign mode”.
mentions0/10Only in callsign mode. 1 = return every mention with mentioned_at. 0 = dedup per transcript with last_mentioned_at.
sincedate/datetimeFilter by local time window start. Accepts YYYY-MM-DD or ISO-8601. Date-only expands to 00:00:00.
untildate/datetimeFilter by local time window end. Date-only expands to 23:59:59.
limitint25Number of rows to return (min 1, max 100000). In dedup mode, applied after joining to avoid off-by-one.
debug0/10Wraps response as { data: [...], _meta: {...} } for troubleshooting.

Example: dedup by callsign

GET https://kk7nqn.net/api/callsign_transcriptions.php?callsign=AB6MB&limit=3
{
  "transcript_id": 5039,
  "filename": "2025-07-26_21-32-03.wav",
  "transcription": "…",
  "transcript_timestamp": "2025-07-26 21:38:40",
  "last_mentioned_at": "2025-07-28 20:50:51"
}

Example: mentions mode (every mention)

GET https://kk7nqn.net/api/callsign_transcriptions.php?callsign=AB6MB&mentions=1&limit=5
{
  "transcript_id": 5039,
  "filename": "2025-07-26_21-32-03.wav",
  "transcription": "…",
  "transcript_timestamp": "2025-07-26 21:38:40",
  "mentioned_at": "2025-07-28 20:50:51"
}

Example: date window (fallback mode)

GET https://kk7nqn.net/api/callsign_transcriptions.php?since=2025-07-26&until=2025-07-26&limit=10

cURL & JS

# cURL
curl -s "https://kk7nqn.net/api/callsign_transcriptions.php?callsign=AB6MB&limit=3" | jq .

# JavaScript
const url = "https://kk7nqn.net/api/callsign_transcriptions.php?callsign=AB6MB&limit=3";
const rows = await fetch(url).then(r => r.json());

2) https://kk7nqn.net/api/callsigns_db.php

Lists callsigns from the callsign table with metadata (ID, callsign, validated, first_seen, last_seen, seen_count), with search/sort/filter.

Query Parameters

ParamTypeDefaultDescription
qstringSearch callsign (case-insensitive). Use with qmode.
qmodeenumcontainsprefix or contains.
validated0/1Filter by validation flag.
min_seenintMinimum seen_count.
since/untildate/datetimeFilter on last_seen (local time).
orderenumlast_seenlast_seen | first_seen | seen_count | callsign.
direnumdescasc or desc.
limitint25Number of rows to return (min 1, max 100000).
debug0/10Include _meta with effective limit & sort.

Example: recent, validated

GET https://kk7nqn.net/api/callsigns_db.php?validated=1&limit=10

Example: prefix search, sort by seen_count

GET https://kk7nqn.net/api/callsigns_db.php?q=KK7&qmode=prefix&order=seen_count&dir=desc&limit=20

3) https://kk7nqn.net/api/callsign_log.php

Raw view of the callsign_log mentions table.

Query Parameters

ParamTypeDefaultDescription
callsignstringOptional exact callsign filter (case-insensitive).
transcript_idintOptional exact transcript filter.
since/untildate/datetimeFilter by callsign_log.timestamp (local time).
limitint25Number of rows to return (min 1, max 100000).
debug0/10Include _meta with effective limit.

Example: log slice for a callsign

GET https://kk7nqn.net/api/callsign_log.php?callsign=AB6MB&since=2025-07-26&until=2025-07-27&limit=20
[
  { "id": 123, "callsign": "AB6MB", "transcript_id": 5039, "timestamp": "2025-07-26 21:38:40" },
  { "id": 124, "callsign": "AB6MB", "transcript_id": 5037, "timestamp": "2025-07-26 21:34:26" }
]

HTTP & CORS

Content-Type: application/json; charset=utf-8
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, OPTIONS
Access-Control-Allow-Headers: Content-Type
Cache-Control: public, max-age=60

Preflight OPTIONS returns 204 No Content.

Errors

{
  "error": "Server error",
  "message": "prepare failed (dedup): ...or other mysqli error..."
}

Error responses use HTTP 500 with a short JSON body. Do not rely on the exact message text; it may change.

Quick Examples

Fetch (Browser / Node)

const qs = new URLSearchParams({ callsign: "AB6MB", limit: "3" });
const res = await fetch("/api/callsign_transcriptions.php?" + qs.toString());
const data = await res.json();

cURL

curl -s "https://kk7nqn.net/api/callsigns_db.php?q=KK7&qmode=prefix&order=seen_count&dir=desc&limit=10" | jq .
curl -s "https://kk7nqn.net/api/callsign_log.php?callsign=AB6MB&limit=5" | jq .

Questions or feature requests? Open an issue or ping the maintainer.