atmowx.net

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 °C

SI 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.

FieldTypeDescription
value(required)integerSignificand.
scaleintegerPower-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.

FieldTypeDescription
position(required)open union · community.lexicon.location.geo | community.lexicon.location.hthree | community.lexicon.location.addressThe position, as a community location shape. Open union: additional shapes remain valid.
geohashstringDenormalized geohash index hint. Precision is the owner's choice and doubles as a privacy knob.max 12 bytes
elevationintegerMeters above mean sea level (whole meters).
sensorHeightquantitySensor height above ground level, meters.

#measurement

An arbitrary measurement for parameters not covered by the core observation fields. Units MUST be SI.

FieldTypeDescription
parameter(required)stringMeasurement name, lowerCamelCase by convention.max 128 bytes
value(required)quantity
unit(required)stringSI unit name.max 64 bytescelsiushectopascalmetersPerSecondmillimetersmillimetersPerHourpercentwattsPerSquareMetermetersdegreesmicrogramsPerCubicMeterpartsPerMillion
heightquantityMeters 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

FieldTypeDescription
name(required)stringHuman-readable station name/nickname.max 64 graphemes · max 640 bytes
location(required)location
createdAt(required)string · datetime
hardwareobject
hardware.makestringmax 128 bytes
hardware.modelstringmax 128 bytes
hardware.firmwarestringmax 128 bytes
kindstringOperator class.max 64 bytesamateurprofessionalofficialresearch
statusstringAbsent means active.max 64 bytesactiveinactiveretired
timezonestringIANA timezone name, e.g. America/Los_Angeles. Needed to interpret station-local accumulation resets.max 64 bytes
descriptionstringmax 1000 graphemes · max 10000 bytes
urlstring · 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

FieldTypeDescription
station(required)string · at-uriAT-URI of the net.atmowx.station this reading came from.
observedAt(required)string · datetimeMeasurement time, UTC.
temperaturequantityAir temperature, °C.
dewPointquantityDew point, °C.
relativeHumidityquantityRelative humidity, percent.
pressureStationquantityAbsolute station pressure, hPa.
pressureSeaLevelquantityMean-sea-level reduced pressure, hPa.
windobject
wind.speedquantitym/s.
wind.gustquantitym/s.
wind.directionintegerDegrees true, 0 = north.0–359
wind.gustDirectionintegerDegrees true, 0 = north.0–359
precipitationobject
precipitation.ratequantitymm/h.
precipitation.hourquantitymm in the last 60 minutes.
precipitation.dayquantitymm since station-local midnight.
precipitation.eventquantitymm in the current rain event.
solarIrradiancequantityW/m².
uvIndexquantityUV index, dimensionless.
visibilityquantityMeters.
snowDepthquantityMillimeters.
soilTemperaturequantity°C at default depth; use extra for multiple depths.
soilMoisturequantityPercent.
presentWeatherintegerWMO code table 4680 (present weather from automatic station).0–99
airQualityobjectOutdoor 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.pm1quantityPM1 mass concentration, µg/m³.
airQuality.pm25quantityPM2.5 mass concentration, µg/m³.
airQuality.pm10quantityPM10 mass concentration, µg/m³.
airQuality.ozonequantityO₃ mass concentration, µg/m³.
airQuality.no2quantityNO₂ mass concentration, µg/m³.
airQuality.so2quantitySO₂ mass concentration, µg/m³.
airQuality.coquantityCO mass concentration, µg/m³.
extraarray · open union · measurementMeasurements 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

FieldTypeDescription
minLatstringBounding box south edge, decimal degrees.
maxLatstringBounding box north edge, decimal degrees.
minLonstringBounding box west edge, decimal degrees.
maxLonstringBounding box east edge, decimal degrees.

Output (application/json)

FieldTypeDescription
stations(required)array · stationView

#stationView

A station with its most recent observation.

FieldTypeDescription
uri(required)string · at-uri
did(required)string · did
name(required)stringmax 640 bytes
latitude(required)stringDecimal degrees.
longitude(required)stringDecimal degrees.
elevationintegerMeters above mean sea level.
kindstringmax 64 bytes
statusstringmax 64 bytes
timezonestringmax 64 bytes
createdAtstring · datetimeThe station record's self-reported creation time.
firstObservedAtstring · datetimeTimestamp of the station's earliest indexed observation.
latestunknownThe 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

FieldTypeDescription
station(required)string · at-uriAT-URI of the net.atmowx.station record.
from(required)string · datetime
to(required)string · datetime
bucketstringdefault "raw"rawhourday

Output (application/json)

FieldTypeDescription
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.

FieldTypeDescription
parameter(required)stringmax 128 bytestemperaturedewPointrelativeHumiditypressureSeaLevelwindSpeedwindGustwindDirectionprecipitationRateprecipitationDaysolarIrradianceuvIndexpm1pm25pm10ozoneno2so2co
unit(required)stringSI unit name, e.g. celsius, hectopascal, metersPerSecond, millimeters, percent, wattsPerSquareMeter.max 64 bytes
points(required)array · point

#point

FieldTypeDescription
time(required)string · datetimeReading time (raw) or UTC bucket start (hour/day).
valuequantityPresent for bucket=raw.
minquantity
avgquantity
maxquantity
sumquantityPrecipitation buckets report sum instead of min/avg/max.

Errors

  • StationNotFoundNo indexed station with that AT-URI.
  • RangeTooLargeraw bucket over 5000 points; narrow the range or use hour/day.
  • InvalidBucketbucket 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."
        }
      }
    }
  }
}