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_area1 winter weather expected, impacts not minor2 moderate3 major4 extreme5 The published components are
snow_amount,snow_load(weight of snow on trees and power lines),ice_accumulationandblowing_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_rainandhazardous_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_atis the WSSI run the answer is from;sourcesgives the newest issuance in each product family. A family is several products issued on their own clocks, so eachoddsentry carries its ownissued_atand it can be older thansources.pwpf. Allnullbefore the first ingest.wssilists Days 1 to 3, skipping any day whose window has ended.valid_fromandvalid_toare WPC’s window for that day (Day 1 starts around the issue time, later days run 12Z to 12Z);valid_dateis the UTC date the window starts on.- A category of
"none"means the place is outside every area of that layer.nullmeans the layer is not available at all.flash_freezeandground_blizzardare alwaysnull: WPC does not publish a flash freeze component, and its ground blizzard file has not been updated since October 2025. oddslists each PWPF day, kind and threshold where the place’s chance is 10 percent or more, sorted by day, snow before ice, then threshold.pctis the highest WPC contour containing the place, so it is a lower bound:30means at least 30 percent.issued_atis 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).days3to7lists 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), andstart_dateandend_date, both inclusive.headlineis 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”.nullwhen 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.

