Confirmation
The Confirmation resource is a read-only endpoint that lists the QSL confirmations the token owner has received — one row per (QSO, confirmation type) pair. It is the API counterpart to the web UI's Confirmations page: a QSO confirmed via both LoTW and eQSL appears as two rows here, exactly as it does in that table.
- Base path:
/api/v2/confirmation - Scope:
confirmation:read
Note
Read the API v2 overview first for authentication, the response envelope and error codes.
What this endpoint is (and is not)
It is easy to confuse with two other features, so it is worth being explicit:
- Statistic
?profile=confirmationsreturns aggregate counts per type (how many QSOs confirmed by LoTW, by eQSL, …). This endpoint returns the per-QSO records themselves — callsign, dates, mode/band and the matching type — so a client can render the same view a human sees in the browser. - The QSO list's
?qsl_filter=parameter narrows the QSO list to "QSOs that have at least one of these confirmations", but it does not surface which type matched, nor when the confirmation arrived. This endpoint does.
Endpoint
| Verb | Path | Scope | Purpose |
|---|---|---|---|
GET |
/api/v2/confirmation |
confirmation:read |
List QSL confirmations, newest first |
This is a list-only endpoint. There is no single-item URL — a request like
/api/v2/confirmation/42 returns 404 not_found, because a confirmation has no stable id of its
own (it is identified by the QSO plus its type).
Filters
All parameters are optional and can be combined:
| Parameter | Default | Values |
|---|---|---|
type |
all | Comma-separated list of lotw, eqsl, qsl, qrz, clublog |
station_id |
all owned by the token user | Comma-separated station ids; ownership-checked |
since |
none | YYYY-MM-DD — only confirmations received on or after this date |
qso_since |
none | YYYY-MM-DD — only QSOs made on or after this date |
qso_until |
none | YYYY-MM-DD — only QSOs made on or before this date |
band |
all | A band such as 20m, or SAT for satellite QSOs |
mode |
all | A mode or submode, e.g. CW or FT8 |
callsign |
none | Exact match on the worked callsign |
page |
1 |
Page number |
per_page |
100 |
Page size, hard-capped at 1000 |
The ?type= values are the lowercase keys (lotw, eqsl, …). The type field in the
response carries the human-readable label instead (LoTW, eQSL, QSL Card, QRZ.com,
Clublog) — the same words the web UI uses.
since and qso_since answer different questions, just as they do on the Statistic
confirmations topic. since filters on the date a confirmation
arrived — "which confirmations came in this week" — applied per type against that type's own
received-date column. qso_since / qso_until filter on the date of the QSO itself. Both
ends are inclusive and can be used on their own.
An invalid type value or a malformed date returns 400 validation_error. Note that HRDLog is
not a confirmation type: Wavelog only uploads to it, there is no received status to list.
Example
curl "https://<WAVELOG_URL>/index.php/api/v2/confirmation?type=lotw,eqsl&since=2026-07-01" \
-H "Authorization: Bearer wl2_your_token_here"
{
"data": [
{
"qso_id": 48215,
"callsign": "DL1ABC",
"qso_date": "2026-07-28 18:30:00",
"mode": "CW",
"band": "20m",
"gridsquare": "JN49",
"confirmation_date": "2026-08-02",
"type": "LoTW"
},
{
"qso_id": 48200,
"callsign": "OE3XYZ",
"qso_date": "2026-07-26 19:05:00",
"mode": "SSB",
"band": "40m",
"confirmation_date": "2026-08-01",
"type": "eQSL"
},
{
"qso_id": 48200,
"callsign": "OE3XYZ",
"qso_date": "2026-07-26 19:05:00",
"mode": "SSB",
"band": "40m",
"confirmation_date": "2026-07-31",
"type": "LoTW"
},
{
"qso_id": 48190,
"callsign": "K1ABC",
"qso_date": "2026-07-25 10:12:00",
"mode": "CW",
"band": "2m",
"gridsquare": "EM12",
"sat_name": "AO-7",
"sat_mode": "B",
"confirmation_date": "2026-07-30",
"type": "LoTW"
}
],
"meta": {
"page": 1,
"per_page": 100,
"count": 4,
"total": 4,
"total_pages": 1,
"has_more": false,
"filters": {
"type": ["lotw", "eqsl"],
"since": "2026-07-01",
"qso_since": null,
"qso_until": null,
"band": null,
"mode": null,
"callsign": null
}
}
}
Notes
- Rows are returned newest confirmation first (
confirmation_date, thenqso_id). - The core fields (
qso_id,callsign,qso_date,mode,band,confirmation_date,type) are always present. The optional fields —submode,gridsquare,vucc_grids,sat_name,sat_mode— are omitted entirely when empty, so the payload only carries what the QSO actually has. In the example above, theOE3XYZrows have no optional fields, while the satellite contact carriessat_name/sat_mode/gridsquare. - The
meta.filtersblock echoes back the resolved filters, so a poller can interpret the rows without tracking the query it sent.station_idis resolved internally and is not echoed. - Results are ordered newest-first; use pagination (
page/per_page) and thehas_more/total_pagesmeta to page through large result sets.
Clubstation tokens are scoped to the member
Like the QSO resource, a clubstation member below officer level only ever sees the confirmations of their own operator's QSOs. Officers see the whole club's confirmations.