Community. Driven. Weather. Data. | Always Ad-Free | Developer FriendlyChecking statusDiscord
Become a supporter
Sign in
API

Winter weather

The Weather Prediction Center's Winter Storm Severity Index, snow and freezing rain probabilities, and Day 3 to 7 winter hazards, at a point or as GeoJSON for a map.


Base URL: https://api.wxalerts.org

What NOAA’s Weather Prediction Center (WPC) expects from winter weather over the next week across the CONUS: the impact index for Days 1 to 3, the odds of heavy snow or freezing rain for Days 1 to 3, and the winter hazards for Days 3 to 7. One route answers for a single place; three return map layers.

GET /v1/winter/at?lat=48.78&lon=-121.81
GET /v1/winter/wssi?day=2&component=blowing_snow
GET /v1/winter/odds?day=2&kind=snow&threshold=8
GET /v1/winter/hazards

Needs an API key (outlooks:read), and is served only under /v1. The bare paths answer 401 api_key_required. Requests count against the key’s rate limit. Browsers block calls from other websites (CORS allows only wxalerts.org), so call it from a server, script or app.

Every response carries "attribution": "NOAA Weather Prediction Center". Credit it where you show the data.

The products

  • WSSI, the Winter Storm Severity Index. WPC’s forecast of how much disruption winter weather may cause, not how much falls: the same 6 inches of snow rates higher where it rarely snows. It comes as an overall category plus the components behind it, on a 2.5 km grid, for three 24 hour days. Categories, lowest first:

    category rank
    winter_weather_area 1 winter weather expected, impacts not
    minor 2
    moderate 3
    major 4
    extreme 5

    The published components are snow_amount, snow_load (weight of snow on trees and power lines), ice_accumulation and blowing_snow.

  • PWPF, the Probabilistic Winter Precipitation Forecast. WPC’s chance that a 24 hour period brings at least a given amount: 4, 8 or 12 inches of snow, or 0.01, 0.10 or 0.25 inch of freezing rain accretion (“ice” here means freezing rain, which is what the product measures). Drawn as nested contours at 1, 5, 10, 20, 30 percent and so on up to 95.

  • Day 3 to 7 hazards, winter only. WPC’s medium range hazards outlook, keeping only heavy_snow, freezing_rain and hazardous_cold. It is a set of labelled areas with dates; WPC attaches no probability to it.

Season

WPC’s winter desk issues these products from about mid September to mid May. The API asks for new issuances every 15 minutes from October through April (by UTC month) and once a day otherwise. The newest issuance of each product is always kept, but a forecast window that has ended is never served. So out of season /winter/at answers with empty wssi, odds and days3to7 lists and a null headline (its issued_at and sources still name the last issuance stored), /winter/wssi and /winter/odds answer with an empty features list and "issued_at": null, and /winter/hazards with an empty features list. That is a normal answer, not an error.

At a place

GET /v1/winter/at?lat=&lon= returns all three products at one point.

parameter
lat required, -90 to 90
lon required, -180 to 180

The point is rounded to 0.01 degree (about a kilometre, finer than the WSSI grid) before it is looked up. Out of range values are a 422.

{
  "issued_at": "2026-11-09T17:15:00Z",
  "sources": {
    "wssi": "2026-11-09T17:15:00Z",
    "pwpf": "2026-11-09T15:56:00Z",
    "hazards": "2026-11-09T18:15:20Z"
  },
  "wssi": [
    {
      "day": 1, "valid_date": "2026-11-09",
      "valid_from": "2026-11-09T17:00:00Z", "valid_to": "2026-11-10T12:00:00Z",
      "overall": "moderate",
      "components": {
        "snow_amount": "winter_weather_area", "snow_load": "minor",
        "ice_accumulation": "none", "flash_freeze": null,
        "blowing_snow": "moderate", "ground_blizzard": null
      }
    },
    {
      "day": 2, "valid_date": "2026-11-10",
      "valid_from": "2026-11-10T12:00:00Z", "valid_to": "2026-11-11T12:00:00Z",
      "overall": "major",
      "components": {
        "snow_amount": "winter_weather_area", "snow_load": "moderate",
        "ice_accumulation": "none", "flash_freeze": null,
        "blowing_snow": "major", "ground_blizzard": null
      }
    },
    "..."
  ],
  "odds": [
    { "label": "Snow, 4 in or more", "kind": "snow", "threshold_in": 4.0, "day": 1, "valid_date": "2026-11-09", "pct": 30, "issued_at": "2026-11-09T08:45:00Z" },
    { "label": "Snow, 4 in or more", "kind": "snow", "threshold_in": 4.0, "day": 2, "valid_date": "2026-11-10", "pct": 80, "issued_at": "2026-11-09T09:57:00Z" },
    { "label": "Snow, 8 in or more", "kind": "snow", "threshold_in": 8.0, "day": 2, "valid_date": "2026-11-10", "pct": 50, "issued_at": "2026-11-09T09:57:00Z" },
    "..."
  ],
  "days3to7": [],
  "headline": "Major blowing snow impacts at this place by Day 2",
  "attribution": "NOAA Weather Prediction Center"
}

