GET /v1/verification/station/{station}

$0.02dailytier: datacache 3600sEngine B — Weather Intelligence

Single-station audit view of our forecast verification: daily MAE, signed bias, raw-NWS baseline, and sample counts for every lead time and method segment at one ICAO station, over a selectable window up to 90 days. Scored against that station's real NWS observations; model versions reported separately, never mixed.

Parameters

NameInTypeRequiredNotes
stationpathstringyesICAO observation station, e.g. KNYC
daysqueryintegerno (default: 30)
lead_hoursqueryintegerno

Example

curl "https://x402-factory.com/v1/verification/station/KNYC?days=30"

New York (Central Park) station history.

Example response

Worked example from deterministic fixture data (note meta.data_mode); live responses report their own sources and data_mode.

{
  "data": {
    "rows": [
      {
        "date": "2026-07-13",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 1,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.2,
        "bias_ours": 0.2,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-13",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 1,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.4,
        "bias_ours": -0.4,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-13",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 3,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.9,
        "bias_ours": -0.9,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-13",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 3,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 1.4,
        "bias_ours": 1.4,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-13",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 6,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.8,
        "bias_ours": -0.8,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-13",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 6,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 2.1,
        "bias_ours": -2.1,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-14",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 1,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.2,
        "bias_ours": 0.2,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-14",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 1,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.8,
        "bias_ours": -0.8,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-14",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 3,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.1,
        "bias_ours": -0.1,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-14",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 3,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 1.5,
        "bias_ours": 1.5,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-14",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 6,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.7,
        "bias_ours": -0.7,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-14",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 6,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.6,
        "bias_ours": -0.6,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-14",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 24,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 1.8,
        "bias_ours": 1.8,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-14",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 24,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.8,
        "bias_ours": -0.8,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-15",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 1,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.6,
        "bias_ours": -0.6,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-15",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 1,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 3.5,
        "bias_ours": 3.5,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-15",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 3,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.1,
        "bias_ours": -0.1,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-15",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 3,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 1.2,
        "bias_ours": 1.2,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-15",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 6,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.1,
        "bias_ours": 0.1,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-15",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 6,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 2.6,
        "bias_ours": -2.6,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-15",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 24,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.2,
        "bias_ours": -0.2,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-15",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 24,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.6,
        "bias_ours": 0.6,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-15",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 48,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.2,
        "bias_ours": -0.2,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-15",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 48,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.6,
        "bias_ours": 0.6,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-16",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 1,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 1.3,
        "bias_ours": 1.3,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-16",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 1,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.4,
        "bias_ours": 0.4,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-16",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 3,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.1,
        "bias_ours": 0.1,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-16",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 3,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 1.4,
        "bias_ours": 1.4,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-16",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 6,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.4,
        "bias_ours": 0.4,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-16",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 6,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 1,
        "bias_ours": 1,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-16",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 24,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.1,
        "bias_ours": -0.1,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-16",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 24,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.8,
        "bias_ours": -0.8,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-16",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 48,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.1,
        "bias_ours": -0.1,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-16",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 48,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.8,
        "bias_ours": -0.8,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-16",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 72,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.1,
        "bias_ours": -0.1,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-16",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 72,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.8,
        "bias_ours": -0.8,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-17",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 1,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.6,
        "bias_ours": 0.6,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-17",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 1,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.4,
        "bias_ours": 0.4,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-17",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 3,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 1.6,
        "bias_ours": 1.6,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-17",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 3,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.7,
        "bias_ours": 0.7,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-17",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 6,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0,
        "bias_ours": 0,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-17",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 6,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 1.2,
        "bias_ours": 1.2,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-17",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 24,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.5,
        "bias_ours": -0.5,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-17",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 24,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 1,
        "bias_ours": -1,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-17",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 48,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.5,
        "bias_ours": -0.5,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-17",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 48,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 1,
        "bias_ours": -1,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-17",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 72,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.6,
        "bias_ours": -0.6,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-17",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 72,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 1,
        "bias_ours": -1,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-18",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 24,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 0.9,
        "bias_ours": 0.9,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-18",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 24,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 1.3,
        "bias_ours": -1.3,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-18",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 48,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 1.1,
        "bias_ours": 1.1,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-18",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 48,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 1.3,
        "bias_ours": -1.3,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-18",
        "station": "KNYC",
        "region": "northeast",
        "variable": "temp",
        "lead_hours": 72,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 1.2,
        "bias_ours": 1.2,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      },
      {
        "date": "2026-07-18",
        "station": "KNYC",
        "region": "northeast",
        "variable": "wind",
        "lead_hours": 72,
        "segment": "stub",
        "model_version": "stub-model",
        "mae_ours": 1.3,
        "bias_ours": -1.3,
        "mae_nws": null,
        "n": 1,
        "n_nws": 0
      }
    ],
    "window_days": 30,
    "methodology": "MAE over stored forecast/actual pairs for the verification set (25 cities + 20 airports, rolling 90d), grouped by variable × region × lead × segment × model_version. Rows recorded before 2026-09-08 were backfilled to model_version 'runway-oracle-v4' by timestamp (exact: the v4.1 wrapper deployed after the partition shipped); read skill claims within one version only. Forecasts are recorded at issue time; actuals are real NWS station observations attached after valid time. `segment` is the model's own method label: 'nws-blend' = temperature at the 8 covered stations where the proprietary nowcast informs the series; 'nws-gridpoint' = NWS passthrough (uncovered temperature, and wind everywhere) — there mae_ours equals NWS by construction, so mae_nws is only reported for the blend segment, where it is the raw un-blended NWS gridpoint scored against the same observations. Rows labeled 'stub'/'stub-era' predate the real model (2026-08-13) and verify the deterministic placeholder. historical_oos is offline fit history, kept separate from live pairs.",
    "free_summary": "/v1/verification/scores"
  },
  "meta": {
    "endpoint": "/v1/verification/station/{station}",
    "version": "1.0.0",
    "generated_at": "2026-10-05T10:15:58.182Z",
    "freshness": "daily",
    "sources": [
      "stub-model",
      "nws"
    ],
    "request_id": "req_00000000",
    "docs": "https://x402-factory.com/docs/weather.verification-station",
    "data_mode": "live"
  }
}

