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: *.
America/Los_Angeles (local server time; PST/PDT as appropriate).limit and time filters to avoid large pulls.YYYY-MM-DD or ISO-8601 (e.g. 2025-07-26T21:00:00Z). Date-only expands to local day start/end.{"error":"Server error","message":"..."} with HTTP 500.debug=1 to include a _meta block with effective params/branch.Returns transcripts. Works in two modes:
callsign=AB6MB. Default returns one row per transcript with that callsign, with the most recent mention time (last_mentioned_at). Add mentions=1 to return every mention (duplicates per transcript).transcriptions, optionally filtered by date range.| Param | Type | Default | Description |
|---|---|---|---|
callsign | string | — | Filter by callsign (case-insensitive). Enables “callsign mode”. |
mentions | 0/1 | 0 | Only in callsign mode. 1 = return every mention with mentioned_at. 0 = dedup per transcript with last_mentioned_at. |
since | date/datetime | — | Filter by local time window start. Accepts YYYY-MM-DD or ISO-8601. Date-only expands to 00:00:00. |
until | date/datetime | — | Filter by local time window end. Date-only expands to 23:59:59. |
limit | int | 25 | Number of rows to return (min 1, max 100000). In dedup mode, applied after joining to avoid off-by-one. |
debug | 0/1 | 0 | Wraps response as { data: [...], _meta: {...} } for troubleshooting. |
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"
}
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"
}
GET https://kk7nqn.net/api/callsign_transcriptions.php?since=2025-07-26&until=2025-07-26&limit=10
# 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());
Lists callsigns from the callsign table with metadata (ID, callsign, validated, first_seen, last_seen, seen_count), with search/sort/filter.
| Param | Type | Default | Description |
|---|---|---|---|
q | string | — | Search callsign (case-insensitive). Use with qmode. |
qmode | enum | contains | prefix or contains. |
validated | 0/1 | — | Filter by validation flag. |
min_seen | int | — | Minimum seen_count. |
since/until | date/datetime | — | Filter on last_seen (local time). |
order | enum | last_seen | last_seen | first_seen | seen_count | callsign. |
dir | enum | desc | asc or desc. |
limit | int | 25 | Number of rows to return (min 1, max 100000). |
debug | 0/1 | 0 | Include _meta with effective limit & sort. |
GET https://kk7nqn.net/api/callsigns_db.php?validated=1&limit=10
GET https://kk7nqn.net/api/callsigns_db.php?q=KK7&qmode=prefix&order=seen_count&dir=desc&limit=20
Raw view of the callsign_log mentions table.
| Param | Type | Default | Description |
|---|---|---|---|
callsign | string | — | Optional exact callsign filter (case-insensitive). |
transcript_id | int | — | Optional exact transcript filter. |
since/until | date/datetime | — | Filter by callsign_log.timestamp (local time). |
limit | int | 25 | Number of rows to return (min 1, max 100000). |
debug | 0/1 | 0 | Include _meta with effective limit. |
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" }
]
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.
{
"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.
const qs = new URLSearchParams({ callsign: "AB6MB", limit: "3" });
const res = await fetch("/api/callsign_transcriptions.php?" + qs.toString());
const data = await res.json();
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.