The wssi block above is Mount Baker, WA and the odds block a point in the BC Coast Mountains, both from live responses on the same issuance.

  • issued_at is the WSSI run the answer is from; sources gives the newest issuance in each product family. A family is several products issued on their own clocks, so each odds entry carries its own issued_at and it can be older than sources.pwpf. All null before the first ingest.
  • wssi lists Days 1 to 3, skipping any day whose window has ended. valid_from and valid_to are WPC’s window for that day (Day 1 starts around the issue time, later days run 12Z to 12Z); valid_date is the UTC date the window starts on.
  • A category of "none" means the place is outside every area of that layer. null means the layer is not available at all. flash_freeze and ground_blizzard are always null: WPC does not publish a flash freeze component, and its ground blizzard file has not been updated since October 2025.
  • odds lists each PWPF day, kind and threshold where the place’s chance is 10 percent or more, sorted by day, snow before ice, then threshold. pct is the highest WPC contour containing the place, so it is a lower bound: 30 means at least 30 percent. issued_at is when WPC issued that probability. WPC draws 1 and 5 percent contours over huge areas on a quiet day, which is why they are left out here (the map route has them).
  • days3to7 lists the winter hazards covering the place that have not ended: hazard (heavy_snow, freezing_rain, hazardous_cold), category (WPC’s label: Heavy Snow, Freezing Rain, Hazardous Cold), and start_date and end_date, both inclusive.
  • headline is one sentence naming the highest overall WSSI category at Minor or above across the three days, at its first day. It names the component at that same category that day (ice first, then snow, blowing snow, snow load), or says “winter storm” when only the overall index is that high. “on Day 1”, otherwise “by Day N”. null when nothing reaches Minor, so a Winter Weather Area alone gives no headline.

Map layers

The three map routes return a GeoJSON FeatureCollection with the issuance’s issued_at and the attribution. Features come lowest rank first, so drawing them in order leaves the most severe on top. Every feature’s properties carry:

property
product the issuance’s name, e.g. wssi-overall-day1, pwpf-snow-4-day1, hazards-prcp
family wssi, pwpf or hazards
day 1 to 3, or null for hazards
level, rank, label the area’s value as a key, a number to sort or colour by, and WPC’s wording
issued_at, valid_from, valid_to the issuance and its window, UTC

Geometries are Polygon or MultiPolygon, lightly simplified for drawing.

/v1/winter/wssi

parameter
day 1 (default), 2 or 3
component overall (default), snow_amount, snow_load, ice_accumulation or blowing_snow

Anything else is a 422. One feature per category present, with category (same as level, e.g. major), rank 1 to 5 and component added:

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "geometry": { "type": "MultiPolygon", "coordinates": [[[[-120.161, 48.6807], [-120.1607, 48.6883], "..."]]] },
      "properties": {
        "product": "wssi-overall-day1", "family": "wssi", "day": 1,
        "level": "winter_weather_area", "rank": 1, "label": "Winter Weather Area",
        "issued_at": "2026-11-09T17:15:00Z",
        "valid_from": "2026-11-09T17:00:00Z", "valid_to": "2026-11-10T12:00:00Z",
        "component": "overall", "category": "winter_weather_area"
      }
    },
    "... minor, moderate, major"
  ],
  "issued_at": "2026-11-09T17:15:00Z",
  "attribution": "NOAA Weather Prediction Center"
}

/v1/winter/odds

parameter
day 1 (default), 2 or 3
kind snow (default) or ice
threshold inches. 4 (default), 8 or 12 for snow; 0.01, 0.1 or 0.25 for ice

A threshold that does not belong to the kind is a 422 with the detail “threshold must be 4, 8 or 12 for snow, or 0.01, 0.1 or 0.25 for ice”. Each feature is one contour, with kind, threshold_in and pct added (rank equals pct, level is the same as a string). One percentage can appear as several features. The contours nest: a place inside the 30 percent contour is also inside the 20, so draw in order and the highest wins.

{
  "type": "Feature",
  "geometry": { "type": "Polygon", "coordinates": [[[-121.22, 48.29], [-121.15, 48.33], "..."]] },
  "properties": {
    "product": "pwpf-snow-4-day1", "family": "pwpf", "day": 1,
    "level": "1", "rank": 1, "label": "1%",
    "issued_at": "2026-11-09T08:45:00Z",
    "valid_from": "2026-11-09T12:00:00Z", "valid_to": "2026-11-10T12:00:00Z",
    "kind": "snow", "threshold_in": 4.0, "pct": 1
  }
}

When WPC forecasts nothing at 1 percent or more, the answer is an empty features list with the issuance’s issued_at, not the previous forecast.

/v1/winter/hazards

No parameters. The winter areas of the Day 3 to 7 hazards outlook whose end_date is today (UTC) or later, with hazard, start_date and end_date added. rank is 1 for hazardous_cold, 2 for freezing_rain and 3 for heavy_snow. A hazard WPC draws for two separate stretches of the week comes as two features.

{
  "type": "Feature",
  "geometry": { "type": "MultiPolygon", "coordinates": ["..."] },
  "properties": {
    "product": "hazards-prcp", "family": "hazards", "day": null,
    "level": "heavy_snow", "rank": 3, "label": "Heavy Snow",
    "issued_at": "2026-11-09T18:15:20Z",
    "valid_from": "2026-11-12T00:00:00Z", "valid_to": "2026-11-14T00:00:00Z",
    "hazard": "heavy_snow", "start_date": "2026-11-12", "end_date": "2026-11-13"
  }
}

That feature is built from the schema: on the day this page was checked the outlook held no winter hazards, and the route answered {"type": "FeatureCollection", "features": [], "issued_at": "2026-11-09T18:15:20Z", ...}.

Freshness

WPC updates the WSSI several times a day and the PWPF at least twice, at no fixed minute. In season the API picks up a new issuance within 15 minutes.

May we use Microsoft Clarity to see how pages are used (clicks, scrolling and replays of a visit, with anything you type hidden), plus a random ID linking that to crash reports? Only to find bugs and confusing screens. Never advertising, never sold.