Response schema (data payload)

{
  "type": "object",
  "properties": {
    "rows": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "UTC day the forecasts were valid for"
          },
          "station": {
            "type": "string",
            "description": "ICAO observation station that scored the rows ('unmatched' where none)"
          },
          "region": {
            "type": "string"
          },
          "variable": {
            "type": "string"
          },
          "lead_hours": {
            "type": "number"
          },
          "segment": {
            "type": "string",
            "description": "What produced the forecast: 'nws-blend' (proprietary nowcast at covered stations) or 'nws-gridpoint' (NWS passthrough)"
          },
          "model_version": {
            "type": "string"
          },
          "mae_ours": {
            "type": "number",
            "description": "Mean absolute error of our served forecast, °C"
          },
          "bias_ours": {
            "type": "number",
            "description": "Mean signed error (forecast − actual), °C — the direction of the miss"
          },
          "mae_nws": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Raw-NWS baseline MAE on the same rows; null outside the blend segment"
          },
          "n": {
            "type": "number"
          },
          "n_nws": {
            "type": "number"
          }
        },
        "required": [
          "date",
          "station",
          "region",
          "variable",
          "lead_hours",
          "segment",
          "model_version",
          "mae_ours",
          "bias_ours",
          "mae_nws",
          "n",
          "n_nws"
        ],
        "additionalProperties": false
      }
    },
    "window_days": {
      "type": "number"
    },
    "methodology": {
      "type": "string"
    },
    "free_summary": {
      "type": "string"
    }
  },
  "required": [
    "rows",
    "window_days",
    "methodology",
    "free_summary"
  ],
  "additionalProperties": false
}

The platform wraps every payload in an envelope: { "data": …, "meta": { endpoint, version, generated_at, freshness, sources, request_id, docs, data_mode } }.

Payment (x402)

Unpaid requests receive 402 with payment requirements (accepts). Pay $0.02 in USDC on Base per call via an X-PAYMENT header — see docs.x402.org. With PAYMENT_MODE=disabled (local dev) the endpoint is open.

Errors

StatusCodeMeaning
400INVALID_PARAMSInput failed validation; message lists the offending fields.
404NOT_FOUNDNo matching resource; suggestion may point to a sibling endpoint.
410RESOLVEDMarket/event settled; body includes a resolution summary.
503STALE_DATAUpstream feed down; stale data is never silently served beyond 2× cache TTL.
500INTERNALOur bug. The request_id helps us find it.