---
title: "Monthly snowfall climatology for a resort"
method: GET
path: "/api/v1/resorts/{slug}/monthly-snow"
tags: ["Resorts"]
---

# Monthly snowfall climatology for a resort

`GET /api/v1/resorts/{slug}/monthly-snow`

## Request

- Base URL: `https://www.snowsure.ai`
- URL: `https://www.snowsure.ai/api/v1/resorts/{slug}/monthly-snow`
- Auth: none declared

Per-resort monthly snow norms and per-season history from the ERA5 reanalysis — what a given month is *typically* like at this resort, across 30-ish tracked years.

This is **history, not a forecast and not a prediction**, and nothing in it is a SnowSure Score. It is built for date-choosing surfaces: "February here averages 40.7cm of snowfall and an 84cm base, across 31 tracked years."

A month is only published once it has at least `meta.minYearsForNorm` years behind it; thinner months are withheld and listed in `meta.withheld` with their year count, so a consumer cannot accidentally render a norm we cannot support.

A real resort with no ERA5 history returns **200** with an empty `data.months`, not 404 — "no history for this resort" and "no such resort" are different answers.

## Path parameters

- `slug` string, required

## Response `200`

Monthly climatology. Empty `data.months` when the resort has no ERA5 history yet.

- ResortMonthlySnowResponse: Monthly snowfall climatology and per-season history for one resort, from the ERA5 reanalysis.
  - `schemaVersion` '1.0.0': Versions this payload contract, independently of info.version.
  - `meta` object
    - `source` 'SnowSure'
    - `slug` string: Canonical resort slug, after alias resolution
    - `generatedAt` string, date-time
    - `dataSource` 'open-meteo-era5'
    - `hemisphere` 'NH' | 'SH' | 'null', nullable: Drives which months count as the ski season.
    - `seasonsTracked` integer
    - `minYearsForNorm` integer: Minimum tracked years before a month’s averages are published. Months below it are withheld rather than shown thin.
    - `withheld` object[]: Months excluded from data.months for having too little history, with the reason. Empty for most resorts.
      - `month` integer
      - `monthName` string
      - `yearsTracked` integer
      - `reason` string
  - `data` object
    - `avgAnnualSnowfallCm` number, nullable
    - `avgAnnualSnowDays` integer, nullable
    - `hasRichMetrics` boolean: False until the backfill has populated snow_days / depth columns; those fields are null when false.
    - `months` object[]
      - `month` integer
      - `monthName` string
      - `avgSnowfallCm` number: Mean snowfall total for this month
      - `avgSnowDays` integer: Mean count of days with measurable snowfall
      - `avgDepthCm` integer, nullable: Mean snow depth across the month
      - `avgMaxDepthCm` integer, nullable: Mean of each year’s peak depth
      - `avgMaxStormCm` number, nullable: Mean of each year’s largest single storm
      - `yearsTracked` integer: How many years back this month’s averages. Always ≥ meta.minYearsForNorm — thinner months are withheld and listed in meta.withheld.
    - `seasons` object[]: Per-season totals, most recent first.
      - `seasonYear` integer
      - `seasonLabel` string
      - `totalCm` number
      - `snowDays` integer, nullable
      - `avgDepthCm` number, nullable
      - `peakDepthCm` number, nullable
      - `maxStormCm` number, nullable

## Other responses

- `404`: No such resort (after alias resolution). Terminal — do not retry.
- `503`: Resort existence could not be determined because the catalog was unreachable. Retryable — never used to mean "unknown resort".

---

[API](https://skmtc.dev/snowsure/apis/snowsure-api.md) · [All operations](https://skmtc.dev/snowsure/apis/snowsure-api/llms.txt) · [OpenAPI document](https://skmtc.dev/snowsure/apis/snowsure-api/revisions/dcbcdbb3df50?raw)
