{"openapi":"3.1.0","info":{"title":"Global Ski Forecast API","version":"1.1.0","description":"Free JSON API — no key, no auth, CORS enabled. 16-day snow forecasts for 188 ski resorts in 38 countries, computed as a weighted consensus of 4 weather models (GFS/NOAA, ECMWF, ICON/DWD, GEM/CMC) with regional weighting. Data refreshes every 3 hours. A remote MCP server is available at https://globalskiforecast.com/mcp; see https://globalskiforecast.com/llms.txt for an agent-friendly overview.","contact":{"url":"https://globalskiforecast.com"}},"servers":[{"url":"https://globalskiforecast.com"}],"paths":{"/api/resorts":{"get":{"operationId":"listResorts","summary":"List all 188 ski resorts","description":"Full resort directory with coordinates, summit elevation, piste length and per-resort forecast URLs.","responses":{"200":{"description":"Resort directory.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResortListResponse"}}}}}}},"/api/forecast/{slug}":{"get":{"operationId":"getForecastBySlug","summary":"16-day snow forecast for one resort","description":"Weighted-consensus forecast (per-day blend of GFS, ECMWF, ICON and GEM using regional weights) plus the raw per-model daily data, the weights applied, current snow depth and a confidence rating. `forecast` is a deprecated alias of `consensus` kept for backwards compatibility.","parameters":[{"name":"slug","in":"path","required":true,"description":"Resort slug as returned by /api/resorts (e.g. `zermatt`, `whistler-blackcomb`).","schema":{"type":"string"}}],"responses":{"200":{"description":"Forecast for the resort.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForecastResponse"}}}},"404":{"description":"Unknown resort slug.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/top-powder":{"get":{"operationId":"getTopPowder","summary":"Resorts ranked by expected snowfall","description":"Ranks resorts by total weighted-consensus snowfall over the next `days` days, optionally filtered by continent.","parameters":[{"name":"days","in":"query","required":false,"description":"Forecast window in days.","schema":{"type":"integer","minimum":1,"maximum":16,"default":7}},{"name":"continent","in":"query","required":false,"description":"Filter: North America, Europe, Asia, South America, Oceania or Africa.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Max results.","schema":{"type":"integer","minimum":1,"maximum":50,"default":10}}],"responses":{"200":{"description":"Ranked powder list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopPowderResponse"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string","description":"Human-readable error message."}},"example":{"error":"Resort not found"}},"ResortSummary":{"type":"object","description":"One resort in the directory.","properties":{"name":{"type":"string"},"country":{"type":"string"},"region":{"type":"string","description":"State / province / mountain region."},"continent":{"type":"string"},"slug":{"type":"string","description":"URL-safe identifier used in /forecast/{slug} and /api/forecast/{slug}."},"lat":{"type":"number"},"lon":{"type":"number"},"elevation":{"type":"integer","description":"Summit elevation in metres."},"pisteKm":{"type":"number","description":"Total marked pistes in km."},"forecastUrl":{"type":"string","format":"uri"},"apiUrl":{"type":"string","format":"uri"}},"example":{"name":"Zermatt","country":"Switzerland","region":"Valais","continent":"Europe","slug":"zermatt","lat":46.02,"lon":7.75,"elevation":3883,"pisteKm":360,"forecastUrl":"https://globalskiforecast.com/forecast/zermatt","apiUrl":"https://globalskiforecast.com/api/forecast/zermatt"}},"ResortListResponse":{"type":"object","properties":{"count":{"type":"integer","description":"Number of resorts (188)."},"resorts":{"type":"array","items":{"$ref":"#/components/schemas/ResortSummary"}},"attribution":{"type":"string"},"website":{"type":"string","format":"uri"}}},"DailyForecast":{"type":"object","description":"Open-Meteo-style daily arrays. All arrays are index-aligned with `time`.","properties":{"time":{"type":"array","items":{"type":"string","format":"date"},"description":"Forecast dates (YYYY-MM-DD), up to 16 days."},"snowfall_sum":{"type":"array","items":{"type":"number"},"description":"Daily snowfall in cm."},"temperature_2m_max":{"type":"array","items":{"type":["number","null"]},"description":"Daily max temperature in °C at ski elevation."},"temperature_2m_min":{"type":"array","items":{"type":["number","null"]},"description":"Daily min temperature in °C at ski elevation."}}},"Weights":{"type":"object","description":"Regional blending weights applied to each model for this resort's continent.","properties":{"gfs":{"type":"number"},"ecmwf":{"type":"number"},"icon":{"type":"number"},"gem":{"type":"number"}}},"Confidence":{"type":"object","description":"Forecast confidence derived from model availability and inter-model agreement on snowfall totals.","properties":{"pct":{"type":"integer","minimum":0,"maximum":100},"level":{"type":"string","enum":["none","low","medium","high"]}},"example":{"pct":82,"level":"high"}},"ForecastResponse":{"type":"object","properties":{"resort":{"type":"object","properties":{"name":{"type":"string"},"country":{"type":"string"},"region":{"type":"string"},"continent":{"type":"string"},"elevation":{"type":"integer","description":"Summit elevation in metres."},"pisteKm":{"type":"number"},"slug":{"type":"string"}}},"updated_at":{"type":"string","format":"date-time","description":"When the forecast cache was last refreshed (every 3 hours)."},"consensus":{"type":"object","description":"Weighted consensus of all available models, blended per day with regional weights.","properties":{"time":{"type":"array","items":{"type":"string","format":"date"},"description":"Forecast dates (YYYY-MM-DD), up to 16 days."},"snowfall_sum":{"type":"array","items":{"type":"number"},"description":"Daily snowfall in cm."},"temperature_2m_max":{"type":"array","items":{"type":["number","null"]},"description":"Daily max temperature in °C at ski elevation."},"temperature_2m_min":{"type":"array","items":{"type":["number","null"]},"description":"Daily min temperature in °C at ski elevation."}}},"models":{"type":"object","description":"Raw per-model daily data. A model is null when unavailable; ICON only covers 7 days.","properties":{"gfs":{"oneOf":[{"type":"object","description":"Open-Meteo-style daily arrays. All arrays are index-aligned with `time`.","properties":{"time":{"type":"array","items":{"type":"string","format":"date"},"description":"Forecast dates (YYYY-MM-DD), up to 16 days."},"snowfall_sum":{"type":"array","items":{"type":"number"},"description":"Daily snowfall in cm."},"temperature_2m_max":{"type":"array","items":{"type":["number","null"]},"description":"Daily max temperature in °C at ski elevation."},"temperature_2m_min":{"type":"array","items":{"type":["number","null"]},"description":"Daily min temperature in °C at ski elevation."}}},{"type":"null"}]},"ecmwf":{"oneOf":[{"type":"object","description":"Open-Meteo-style daily arrays. All arrays are index-aligned with `time`.","properties":{"time":{"type":"array","items":{"type":"string","format":"date"},"description":"Forecast dates (YYYY-MM-DD), up to 16 days."},"snowfall_sum":{"type":"array","items":{"type":"number"},"description":"Daily snowfall in cm."},"temperature_2m_max":{"type":"array","items":{"type":["number","null"]},"description":"Daily max temperature in °C at ski elevation."},"temperature_2m_min":{"type":"array","items":{"type":["number","null"]},"description":"Daily min temperature in °C at ski elevation."}}},{"type":"null"}]},"icon":{"oneOf":[{"type":"object","description":"Open-Meteo-style daily arrays. All arrays are index-aligned with `time`.","properties":{"time":{"type":"array","items":{"type":"string","format":"date"},"description":"Forecast dates (YYYY-MM-DD), up to 16 days."},"snowfall_sum":{"type":"array","items":{"type":"number"},"description":"Daily snowfall in cm."},"temperature_2m_max":{"type":"array","items":{"type":["number","null"]},"description":"Daily max temperature in °C at ski elevation."},"temperature_2m_min":{"type":"array","items":{"type":["number","null"]},"description":"Daily min temperature in °C at ski elevation."}}},{"type":"null"}]},"gem":{"oneOf":[{"type":"object","description":"Open-Meteo-style daily arrays. All arrays are index-aligned with `time`.","properties":{"time":{"type":"array","items":{"type":"string","format":"date"},"description":"Forecast dates (YYYY-MM-DD), up to 16 days."},"snowfall_sum":{"type":"array","items":{"type":"number"},"description":"Daily snowfall in cm."},"temperature_2m_max":{"type":"array","items":{"type":["number","null"]},"description":"Daily max temperature in °C at ski elevation."},"temperature_2m_min":{"type":"array","items":{"type":["number","null"]},"description":"Daily min temperature in °C at ski elevation."}}},{"type":"null"}]}}},"weights":{"type":"object","description":"Regional blending weights applied to each model for this resort's continent.","properties":{"gfs":{"type":"number"},"ecmwf":{"type":"number"},"icon":{"type":"number"},"gem":{"type":"number"}}},"snow_depth_cm":{"type":"number","description":"Current snow depth at the resort in cm (0 when unknown)."},"confidence":{"$ref":"#/components/schemas/Confidence"},"forecast":{"type":"object","description":"DEPRECATED alias of `consensus`, kept for backwards compatibility.","properties":{"time":{"type":"array","items":{"type":"string","format":"date"},"description":"Forecast dates (YYYY-MM-DD), up to 16 days."},"snowfall_sum":{"type":"array","items":{"type":"number"},"description":"Daily snowfall in cm."},"temperature_2m_max":{"type":"array","items":{"type":["number","null"]},"description":"Daily max temperature in °C at ski elevation."},"temperature_2m_min":{"type":"array","items":{"type":["number","null"]},"description":"Daily min temperature in °C at ski elevation."}}},"attribution":{"type":"string"},"website":{"type":"string","format":"uri"}},"example":{"resort":{"name":"Zermatt","country":"Switzerland","region":"Valais","continent":"Europe","elevation":3883,"pisteKm":360,"slug":"zermatt"},"updated_at":"2026-06-10T09:00:00.000Z","consensus":{"time":["2026-06-10","2026-06-11"],"snowfall_sum":[4.2,0.7],"temperature_2m_max":[-2.1,1.4],"temperature_2m_min":[-9.3,-6.8]},"models":{"gfs":{"time":["2026-06-10"],"snowfall_sum":[3.5],"temperature_2m_max":[-1.9],"temperature_2m_min":[-9.1]},"ecmwf":null,"icon":null,"gem":null},"weights":{"gfs":0.85,"ecmwf":1.25,"icon":1.35,"gem":0.75},"snow_depth_cm":145,"confidence":{"pct":82,"level":"high"},"forecast":{"time":["2026-06-10","2026-06-11"],"snowfall_sum":[4.2,0.7],"temperature_2m_max":[-2.1,1.4],"temperature_2m_min":[-9.3,-6.8]},"attribution":"Global Ski Forecast","website":"https://globalskiforecast.com/forecast/zermatt"}},"TopPowderResult":{"type":"object","properties":{"rank":{"type":"integer","minimum":1},"name":{"type":"string"},"slug":{"type":"string"},"country":{"type":"string"},"region":{"type":"string"},"continent":{"type":"string"},"total_snow_cm":{"type":"number","description":"Total consensus snowfall over the requested window, in cm."},"snow_depth_cm":{"type":"number"},"forecast_url":{"type":"string","format":"uri"},"api_url":{"type":"string","format":"uri"}},"example":{"rank":1,"name":"Whistler Blackcomb","slug":"whistler-blackcomb","country":"Canada","region":"British Columbia","continent":"North America","total_snow_cm":64.5,"snow_depth_cm":210,"forecast_url":"https://globalskiforecast.com/forecast/whistler-blackcomb","api_url":"https://globalskiforecast.com/api/forecast/whistler-blackcomb"}},"TopPowderResponse":{"type":"object","properties":{"updated_at":{"type":"string","format":"date-time"},"days":{"type":"integer","description":"Forecast window used for the ranking."},"continent":{"type":"string","description":"Continent filter applied, or \"all\"."},"results":{"type":"array","items":{"$ref":"#/components/schemas/TopPowderResult"}}}}}}}