Version: 0.1.0 (Draft) Status: Proposal Date: 2026-03-05
qsy:// is a vendor-neutral URI scheme for amateur radio logging applications. The name comes from the Q-code QSY — "change your transmitting frequency" — reflecting the scheme's purpose of directing apps to a specific station, frequency, or action.
It enables interoperability between spot aggregators, band maps, cluster clients, CAT control software, and logging apps on any platform.
Any application may register as a handler for qsy:// URIs. When multiple handlers exist, the operating system's default app selection applies.
qsy://<action>?<parameters>
Actions define the intent. Parameters are standard URL query parameters (percent-encoded).
Opens the logging app with a new QSO form pre-filled from spot data. The QSO is not saved automatically — the operator confirms and completes the entry.
qsy://spot?callsign=W1AW&freq=14074000&mode=FT8
Required parameters: callsign, freq
Use cases:
- Spot aggregator sends a DX spot to a logging app
- Band map click opens logger pre-filled
- Alert service (HamAlert, etc.) triggers logging
Requests the receiving app to tune a connected radio (via CAT control) to the specified frequency and mode. No QSO form is opened unless the app chooses to.
qsy://tune?freq=14074000&mode=FT8
Required parameters: freq
Use cases:
- Spot tool sends "tune to this station"
- Band plan reference app sends a frequency
- Scheduled activity reminder triggers tune
Opens callsign lookup/details for the specified callsign. No QSO form is opened.
qsy://lookup?callsign=W1AW
Required parameters: callsign
Use cases:
- QRZ/HamDB link opens in a logging app's lookup view
- Callsign mentioned in chat/email opens lookup
Imports QSO records from an ADIF source. The source may be a URL to fetch or a reference to a local file.
qsy://import?url=https%3A%2F%2Fexample.com%2Flog.adi
qsy://import?url=file%3A%2F%2F%2Fpath%2Fto%2Flog.adi
Required parameters: url
Optional parameters: format (default: adif)
Use cases:
- Web service offers "Open in logger" link
- Email attachment handler
- Contest log exchange
Sends a fully-specified QSO record to be saved. The receiving app should present the record for confirmation before saving, but may save directly if the operator has configured auto-accept.
qsy://log?callsign=W1AW&freq=14074000&mode=FT8&rst_sent=599&rst_rcvd=599&time=20260305T1430Z
Required parameters: callsign, freq, mode
Use cases:
- Contest logging app sends QSO to general logger
- Digital mode decoder (WSJT-X, etc.) sends decoded QSO
- Automated logging from SDR software
| Parameter | Type | Description | ADIF Field |
|---|---|---|---|
callsign |
string | Callsign of the station being worked | CALL |
op |
string | Operator's own callsign (if different from station) | OPERATOR |
station |
string | Station callsign (if portable, club, etc.) | STATION_CALLSIGN |
| Parameter | Type | Description | ADIF Field |
|---|---|---|---|
freq |
integer | Frequency in Hz | FREQ (converted to MHz) |
mode |
string | ADIF mode value (e.g., FT8, SSB, CW) |
MODE |
submode |
string | ADIF submode value (e.g., USB, LSB) |
SUBMODE |
band |
string | Band name (e.g., 20m, 2m). Informational; freq takes precedence if both present. |
BAND |
| Parameter | Type | Description | ADIF Field |
|---|---|---|---|
tx_power |
number | Transmit power in watts | TX_PWR |
| Parameter | Type | Description | ADIF Field |
|---|---|---|---|
rst_sent |
string | RST/signal report sent | RST_SENT |
rst_rcvd |
string | RST/signal report received | RST_RCVD |
| Parameter | Type | Description | ADIF Field |
|---|---|---|---|
grid |
string | Maidenhead grid locator of the worked station | GRIDSQUARE |
my_grid |
string | Operator's grid locator | MY_GRIDSQUARE |
Activation references support multiple simultaneous activations via comma-separated values. When multiple values are present, ref and ref_type are positionally paired (first ref with first ref_type, etc.).
| Parameter | Type | Description | ADIF Field |
|---|---|---|---|
ref |
string | Activation reference(s), comma-separated (e.g., K-1234 or K-1234,W6/CT-001) |
SIG_INFO |
ref_type |
string | Reference program(s), comma-separated (e.g., pota or pota,sota) |
SIG |
my_ref |
string | Operator's activation reference(s), comma-separated | MY_SIG_INFO |
my_ref_type |
string | Operator's reference program(s), comma-separated | MY_SIG |
Example — dual POTA/SOTA activation:
ref=K-1234,W6/CT-001&ref_type=pota,sota
Receivers that only support a single reference SHOULD use the first value and ignore the rest.
| Parameter | Type | Description | ADIF Field |
|---|---|---|---|
time |
string | ISO 8601 UTC timestamp (e.g., 20260305T1430Z) |
QSO_DATE + TIME_ON |
| Parameter | Type | Description | ADIF Field |
|---|---|---|---|
contest |
string | Contest ID (e.g., CQ-WPX-CW) |
CONTEST_ID |
srx |
string | Serial/exchange received | SRX_STRING |
stx |
string | Serial/exchange sent | STX_STRING |
| Parameter | Type | Description |
|---|---|---|
source |
string | Originating application or service identifier |
comment |
string | Free-text comment to pre-fill |
- All parameter values MUST be percent-encoded per RFC 3986.
- Frequency (
freq) is always an integer in hertz. No decimal points. - Mode and submode values MUST use ADIF mode enumeration strings.
- Time values use compact ISO 8601 in UTC:
YYYYMMDDTHHmmZorYYYYMMDDTHHmmSSZ. - Callsigns SHOULD be uppercase but receivers MUST accept any case.
- Unknown parameters MUST be ignored by the receiver (forward compatibility).
- Comma-separated values (activation references) MUST NOT contain unescaped commas within individual values.
- Unknown actions: If a receiver does not support an action, it SHOULD open to its default view and MAY display a notice.
- Missing optional parameters: Receivers fill in defaults or leave fields empty.
- Conflicting parameters: If
freqandbanddisagree,freqwins. - Security: Receivers MUST NOT auto-save QSOs from
spotactions. Thelogaction MAY auto-save only if the operator has explicitly opted in. - Validation: Receivers SHOULD validate callsign format and frequency range before pre-filling.
- Multiple references: Receivers that support only a single activation reference SHOULD use the first comma-separated value and silently ignore additional values.
Apps register the scheme in Info.plist:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>qsy</string>
</array>
<key>CFBundleURLName</key>
<string>org.qsy.uri</string>
</dict>
</array>Handle in SwiftUI with .onOpenURL { url in ... }.
Register in AndroidManifest.xml:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="qsy" />
</intent-filter>Register the qsy:// protocol handler via OS-specific mechanisms (Windows Registry, xdg-mime, Launch Services).
DX spot from cluster:
qsy://spot?callsign=JA1ABC&freq=21074000&mode=FT8&grid=PM95&source=dxcluster
POTA spot with activation reference:
qsy://spot?callsign=W4EF&freq=7074000&mode=FT8&ref=K-1234&ref_type=pota&source=pota
Dual POTA/SOTA activation:
qsy://spot?callsign=W4EF&freq=7074000&mode=FT8&ref=K-1234,W6/CT-001&ref_type=pota,sota
QRP station with power:
qsy://spot?callsign=KD2UJK&freq=7030000&mode=CW&tx_power=5&source=sotawatch
Tune radio to a CW frequency:
qsy://tune?freq=14035000&mode=CW
Complete contest QSO:
qsy://log?callsign=K3LR&freq=14000000&mode=CW&rst_sent=599&rst_rcvd=599&contest=CQ-WPX-CW&stx=001&srx=123&time=20260305T1430Z
Import from URL:
qsy://import?url=https%3A%2F%2Fpota.app%2Fexport%2FN3JSV.adi
Callsign lookup:
qsy://lookup?callsign=W1AW
This specification follows Semantic Versioning. The version is informational — there is no version negotiation in the URI itself. Forward compatibility is maintained by the "ignore unknown parameters" rule.
This specification is released under CC0 1.0 Universal — public domain, no rights reserved. Anyone may implement, extend, or redistribute without restriction.