> ## Documentation Index
> Fetch the complete documentation index at: https://docs.metar.ws/llms.txt
> Use this file to discover all available pages before exploring further.

# Model Forecasts

> Daily max/min temperature forecasts from global and high-resolution numerical weather models.

`metar.forecast.<tier>.<icao>` carries what a numerical weather model expects, as opposed to what a station measured. Each event carries the forecast maximum and minimum for one station over one local calendar day, and is re-sent whenever newly published forecast hours change it.

## Two tiers

High-resolution models only cover their own region, so forecasts are split into two tiers.

| Channel                       | Models                                | Minimum plan |
| ----------------------------- | ------------------------------------- | ------------ |
| `metar.forecast.basic.<icao>` | GFS 0.25°, ICON global, ICON-EU       | Sandbox      |
| `metar.forecast.hires.<icao>` | HRRR 3 km, ICON-D2 2 km, JMA MSM 5 km | Starter      |

Basic forecasts cover all streamed stations, since the underlying global models cover the whole planet. Hires forecasts cover a subset of stations: the US and Toronto under HRRR, several East Asian airports under JMA MSM, and a handful of Central European airports under ICON-D2. Stations outside these regions have no high-resolution model; their `metar.forecast.hires.*` channel exists but stays silent, which is not an error.

<Note>
  Temperatures, deltas and coordinates are decimal strings rather than JSON numbers, so no binary float rounding happens in transit.
</Note>

## Timestamps and status

Three timestamps describe the lifecycle of a forecast: `run_utc` is when the model was initialised, `source_available_utc` is when the provider published the file, and `receipt_time` is when metar.ws finished decoding it.

The `status` field moves through `detected`, `partial` and `day_complete` as forecast hours arrive; `corrected` means the provider replaced a file that had already been used.

`grid_point.distance_km` is the distance from the airport to the model grid cell actually used. A 2 km model typically lands within about 1.5 km of the station; a 25 km global model can be as far as 15 km away. Check this value before treating a forecast as strictly local.

<Warning>
  Filter on `local_day_complete` before comparing any forecast values. Until a full local day has arrived, `temp_max_c` is only the maximum of the hours received so far, and the missing hours cannot lower it, so an incomplete day systematically under-reports the maximum and over-reports the minimum. This bias does not average out across many days. Treat `local_day_complete: true` (equivalently a `status` of `day_complete` or `run_complete`) as the signal that a measurement is final, and read `available_through_forecast_hour` to see how much of the day an incomplete event actually covers.
</Warning>

<Card title="Next: Plans & Limits" icon="layer-group" href="/plans-and-limits">
  Compare Sandbox, Starter and Pro, and see how channel limits are counted.
</Card>
