Lexicon reference
atmowx data lives in AT Protocol repositories as records described by five published lexicons in the net.atmowx.* namespace. Stations and observations are records that station owners publish to their own repos; the two query lexicons describe the AppView’s read API. The schemas below are rendered directly from the published lexicon documents — this page cannot drift from the schema. Fields marked * are required.
Concepts
Quantities: decimals as scaled integers
The lexicon data model has no floating-point type, so every numeric measurement is a quantity: an integer significand plus a power-of-ten scale, decimal = value × 10^scale. Values stay exact, and publishers must not report more precision than the sensor resolves.
{ "value": 186, "scale": -1 } // 18.6 °CSI units only
Records carry SI units exclusively: °C, hPa, m/s, mm, W/m², µg/m³. Unit conversion for display is the consumer’s job. Derived indexes (like AQI) are intentionally not stored — they are jurisdiction-specific and must be computed from the concentration series.
TID keys, immutable observations
Station and observation records use TID record keys. An observation’s key should be derived from observedAt, and observations are immutable once published.
Open unions
location.position and extra are open unions: values with types beyond the listed ones remain valid, and consumers must tolerate members they do not recognize.
Stations do not move
A station that physically relocates must be retired (status: retired) and a new station record created, so historical observations stay tied to the site where they were measured.
Schema resolution
The schemas are published, resolvable records — not just files in a repo. Each lexicon lives as a com.atproto.lexicon.schema record (record key = the NSID) in the authority repo did:plc:7ytchp6nym3ugtpx7ttilnur. NSID authority for net.atmowx.* is delegated via DNS:
$ dig +short TXT _lexicon.atmowx.net
"did=did:plc:7ytchp6nym3ugtpx7ttilnur"Tooling that understands lexicon resolution can fetch any of the schemas below from that repo by NSID. The Raw lexicon schema blocks on this page show the exact published documents.
net.atmowx.defsdefs
#quantity
A decimal number as a scaled integer: decimal = value * 10^scale. Publishers MUST NOT report more precision than the sensor resolves.
| Field | Type | Description |
|---|---|---|
value(required) | integer | Significand. |
scale | integer | Power-of-ten exponent. Default 0.default 0 |
#location
Where a station is sited. Elevation is strongly recommended: pressure data is hard to interpret without it.
| Field | Type | Description |
|---|---|---|
position(required) | open union · community.lexicon.location.geo | community.lexicon.location.hthree | community.lexicon.location.address | The position, as a community location shape. Open union: additional shapes remain valid. |
geohash | string | Denormalized geohash index hint. Precision is the owner's choice and doubles as a privacy knob.max 12 bytes |
elevation | integer | Meters above mean sea level (whole meters). |
sensorHeight | quantity | Sensor height above ground level, meters. |
#measurement
An arbitrary measurement for parameters not covered by the core observation fields. Units MUST be SI.
| Field | Type | Description |
|---|---|---|
parameter(required) | string | Measurement name, lowerCamelCase by convention.max 128 bytes |
value(required) | quantity | |
unit(required) | string | SI unit name.max 64 bytescelsiushectopascalmetersPerSecondmillimetersmillimetersPerHourpercentwattsPerSquareMetermetersdegreesmicrogramsPerCubicMeterpartsPerMillion |
height | quantity | Meters relative to ground level; negative values are below the surface (e.g. soil probes). |
Raw lexicon schema
{
"lexicon": 1,
"id": "net.atmowx.defs",
"defs": {
"quantity": {
"type": "object",
"description": "A decimal number as a scaled integer: decimal = value * 10^scale. Publishers MUST NOT report more precision than the sensor resolves.",
"required": [
"value"
],
"properties": {
"value": {
"type": "integer",
"description": "Significand."
},
"scale": {
"type": "integer",
"description": "Power-of-ten exponent. Default 0.",
"default": 0
}
}
},
"location": {
"type": "object",
"description": "Where a station is sited. Elevation is strongly recommended: pressure data is hard to interpret without it.",
"required": [
"position"
],
"properties": {
"position": {
"type": "union",
"description": "The position, as a community location shape. Open union: additional shapes remain valid.",
"refs": [
"community.lexicon.location.geo",
"community.lexicon.location.hthree",
"community.lexicon.location.address"
],
"closed": false
},
"geohash": {
"type": "string",
"description": "Denormalized geohash index hint. Precision is the owner's choice and doubles as a privacy knob.",
"maxLength": 12
},
"elevation": {
"type": "integer",
"description": "Meters above mean sea level (whole meters)."
},
"sensorHeight": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "Sensor height above ground level, meters."
}
}
},
"measurement": {
"type": "object",
"description": "An arbitrary measurement for parameters not covered by the core observation fields. Units MUST be SI.",
"required": [
"parameter",
"value",
"unit"
],
"properties": {
"parameter": {
"type": "string",
"maxLength": 128,
"description": "Measurement name, lowerCamelCase by convention."
},
"value": {
"type": "ref",
"ref": "net.atmowx.defs#quantity"
},
"unit": {
"type": "string",
"maxLength": 64,
"description": "SI unit name.",
"knownValues": [
"celsius",
"hectopascal",
"metersPerSecond",
"millimeters",
"millimetersPerHour",
"percent",
"wattsPerSquareMeter",
"meters",
"degrees",
"microgramsPerCubicMeter",
"partsPerMillion"
]
},
"height": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "Meters relative to ground level; negative values are below the surface (e.g. soil probes)."
}
}
}
}
}net.atmowx.stationrecord
A weather station. One account may own many stations. A station that physically relocates MUST be retired (status: retired) and a new station record created, so historical observations stay tied to the site where they were measured.
Record key: tid
| Field | Type | Description |
|---|---|---|
name(required) | string | Human-readable station name/nickname.max 64 graphemes · max 640 bytes |
location(required) | location | |
createdAt(required) | string · datetime | |
hardware | object | |
hardware.make | string | max 128 bytes |
hardware.model | string | max 128 bytes |
hardware.firmware | string | max 128 bytes |
kind | string | Operator class.max 64 bytesamateurprofessionalofficialresearch |
status | string | Absent means active.max 64 bytesactiveinactiveretired |
timezone | string | IANA timezone name, e.g. America/Los_Angeles. Needed to interpret station-local accumulation resets.max 64 bytes |
description | string | max 1000 graphemes · max 10000 bytes |
url | string · uri |
Example
{
"$type": "net.atmowx.station",
"name": "Backyard — Bernal Heights",
"location": {
"position": {
"$type": "community.lexicon.location.geo",
"latitude": "37.7409",
"longitude": "-122.4139"
},
"geohash": "9q8yy",
"elevation": 78,
"sensorHeight": {
"value": 2
}
},
"hardware": {
"make": "Ambient Weather",
"model": "WS-2902",
"firmware": "4.3.4"
},
"kind": "amateur",
"timezone": "America/Los_Angeles",
"createdAt": "2026-07-23T18:04:11.000Z"
}Raw lexicon schema
{
"lexicon": 1,
"id": "net.atmowx.station",
"defs": {
"main": {
"type": "record",
"description": "A weather station. One account may own many stations. A station that physically relocates MUST be retired (status: retired) and a new station record created, so historical observations stay tied to the site where they were measured.",
"key": "tid",
"record": {
"type": "object",
"required": [
"name",
"location",
"createdAt"
],
"properties": {
"name": {
"type": "string",
"maxGraphemes": 64,
"maxLength": 640,
"description": "Human-readable station name/nickname."
},
"location": {
"type": "ref",
"ref": "net.atmowx.defs#location"
},
"createdAt": {
"type": "string",
"format": "datetime"
},
"hardware": {
"type": "object",
"properties": {
"make": {
"type": "string",
"maxLength": 128
},
"model": {
"type": "string",
"maxLength": 128
},
"firmware": {
"type": "string",
"maxLength": 128
}
}
},
"kind": {
"type": "string",
"maxLength": 64,
"description": "Operator class.",
"knownValues": [
"amateur",
"professional",
"official",
"research"
]
},
"status": {
"type": "string",
"maxLength": 64,
"description": "Absent means active.",
"knownValues": [
"active",
"inactive",
"retired"
]
},
"timezone": {
"type": "string",
"maxLength": 64,
"description": "IANA timezone name, e.g. America/Los_Angeles. Needed to interpret station-local accumulation resets."
},
"description": {
"type": "string",
"maxGraphemes": 1000,
"maxLength": 10000
},
"url": {
"type": "string",
"format": "uri"
}
}
}
}
}
}net.atmowx.observationrecord
One immutable weather observation. All measurement fields are optional and SI-only: celsius, hectopascal, meters/second, millimeters, W/m². Record key SHOULD be a TID derived from observedAt.
Record key: tid
| Field | Type | Description |
|---|---|---|
station(required) | string · at-uri | AT-URI of the net.atmowx.station this reading came from. |
observedAt(required) | string · datetime | Measurement time, UTC. |
temperature | quantity | Air temperature, °C. |
dewPoint | quantity | Dew point, °C. |
relativeHumidity | quantity | Relative humidity, percent. |
pressureStation | quantity | Absolute station pressure, hPa. |
pressureSeaLevel | quantity | Mean-sea-level reduced pressure, hPa. |
wind | object | |
wind.speed | quantity | m/s. |
wind.gust | quantity | m/s. |
wind.direction | integer | Degrees true, 0 = north.0–359 |
wind.gustDirection | integer | Degrees true, 0 = north.0–359 |
precipitation | object | |
precipitation.rate | quantity | mm/h. |
precipitation.hour | quantity | mm in the last 60 minutes. |
precipitation.day | quantity | mm since station-local midnight. |
precipitation.event | quantity | mm in the current rain event. |
solarIrradiance | quantity | W/m². |
uvIndex | quantity | UV index, dimensionless. |
visibility | quantity | Meters. |
snowDepth | quantity | Millimeters. |
soilTemperature | quantity | °C at default depth; use extra for multiple depths. |
soilMoisture | quantity | Percent. |
presentWeather | integer | WMO code table 4680 (present weather from automatic station).0–99 |
airQuality | object | Outdoor ambient air-quality mass concentrations, µg/m³. Derived indexes (AQI, EAQI, …) are intentionally not stored: they are jurisdiction- and time-window-specific and must be computed by consumers from the concentration series. |
airQuality.pm1 | quantity | PM1 mass concentration, µg/m³. |
airQuality.pm25 | quantity | PM2.5 mass concentration, µg/m³. |
airQuality.pm10 | quantity | PM10 mass concentration, µg/m³. |
airQuality.ozone | quantity | O₃ mass concentration, µg/m³. |
airQuality.no2 | quantity | NO₂ mass concentration, µg/m³. |
airQuality.so2 | quantity | SO₂ mass concentration, µg/m³. |
airQuality.co | quantity | CO mass concentration, µg/m³. |
extra | array · open union · measurement | Measurements not covered by core fields. Open union.max 64 items |
Example
{
"$type": "net.atmowx.observation",
"station": "at://did:plc:z5efhtji4vfiutzqquvx3w7o/net.atmowx.station/3mremies2t222",
"observedAt": "2026-07-27T21:35:00.000Z",
"temperature": {
"value": 186,
"scale": -1
},
"dewPoint": {
"value": 121,
"scale": -1
},
"relativeHumidity": {
"value": 65
},
"pressureStation": {
"value": 10096,
"scale": -1
},
"pressureSeaLevel": {
"value": 10189,
"scale": -1
},
"wind": {
"speed": {
"value": 34,
"scale": -1
},
"gust": {
"value": 61,
"scale": -1
},
"direction": 285
},
"precipitation": {
"rate": {
"value": 0
},
"day": {
"value": 25,
"scale": -1
}
},
"solarIrradiance": {
"value": 412
},
"uvIndex": {
"value": 4
},
"airQuality": {
"pm25": {
"value": 81,
"scale": -1
},
"pm10": {
"value": 124,
"scale": -1
}
},
"extra": [
{
"$type": "net.atmowx.defs#measurement",
"parameter": "leafWetness",
"value": {
"value": 12
},
"unit": "percent"
}
]
}Raw lexicon schema
{
"lexicon": 1,
"id": "net.atmowx.observation",
"defs": {
"main": {
"type": "record",
"description": "One immutable weather observation. All measurement fields are optional and SI-only: celsius, hectopascal, meters/second, millimeters, W/m². Record key SHOULD be a TID derived from observedAt.",
"key": "tid",
"record": {
"type": "object",
"required": [
"station",
"observedAt"
],
"properties": {
"station": {
"type": "string",
"format": "at-uri",
"description": "AT-URI of the net.atmowx.station this reading came from."
},
"observedAt": {
"type": "string",
"format": "datetime",
"description": "Measurement time, UTC."
},
"temperature": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "Air temperature, °C."
},
"dewPoint": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "Dew point, °C."
},
"relativeHumidity": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "Relative humidity, percent."
},
"pressureStation": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "Absolute station pressure, hPa."
},
"pressureSeaLevel": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "Mean-sea-level reduced pressure, hPa."
},
"wind": {
"type": "object",
"properties": {
"speed": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "m/s."
},
"gust": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "m/s."
},
"direction": {
"type": "integer",
"minimum": 0,
"maximum": 359,
"description": "Degrees true, 0 = north."
},
"gustDirection": {
"type": "integer",
"minimum": 0,
"maximum": 359,
"description": "Degrees true, 0 = north."
}
}
},
"precipitation": {
"type": "object",
"properties": {
"rate": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "mm/h."
},
"hour": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "mm in the last 60 minutes."
},
"day": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "mm since station-local midnight."
},
"event": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "mm in the current rain event."
}
}
},
"solarIrradiance": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "W/m²."
},
"uvIndex": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "UV index, dimensionless."
},
"visibility": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "Meters."
},
"snowDepth": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "Millimeters."
},
"soilTemperature": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "°C at default depth; use extra for multiple depths."
},
"soilMoisture": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "Percent."
},
"presentWeather": {
"type": "integer",
"minimum": 0,
"maximum": 99,
"description": "WMO code table 4680 (present weather from automatic station)."
},
"airQuality": {
"type": "object",
"description": "Outdoor ambient air-quality mass concentrations, µg/m³. Derived indexes (AQI, EAQI, …) are intentionally not stored: they are jurisdiction- and time-window-specific and must be computed by consumers from the concentration series.",
"properties": {
"pm1": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "PM1 mass concentration, µg/m³."
},
"pm25": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "PM2.5 mass concentration, µg/m³."
},
"pm10": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "PM10 mass concentration, µg/m³."
},
"ozone": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "O₃ mass concentration, µg/m³."
},
"no2": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "NO₂ mass concentration, µg/m³."
},
"so2": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "SO₂ mass concentration, µg/m³."
},
"co": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "CO mass concentration, µg/m³."
}
}
},
"extra": {
"type": "array",
"maxLength": 64,
"items": {
"type": "union",
"refs": [
"net.atmowx.defs#measurement"
],
"closed": false
},
"description": "Measurements not covered by core fields. Open union."
}
}
}
}
}
}net.atmowx.queryStationsquery
List active weather stations with their latest observation. No auth. Pass all four bbox params to filter by bounding box; otherwise all active stations are returned. Decimal degrees as strings (the lexicon data model has no floats).
Parameters
| Field | Type | Description |
|---|---|---|
minLat | string | Bounding box south edge, decimal degrees. |
maxLat | string | Bounding box north edge, decimal degrees. |
minLon | string | Bounding box west edge, decimal degrees. |
maxLon | string | Bounding box east edge, decimal degrees. |
Output (application/json)
| Field | Type | Description |
|---|---|---|
stations(required) | array · stationView |
#stationView
A station with its most recent observation.
| Field | Type | Description |
|---|---|---|
uri(required) | string · at-uri | |
did(required) | string · did | |
name(required) | string | max 640 bytes |
latitude(required) | string | Decimal degrees. |
longitude(required) | string | Decimal degrees. |
elevation | integer | Meters above mean sea level. |
kind | string | max 64 bytes |
status | string | max 64 bytes |
timezone | string | max 64 bytes |
createdAt | string · datetime | The station record's self-reported creation time. |
firstObservedAt | string · datetime | Timestamp of the station's earliest indexed observation. |
latest | unknown | The station's most recent net.atmowx.observation record, as stored. |
Example
{
"stations": [
{
"uri": "at://did:plc:z5efhtji4vfiutzqquvx3w7o/net.atmowx.station/3mremies2t222",
"did": "did:plc:z5efhtji4vfiutzqquvx3w7o",
"name": "Backyard — Bernal Heights",
"latitude": "37.7409",
"longitude": "-122.4139",
"elevation": 78,
"kind": "amateur",
"timezone": "America/Los_Angeles",
"createdAt": "2026-07-20T18:11:09.000Z",
"firstObservedAt": "2026-07-23T19:02:44.000Z",
"latest": {
"$type": "net.atmowx.observation",
"station": "at://did:plc:z5efhtji4vfiutzqquvx3w7o/net.atmowx.station/3mremies2t222",
"observedAt": "2026-07-27T21:35:00.000Z",
"temperature": {
"value": 186,
"scale": -1
},
"dewPoint": {
"value": 121,
"scale": -1
},
"relativeHumidity": {
"value": 65
},
"pressureStation": {
"value": 10096,
"scale": -1
},
"pressureSeaLevel": {
"value": 10189,
"scale": -1
},
"wind": {
"speed": {
"value": 34,
"scale": -1
},
"gust": {
"value": 61,
"scale": -1
},
"direction": 285
},
"precipitation": {
"rate": {
"value": 0
},
"day": {
"value": 25,
"scale": -1
}
},
"solarIrradiance": {
"value": 412
},
"uvIndex": {
"value": 4
},
"airQuality": {
"pm25": {
"value": 81,
"scale": -1
},
"pm10": {
"value": 124,
"scale": -1
}
},
"extra": [
{
"$type": "net.atmowx.defs#measurement",
"parameter": "leafWetness",
"value": {
"value": 12
},
"unit": "percent"
}
]
}
}
]
}Raw lexicon schema
{
"lexicon": 1,
"id": "net.atmowx.queryStations",
"defs": {
"main": {
"type": "query",
"description": "List active weather stations with their latest observation. No auth. Pass all four bbox params to filter by bounding box; otherwise all active stations are returned. Decimal degrees as strings (the lexicon data model has no floats).",
"parameters": {
"type": "params",
"properties": {
"minLat": {
"type": "string",
"description": "Bounding box south edge, decimal degrees."
},
"maxLat": {
"type": "string",
"description": "Bounding box north edge, decimal degrees."
},
"minLon": {
"type": "string",
"description": "Bounding box west edge, decimal degrees."
},
"maxLon": {
"type": "string",
"description": "Bounding box east edge, decimal degrees."
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": [
"stations"
],
"properties": {
"stations": {
"type": "array",
"items": {
"type": "ref",
"ref": "net.atmowx.queryStations#stationView"
}
}
}
}
}
},
"stationView": {
"type": "object",
"description": "A station with its most recent observation.",
"required": [
"uri",
"did",
"name",
"latitude",
"longitude"
],
"properties": {
"uri": {
"type": "string",
"format": "at-uri"
},
"did": {
"type": "string",
"format": "did"
},
"name": {
"type": "string",
"maxLength": 640
},
"latitude": {
"type": "string",
"description": "Decimal degrees."
},
"longitude": {
"type": "string",
"description": "Decimal degrees."
},
"elevation": {
"type": "integer",
"description": "Meters above mean sea level."
},
"kind": {
"type": "string",
"maxLength": 64
},
"status": {
"type": "string",
"maxLength": 64
},
"timezone": {
"type": "string",
"maxLength": 64
},
"createdAt": {
"type": "string",
"format": "datetime",
"description": "The station record's self-reported creation time."
},
"firstObservedAt": {
"type": "string",
"format": "datetime",
"description": "Timestamp of the station's earliest indexed observation."
},
"latest": {
"type": "unknown",
"description": "The station's most recent net.atmowx.observation record, as stored."
}
}
}
}
}net.atmowx.getStationHistoryquery
Time series for one station. bucket=raw returns individual readings (capped at 5000 points; narrow the range or coarsen the bucket on RangeTooLarge). hour/day buckets return UTC-aligned min/avg/max (sum for precipitation). No auth.
Parameters
| Field | Type | Description |
|---|---|---|
station(required) | string · at-uri | AT-URI of the net.atmowx.station record. |
from(required) | string · datetime | |
to(required) | string · datetime | |
bucket | string | default "raw"rawhourday |
Output (application/json)
| Field | Type | Description |
|---|---|---|
station(required) | string · at-uri | |
bucket(required) | string | |
series(required) | array · series |
#series
One measured parameter's series. The parameter set is open: additional parameters may be served later without a schema change.
| Field | Type | Description |
|---|---|---|
parameter(required) | string | max 128 bytestemperaturedewPointrelativeHumiditypressureSeaLevelwindSpeedwindGustwindDirectionprecipitationRateprecipitationDaysolarIrradianceuvIndexpm1pm25pm10ozoneno2so2co |
unit(required) | string | SI unit name, e.g. celsius, hectopascal, metersPerSecond, millimeters, percent, wattsPerSquareMeter.max 64 bytes |
points(required) | array · point |
#point
Errors
StationNotFound— No indexed station with that AT-URI.RangeTooLarge— raw bucket over 5000 points; narrow the range or use hour/day.InvalidBucket— bucket must be raw, hour, or day.
Example
{
"station": "at://did:plc:z5efhtji4vfiutzqquvx3w7o/net.atmowx.station/3mremies2t222",
"bucket": "hour",
"series": [
{
"parameter": "temperature",
"unit": "celsius",
"points": [
{
"time": "2026-07-27T18:00:00.000Z",
"min": {
"value": 171,
"scale": -1
},
"avg": {
"value": 178,
"scale": -1
},
"max": {
"value": 186,
"scale": -1
}
},
{
"time": "2026-07-27T19:00:00.000Z",
"min": {
"value": 175,
"scale": -1
},
"avg": {
"value": 181,
"scale": -1
},
"max": {
"value": 189,
"scale": -1
}
}
]
},
{
"parameter": "precipitationDay",
"unit": "millimeters",
"points": [
{
"time": "2026-07-27T18:00:00.000Z",
"sum": {
"value": 0
}
},
{
"time": "2026-07-27T19:00:00.000Z",
"sum": {
"value": 25,
"scale": -1
}
}
]
}
]
}Raw lexicon schema
{
"lexicon": 1,
"id": "net.atmowx.getStationHistory",
"defs": {
"main": {
"type": "query",
"description": "Time series for one station. bucket=raw returns individual readings (capped at 5000 points; narrow the range or coarsen the bucket on RangeTooLarge). hour/day buckets return UTC-aligned min/avg/max (sum for precipitation). No auth.",
"parameters": {
"type": "params",
"required": [
"station",
"from",
"to"
],
"properties": {
"station": {
"type": "string",
"format": "at-uri",
"description": "AT-URI of the net.atmowx.station record."
},
"from": {
"type": "string",
"format": "datetime"
},
"to": {
"type": "string",
"format": "datetime"
},
"bucket": {
"type": "string",
"knownValues": [
"raw",
"hour",
"day"
],
"default": "raw"
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": [
"station",
"bucket",
"series"
],
"properties": {
"station": {
"type": "string",
"format": "at-uri"
},
"bucket": {
"type": "string"
},
"series": {
"type": "array",
"items": {
"type": "ref",
"ref": "net.atmowx.getStationHistory#series"
}
}
}
}
},
"errors": [
{
"name": "StationNotFound",
"description": "No indexed station with that AT-URI."
},
{
"name": "RangeTooLarge",
"description": "raw bucket over 5000 points; narrow the range or use hour/day."
},
{
"name": "InvalidBucket",
"description": "bucket must be raw, hour, or day."
}
]
},
"series": {
"type": "object",
"description": "One measured parameter's series. The parameter set is open: additional parameters may be served later without a schema change.",
"required": [
"parameter",
"unit",
"points"
],
"properties": {
"parameter": {
"type": "string",
"maxLength": 128,
"knownValues": [
"temperature",
"dewPoint",
"relativeHumidity",
"pressureSeaLevel",
"windSpeed",
"windGust",
"windDirection",
"precipitationRate",
"precipitationDay",
"solarIrradiance",
"uvIndex",
"pm1",
"pm25",
"pm10",
"ozone",
"no2",
"so2",
"co"
]
},
"unit": {
"type": "string",
"maxLength": 64,
"description": "SI unit name, e.g. celsius, hectopascal, metersPerSecond, millimeters, percent, wattsPerSquareMeter."
},
"points": {
"type": "array",
"items": {
"type": "ref",
"ref": "net.atmowx.getStationHistory#point"
}
}
}
},
"point": {
"type": "object",
"required": [
"time"
],
"properties": {
"time": {
"type": "string",
"format": "datetime",
"description": "Reading time (raw) or UTC bucket start (hour/day)."
},
"value": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "Present for bucket=raw."
},
"min": {
"type": "ref",
"ref": "net.atmowx.defs#quantity"
},
"avg": {
"type": "ref",
"ref": "net.atmowx.defs#quantity"
},
"max": {
"type": "ref",
"ref": "net.atmowx.defs#quantity"
},
"sum": {
"type": "ref",
"ref": "net.atmowx.defs#quantity",
"description": "Precipitation buckets report sum instead of min/avg/max."
}
}
}
}
}