API Documentation¶
Overview¶
This API provides access to station metadata and feature data collected from reference receivers. Data is retained for a short window (a few minutes) after collection.
All endpoints require authentication via OAuth2 client credentials issued by Amazon Cognito. Clients must request an access token from the Cognito token endpoint and include it as a bearer token on each request.
Authorization: Bearer <access_token>
Authentication¶
Access tokens are obtained via the OAuth2 client credentials grant:
POST /oauth2/token HTTP/1.1
Host: <cognito-domain>
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials&client_id=<client_id>&client_secret=<client_secret>&scope=sensor-api/read
The response contains an access_token and expires_in (seconds).
Tokens should be cached and refreshed shortly before expiry.
Endpoints¶
GET /stations¶
Return all active stations within a 30 km radius of a point.
Required scope: sensor-api/read
Query Parameters¶
Name |
Type |
Description |
|---|---|---|
|
float |
Latitude of the center point, in decimal degrees. |
|
float |
Longitude of the center point, in decimal degrees. |
Response¶
200 OK with a JSON body:
{
"stations": [
{
"station_id": "664e6117-676c-11f1-943c-0ba28edaa340",
"callsign": "WWWW"
"lat": 51.5074,
"lon": -0.1278,
"bandwidth": 400000,
"frequency": 1000000000
}
],
"count": 1
}
Only stations falling within the requested radius are returned.
Example¶
curl "https://<api-url>/stations?lat=51.5074&lon=-0.1278" \
-H "Authorization: Bearer <access_token>"
GET /features¶
Return time-series feature data for one or more stations within a given time range.
Required scope: sensor-api/read
If recent data is unavailable for a requested station, the corresponding sensor is woken automatically; the station is omitted from the response until data becomes available on a subsequent request.
Query Parameters¶
Name |
Type |
Description |
|---|---|---|
|
string |
Comma-separated list of station UUIDs. |
|
integer |
Start of the time range, as a Unix epoch timestamp in nanoseconds. |
|
integer |
End of the time range, as a Unix epoch timestamp in nanoseconds. |
Response¶
200 OK with a msgpack-encoded body
(Content-Type: application/msgpack).
The decoded body is a mapping of station ID to a list of feature records. Stations with no data in the requested range are omitted entirely.
Each feature record has the following structure:
Field |
Type |
Description |
|---|---|---|
|
integer |
Sample timestamp, Unix epoch nanoseconds. |
|
string |
UUID of the originating station. |
|
integer |
-1. For use within the receiver. |
|
array[float] |
Real components of the complex sample array. |
|
array[float] |
Imaginary components of the complex sample array, in the same
order as |
Example¶
import requests
import msgpack
response = requests.get(
"https://<api-url>/features",
params={
"station_ids": "664e6117-676c-11f1-943c-0ba28edaa340",
"time_from": 1781391384818170011,
"time_to": 1781391388818170011,
},
headers={"Authorization": f"Bearer {access_token}"},
)
data = msgpack.unpackb(response.content, raw=False)
for station_id, features in data.items():
print(station_id, len(features))
POST /signup¶
Request a new set of client credentials for the sensor-api/read
scope. Intended for issuing credentials to beta testers during a
limited signup window.
Required scope: none (gated by invite code instead)
Note
This endpoint may be disabled at any time. A 403 response
indicates that signups are currently closed.
Request Body¶
{
"invite_code": "<invite_code>"
}
Response¶
200 OK:
{
"client_id": "...",
"client_secret": "..."
}
401 Unauthorized if the invite code is invalid.
403 Forbidden if signups are currently closed.
Data Retention¶
Feature data is retained for approximately five minutes after upload. Queries for time ranges outside this window will return no data for the affected stations.
Rate Limiting¶
All endpoints are subject to throttling at the API gateway level.
Exceeding the configured rate returns 429 Too Many Requests.