Skip to content
Eden Engine

Hourly History for a Personal Weather Station (PWS)

omnial/get-pws-hourly-history

Given a PWS (personal weather station) id, returns up to 7 days of hourly observations for that station: temperature, humidity, dewpoint, wind speed/gust, wind chill, heat index, barometric pressure, precipitation rate and running total, solar radiation, and UV index for each hour. A station id that does not resolve to any known station returns an empty result rather than an error (see examples/invalid-station-error.json).

activeper callv1
Provider
Web & Business Data Network
Category
weather
Provider price
$0.01365 per call
Latency p50 / p95
— / —
Success rate
Verified

Provider list price; Omnial MCP charges provider cost plus a platform markup on top.

Contract

input_schema.json
{
  "type": "object",
  "required": [
    "station_id"
  ],
  "properties": {
    "station_id": {
      "type": "string",
      "description": "PWS Station ID (e.g. ILONDO440). Obtain from search endpoint's pwsId field."
    }
  },
  "additionalProperties": false
}
output_schema.json
{
  "type": "object",
  "properties": {
    "data": {
      "type": "object",
      "properties": {
        "observations": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "tz": {
                "type": "string",
                "description": "IANA timezone name, e.g. 'Europe/London'."
              },
              "lat": {
                "type": "number",
                "description": "The station's registered latitude -- see verification.notes on why this is safe to ship."
              },
              "lon": {
                "type": "number",
                "description": "The station's registered longitude -- see verification.notes on why this is safe to ship."
              },
              "epoch": {
                "type": "number",
                "description": "Unix epoch seconds for the observation."
              },
              "metric": {
                "type": "object",
                "properties": {
                  "tempAvg": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Celsius. Observed null on every hourly entry -- see tempHigh."
                  },
                  "tempLow": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Celsius. Observed null on every hourly entry -- see tempHigh."
                  },
                  "dewptAvg": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Celsius. Observed null on every hourly entry -- see dewptHigh."
                  },
                  "dewptLow": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Celsius. Observed null on every hourly entry -- see dewptHigh."
                  },
                  "tempHigh": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Celsius. Observed null on every hourly entry in the one populated call -- this station's temperature sensor appears offline/unconfigured for the captured window."
                  },
                  "dewptHigh": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Celsius. Observed null on every hourly entry -- correlated with the offline temperature sensor, see tempHigh."
                  },
                  "precipRate": {
                    "type": "number",
                    "description": "mm/hr."
                  },
                  "precipTotal": {
                    "type": "number",
                    "description": "mm, running total for the local day at the time of this hourly entry."
                  },
                  "pressureMax": {
                    "type": "number",
                    "description": "hPa."
                  },
                  "pressureMin": {
                    "type": "number",
                    "description": "hPa."
                  },
                  "windgustAvg": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "km/h. Observed null on roughly half of the hourly entries."
                  },
                  "windgustLow": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "km/h. Observed null on roughly half of the hourly entries."
                  },
                  "heatindexAvg": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Celsius. Observed null on every hourly entry -- see heatindexHigh."
                  },
                  "heatindexLow": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Celsius. Observed null on every hourly entry -- see heatindexHigh."
                  },
                  "windchillAvg": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Celsius. Observed null on every hourly entry -- see windchillHigh."
                  },
                  "windchillLow": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Celsius. Observed null on every hourly entry -- see windchillHigh."
                  },
                  "windgustHigh": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "km/h. Observed null on roughly half of the hourly entries."
                  },
                  "windspeedAvg": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "km/h. Observed null on roughly half of the hourly entries."
                  },
                  "windspeedLow": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "km/h. Observed null on roughly half of the hourly entries."
                  },
                  "heatindexHigh": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Celsius. Observed null on every hourly entry -- correlated with the offline temperature sensor, see tempHigh."
                  },
                  "pressureTrend": {
                    "type": "number",
                    "description": "hPa change."
                  },
                  "windchillHigh": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Celsius. Observed null on every hourly entry -- correlated with the offline temperature sensor, see tempHigh."
                  },
                  "windspeedHigh": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "km/h. Observed null on roughly half of the hourly entries."
                  }
                },
                "description": "Metric-unit measurements for the hour.",
                "additionalProperties": true
              },
              "uvHigh": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Observed null on roughly half of the hourly entries in the one populated call."
              },
              "qcStatus": {
                "type": "number",
                "description": "Quality-control flag from the vendor. Observed as 1 on every hourly entry in the one populated call."
              },
              "stationID": {
                "type": "string",
                "description": "Echoes the input station_id -- see verification.notes on why this is safe to ship."
              },
              "obsTimeUtc": {
                "type": "string",
                "description": "Observation timestamp in UTC, ISO 8601, e.g. '2026-08-31T23:59:45Z'. A capture-time PII heuristic flagged this leaf as a possible phone number; it is a timestamp string, confirmed against the real fixture value, not a phone number."
              },
              "winddirAvg": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Compass degrees. Observed null on roughly half of the hourly entries in the one populated call."
              },
              "humidityAvg": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Percent. Observed null on every hourly entry in the one populated call -- see humidityHigh."
              },
              "humidityLow": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Percent. Observed null on every hourly entry in the one populated call -- see humidityHigh."
              },
              "humidityHigh": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Percent. Observed null on every hourly entry in the one populated call -- this station's humidity sensor appears offline/unconfigured for the captured window."
              },
              "obsTimeLocal": {
                "type": "string",
                "description": "Observation timestamp in the station's local time, e.g. '2026-09-01 00:59:45'. Same PII-heuristic false positive as obsTimeUtc above -- a timestamp string, not a phone number."
              },
              "solarRadiationHigh": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "W/m^2. Observed null on roughly half of the hourly entries in the one populated call."
              }
            },
            "additionalProperties": true
          },
          "description": "96 hourly entries on the one populated call observed (a full 7-day span reported by that particular station's cadence -- not confirmed to always be exactly 96)."
        }
      },
      "description": "Absent entirely on a station id that does not resolve (see examples/invalid-station-error.json, where the shaped result is `{}`).",
      "additionalProperties": true
    },
    "status": {
      "type": "string",
      "description": "'success' on the one populated call observed."
    }
  },
  "description": "The weather record, as returned at routing.responseResultPath ($.output).",
  "additionalProperties": true
}

Pricing

Every real charge, itemised. A model that quietly omits one is a slow financial leak, so nothing here is rolled up, and a charge that only applies to some inputs says so rather than being added in.

Prices in this catalog are the provider's own list price, not your bill: Omnial MCP charges provider cost plus a platform markup on top, so what you are charged is higher than the figure shown. For the exact amount a specific call will cost, run omnial_execute with dry_run: true; that number includes the markup and is what we hold while the call runs. It is a quote, not a cap on the charge.

ChargeRate
Per call
Flat, regardless of what comes back
$0.01365
Cost basis
Not recorded

This tool's catalog entry does not record how its final bill is determined, so we will not tell you whether its cost is fixed before the call or reported by the provider afterwards. Either way what is held is a quote rather than a cap: you are charged what the call actually costs, bounded at 2x the quote.

Updated
Sep 8, 2026