---
title: "Per-resort SNOWPACK simulation — Snow Quality label, bands, layers, verification (Beta)"
method: GET
path: "/api/v1/resorts/{slug}/snowpack"
tags: ["Resorts"]
---

# Per-resort SNOWPACK simulation — Snow Quality label, bands, layers, verification (Beta)

`GET /api/v1/resorts/{slug}/snowpack`

## Request

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

The SLF SNOWPACK model run at the resort's base, mid and summit elevations on the flat field and eight compass aspects, driven by hourly weather and corrected against a nearby station where one reports snow height. Returns the Snow Quality label (one of dry_powder, soft, packed, wind_affected, crust, wet, spring, no_snow) with a rendered reason, the current modeled state per band and aspect, seven days of snow height with the station's measurement overlaid where one exists, the layered profile for the requested band/aspect, and the 30-day verification record.

Everything here is MODELED (`modeled: true`) at the band elevation, before wind. It describes ski-surface quality only; it carries no stability rating and is not an avalanche product. Official avalanche bulletins are relayed separately at `/api/v1/resorts/{slug}/avalanche`.

Access follows the My Mountains rule that gates days 8–14 of the forecast: Pro readers get every resort; a signed-in free reader gets the resorts in their My Mountains; everyone else gets `locked: true` with the as-of time and band list and no label, reason, numbers or layers. Beta through 31 March 2027 (`beta: true`).

A 404 means the resort has no simulation yet (or an unknown slug); a 503 means a read failed and should be retried.

## Path parameters

- `slug` string, required

## Query parameters

- `band` 'base' | 'mid' | 'summit'
- `aspect` 'flat' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w' | 'nw'

## Response `200`

The simulation for an entitled reader, or the locked frame for everyone else. Discriminate on `locked`.

- union
  - SnowpackPayload
    - `locked` false, required
    - `modeled` true, required: Always true. Every number here is a model output.
    - `beta` boolean, required: True through 31 March 2027.
    - `resort` string, required
    - `asOf` string, date-time, required: When the newest run this body reads from finished.
    - `bands` string[], required
    - `aspects` string[], required
    - `bandsMissing` boolean, required: True when the resort lacked a base elevation, so only the summit band exists.
    - `snowQuality` object, nullable, required: The header label, read from the mid band on the flat aspect (or the only band a summit-only resort has).
      - `label` 'dry_powder' | 'soft' | 'packed' | 'wind_affected' | 'crust' | 'wet' | 'spring' | 'no_snow', required
      - `reasonKey` 'fresh_cold' | 'settled' | 'old_snow_firm' | 'fresh_low_wind_packed_high' | 'melt_freeze_crust' | 'wet_surface' | 'corn_cycle' | 'base_not_established', required
      - `reasonValues` object, required: The numbers behind the reason; a client with a units setting re-renders from these.
      - `reason` string, required: The reason rendered in US English, metric.
      - `band` 'base' | 'mid' | 'summit', required
      - `aspect` 'flat' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w' | 'nw', required
      - `asOf` string, date-time, required
      - `verified` boolean, required
      - `confidence` 'high' | 'medium' | 'low', required: From the station match, the 30-day median snow-height error and the blend's forecast spread; never above medium for an unmatched point; low when the run is older than 12 hours.
      - `confidenceReason` 'station_agrees' | 'station_error_moderate' | 'station_error_high' | 'station_not_yet_graded' | 'unmatched' | 'forecast_spread_wide' | 'run_stale', required
      - `confidenceValues` object, required: The numbers behind the confidence reason (pct, days, hours, spreadRatio).
      - `confidenceText` string, required: The confidence reason rendered in US English.
    - `points` SnowpackPointState[], required
      - `band` 'base' | 'mid' | 'summit', required
      - `aspect` 'flat' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w' | 'nw', required
      - `elevationM` integer, required
      - `date` string, date, required
      - `leg` 'recon' | 'forecast', required: `recon` is archived weather corrected against the station; `forecast` is the forecast leg, today onward.
      - `asOf` string, date-time, required
      - `hsCm` number, nullable: Modeled snow height
      - `sweMm` number, nullable
      - `surfaceTempC` number, nullable
      - `top10Density` number, nullable: Top 10 cm mean density, kg/m³
      - `top10LwcPct` number, nullable
      - `newSnow24hCm` number, nullable
      - `newSnowDensity` number, nullable
      - `settlement24hCm` number, nullable
      - `surfaceGrain` string, nullable
      - `crust` boolean
      - `meltFreezeDays` integer
      - `verified` boolean, required: A station within 15 km / 300 m grades this point.
      - `station` object, nullable, required
        - `source` string
        - `id` string
        - `distanceKm` number, nullable
        - `verticalM` integer, nullable
    - `history` object, required: Keyed by band. The last seven reconstruction days on the flat aspect.
    - `profile` object, nullable, required
      - `band` 'base' | 'mid' | 'summit'
      - `aspect` 'flat' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w' | 'nw'
      - `profileAt` string, date-time
      - `layers` SnowpackLayer[]
        - `depth_cm` number, required: Depth of the layer top below the surface, cm. 0 is the surface layer.
        - `thickness_cm` number, required
        - `density` number, required: kg/m³
        - `grain` string, required: IACS grain code: PP DF RG FC DH SH MF IF MFcr
        - `hardness` integer, required: Hand hardness index: 1 F, 2 4F, 3 1F, 4 P, 5 K, 6 I
        - `temp_c` number, required
        - `lwc_pct` number, required: Liquid water content, % by volume
    - `verification` object, required: Keyed by band; present only where a station grades the band.
  - SnowpackLockedPayload: The frame a reader without access gets: no label, reason, numbers or layers.
    - `locked` true, required
    - `modeled` true, required: Always true. Every number here is a model output.
    - `beta` boolean, required: True through 31 March 2027.
    - `resort` string, required
    - `asOf` string, date-time, required: When the newest run this body reads from finished.
    - `bands` string[], required
    - `aspects` string[], required
    - `bandsMissing` boolean, required: True when the resort lacked a base elevation, so only the summit band exists.

## Other responses

- `400`: `band` or `aspect` outside the enum.
- `404`: No simulation for this resort yet, or an unknown slug. Treat as "not available", not as a resort data error.
- `503`: A read failed. Sent with `Cache-Control: no-store` and `Retry-After`.

---

[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)
