This software is dedicated to the memory of Tom G1PJB, SK, a friend and colleague who sadly passed away around the time I started writing it in Autumn 2025. I was looking forward to showing it to you when it was done.
-
+
{% end %}
\ No newline at end of file
diff --git a/templates/add_spot.html b/templates/add_spot.html
index 6adfa09..bf45d67 100644
--- a/templates/add_spot.html
+++ b/templates/add_spot.html
@@ -69,8 +69,8 @@
-
-
+
+
{% end %}
\ No newline at end of file
diff --git a/templates/alerts.html b/templates/alerts.html
index e919d3a..1423ffc 100644
--- a/templates/alerts.html
+++ b/templates/alerts.html
@@ -70,8 +70,8 @@
-
-
+
+
{% end %}
\ No newline at end of file
diff --git a/templates/bands.html b/templates/bands.html
index b2f0d18..c2243b2 100644
--- a/templates/bands.html
+++ b/templates/bands.html
@@ -76,9 +76,9 @@
-
-
-
+
+
+
{% end %}
\ No newline at end of file
diff --git a/templates/base.html b/templates/base.html
index fe2ea00..3e90081 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -24,7 +24,7 @@
Spothole
-
+
@@ -52,9 +52,9 @@
integrity="sha384-L1eE4eD41kpBIWe2I0eHy+GnEUC4RIpcvibVW2JCminuPlTl+2Bc528iPdVMg5Dn"
crossorigin="anonymous">
-
-
-
+
+
+
diff --git a/templates/conditions.html b/templates/conditions.html
index 5a39b6a..40aab50 100644
--- a/templates/conditions.html
+++ b/templates/conditions.html
@@ -271,8 +271,8 @@
-
-
+
+
diff --git a/templates/map.html b/templates/map.html
index 8b356f3..c0b2ca1 100644
--- a/templates/map.html
+++ b/templates/map.html
@@ -94,9 +94,9 @@
-
-
-
+
+
+
{% end %}
\ No newline at end of file
diff --git a/templates/spots.html b/templates/spots.html
index 108acf7..c01e09e 100644
--- a/templates/spots.html
+++ b/templates/spots.html
@@ -104,9 +104,9 @@
-
-
-
+
+
+
{% end %}
\ No newline at end of file
diff --git a/templates/status.html b/templates/status.html
index 5c55e12..8725ba3 100644
--- a/templates/status.html
+++ b/templates/status.html
@@ -59,8 +59,8 @@
-
-
+
+
diff --git a/webassets/apidocs/openapi.yml b/webassets/apidocs/openapi.yml
index 6daa365..99b0cfe 100644
--- a/webassets/apidocs/openapi.yml
+++ b/webassets/apidocs/openapi.yml
@@ -37,9 +37,23 @@ info:
license:
name: The Unlicense
url: https://unlicense.org/#the-unlicense
- version: v1.3
+ version: v1.4
+
servers:
- url: https://spothole.app/api/v1
+
+tags:
+ - name: Spots
+ description: Endpoints for retrieving and submitting spots (real-time operator sightings).
+ - name: Alerts
+ description: Endpoints for retrieving alerts (upcoming planned activations).
+ - name: Propagation & DX
+ description: Endpoints for solar conditions, propagation forecasts, and DX statistics.
+ - name: General
+ description: Server status and enumeration options.
+ - name: Utilities
+ description: Utility lookups for callsigns, SIG references, and Maidenhead grids.
+
paths:
/spots:
get:
@@ -49,125 +63,25 @@ paths:
description: The main API call that retrieves spots from the system. Supply this with no query parameters to retrieve all spots known to the system. Supply query parameters to filter what is retrieved. If QRZ.com or HamQTH credentials are supplied, returned spots will be enriched with operator name, home location etc. from those services.
operationId: spots
parameters:
- - name: limit
- in: query
- description: Limit the number of spots in the response
- required: false
- schema:
- type: integer
- - name: since
- in: query
- description: Limit the spots to only ones at this time or later. Time in UTC seconds since UNIX epoch. Equivalent to "max_age" but saves the client having to work out how many seconds ago "midnight" was.
- required: false
- schema:
- type: number
- - name: max_age
- in: query
- description: Limit the spots to only ones received in the last 'n' seconds. Equivalent to "since" but saves the client having to work out what time was 'n' seconds ago on every call. Refer to the "max_spot_age" in the /options call to figure out what the maximum useful value you can provide is. Larger values will still be accepted, there just won't be any spots in the system older than max_spot_age.
- required: false
- schema:
- type: number
- - name: received_since
- in: query
- description: Limit the spots to only ones that the system found out about at this time or later. Time in UTC seconds since UNIX epoch. If you are using a front-end that tracks the last time it queried the API and requests spots since then, you want *this* version of the query parameter, not "since", because otherwise it may miss things. The logic is "greater than" rather than "greater than or equal to", so you can submit the time of the last received item back to this call and you will get all the more recent spots back, without duplicating the previous latest spot.
- required: false
- schema:
- type: number
- - name: source
- in: query
- description: "Limit the spots to only ones from one or more sources. To select more than one source, supply a comma-separated list."
- required: false
- schema:
- $ref: "#/components/schemas/Source"
- - name: sig
- in: query
- description: "Limit the spots to only ones from one or more Special Interest Groups provided as an argument. To select more than one SIG, supply a comma-separated list. The special `sig` name `NO_SIG` matches spots with no sig set. You can use `sig=NO_SIG` to specifically only return generic spots with no associated SIG. You can also use combinations to request for example POTA + no SIG, but reject other SIGs. If you want to request 'every SIG and not No SIG', see the `needs_sig` query parameter for a shortcut."
- required: false
- schema:
- $ref: "#/components/schemas/SIGNameIncludingNoSIG"
- - name: needs_sig
- in: query
- description: "Limit the spots to only ones with a Special Interest Group such as POTA. Because supplying all known SIGs as a `sigs` parameter is unwieldy, and leaving `sigs` blank will also return spots with *no* SIG, this parameter can be set true to return only spots with a SIG, regardless of what it is, so long as it's not blank. This is the equivalent of supplying the `sig` query param with a list of every known SIG apart from the special `NO_SIG` value. This is what Field Spotter uses to exclude generic cluster spots and only retrieve xOTA things."
- required: false
- schema:
- type: boolean
- default: false
- - name: needs_sig_ref
- in: query
- description: "Limit the spots to only ones which have at least one reference (e.g. a park reference) for Special Interest Groups such as POTA."
- required: false
- schema:
- type: boolean
- default: false
- - name: band
- in: query
- description: "Limit the spots to only ones from one or more bands. To select more than one band, supply a comma-separated list."
- required: false
- schema:
- $ref: "#/components/schemas/BandName"
- - name: mode
- in: query
- description: "Limit the spots to only ones from one or more modes. To select more than one mode, supply a comma-separated list."
- required: false
- schema:
- $ref: "#/components/schemas/Mode"
- - name: mode_type
- in: query
- description: "Limit the spots to only ones from one or more mode families. To select more than one mode family, supply a comma-separated list."
- required: false
- schema:
- $ref: "#/components/schemas/Mode"
- - name: dx_continent
- in: query
- description: "Limit the spots to only ones where the DX (the operator being spotted) is on the given continent(s). To select more than one continent, supply a comma-separated list."
- required: false
- schema:
- $ref: "#/components/schemas/Continent"
- - name: de_continent
- in: query
- description: "Limit the spots to only ones where the spotteris on the given continent(s). To select more than one continent, supply a comma-separated list."
- required: false
- schema:
- $ref: "#/components/schemas/Continent"
- - name: dedupe
- in: query
- description: "\"De-duplicate\" the spots, returning only the latest spot for any given callsign."
- required: false
- schema:
- type: boolean
- default: false
- - name: dx_call_includes
- in: query
- description: "Limit the spots to only ones where the DX callsign includes the supplied string (case-insensitive). Generally a complete callsign, but you can supply a shorter string for partial matches."
- required: false
- schema:
- type: string
- - name: comment_includes
- in: query
- description: "Return only spots where the comment includes the provided string (case-insensitive)."
- required: false
- schema:
- type: string
- - name: text_includes
- in: query
- description: "Limit the spots to only ones where some significant text (DX callsign or comment) includes the supplied string (case-insensitive)."
- required: false
- schema:
- type: string
- - name: needs_good_location
- in: query
- description: "Return only spots with a 'good' location. (See the spot `dx_location_good` parameter for details. Useful for map-based clients, to avoid spots with 'bad' locations e.g. loads of cluster spots ending up in the centre of the DXCC entitity.)"
- required: false
- schema:
- type: boolean
- default: false
- - name: allow_qrt
- in: query
- description: Allow spots that are known to be QRT to be returned.
- required: false
- schema:
- type: boolean
- default: true
+ - $ref: '#/components/parameters/SpotLimit'
+ - $ref: '#/components/parameters/SpotSince'
+ - $ref: '#/components/parameters/SpotMaxAge'
+ - $ref: '#/components/parameters/SpotReceivedSince'
+ - $ref: '#/components/parameters/SpotSource'
+ - $ref: '#/components/parameters/SpotSig'
+ - $ref: '#/components/parameters/SpotNeedsSig'
+ - $ref: '#/components/parameters/SpotNeedsSigRef'
+ - $ref: '#/components/parameters/SpotBand'
+ - $ref: '#/components/parameters/SpotMode'
+ - $ref: '#/components/parameters/SpotModeType'
+ - $ref: '#/components/parameters/SpotDxContinent'
+ - $ref: '#/components/parameters/SpotDeContinent'
+ - $ref: '#/components/parameters/SpotDedupe'
+ - $ref: '#/components/parameters/SpotDxCallIncludes'
+ - $ref: '#/components/parameters/SpotCommentIncludes'
+ - $ref: '#/components/parameters/SpotTextIncludes'
+ - $ref: '#/components/parameters/SpotNeedsGoodLocation'
+ - $ref: '#/components/parameters/SpotAllowQrt'
- $ref: '#/components/parameters/QrzUsername'
- $ref: '#/components/parameters/QrzPassword'
- $ref: '#/components/parameters/QrzSessionKey'
@@ -180,9 +94,7 @@ paths:
content:
application/json:
schema:
- type: array
- items:
- $ref: '#/components/schemas/Spot'
+ $ref: '#/components/schemas/SpotList'
/spots/stream:
get:
@@ -192,94 +104,20 @@ paths:
description: Request a Server-Sent Event stream which will return individual spots immediately when they are added to the system. Only spots that match the provided filters will be returned. If QRZ.com or HamQTH credentials are supplied, streamed spots will be enriched with operator name, home location etc. from those services.
operationId: spots-stream
parameters:
- - name: source
- in: query
- description: "Limit the spots to only ones from one or more sources. To select more than one source, supply a comma-separated list."
- required: false
- schema:
- $ref: "#/components/schemas/Source"
- - name: sig
- in: query
- description: "Limit the spots to only ones from one or more Special Interest Groups provided as an argument. To select more than one SIG, supply a comma-separated list. The special `sig` name `NO_SIG` matches spots with no sig set. You can use `sig=NO_SIG` to specifically only return generic spots with no associated SIG. You can also use combinations to request for example POTA + no SIG, but reject other SIGs. If you want to request 'every SIG and not No SIG', see the `needs_sig` query parameter for a shortcut."
- required: false
- schema:
- $ref: "#/components/schemas/SIGNameIncludingNoSIG"
- - name: needs_sig
- in: query
- description: "Limit the spots to only ones with a Special Interest Group such as POTA. Because supplying all known SIGs as a `sigs` parameter is unwieldy, and leaving `sigs` blank will also return spots with *no* SIG, this parameter can be set true to return only spots with a SIG, regardless of what it is, so long as it's not blank. This is the equivalent of supplying the `sig` query param with a list of every known SIG apart from the special `NO_SIG` value. This is what Field Spotter uses to exclude generic cluster spots and only retrieve xOTA things."
- required: false
- schema:
- type: boolean
- default: false
- - name: needs_sig_ref
- in: query
- description: "Limit the spots to only ones which have at least one reference (e.g. a park reference) for Special Interest Groups such as POTA."
- required: false
- schema:
- type: boolean
- default: false
- - name: band
- in: query
- description: "Limit the spots to only ones from one or more bands. To select more than one band, supply a comma-separated list."
- required: false
- schema:
- $ref: "#/components/schemas/BandName"
- - name: mode
- in: query
- description: "Limit the spots to only ones from one or more modes. To select more than one mode, supply a comma-separated list."
- required: false
- schema:
- $ref: "#/components/schemas/Mode"
- - name: mode_type
- in: query
- description: "Limit the spots to only ones from one or more mode families. To select more than one mode family, supply a comma-separated list."
- required: false
- schema:
- $ref: "#/components/schemas/Mode"
- - name: dx_continent
- in: query
- description: "Limit the spots to only ones where the DX (the operator being spotted) is on the given continent(s). To select more than one continent, supply a comma-separated list."
- required: false
- schema:
- $ref: "#/components/schemas/Continent"
- - name: de_continent
- in: query
- description: "Limit the spots to only ones where the spotteris on the given continent(s). To select more than one continent, supply a comma-separated list."
- required: false
- schema:
- $ref: "#/components/schemas/Continent"
- - name: dx_call_includes
- in: query
- description: "Limit the spots to only ones where the DX callsign includes the supplied string (case-insensitive). Generally a complete callsign, but you can supply a shorter string for partial matches."
- required: false
- schema:
- type: string
- - name: comment_includes
- in: query
- description: "Return only spots where the comment includes the provided string (case-insensitive)."
- required: false
- schema:
- type: string
- - name: text_includes
- in: query
- description: "Limit the spots to only ones where some significant text (DX callsign or comment) includes the supplied string (case-insensitive)."
- required: false
- schema:
- type: string
- - name: needs_good_location
- in: query
- description: "Return only spots with a 'good' location. (See the spot `dx_location_good` parameter for details. Useful for map-based clients, to avoid spots with 'bad' locations e.g. loads of cluster spots ending up in the centre of the DXCC entitity.)"
- required: false
- schema:
- type: boolean
- default: false
- - name: allow_qrt
- in: query
- description: Allow spots that are known to be QRT to be returned.
- required: false
- schema:
- type: boolean
- default: true
+ - $ref: '#/components/parameters/SpotSource'
+ - $ref: '#/components/parameters/SpotSig'
+ - $ref: '#/components/parameters/SpotNeedsSig'
+ - $ref: '#/components/parameters/SpotNeedsSigRef'
+ - $ref: '#/components/parameters/SpotBand'
+ - $ref: '#/components/parameters/SpotMode'
+ - $ref: '#/components/parameters/SpotModeType'
+ - $ref: '#/components/parameters/SpotDxContinent'
+ - $ref: '#/components/parameters/SpotDeContinent'
+ - $ref: '#/components/parameters/SpotDxCallIncludes'
+ - $ref: '#/components/parameters/SpotCommentIncludes'
+ - $ref: '#/components/parameters/SpotTextIncludes'
+ - $ref: '#/components/parameters/SpotNeedsGoodLocation'
+ - $ref: '#/components/parameters/SpotAllowQrt'
- $ref: '#/components/parameters/QrzUsername'
- $ref: '#/components/parameters/QrzPassword'
- $ref: '#/components/parameters/QrzSessionKey'
@@ -303,60 +141,15 @@ paths:
description: Retrieves alerts (indications of upcoming activations) from the system. Supply this with no query parameters to retrieve all alerts known to the system. Supply query parameters to filter what is retrieved. If QRZ.com or HamQTH credentials are supplied, returned alerts will be enriched with operator names from those services.
operationId: alerts
parameters:
- - name: limit
- in: query
- description: Limit the number of alerts in the response
- required: false
- schema:
- type: integer
- - name: received_since
- in: query
- description: Limit the alerts to only ones that the system found out about at this time or later. Time in UTC seconds since UNIX epoch. If you are using a front-end that tracks the last time it queried the API and requests alerts since then, you want *this* version of the query parameter, not "since", because otherwise it may miss things. The logic is "greater than" rather than "greater than or equal to", so you can submit the time of the last received item back to this call and you will get all the more recent alerts back, without duplicating the previous latest spot.
- required: false
- schema:
- type: number
- - name: max_duration
- in: query
- description: Limit the alerts to only ones with a duration of this many seconds or less. Duration is end time minus start time, if end time is set, otherwise the activation is assumed to be short and therefore to always pass this check. This is useful to filter out people who alert POTA activations lasting months or even years, but note it will also include multi-day or multi-week DXpeditions that you might otherwise be interested in. See the dxpeditions_skip_max_duration_check parameter for the workaround.
- required: false
- schema:
- type: integer
- - name: dxpeditions_skip_max_duration_check
- in: query
- description: Return DXpedition alerts even if they last longer than max_duration. This allows the user to filter out multi-day/multi-week POTA alerts where the operator likely won't be on the air most of the time, but keep multi-day/multi-week DXpeditions where the operator(s) likely *will* be on the air most of the time.
- required: false
- schema:
- type: boolean
- - name: source
- in: query
- description: "Limit the alerts to only ones from one or more sources. To select more than one source, supply a comma-separated list."
- required: false
- schema:
- $ref: "#/components/schemas/Source"
- - name: sig
- in: query
- description: "Limit the alerts to only ones from one or more Special Interest Groups. To select more than one SIG, supply a comma-separated list. The special value 'NO_SIG' can be included to return alerts specifically without an associated SIG (i.e. general DXpeditions)."
- required: false
- schema:
- $ref: "#/components/schemas/SIGNameIncludingNoSIG"
- - name: dx_continent
- in: query
- description: "Limit the alerts to only ones where the DX operator is on the given continent(s). To select more than one continent, supply a comma-separated list."
- required: false
- schema:
- $ref: "#/components/schemas/Continent"
- - name: dx_call_includes
- in: query
- description: "Limit the alerts to only ones where the DX callsign includes the supplied string (case-insensitive). Generally a complete callsign, but you can supply a shorter string for partial matches."
- required: false
- schema:
- type: string
- - name: text_includes
- in: query
- description: "Limit the alerts to only ones where some significant text (DX callsign, freqs/modes, or comment) includes the supplied string (case-insensitive)."
- required: false
- schema:
- type: string
+ - $ref: '#/components/parameters/AlertLimit'
+ - $ref: '#/components/parameters/AlertReceivedSince'
+ - $ref: '#/components/parameters/AlertMaxDuration'
+ - $ref: '#/components/parameters/AlertDxpeditionsSkipMaxDurationCheck'
+ - $ref: '#/components/parameters/AlertSource'
+ - $ref: '#/components/parameters/AlertSig'
+ - $ref: '#/components/parameters/AlertDxContinent'
+ - $ref: '#/components/parameters/AlertDxCallIncludes'
+ - $ref: '#/components/parameters/AlertTextIncludes'
- $ref: '#/components/parameters/QrzUsername'
- $ref: '#/components/parameters/QrzPassword'
- $ref: '#/components/parameters/QrzSessionKey'
@@ -369,9 +162,7 @@ paths:
content:
application/json:
schema:
- type: array
- items:
- $ref: '#/components/schemas/Alert'
+ $ref: '#/components/schemas/AlertList'
/alerts/stream:
@@ -382,48 +173,13 @@ paths:
description: Request a Server-Sent Event stream which will return individual alerts immediately when they are added to the system. Only alerts that match the provided filters will be returned. If QRZ.com or HamQTH credentials are supplied, streamed alerts will be enriched with operator names from those services.
operationId: alerts-stream
parameters:
- - name: max_duration
- in: query
- description: Limit the alerts to only ones with a duration of this many seconds or less. Duration is end time minus start time, if end time is set, otherwise the activation is assumed to be short and therefore to always pass this check. This is useful to filter out people who alert POTA activations lasting months or even years, but note it will also include multi-day or multi-week DXpeditions that you might otherwise be interested in. See the dxpeditions_skip_max_duration_check parameter for the workaround.
- required: false
- schema:
- type: integer
- - name: dxpeditions_skip_max_duration_check
- in: query
- description: Return DXpedition alerts even if they last longer than max_duration. This allows the user to filter out multi-day/multi-week POTA alerts where the operator likely won't be on the air most of the time, but keep multi-day/multi-week DXpeditions where the operator(s) likely *will* be on the air most of the time.
- required: false
- schema:
- type: boolean
- - name: source
- in: query
- description: "Limit the alerts to only ones from one or more sources. To select more than one source, supply a comma-separated list."
- required: false
- schema:
- $ref: "#/components/schemas/Source"
- - name: sig
- in: query
- description: "Limit the alerts to only ones from one or more Special Interest Groups. To select more than one SIG, supply a comma-separated list. The special value 'NO_SIG' can be included to return alerts specifically without an associated SIG (i.e. general DXpeditions)."
- required: false
- schema:
- $ref: "#/components/schemas/SIGNameIncludingNoSIG"
- - name: dx_continent
- in: query
- description: "Limit the alerts to only ones where the DX operator is on the given continent(s). To select more than one continent, supply a comma-separated list."
- required: false
- schema:
- $ref: "#/components/schemas/Continent"
- - name: dx_call_includes
- in: query
- description: "Limit the alerts to only ones where the DX callsign includes the supplied string (case-insensitive). Generally a complete callsign, but you can supply a shorter string for partial matches."
- required: false
- schema:
- type: string
- - name: text_includes
- in: query
- description: "Limit the alerts to only ones where some significant text (DX callsign, freqs/modes, or comment) includes the supplied string (case-insensitive)."
- required: false
- schema:
- type: string
+ - $ref: '#/components/parameters/AlertMaxDuration'
+ - $ref: '#/components/parameters/AlertDxpeditionsSkipMaxDurationCheck'
+ - $ref: '#/components/parameters/AlertSource'
+ - $ref: '#/components/parameters/AlertSig'
+ - $ref: '#/components/parameters/AlertDxContinent'
+ - $ref: '#/components/parameters/AlertDxCallIncludes'
+ - $ref: '#/components/parameters/AlertTextIncludes'
- $ref: '#/components/parameters/QrzUsername'
- $ref: '#/components/parameters/QrzPassword'
- $ref: '#/components/parameters/QrzSessionKey'
@@ -468,26 +224,7 @@ paths:
content:
application/json:
schema:
- type: object
- description: Spot counts keyed by DE continent
- additionalProperties:
- type: object
- description: Spot counts keyed by DX continent
- additionalProperties:
- type: object
- description: Spot counts keyed by band
- properties:
- 160m: { type: integer }
- 80m: { type: integer }
- 60m: { type: integer }
- 40m: { type: integer }
- 30m: { type: integer }
- 20m: { type: integer }
- 17m: { type: integer }
- 15m: { type: integer }
- 12m: { type: integer }
- 10m: { type: integer }
- 6m: { type: integer }
+ $ref: '#/components/schemas/DxStats'
example:
EU:
NA: { 20m: 42, 17m: 7, 15m: 3, 10m: 0, 6m: 0, 160m: 0, 80m: 1, 60m: 0, 40m: 5, 30m: 2, 12m: 0 }
@@ -507,73 +244,7 @@ paths:
content:
application/json:
schema:
- type: object
- properties:
- "software-version":
- type: string
- description: The version number of the software.
- example: "1.0.1"
- "server-owner-callsign":
- type: string
- description: The callsign of this server's operator.
- example: "M0TRT"
- "uptime_sec":
- type: integer
- description: The amount of time the software has been running for, in seconds.
- example: 12345
- "mem_use_mb":
- type: number
- description: The amount of memory the software is using, in megabytes.
- example: 123.456
- "num_spots":
- type: integer
- description: Number of spots currently in the system.
- example: 123
- "num_alerts":
- type: integer
- description: Number of alerts currently in the system.
- example: 123
- "cleanup":
- type: object
- properties:
- status:
- type: string
- description: The status of the cleanup thread
- example: OK
- last_ran:
- type: number
- description: The last time the cleanup operation ran, UTC seconds since UNIX epoch.
- example: 1759579508
- "webserver":
- type: object
- properties:
- status:
- type: string
- description: The status of the web server
- example: OK
- last_page_access:
- type: number
- description: The last time a page was accessed on the web server, UTC seconds since UNIX epoch.
- example: 1759579508
- last_api_access:
- type: number
- description: The last time an API endpoint was accessed on the web server, UTC seconds since UNIX epoch.
- example: 1759579508
- spot_providers:
- type: array
- description: An array of all the spot providers.
- items:
- $ref: '#/components/schemas/SpotProviderStatus'
- alert_providers:
- type: array
- description: An array of all the alert providers.
- items:
- $ref: '#/components/schemas/AlertProviderStatus'
- solar_condition_providers:
- type: array
- description: An array of all the solar conditions providers.
- items:
- $ref: '#/components/schemas/SolarConditionsProviderStatus'
+ $ref: '#/components/schemas/ServerStatus'
/options:
@@ -589,50 +260,7 @@ paths:
content:
application/json:
schema:
- type: object
- properties:
- bands:
- type: array
- description: An array of all the supported bands.
- items:
- $ref: '#/components/schemas/Band'
- modes:
- type: array
- description: An array of all the supported modes.
- items:
- type: string
- example: "LSB"
- mode_types:
- type: array
- description: An array of all the supported mode types.
- items:
- type: string
- example: "PHONE"
- sigs:
- type: array
- description: An array of all the supported Special Interest Groups.
- items:
- $ref: '#/components/schemas/SIG'
- sources:
- type: array
- description: An array of all the supported data sources.
- items:
- type: string
- example: "Cluster"
- continents:
- type: array
- description: An array of all the supported continents.
- items:
- type: string
- example: "EU"
- max_spot_age:
- type: integer
- description: The maximum age, in seconds, of any spot before it will be deleted by the system. When querying the /api/v1/spots endpoint and providing a "max_age" or "since" parameter, there is no point providing a number larger than this, because the system drops all spots older than this.
- example: 3600
- spot_allowed:
- type: boolean
- description: Whether the POST /spot call, to add spots to the server directly via its API, is permitted on this server.
- example: true
+ $ref: '#/components/schemas/Options'
/lookup/call:
get:
@@ -642,12 +270,7 @@ paths:
description: Perform a lookup of data about a certain callsign, using any of the lookup services available to the Spothole server. If QRZ.com or HamQTH credentials are supplied, the response will be able to use these services to perform a lookup.
operationId: call
parameters:
- - name: call
- in: query
- description: A callsign
- required: true
- type: string
- example: M0TRT
+ - $ref: '#/components/parameters/CallParam'
- $ref: '#/components/parameters/QrzUsername'
- $ref: '#/components/parameters/QrzPassword'
- $ref: '#/components/parameters/QrzSessionKey'
@@ -660,65 +283,13 @@ paths:
content:
application/json:
schema:
- type: object
- properties:
- call:
- type: string
- description: Callsign, as provided to the API
- example: M0TRT
- name:
- type: string
- description: Name of the operator
- example: Ian
- qth:
- type: string
- description: QTH of the operator. This could be from any SIG refs or could be from online lookup of their home QTH.
- example: Dorset
- country:
- type: string
- description: Country of the operator. Note that this is named "country" for commonality with other amateur radio tools, but in reality this is more of a "DXCC Name", as it includes many options which are not countries, just territories that DXCC uniquely identifies.
- example: England
- flag:
- type: string
- description: Country flag of the operator. This is limited to the range of emoji flags. For some DXCCs there may not be an official emoji flag, e.g. Northern Ireland, so the appearance may vary depending on your browser and operating system. Some small islands may also have no flag. Many DXCCs may also share a flag, e.g. mainland Spain, Balearic Islands, etc.
- example: ""
- continent:
- description: Continent of the operator
- $ref: "#/components/schemas/Continent"
- dxcc_id:
- type: integer
- description: DXCC ID of the operator
- example: 235
- cq_zone:
- type: integer
- description: CQ zone of the operator
- example: 27
- itu_zone:
- type: integer
- description: ITU zone of the operator
- example: 14
- grid:
- type: string
- description: Maidenhead grid locator for the operator's QTH. This could be from an online lookup service, or just based on the DXCC.
- example: IO91aa
- latitude:
- type: number
- description: Latitude of the operator's QTH, in degrees. This could be from an online lookup service, or just based on the DXCC.
- example: 51.2345
- longitude:
- type: number
- description: Longitude of the opertor's QTH, in degrees. This could be from an online lookup service, or just based on the DXCC.
- example: -1.2345
- location_source:
- description: Where we got the location (grid/latitude/longitude) from. Unlike a spot where we might have a summit position or WAB square, here the only options are an online QTH lookup, or a location based purely on DXCC, or nothing.
- $ref: "#/components/schemas/LocationSourceForAlert"
+ $ref: '#/components/schemas/CallLookup'
'422':
description: Validation error e.g. callsign missing or format incorrect
content:
application/json:
schema:
- type: string
- example: "Failed"
+ $ref: '#/components/schemas/ErrorResponse'
/lookup/sigref:
@@ -729,18 +300,8 @@ paths:
description: Perform a lookup of data about a certain reference, providing the SIG and the ID of the reference. A SIGRef structure will be returned containing the SIG and ID, plus any other information Spothole could find about it.
operationId: sigref
parameters:
- - name: sig
- in: query
- description: Special Interest Group (SIG), e.g. outdoor activity programme such as POTA
- required: true
- schema:
- $ref: "#/components/schemas/SIGName"
- - name: id
- in: query
- description: ID of a reference in that SIG
- required: true
- type: string
- example: GB-0001
+ - $ref: '#/components/parameters/SigRefSig'
+ - $ref: '#/components/parameters/SigRefId'
responses:
'200':
description: Success
@@ -753,8 +314,7 @@ paths:
content:
application/json:
schema:
- type: string
- example: "Failed"
+ $ref: '#/components/schemas/ErrorResponse'
@@ -767,68 +327,20 @@ paths:
description: Perform a lookup of data about a Maidenhead grid square.
operationId: grid
parameters:
- - name: grid
- in: query
- description: Maidenhead grid, to any accuracy
- required: true
- type: string
- example: "AA00aa"
+ - $ref: '#/components/parameters/GridParam'
responses:
'200':
description: Success
content:
application/json:
schema:
- type: object
- properties:
- center:
- type: object
- properties:
- latitude:
- type: number
- description: Latitude of the centre of the grid reference.
- example: 0.0
- longitude:
- type: number
- description: Latitude of the centre of the grid reference.
- example: 0.0
- cq_zone:
- type: number
- description: CQ zone of the centre of the grid reference.
- example: 1
- itu_zone:
- type: number
- description: ITU zone of the centre of the grid reference.
- example: 1
- southwest:
- type: object
- properties:
- latitude:
- type: number
- description: Latitude of the south-west corner of the grid square.
- example: 0.0
- longitude:
- type: number
- description: Latitude of the south-west corner of the grid square.
- example: 0.0
- northeast:
- type: object
- properties:
- latitude:
- type: number
- description: Latitude of the north-east corner of the grid square.
- example: 0.0
- longitude:
- type: number
- description: Latitude of the north-east corner of the grid square.
- example: 0.0
+ $ref: '#/components/schemas/GridLookup'
'422':
description: Validation error e.g. reference format incorrect
content:
application/json:
schema:
- type: string
- example: "Failed"
+ $ref: '#/components/schemas/ErrorResponse'
/spot:
@@ -851,29 +363,25 @@ paths:
content:
application/json:
schema:
- type: string
- example: "OK"
+ $ref: '#/components/schemas/OkResponse'
'415':
description: Incorrect Content-Type
content:
application/json:
schema:
- type: string
- example: "Failed"
+ $ref: '#/components/schemas/ErrorResponse'
'422':
description: Validation error
content:
application/json:
schema:
- type: string
- example: "Failed"
+ $ref: '#/components/schemas/ErrorResponse'
'500':
description: Internal server error
content:
application/json:
schema:
- type: string
- example: "Failed"
+ $ref: '#/components/schemas/ErrorResponse'
components:
parameters:
@@ -881,44 +389,242 @@ components:
name: qrz_username
in: query
description: "QRZ.com username for online callsign lookup, which will enrich the returned spots and alerts with extra data. Requires a QRZ.com XML Subscriber (paid) account. Supply together with `qrz_password`, or supply `qrz_session_key` instead."
- required: false
schema:
type: string
QrzPassword:
name: qrz_password
in: query
description: "QRZ.com password. Supply together with `qrz_username`."
- required: false
schema:
type: string
QrzSessionKey:
name: qrz_session_key
in: query
description: "A pre-obtained QRZ.com XML session key, as an alternative to supplying `qrz_username` and `qrz_password`. See https://www.qrz.com/docs/xml/current_spec.html for details on how to obtain one for the user."
- required: false
schema:
type: string
HamqthUsername:
name: hamqth_username
in: query
description: "HamQTH username for online callsign lookup, which will enrich the returned spots and alerts with extra data. Supply together with `hamqth_password`, or supply `hamqth_session_id` instead."
- required: false
schema:
type: string
HamqthPassword:
name: hamqth_password
in: query
description: "HamQTH password. Supply together with `hamqth_username`."
- required: false
schema:
type: string
HamqthSessionId:
name: hamqth_session_id
in: query
description: "A pre-obtained HamQTH session ID, as an alternative to supplying `hamqth_username` and `hamqth_password`. See https://www.hamqth.com/developers.php for details on how to retrieve one for a user."
- required: false
schema:
type: string
+ SpotSource:
+ name: source
+ in: query
+ description: "Limit the spots to only ones from one or more sources. To select more than one source, supply a comma-separated list."
+ schema:
+ $ref: "#/components/schemas/Source"
+ SpotSig:
+ name: sig
+ in: query
+ description: "Limit the spots to only ones from one or more Special Interest Groups provided as an argument. To select more than one SIG, supply a comma-separated list. The special `sig` name `NO_SIG` matches spots with no sig set. You can use `sig=NO_SIG` to specifically only return generic spots with no associated SIG. You can also use combinations to request for example POTA + no SIG, but reject other SIGs. If you want to request 'every SIG and not No SIG', see the `needs_sig` query parameter for a shortcut."
+ schema:
+ $ref: "#/components/schemas/SIGNameIncludingNoSIG"
+ SpotNeedsSig:
+ name: needs_sig
+ in: query
+ description: "Limit the spots to only ones with a Special Interest Group such as POTA. Because supplying all known SIGs as a `sigs` parameter is unwieldy, and leaving `sigs` blank will also return spots with *no* SIG, this parameter can be set true to return only spots with a SIG, regardless of what it is, so long as it's not blank. This is the equivalent of supplying the `sig` query param with a list of every known SIG apart from the special `NO_SIG` value. This is what Field Spotter uses to exclude generic cluster spots and only retrieve xOTA things."
+ schema:
+ type: boolean
+ default: false
+ SpotNeedsSigRef:
+ name: needs_sig_ref
+ in: query
+ description: "Limit the spots to only ones which have at least one reference (e.g. a park reference) for Special Interest Groups such as POTA."
+ schema:
+ type: boolean
+ default: false
+ SpotBand:
+ name: band
+ in: query
+ description: "Limit the spots to only ones from one or more bands. To select more than one band, supply a comma-separated list."
+ schema:
+ $ref: "#/components/schemas/BandName"
+ SpotMode:
+ name: mode
+ in: query
+ description: "Limit the spots to only ones from one or more modes. To select more than one mode, supply a comma-separated list."
+ schema:
+ $ref: "#/components/schemas/Mode"
+ SpotModeType:
+ name: mode_type
+ in: query
+ description: "Limit the spots to only ones from one or more mode families. To select more than one mode family, supply a comma-separated list."
+ schema:
+ $ref: "#/components/schemas/ModeType"
+ SpotDxContinent:
+ name: dx_continent
+ in: query
+ description: "Limit the spots to only ones where the DX (the operator being spotted) is on the given continent(s). To select more than one continent, supply a comma-separated list."
+ schema:
+ $ref: "#/components/schemas/Continent"
+ SpotDeContinent:
+ name: de_continent
+ in: query
+ description: "Limit the spots to only ones where the spotter is on the given continent(s). To select more than one continent, supply a comma-separated list."
+ schema:
+ $ref: "#/components/schemas/Continent"
+ SpotDxCallIncludes:
+ name: dx_call_includes
+ in: query
+ description: "Limit the spots to only ones where the DX callsign includes the supplied string (case-insensitive). Generally a complete callsign, but you can supply a shorter string for partial matches."
+ schema:
+ type: string
+ SpotCommentIncludes:
+ name: comment_includes
+ in: query
+ description: "Return only spots where the comment includes the provided string (case-insensitive)."
+ schema:
+ type: string
+ SpotTextIncludes:
+ name: text_includes
+ in: query
+ description: "Limit the spots to only ones where some significant text (DX callsign or comment) includes the supplied string (case-insensitive)."
+ schema:
+ type: string
+ SpotNeedsGoodLocation:
+ name: needs_good_location
+ in: query
+ description: "Return only spots with a 'good' location. (See the spot `dx_location_good` parameter for details. Useful for map-based clients, to avoid spots with 'bad' locations e.g. loads of cluster spots ending up in the centre of the DXCC entitity.)"
+ schema:
+ type: boolean
+ default: false
+ SpotAllowQrt:
+ name: allow_qrt
+ in: query
+ description: Allow spots that are known to be QRT to be returned.
+ schema:
+ type: boolean
+ default: true
+ AlertMaxDuration:
+ name: max_duration
+ in: query
+ description: Limit the alerts to only ones with a duration of this many seconds or less. Duration is end time minus start time, if end time is set, otherwise the activation is assumed to be short and therefore to always pass this check. This is useful to filter out people who alert POTA activations lasting months or even years, but note it will also include multi-day or multi-week DXpeditions that you might otherwise be interested in. See the dxpeditions_skip_max_duration_check parameter for the workaround.
+ schema:
+ type: integer
+ AlertDxpeditionsSkipMaxDurationCheck:
+ name: dxpeditions_skip_max_duration_check
+ in: query
+ description: Return DXpedition alerts even if they last longer than max_duration. This allows the user to filter out multi-day/multi-week POTA alerts where the operator likely won't be on the air most of the time, but keep multi-day/multi-week DXpeditions where the operator(s) likely *will* be on the air most of the time.
+ schema:
+ type: boolean
+ AlertSource:
+ name: source
+ in: query
+ description: "Limit the alerts to only ones from one or more sources. To select more than one source, supply a comma-separated list."
+ schema:
+ $ref: "#/components/schemas/Source"
+ AlertSig:
+ name: sig
+ in: query
+ description: "Limit the alerts to only ones from one or more Special Interest Groups. To select more than one SIG, supply a comma-separated list. The special value 'NO_SIG' can be included to return alerts specifically without an associated SIG (i.e. general DXpeditions)."
+ schema:
+ $ref: "#/components/schemas/SIGNameIncludingNoSIG"
+ AlertDxContinent:
+ name: dx_continent
+ in: query
+ description: "Limit the alerts to only ones where the DX operator is on the given continent(s). To select more than one continent, supply a comma-separated list."
+ schema:
+ $ref: "#/components/schemas/Continent"
+ AlertDxCallIncludes:
+ name: dx_call_includes
+ in: query
+ description: "Limit the alerts to only ones where the DX callsign includes the supplied string (case-insensitive). Generally a complete callsign, but you can supply a shorter string for partial matches."
+ schema:
+ type: string
+ AlertTextIncludes:
+ name: text_includes
+ in: query
+ description: "Limit the alerts to only ones where some significant text (DX callsign, freqs/modes, or comment) includes the supplied string (case-insensitive)."
+ schema:
+ type: string
+ SpotLimit:
+ name: limit
+ in: query
+ description: Limit the number of spots in the response
+ schema:
+ type: integer
+ SpotSince:
+ name: since
+ in: query
+ description: Limit the spots to only ones at this time or later. Time in UTC seconds since UNIX epoch. Equivalent to "max_age" but saves the client having to work out how many seconds ago "midnight" was.
+ schema:
+ type: number
+ SpotMaxAge:
+ name: max_age
+ in: query
+ description: Limit the spots to only ones received in the last 'n' seconds. Equivalent to "since" but saves the client having to work out what time was 'n' seconds ago on every call. Refer to the "max_spot_age" in the /options call to figure out what the maximum useful value you can provide is. Larger values will still be accepted, there just won't be any spots in the system older than max_spot_age.
+ schema:
+ type: number
+ SpotReceivedSince:
+ name: received_since
+ in: query
+ description: Limit the spots to only ones that the system found out about at this time or later. Time in UTC seconds since UNIX epoch. If you are using a front-end that tracks the last time it queried the API and requests spots since then, you want *this* version of the query parameter, not "since", because otherwise it may miss things. The logic is "greater than" rather than "greater than or equal to", so you can submit the time of the last received item back to this call and you will get all the more recent spots back, without duplicating the previous latest spot.
+ schema:
+ type: number
+ SpotDedupe:
+ name: dedupe
+ in: query
+ description: "\"De-duplicate\" the spots, returning only the latest spot for any given callsign."
+ schema:
+ type: boolean
+ default: false
+ AlertLimit:
+ name: limit
+ in: query
+ description: Limit the number of alerts in the response
+ schema:
+ type: integer
+ AlertReceivedSince:
+ name: received_since
+ in: query
+ description: Limit the alerts to only ones that the system found out about at this time or later. Time in UTC seconds since UNIX epoch. If you are using a front-end that tracks the last time it queried the API and requests alerts since then, you want *this* version of the query parameter, not "since", because otherwise it may miss things. The logic is "greater than" rather than "greater than or equal to", so you can submit the time of the last received item back to this call and you will get all the more recent alerts back, without duplicating the previous latest spot.
+ schema:
+ type: number
+ CallParam:
+ name: call
+ in: query
+ description: A callsign
+ required: true
+ schema:
+ type: string
+ example: M0TRT
+ SigRefSig:
+ name: sig
+ in: query
+ description: Special Interest Group (SIG), e.g. outdoor activity programme such as POTA
+ required: true
+ schema:
+ $ref: "#/components/schemas/SIGName"
+ SigRefId:
+ name: id
+ in: query
+ description: ID of a reference in that SIG
+ required: true
+ schema:
+ type: string
+ example: GB-0001
+ GridParam:
+ name: grid
+ in: query
+ description: Maidenhead grid, to any accuracy
+ required: true
+ schema:
+ type: string
+ example: "AA00aa"
schemas:
Source:
@@ -970,31 +676,10 @@ components:
example: POTA
SIGNameIncludingNoSIG:
- type: string
- enum:
- - POTA
- - SOTA
- - WWFF
- - WWBOTA
- - GMA
- - HEMA
- - WCA
- - MOTA
- - SIOTA
- - ARLHS
- - ILLW
- - ZLOTA
- - KRMNPA
- - IOTA
- - WOTA
- - BOTA
- - LLOTA
- - WWTOTA
- - Tiles
- - WAB
- - WAI
- - TOTA
- - NO_SIG
+ oneOf:
+ - $ref: "#/components/schemas/SIGName"
+ - type: string
+ enum: [NO_SIG]
example: POTA
Continent:
@@ -1067,7 +752,7 @@ components:
- FSK
- PKT
- MSK144
- example: SSB
+ example: SSB
ModeType:
type: string
@@ -1457,11 +1142,11 @@ components:
description: The name of the band
$ref: "#/components/schemas/BandName"
start_freq:
- type: int
+ type: integer
description: The start frequency of this band, in Hz.
example: 7000000
end_freq:
- type: int
+ type: integer
description: The end frequency of this band, in Hz.
example: 7200000
@@ -1771,4 +1456,258 @@ components:
last_updated:
type: number
description: The last time at which this provider received data, UTC seconds since UNIX epoch. If this is zero, the provider has never updated.
- example: 1759579508
\ No newline at end of file
+ example: 1759579508
+
+ SpotList:
+ type: array
+ items:
+ $ref: '#/components/schemas/Spot'
+
+ AlertList:
+ type: array
+ items:
+ $ref: '#/components/schemas/Alert'
+
+ OkResponse:
+ type: string
+ example: "OK"
+
+ ErrorResponse:
+ type: string
+ example: "Failed"
+
+ DxStats:
+ type: object
+ description: Spot counts keyed by DE continent
+ additionalProperties:
+ type: object
+ description: Spot counts keyed by DX continent
+ additionalProperties:
+ type: object
+ description: Spot counts keyed by band
+ properties:
+ 160m: { type: integer }
+ 80m: { type: integer }
+ 60m: { type: integer }
+ 40m: { type: integer }
+ 30m: { type: integer }
+ 20m: { type: integer }
+ 17m: { type: integer }
+ 15m: { type: integer }
+ 12m: { type: integer }
+ 10m: { type: integer }
+ 6m: { type: integer }
+
+ ServerStatus:
+ type: object
+ properties:
+ "software-version":
+ type: string
+ description: The version number of the software.
+ example: "1.0.1"
+ "server-owner-callsign":
+ type: string
+ description: The callsign of this server's operator.
+ example: "M0TRT"
+ "uptime_sec":
+ type: integer
+ description: The amount of time the software has been running for, in seconds.
+ example: 12345
+ "mem_use_mb":
+ type: number
+ description: The amount of memory the software is using, in megabytes.
+ example: 123.456
+ "num_spots":
+ type: integer
+ description: Number of spots currently in the system.
+ example: 123
+ "num_alerts":
+ type: integer
+ description: Number of alerts currently in the system.
+ example: 123
+ "cleanup":
+ type: object
+ properties:
+ status:
+ type: string
+ description: The status of the cleanup thread
+ example: OK
+ last_ran:
+ type: number
+ description: The last time the cleanup operation ran, UTC seconds since UNIX epoch.
+ example: 1759579508
+ "webserver":
+ type: object
+ properties:
+ status:
+ type: string
+ description: The status of the web server
+ example: OK
+ last_page_access:
+ type: number
+ description: The last time a page was accessed on the web server, UTC seconds since UNIX epoch.
+ example: 1759579508
+ last_api_access:
+ type: number
+ description: The last time an API endpoint was accessed on the web server, UTC seconds since UNIX epoch.
+ example: 1759579508
+ spot_providers:
+ type: array
+ description: An array of all the spot providers.
+ items:
+ $ref: '#/components/schemas/SpotProviderStatus'
+ alert_providers:
+ type: array
+ description: An array of all the alert providers.
+ items:
+ $ref: '#/components/schemas/AlertProviderStatus'
+ solar_condition_providers:
+ type: array
+ description: An array of all the solar conditions providers.
+ items:
+ $ref: '#/components/schemas/SolarConditionsProviderStatus'
+
+ Options:
+ type: object
+ properties:
+ bands:
+ type: array
+ description: An array of all the supported bands.
+ items:
+ $ref: '#/components/schemas/Band'
+ modes:
+ type: array
+ description: An array of all the supported modes.
+ items:
+ type: string
+ example: "LSB"
+ mode_types:
+ type: array
+ description: An array of all the supported mode types.
+ items:
+ type: string
+ example: "PHONE"
+ sigs:
+ type: array
+ description: An array of all the supported Special Interest Groups.
+ items:
+ $ref: '#/components/schemas/SIG'
+ sources:
+ type: array
+ description: An array of all the supported data sources.
+ items:
+ type: string
+ example: "Cluster"
+ continents:
+ type: array
+ description: An array of all the supported continents.
+ items:
+ type: string
+ example: "EU"
+ max_spot_age:
+ type: integer
+ description: The maximum age, in seconds, of any spot before it will be deleted by the system. When querying the /api/v1/spots endpoint and providing a "max_age" or "since" parameter, there is no point providing a number larger than this, because the system drops all spots older than this.
+ example: 3600
+ spot_allowed:
+ type: boolean
+ description: Whether the POST /spot call, to add spots to the server directly via its API, is permitted on this server.
+ example: true
+
+ CallLookup:
+ type: object
+ properties:
+ call:
+ type: string
+ description: Callsign, as provided to the API
+ example: M0TRT
+ name:
+ type: string
+ description: Name of the operator
+ example: Ian
+ qth:
+ type: string
+ description: QTH of the operator. This could be from any SIG refs or could be from online lookup of their home QTH.
+ example: Dorset
+ country:
+ type: string
+ description: Country of the operator. Note that this is named "country" for commonality with other amateur radio tools, but in reality this is more of a "DXCC Name", as it includes many options which are not countries, just territories that DXCC uniquely identifies.
+ example: England
+ flag:
+ type: string
+ description: Country flag of the operator. This is limited to the range of emoji flags. For some DXCCs there may not be an official emoji flag, e.g. Northern Ireland, so the appearance may vary depending on your browser and operating system. Some small islands may also have no flag. Many DXCCs may also share a flag, e.g. mainland Spain, Balearic Islands, etc.
+ example: ""
+ continent:
+ description: Continent of the operator
+ $ref: "#/components/schemas/Continent"
+ dxcc_id:
+ type: integer
+ description: DXCC ID of the operator
+ example: 235
+ cq_zone:
+ type: integer
+ description: CQ zone of the operator
+ example: 27
+ itu_zone:
+ type: integer
+ description: ITU zone of the operator
+ example: 14
+ grid:
+ type: string
+ description: Maidenhead grid locator for the operator's QTH. This could be from an online lookup service, or just based on the DXCC.
+ example: IO91aa
+ latitude:
+ type: number
+ description: Latitude of the operator's QTH, in degrees. This could be from an online lookup service, or just based on the DXCC.
+ example: 51.2345
+ longitude:
+ type: number
+ description: Longitude of the opertor's QTH, in degrees. This could be from an online lookup service, or just based on the DXCC.
+ example: -1.2345
+ location_source:
+ description: Where we got the location (grid/latitude/longitude) from. Unlike a spot where we might have a summit position or WAB square, here the only options are an online QTH lookup, or a location based purely on DXCC, or nothing.
+ $ref: "#/components/schemas/LocationSourceForAlert"
+
+ GridLookup:
+ type: object
+ properties:
+ center:
+ type: object
+ properties:
+ latitude:
+ type: number
+ description: Latitude of the centre of the grid reference.
+ example: 0.0
+ longitude:
+ type: number
+ description: Longitude of the centre of the grid reference.
+ example: 0.0
+ cq_zone:
+ type: number
+ description: CQ zone of the centre of the grid reference.
+ example: 1
+ itu_zone:
+ type: number
+ description: ITU zone of the centre of the grid reference.
+ example: 1
+ southwest:
+ type: object
+ properties:
+ latitude:
+ type: number
+ description: Latitude of the south-west corner of the grid square.
+ example: 0.0
+ longitude:
+ type: number
+ description: Longitude of the south-west corner of the grid square.
+ example: 0.0
+ northeast:
+ type: object
+ properties:
+ latitude:
+ type: number
+ description: Latitude of the north-east corner of the grid square.
+ example: 0.0
+ longitude:
+ type: number
+ description: Longitude of the north-east corner of the grid square.
+ example: 0.0
\ No newline at end of file