{"openapi":"3.1.0","info":{"title":"Shacks On The Air (SHOTA) API","version":"1.0.0","summary":"Official API for spots, shacks, activations, leaderboards and your own SHOTA log.","description":"The official, supported way to integrate with Shacks On The Air. Everything shown on the website is\navailable here, so **please do not scrape the site**. Use this API instead.\n\n**Authentication:** create a key at `/account/api-keys` and send it as `Authorization: Bearer <key>`\nor `X-API-Key: <key>`. Keys carry scopes: `read` for all GET endpoints and `write` for posting QSOs and spots.\n\n**Rate limits:** 120 requests per minute per key. Exceeding the limit returns `429` with `Retry-After`\nand `X-RateLimit-*` headers.\n\n**Every shack is equal:** portable (/P), mobile (/M) and prefixed callsigns all resolve to the operator's one\nshack and count towards the same awards. Where you operate from is recorded, but it never affects scoring.","contact":{"name":"SHOTA","url":"https://shacksontheair.com/developers"}},"servers":[{"url":"https://shacksontheair.com/api/v1","description":"This server"}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"tags":[{"name":"Spots","description":"Live activator spots."},{"name":"Shacks","description":"The shack list. One shack per operator."},{"name":"Activations","description":"Per-day activation summaries."},{"name":"Leaderboards"},{"name":"Events","description":"Official SHOTA events."},{"name":"Operators","description":"Public operator profiles."},{"name":"Me","description":"The API key owner's account."},{"name":"Logging","description":"Post and manage QSOs."},{"name":"Meta"}],"paths":{"/openapi.json":{"get":{"tags":["Meta"],"operationId":"getOpenApi","summary":"This OpenAPI document","security":[],"responses":{"200":{"description":"OpenAPI 3.1 document","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/spots":{"get":{"tags":["Spots"],"operationId":"listSpots","summary":"Active spots","description":"The latest spot for each activator heard within the age window, newest first.","parameters":[{"name":"minutes","in":"query","required":false,"description":"Maximum spot age in minutes (defaults to the site setting, normally 30).","schema":{"type":"integer","minimum":1,"maximum":1440}},{"name":"mode","in":"query","required":false,"description":"Filter by mode, e.g. CW, SSB, FT8.","schema":{"type":"string"}},{"name":"band","in":"query","required":false,"description":"Filter by band, e.g. 40m.","schema":{"type":"string"}},{"name":"program","in":"query","required":false,"description":"Filter by program (country) code, e.g. GB.","schema":{"type":"string"}}],"responses":{"200":{"description":"Spots","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Spot"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"}}},"post":{"tags":["Spots"],"operationId":"createSpot","summary":"Post a spot","description":"Requires the `write` scope. The spotter is the key owner.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpotInput"},"example":{"activator":"G0ABC/P","frequency":14062.5,"mode":"CW","comment":"Calling CQ SHOTA"}}}},"responses":{"201":{"description":"Spot created","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Spot"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"},"422":{"$ref":"#/components/responses/ValidationError"}}}},"/shacks":{"get":{"tags":["Shacks"],"operationId":"listShacks","summary":"Shack list","parameters":[{"name":"program","in":"query","required":false,"description":"Program (country) code, e.g. GB.","schema":{"type":"string"}},{"name":"q","in":"query","required":false,"description":"Search reference, shack name or callsign.","schema":{"type":"string"}},{"name":"active","in":"query","required":false,"description":"Only active (true) or inactive (false) shacks.","schema":{"type":"boolean"}},{"name":"per_page","in":"query","required":false,"description":"Results per page.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"page","in":"query","required":false,"description":"Page number.","schema":{"type":"integer","minimum":1,"default":1}}],"responses":{"200":{"description":"Paginated shacks","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Shack"}},"links":{"$ref":"#/components/schemas/PageLinks"},"meta":{"$ref":"#/components/schemas/PageMeta"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/shacks/{reference}":{"get":{"tags":["Shacks"],"operationId":"getShack","summary":"One shack","parameters":[{"name":"reference","in":"path","required":true,"description":"Shack reference","schema":{"type":"string"},"example":"SHGB-2222"}],"responses":{"200":{"description":"Shack","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Shack"}}}}}},"404":{"$ref":"#/components/responses/NotFound"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/shacks/{reference}/activations":{"get":{"tags":["Shacks","Activations"],"operationId":"listShackActivations","summary":"Activation history of a shack","parameters":[{"name":"reference","in":"path","required":true,"description":"Shack reference","schema":{"type":"string"},"example":"SHGB-2222"},{"name":"per_page","in":"query","required":false,"description":"Results per page.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"page","in":"query","required":false,"description":"Page number.","schema":{"type":"integer","minimum":1,"default":1}}],"responses":{"200":{"description":"Paginated activations","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Activation"}},"links":{"$ref":"#/components/schemas/PageLinks"},"meta":{"$ref":"#/components/schemas/PageMeta"}}}}}},"404":{"$ref":"#/components/responses/NotFound"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/activations":{"get":{"tags":["Activations"],"operationId":"listActivations","summary":"Recent activations","parameters":[{"name":"date","in":"query","required":false,"description":"UTC date (YYYY-MM-DD).","schema":{"type":"string","format":"date"}},{"name":"program","in":"query","required":false,"description":"Program (country) code.","schema":{"type":"string"}},{"name":"include_invalid","in":"query","required":false,"description":"Include days below the QSO threshold.","schema":{"type":"boolean"}},{"name":"per_page","in":"query","required":false,"description":"Results per page.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"page","in":"query","required":false,"description":"Page number.","schema":{"type":"integer","minimum":1,"default":1}}],"responses":{"200":{"description":"Paginated activations","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Activation"}},"links":{"$ref":"#/components/schemas/PageLinks"},"meta":{"$ref":"#/components/schemas/PageMeta"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/leaderboards/activators":{"get":{"tags":["Leaderboards"],"operationId":"activatorLeaderboard","summary":"Top activators","description":"Ranked by valid activation days, then QSOs. Refreshed every 5 minutes.","parameters":[{"name":"limit","in":"query","required":false,"description":"Number of rows.","schema":{"type":"integer","minimum":1,"maximum":500,"default":100}}],"responses":{"200":{"description":"Leaderboard","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ActivatorRank"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/leaderboards/hunters":{"get":{"tags":["Leaderboards"],"operationId":"hunterLeaderboard","summary":"Top hunters","description":"Ranked by distinct shacks worked, then QSOs. Refreshed every 5 minutes.","parameters":[{"name":"limit","in":"query","required":false,"description":"Number of rows.","schema":{"type":"integer","minimum":1,"maximum":500,"default":100}}],"responses":{"200":{"description":"Leaderboard","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/HunterRank"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/events":{"get":{"tags":["Events"],"operationId":"listEvents","summary":"Official events","parameters":[{"name":"include_past","in":"query","required":false,"description":"Include finished events.","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Events","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Event"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/operators/{callsign}":{"get":{"tags":["Operators"],"operationId":"getOperator","summary":"Public operator profile","description":"Any variant (G0ABC/P, EA8/G0ABC) resolves to the owning operator. Private profiles return 404.","parameters":[{"name":"callsign","in":"path","required":true,"description":"Callsign","schema":{"type":"string"},"example":"G0ABC"}],"responses":{"200":{"description":"Operator","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Operator"}}}}}},"404":{"$ref":"#/components/responses/NotFound"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/me":{"get":{"tags":["Me"],"operationId":"getMe","summary":"Your profile, shack and key info","responses":{"200":{"description":"You","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Operator"},"meta":{"type":"object","properties":{"is_supporter":{"type":"boolean"},"api_key":{"type":"object","properties":{"name":{"type":"string"},"scopes":{"type":"array","items":{"type":"string","enum":["read","write"]}}}}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/me/callsigns":{"get":{"tags":["Me"],"operationId":"getMyCallsigns","summary":"Your registered base callsigns","responses":{"200":{"description":"Callsigns","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Callsign"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/me/activations":{"get":{"tags":["Me","Activations"],"operationId":"getMyActivations","summary":"Your activations","parameters":[{"name":"per_page","in":"query","required":false,"description":"Results per page.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"page","in":"query","required":false,"description":"Page number.","schema":{"type":"integer","minimum":1,"default":1}}],"responses":{"200":{"description":"Paginated activations","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Activation"}},"links":{"$ref":"#/components/schemas/PageLinks"},"meta":{"$ref":"#/components/schemas/PageMeta"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/me/qsos":{"get":{"tags":["Me","Logging"],"operationId":"getMyQsos","summary":"Your logged QSOs","parameters":[{"name":"from","in":"query","required":false,"description":"From UTC date (inclusive).","schema":{"type":"string","format":"date"}},{"name":"to","in":"query","required":false,"description":"To UTC date (inclusive).","schema":{"type":"string","format":"date"}},{"name":"band","in":"query","required":false,"description":"Band, e.g. 20m.","schema":{"type":"string"}},{"name":"mode","in":"query","required":false,"description":"Mode, e.g. FT8.","schema":{"type":"string"}},{"name":"per_page","in":"query","required":false,"description":"Results per page.","schema":{"type":"integer","minimum":1,"maximum":500,"default":100}},{"name":"page","in":"query","required":false,"description":"Page number.","schema":{"type":"integer","minimum":1,"default":1}}],"responses":{"200":{"description":"Paginated QSOs","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Qso"}},"links":{"$ref":"#/components/schemas/PageLinks"},"meta":{"$ref":"#/components/schemas/PageMeta"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/me/hunted":{"get":{"tags":["Me"],"operationId":"getMyHunted","summary":"Shacks you have worked as a hunter","description":"Hunter credit comes from activators' logs that include any of your callsigns.","responses":{"200":{"description":"Hunted shacks","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/HuntedShack"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/me/awards":{"get":{"tags":["Me"],"operationId":"getMyAwards","summary":"Your award progress","responses":{"200":{"description":"Award ladders","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Award"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/qsos":{"post":{"tags":["Logging"],"operationId":"postQsos","summary":"Log QSOs","description":"Requires the `write` scope. Send **raw ADIF** (`Content-Type: text/plain`), JSON `{\"adif\": \"...\"}`, or JSON\n`{\"qsos\": [...]}` with ADIF field names. 256 KB and 5000 QSOs maximum per request.\n\nRe-sending a QSO updates it rather than duplicating it (de-duplicated on base call, minute, band and mode).\nEach record's `station_callsign` must resolve to one of your registered callsigns (/P, /M and prefixed\nforms are fine). Use `SIG=SHOTA` + `SIG_INFO=<ref>` (or `their_shack_ref`) for shack-to-shack contacts,\nand optionally `SHOTA_FROM` (or `operating_from`) as one of home, shed, club, mobile, portable or remote.","requestBody":{"required":true,"content":{"text/plain":{"schema":{"type":"string"},"example":"<STATION_CALLSIGN:5>G0ABC <CALL:5>M0XYZ <QSO_DATE:8>20261101 <TIME_ON:4>1830 <BAND:3>40m <FREQ:5>7.030 <MODE:2>CW <RST_SENT:3>599 <RST_RCVD:3>579 <EOR>"},"application/json":{"schema":{"oneOf":[{"type":"object","required":["adif"],"properties":{"adif":{"type":"string"}}},{"type":"object","required":["qsos"],"properties":{"qsos":{"type":"array","maxItems":5000,"items":{"$ref":"#/components/schemas/QsoInput"}}}}]},"example":{"qsos":[{"station_callsign":"G0ABC/M","call":"M0XYZ","qso_date":"20261101","time_on":"1830","freq":"14.062","band":"20m","mode":"CW","rst_sent":"599","rst_rcvd":"599"}]}}}},"responses":{"200":{"description":"Import result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportResult"},"example":{"imported":1,"skipped":0,"errors":[]}}}},"413":{"description":"Payload too large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Nothing could be imported","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportResult"},"example":{"imported":0,"skipped":1,"errors":["Record 1: station callsign K1ABC is not registered to your account"]}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/qsos/{id}":{"delete":{"tags":["Logging"],"operationId":"deleteQso","summary":"Delete one of your QSOs","description":"Requires `write`. The day's activation is recalculated.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"}}}}}},"404":{"$ref":"#/components/responses/NotFound"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Your SHOTA API key, e.g. `Authorization: Bearer shota_...`"},"apiKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key"}},"responses":{"Unauthorized":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"message":"Invalid API key."}}}},"Forbidden":{"description":"Key lacks the required scope, or the account is suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"message":"This API key does not have the 'write' scope."}}}},"NotFound":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"TooManyRequests":{"description":"Rate limit exceeded (120/min per key). See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"message":"Too Many Attempts."}}}},"ValidationError":{"description":"Validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"errors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}}}}}}}},"schemas":{"Error":{"type":"object","properties":{"message":{"type":"string"}}},"OperatingFrom":{"type":"string","enum":["home","shed","club","mobile","portable","remote"],"description":"Where the shack was today. Informational only; never scored."},"Spot":{"type":"object","properties":{"id":{"type":"integer"},"activator":{"type":"string","example":"G0ABC/P"},"reference":{"type":["string","null"],"example":"SHGB-2222"},"shack_name":{"type":["string","null"]},"frequency_khz":{"type":"number","example":14062.5},"band":{"type":["string","null"],"example":"20m"},"mode":{"type":["string","null"],"example":"CW"},"operating_from":{"$ref":"#/components/schemas/OperatingFrom"},"operating_from_label":{"type":"string","example":"Portable shack"},"spotter":{"type":"string"},"comment":{"type":["string","null"]},"source":{"type":"string","enum":["web","api","rbn"]},"is_qrt":{"type":"boolean"},"spotted_at":{"type":"string","format":"date-time"},"activator_photo_url":{"type":["string","null"],"format":"uri"},"activator_name":{"type":["string","null"]},"country":{"type":["string","null"]},"grid":{"type":["string","null"]}}},"SpotInput":{"type":"object","required":["activator","frequency"],"properties":{"activator":{"type":"string","maxLength":20},"frequency":{"type":"number","description":"kHz"},"mode":{"type":"string"},"reference":{"type":"string","description":"Shack reference. Optional when the activator is registered."},"comment":{"type":"string","maxLength":200},"operating_from":{"$ref":"#/components/schemas/OperatingFrom"},"is_qrt":{"type":"boolean"}}},"Shack":{"type":"object","properties":{"reference":{"type":"string","example":"SHGB-2222"},"program":{"type":"string","example":"GB"},"name":{"type":"string"},"description":{"type":["string","null"]},"country":{"type":["string","null"]},"region":{"type":["string","null"]},"grid":{"type":["string","null"]},"lat":{"type":["number","null"]},"lon":{"type":["number","null"]},"photo_url":{"type":["string","null"],"format":"uri"},"rig":{"type":["string","null"]},"antenna":{"type":["string","null"]},"power_watts":{"type":["integer","null"]},"is_active":{"type":"boolean"},"activations_count":{"type":"integer"},"qsos_count":{"type":"integer"},"first_activated_at":{"type":["string","null"],"format":"date"},"last_activated_at":{"type":["string","null"],"format":"date"},"operator":{"type":["object","null"],"properties":{"callsign":{"type":"string"},"name":{"type":"string"},"photo_url":{"type":"string"}}},"url":{"type":"string","format":"uri"}}},"Activation":{"type":"object","properties":{"reference":{"type":"string"},"shack_name":{"type":"string"},"activator":{"type":["string","null"]},"date":{"type":"string","format":"date"},"qso_count":{"type":"integer"},"cw_count":{"type":"integer"},"phone_count":{"type":"integer"},"data_count":{"type":"integer"},"is_valid":{"type":"boolean"},"callsigns_used":{"type":"array","items":{"type":"string"}},"operating_from":{"type":"array","items":{"$ref":"#/components/schemas/OperatingFrom"}}}},"ActivatorRank":{"type":"object","properties":{"rank":{"type":"integer"},"callsign":{"type":["string","null"]},"name":{"type":"string"},"photo_url":{"type":"string"},"reference":{"type":"string"},"shack_name":{"type":"string"},"country":{"type":["string","null"]},"activations":{"type":"integer"},"qsos":{"type":"integer"}}},"HunterRank":{"type":"object","properties":{"rank":{"type":"integer"},"callsign":{"type":["string","null"]},"name":{"type":"string"},"photo_url":{"type":"string"},"shacks_hunted":{"type":"integer"},"qsos":{"type":"integer"}}},"Event":{"type":"object","properties":{"slug":{"type":"string"},"title":{"type":"string"},"summary":{"type":["string","null"]},"body":{"type":["string","null"]},"starts_at":{"type":"string","format":"date-time"},"ends_at":{"type":"string","format":"date-time"},"is_live":{"type":"boolean"},"url":{"type":"string","format":"uri"}}},"Operator":{"type":"object","description":"Public profile. Email addresses are never exposed.","properties":{"callsign":{"type":["string","null"]},"name":{"type":"string"},"photo_url":{"type":"string","format":"uri"},"location":{"type":["string","null"]},"grid":{"type":["string","null"]},"bio":{"type":["string","null"]},"profile_url":{"type":["string","null"],"format":"uri"},"shack":{"oneOf":[{"$ref":"#/components/schemas/Shack"},{"type":"null"}]},"callsigns":{"type":"array","items":{"type":"string"}},"joined_at":{"type":"string","format":"date-time"}}},"Callsign":{"type":"object","properties":{"callsign":{"type":"string"},"is_primary":{"type":"boolean"},"verified":{"type":"boolean"}}},"Qso":{"type":"object","properties":{"id":{"type":"integer"},"station_callsign":{"type":"string"},"operator":{"type":["string","null"]},"call":{"type":"string"},"qso_at":{"type":"string","format":"date-time"},"band":{"type":["string","null"]},"freq_mhz":{"type":["number","null"]},"mode":{"type":["string","null"]},"submode":{"type":["string","null"]},"rst_sent":{"type":["string","null"]},"rst_rcvd":{"type":["string","null"]},"gridsquare":{"type":["string","null"]},"their_shack_ref":{"type":["string","null"]},"operating_from":{"$ref":"#/components/schemas/OperatingFrom"},"source":{"type":"string"}}},"QsoInput":{"type":"object","required":["call","qso_date","time_on"],"properties":{"station_callsign":{"type":"string","description":"Defaults to your primary callsign."},"operator":{"type":"string"},"call":{"type":"string"},"qso_date":{"type":"string","pattern":"^\\d{8}$","example":"20261101"},"time_on":{"type":"string","pattern":"^\\d{4}(\\d{2})?$","example":"1830"},"freq":{"type":"string","description":"MHz"},"band":{"type":"string"},"mode":{"type":"string"},"submode":{"type":"string"},"rst_sent":{"type":"string"},"rst_rcvd":{"type":"string"},"gridsquare":{"type":"string"},"operating_from":{"$ref":"#/components/schemas/OperatingFrom"},"their_shack_ref":{"type":"string","description":"Other station's shack reference for shack-to-shack."}}},"ImportResult":{"type":"object","properties":{"imported":{"type":"integer"},"skipped":{"type":"integer"},"errors":{"type":"array","items":{"type":"string"},"description":"First 20 per-record problems."}}},"HuntedShack":{"type":"object","properties":{"reference":{"type":"string"},"shack_name":{"type":"string"},"qsos":{"type":"integer"},"last_worked_at":{"type":"string"}}},"Award":{"type":"object","properties":{"key":{"type":"string","enum":["activator","hunter","qsos","s2s"]},"title":{"type":"string"},"unit":{"type":"string"},"value":{"type":"integer"},"steps":{"type":"array","items":{"type":"integer"}},"achieved":{"type":"array","items":{"type":"integer"}},"next":{"type":["integer","null"]}}},"PageLinks":{"type":"object","properties":{"first":{"type":["string","null"]},"last":{"type":["string","null"]},"prev":{"type":["string","null"]},"next":{"type":["string","null"]}}},"PageMeta":{"type":"object","properties":{"current_page":{"type":"integer"},"last_page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"}}}}}}