{"mesh_choices":["coarse","medium","fine"],"mesh_resolution_m":{"min":10,"max":2000},"mesh_choice_cells":{"coarse":4000,"medium":10000,"fine":20000},"vegetation":["grass","brush","trees"],"max_domain_km":400.0,"max_cells":225000,"max_run_seconds":900,"initialization":["domain_average","point","weather_model","profile"],"wx_models":[{"id":"NOMADS-GFS-GLOBAL-0.25-DEG","label":"GFS Global 0.25°","coverage":"global","resolution_km":28},{"id":"NOMADS-HRRR-CONUS-3-KM","label":"HRRR CONUS 3 km","coverage":"conus","resolution_km":3},{"id":"NOMADS-NAM-CONUS-12-KM","label":"NAM CONUS 12 km","coverage":"conus","resolution_km":12}],"structures":{"max_structures":50,"max_vertices":2000,"height_m":{"min":0.1,"max":5000},"infinite_height_m":1000},"geocode":{"provider":"nominatim","per_ip_per_min":30,"cache_days":7},"weather":{"current_provider":"open-meteo","stations_providers":["nws","metar","ndbc","raws"],"cache_minutes":10,"profile_sources":["model","sounding","surface"]},"solvers":[{"id":"mass","label":"Fast (mass-conserving)","eta":"seconds","available":true},{"id":"momentum","label":"High fidelity (momentum / OpenFOAM) -- models wakes behind buildings","eta":"2-10 min","available":true,"max_cells":60000,"mesh":{"kind":"measured_levels","honours_mesh_choice":true,"levels":[{"preset":"coarse","mesh_count":25000,"cell_m_on_12km":125.0,"seconds_per_height":50.0},{"preset":"medium","mesh_count":50000,"cell_m_on_12km":99.0,"seconds_per_height":80.0},{"preset":"fine","mesh_count":100000,"cell_m_on_12km":39.0,"seconds_per_height":343.0}],"job_budget_s":900.0,"note":"Meshes the area with a measured number of cells per setting (coarse 25,000, medium 50,000, fine 100,000 -- about 125, 99 and 39 m on a 12 km area; cells grow with larger areas). Each output height is a separate solve. The result states the cell size it actually solved at."}}],"output_heights":{"min_count":1,"max_count":6,"height_m":{"min":0.5,"max":1000}},"ground":{"modes":["uniform","painted","data","data+painted"],"uniform_classes":["water","snow","urban","bare","grass","brush","trees"],"fuel_schemes":["anderson13","scott_burgan40"],"sources":[{"id":"esa_worldcover","label":"ESA WorldCover 10m (2021, v200)","license":"CC BY 4.0 -- (c) ESA WorldCover consortium; attribution required, no key","resolution_m":10.0,"available":true,"reason":""},{"id":"copernicus_glc","label":"Copernicus Global Land Cover 100m (CGLS-LC100, 2019)","license":"CC BY 4.0 -- Buchhorn et al. / Copernicus Global Land Service; free, no key","resolution_m":100.0,"available":true,"reason":""},{"id":"landfire","label":"LANDFIRE FBFM40 / CC / CH (US only, LF2025, via LFPS ImageServer)","license":"Public domain (US government work) -- cite LANDFIRE LF2025","resolution_m":30.0,"available":true,"reason":""},{"id":"nlcd","label":"NLCD 2021 Land Cover (L48, US only, 30m)","license":"Public domain (US government work) -- MRLC consortium / USGS","resolution_m":30.0,"available":true,"reason":""},{"id":"modis_mcd12q1","label":"MODIS MCD12Q1 Land Cover Type 1 (IGBP), 500m","license":"NASA LP DAAC -- free with a (free) Earthdata Login account + token","resolution_m":500.0,"available":false,"reason":"EARTHDATA_TOKEN is not set (MODIS MCD12Q1 requires a free NASA Earthdata Login account + token; see https://urs.earthdata.nasa.gov/)"}],"vintages":{"esa_worldcover":{"source":"esa_worldcover","vintages":[{"id":"esa_worldcover:2020_v100","source":"esa_worldcover","label":"ESA WorldCover 10m 2020 (v100)","year":2020,"valid_from":"2020-01-01","valid_to":"2020-12-31","servable":true,"verified_live":true,"evidence":"ESA WorldCover v100 (epoch 2020) on the same keyless S3 bucket as v200, under /v100/2020/map/ with the year+version embedded in the tile name; same 11-class legend. Built from the documented layout, then read live on 2026-10-10: a production job with as_of 2020-06-30 fetched these tiles and solved, with a different field from the 2021 epoch on the same area (docs/checks/ground-vintage.py).","discovery":"static"},{"id":"esa_worldcover:2021_v200","source":"esa_worldcover","label":"ESA WorldCover 10m 2021 (v200)","year":2021,"valid_from":"2021-01-01","valid_to":"2021-12-31","servable":true,"verified_live":true,"evidence":"the vintage this codebase already calls; a real tile HEAD returned 200 from the production host on 2026-10-07 (see landcover/esa_worldcover.py).","discovery":"static"}],"current_vintage":"esa_worldcover:2021_v200","historical_available":true,"discovery":{"supported":false,"ok":false,"reason":"this source publishes no machine-readable catalogue","attempted":false}},"copernicus_glc":{"source":"copernicus_glc","vintages":[{"id":"copernicus_glc:2019","source":"copernicus_glc","label":"Copernicus Global Land Cover 100m (CGLS-LC100 collection 3, epoch 2019)","year":2019,"valid_from":"2019-01-01","valid_to":"2019-12-31","servable":true,"verified_live":true,"evidence":"Zenodo record 3939050, the only CGLS-LC100 record id this codebase has resolved; verified live from the production host 2026-10-07.","discovery":"static"}],"current_vintage":"copernicus_glc:2019","historical_available":false,"discovery":{"supported":false,"ok":false,"reason":"this source publishes no machine-readable catalogue","attempted":false},"note":"CGLS-LC100 collection 3 also published epochs 2015-2018, but each epoch is a separate Zenodo record and only the 2019 record id (3939050) is known to this server, so the earlier epochs are not fetchable from here and are not advertised as available.","only_current_cover":true,"reason":"CGLS-LC100 collection 3 also published epochs 2015-2018, but each epoch is a separate Zenodo record and only the 2019 record id (3939050) is known to this server, so the earlier epochs are not fetchable from here and are not advertised as available."},"landfire":{"source":"landfire","vintages":[{"id":"landfire:LF2016","source":"landfire","label":"LANDFIRE LF2016 (FBFM40 / CC / CH, CONUS)","year":2016,"valid_from":"2016-01-01","valid_to":"2016-12-31","servable":true,"verified_live":false,"evidence":"listed by the LFPS ArcGIS REST root as folder Landfire_LF2016; its LF2016_FBFM40_CONUS ImageServer is addressed exactly as LF2025's verified one is.","discovery":"discovered"},{"id":"landfire:LF2020","source":"landfire","label":"LANDFIRE LF2020 (FBFM40 / CC / CH, CONUS)","year":2020,"valid_from":"2020-01-01","valid_to":"2020-12-31","servable":true,"verified_live":false,"evidence":"listed by the LFPS ArcGIS REST root as folder Landfire_LF2020; its LF2020_FBFM40_CONUS ImageServer is addressed exactly as LF2025's verified one is.","discovery":"discovered"},{"id":"landfire:LF2022","source":"landfire","label":"LANDFIRE LF2022 (FBFM40 / CC / CH, CONUS)","year":2022,"valid_from":"2022-01-01","valid_to":"2022-12-31","servable":true,"verified_live":false,"evidence":"listed by the LFPS ArcGIS REST root as folder Landfire_LF2022; its LF2022_FBFM40_CONUS ImageServer is addressed exactly as LF2025's verified one is.","discovery":"discovered"},{"id":"landfire:LF2023","source":"landfire","label":"LANDFIRE LF2023 (FBFM40 / CC / CH, CONUS)","year":2023,"valid_from":"2023-01-01","valid_to":"2023-12-31","servable":true,"verified_live":false,"evidence":"listed by the LFPS ArcGIS REST root as folder Landfire_LF2023; its LF2023_FBFM40_CONUS ImageServer is addressed exactly as LF2025's verified one is.","discovery":"discovered"},{"id":"landfire:LF2024","source":"landfire","label":"LANDFIRE LF2024 (FBFM40 / CC / CH, CONUS)","year":2024,"valid_from":"2024-01-01","valid_to":"2024-12-31","servable":true,"verified_live":false,"evidence":"listed by the LFPS ArcGIS REST root as folder Landfire_LF2024; its LF2024_FBFM40_CONUS ImageServer is addressed exactly as LF2025's verified one is.","discovery":"discovered"},{"id":"landfire:LF2025","source":"landfire","label":"LANDFIRE LF2025 (FBFM40 / CC / CH, CONUS)","year":2025,"valid_from":"2025-01-01","valid_to":"2025-12-31","servable":true,"verified_live":true,"evidence":"listed by the LFPS ArcGIS REST root as folder Landfire_LF2025; its LF2025_FBFM40_CONUS ImageServer is addressed exactly as LF2025's verified one is.","discovery":"discovered"}],"current_vintage":"landfire:LF2025","historical_available":true,"discovery":{"supported":true,"ok":true,"reason":"","attempted":true}},"nlcd":{"source":"nlcd","vintages":[{"id":"nlcd:2001","source":"nlcd","label":"NLCD 2001 Land Cover (L48)","year":2001,"valid_from":"2001-01-01","valid_to":"2001-12-31","servable":true,"verified_live":false,"evidence":"coverage mrlc_download__NLCD_2001_Land_Cover_L48, listed by MRLC's own WCS GetCapabilities.","discovery":"discovered"},{"id":"nlcd:2004","source":"nlcd","label":"NLCD 2004 Land Cover (L48)","year":2004,"valid_from":"2004-01-01","valid_to":"2004-12-31","servable":true,"verified_live":false,"evidence":"coverage mrlc_download__NLCD_2004_Land_Cover_L48, listed by MRLC's own WCS GetCapabilities.","discovery":"discovered"},{"id":"nlcd:2006","source":"nlcd","label":"NLCD 2006 Land Cover (L48)","year":2006,"valid_from":"2006-01-01","valid_to":"2006-12-31","servable":true,"verified_live":false,"evidence":"coverage mrlc_download__NLCD_2006_Land_Cover_L48, listed by MRLC's own WCS GetCapabilities.","discovery":"discovered"},{"id":"nlcd:2008","source":"nlcd","label":"NLCD 2008 Land Cover (L48)","year":2008,"valid_from":"2008-01-01","valid_to":"2008-12-31","servable":true,"verified_live":false,"evidence":"coverage mrlc_download__NLCD_2008_Land_Cover_L48, listed by MRLC's own WCS GetCapabilities.","discovery":"discovered"},{"id":"nlcd:2011","source":"nlcd","label":"NLCD 2011 Land Cover (L48)","year":2011,"valid_from":"2011-01-01","valid_to":"2011-12-31","servable":true,"verified_live":false,"evidence":"coverage mrlc_download__NLCD_2011_Land_Cover_L48, listed by MRLC's own WCS GetCapabilities.","discovery":"discovered"},{"id":"nlcd:2013","source":"nlcd","label":"NLCD 2013 Land Cover (L48)","year":2013,"valid_from":"2013-01-01","valid_to":"2013-12-31","servable":true,"verified_live":false,"evidence":"coverage mrlc_download__NLCD_2013_Land_Cover_L48, listed by MRLC's own WCS GetCapabilities.","discovery":"discovered"},{"id":"nlcd:2016","source":"nlcd","label":"NLCD 2016 Land Cover (L48)","year":2016,"valid_from":"2016-01-01","valid_to":"2016-12-31","servable":true,"verified_live":false,"evidence":"coverage mrlc_download__NLCD_2016_Land_Cover_L48, listed by MRLC's own WCS GetCapabilities.","discovery":"discovered"},{"id":"nlcd:2019","source":"nlcd","label":"NLCD 2019 Land Cover (L48)","year":2019,"valid_from":"2019-01-01","valid_to":"2019-12-31","servable":true,"verified_live":false,"evidence":"coverage mrlc_download__NLCD_2019_Land_Cover_L48, listed by MRLC's own WCS GetCapabilities.","discovery":"discovered"},{"id":"nlcd:2021","source":"nlcd","label":"NLCD 2021 Land Cover (L48)","year":2021,"valid_from":"2021-01-01","valid_to":"2021-12-31","servable":true,"verified_live":true,"evidence":"coverage mrlc_download__NLCD_2021_Land_Cover_L48, listed by MRLC's own WCS GetCapabilities.","discovery":"discovered"}],"current_vintage":"nlcd:2021","historical_available":true,"discovery":{"supported":true,"ok":true,"reason":"","attempted":true}},"modis_mcd12q1":{"source":"modis_mcd12q1","vintages":[],"current_vintage":null,"historical_available":false,"discovery":{"supported":false,"ok":false,"reason":"this source publishes no machine-readable catalogue","attempted":false},"note":"MCD12Q1 is a yearly product and NASA's CMR search supports a temporal filter, so a vintage axis certainly exists -- but this source has never been exercised (no EARTHDATA_TOKEN is set), so no catalogue has been read and no year is advertised.","no_vintage_catalog":true,"reason":"MCD12Q1 is a yearly product and NASA's CMR search supports a temporal filter, so a vintage axis certainly exists -- but this source has never been exercised (no EARTHDATA_TOKEN is set), so no catalogue has been read and no year is advertised."}},"vintage_request_fields":{"as_of":"ground.data.as_of -- a year (\"2019\") or ISO date (\"2019-08-14\"). The ground is served from the published epoch containing that date, or the request is refused naming the nearest epoch that exists.","vintage":"ground.data.vintage -- an exact vintage id from this block, e.g. \"nlcd:2016\". Mutually exclusive with as_of.","year":"ground.data.year -- the older year-granularity spelling of as_of. It is now HONOURED (it used to be recorded and ignored), so a past year is either served from that epoch or refused.","resolved_vintage":"server-written; any client-supplied value is discarded."},"vintage_refusal_codes":{"unknown_source":"the named land-cover source does not exist","invalid_as_of":"ground.data.as_of could not be parsed as a year or an ISO-8601 date","ambiguous_request":"both as_of and vintage were given; they are two ways to ask the same question","vintage_source_mismatch":"the named vintage belongs to a different land-cover source","vintage_not_published":"this source publishes no vintage covering the requested date; the refusal carries the nearest vintage that DOES exist","no_historical_vintages":"this source publishes exactly one epoch, so there is no historical ground to serve from it -- only current cover is available","no_vintage_catalog":"no vintage catalogue has ever been read for this source, so no date can be honoured from it; no year is advertised rather than one invented","vintage_not_servable":"the vintage exists upstream but this server has no verified way to fetch it; the refusal carries the nearest vintage it CAN fetch","unresolved_vintage":"a dated ground request reached the solver without a server-resolved vintage; refused rather than quietly falling back to current cover"},"vintage_cannot":["It cannot give you a continuous timeline. Land cover is published as discrete epochs (one raster per release year), so a date that falls between two epochs is refused with the nearest one named, never interpolated.","It cannot give you the ground on a particular DAY. The finest granularity any of these sources offers is one year, so sub-annual change (a fire scar from three months ago, last week's clear-cut) is invisible to all of them.","It cannot serve recent years from ESA WorldCover: the programme's last epoch is 2021, so ESA's 'current' cover is already several years stale.","It cannot serve historical Copernicus CGLS-LC100 epochs: each epoch is a separate Zenodo record and only the 2019 record id is known here. Earlier epochs exist upstream and are named in the refusal, but they are not fetchable from this server.","It cannot serve any MODIS MCD12Q1 year: that source has never been exercised (it needs an EARTHDATA_TOKEN that is not set), so no catalogue has been read and none is advertised.","It does not re-date the TERRAIN. A past ground vintage changes land cover only; the DEM is still whatever the elevation tile service holds today, and its own vintage stays unknown.","A LANDFIRE release year is the RELEASE, not the exact year the vegetation was observed; LANDFIRE's inputs lag its release label by a year or more."],"vintage_endpoint":"/api/v1/ground/vintages","vintage_disclaimer":"Land cover is published as discrete yearly epochs, never as a continuous timeline. A date this server cannot serve is refused with a machine-readable code naming the nearest epoch that exists; today's cover is NEVER substituted under a past date. A past ground vintage re-dates the land cover only -- the terrain DEM is unchanged."},"materials":{"airborne_types":["dust","hail","rain","sand","sleet","snow"],"ground_types":["bare","none","sand","snowpack","soil"],"ground_states":["crust","dry","frozen","loose","wet"],"max_airborne":6,"layers":["saltation_flux","deposition","slab_index","transport_vectors"],"units":{"saltation_flux":"kg m^-1 s^-1","deposition":"kg m^-2 s^-1","slab_index":"unitless 0-1","transport_vectors":"kg m^-1 s^-1 (qx east, qy north)"},"estimate":true,"disclaimer":"All particle-transport layers are ESTIMATES from a steady-state, per-cell, map-scale saltation scheme (Li & Pomeroy 1997 / Pomeroy & Gray 1990 for snow; Bagnold 1941 / Owen 1964 for sand, dust and soil), not validated predictions. slab_index is not an avalanche forecast.","not_transported":["hail","rain"],"defaults":{"dust":{"particle_density_kg_m3":2650.0,"size_mm":0.02,"cohesion":0.6,"scheme":"mineral"},"hail":{"particle_density_kg_m3":917.0,"size_mm":10.0,"cohesion":0.0,"scheme":"none"},"rain":{"particle_density_kg_m3":1000.0,"size_mm":2.0,"cohesion":0.0,"scheme":"none"},"sand":{"particle_density_kg_m3":2650.0,"size_mm":0.25,"cohesion":0.0,"scheme":"mineral"},"sleet":{"particle_density_kg_m3":917.0,"size_mm":1.0,"cohesion":0.3,"scheme":"snow"},"snow":{"particle_density_kg_m3":917.0,"size_mm":0.15,"cohesion":0.0,"scheme":"snow"}}},"archive":{"available":true,"dataset":"ERA5 reanalysis","provider":"Open-Meteo archive API","model":"era5","endpoint":"https://archive-api.open-meteo.com/v1/archive","job_field":"archive","series_endpoint":"/api/v1/weather/archive","variables":["wind_speed_10m","wind_direction_10m","temperature_2m","relative_humidity_2m","cloud_cover","surface_pressure","precipitation"],"wind_reference_height_m":10.0,"temporal_resolution":"hourly","start_date":"1940-01-01","grid_deg":0.25,"grid_km_approx":28,"job_max_hours":1,"series_max_hours":24,"job_initialization":"domain_average","nominal_publication_lag_days":6,"publication_lag_measured_on":"2026-10-09","publication_lag_is_nominal":true,"refusal_codes":{"invalid_datetime":"the datetime could not be parsed as ISO-8601","invalid_timezone":"the timezone is not an IANA zone name","window_in_future":"the window ends in the future; a reanalysis cannot cover it","before_archive_start":"the window starts before the archive's first date","window_too_long":"more hours were asked for than this endpoint serves","not_yet_published":"the reanalysis has not been published for this window yet (it lags real time); the refusal carries the latest hour that IS available","no_data_for_window":"the archive published no value for this cell and window, and recency does not explain it (e.g. a variable missing for this cell)","calm_wind_not_simulable":"the archive's wind for this hour is 0; a domain-average run needs a positive input speed, so there is nothing to simulate rather than a number to invent","wind_exceeds_solver_limit":"the archive's wind for this hour is above the solver's input cap","out_of_range":"the upstream archive rejected the date range (its own reason is included)","upstream_unavailable":"the archive could not be reached","unit_mismatch":"the archive returned units this reader does not recognise","malformed_response":"the archive response did not carry an hourly series"},"cannot":["It cannot serve the last few days: ERA5 is published on a lag (6 days when measured on 2026-10-09). An unpublished day comes back HTTP 200 with a full array of nulls, so the refusal is what tells you, not an HTTP error.","It cannot provide a gridded field over the domain: the ERA5 cell is 0.25 deg (~28 km), wider than the largest allowed domain, so an archive job is a domain-average run initialized from one cell, not a weather_model run.","It cannot resolve sub-hourly time: the series is hourly, and a requested datetime is truncated down to its hour (reported as the `truncated_to_hour` caveat).","It cannot go earlier than 1940-01-01 (the upstream's own stated range).","It cannot represent a dead calm: an hour with 0 wind is refused rather than nudged to a runnable non-zero speed.","It is not an observation: ERA5 is a model reanalysis, and its cell elevation (reported as source.cell_elevation_m) is usually not the terrain elevation of the domain, so near-surface speeds are a coarse-cell estimate the solver then downscales."],"estimate":true,"disclaimer":"ERA5 is a model reanalysis, not an observation. An archive-initialized job takes ONE 0.25-degree cell's 10 m wind for the requested hour as its domain-average input and lets WindNinja downscale it over the terrain. Any hour the archive has not published is refused with a machine-readable code; no value is ever substituted."},"conditions":{"available":true,"endpoint":"/api/v1/conditions/find","materials":["snow","sleet","sand","dust","soil"],"objectives":["transport","deposition"],"states":["crust","dry","frozen","loose","wet"],"overrides":["size_mm","density_kg_m3","cohesion"],"days":{"min":7,"max":30,"default":14},"window":{"modes":["trailing","dates"],"fields":["days","start_date","end_date"],"max_days":30,"archive_start_date":"1940-01-01","archive_grid_deg":0.25,"nominal_lag_days":6,"lag_measured_on":"2026-10-09","wind_statistic":{"trailing":"mean/max of ERA5+forecast DAILY 10 m maximum wind (wind_speed_10m_max)","dates":"mean/max of ERA5 HOURLY 10 m wind (wind_speed_10m)"},"refusal_codes":{"invalid_date":"start_date/end_date could not be parsed as a YYYY-MM-DD calendar date","window_order":"end_date is before start_date","window_too_long":"the window spans more days than this search serves","window_in_future":"the window ends after today (UTC); a reanalysis cannot cover it","before_archive_start":"the window starts before the archive's first date","not_published_for_window":"the reanalysis published no wind for this window at any sample point (it lags real time by days); nothing was interpolated in its place","upstream_unavailable":"the archive could not be reached for any sample point"},"refusal_status":422,"latest_published_probe":"/api/v1/weather/archive"},"max_bbox_km":150.0,"units":["metric","imperial"],"weights":{"transport":{"mobility":0.4,"exceedance":0.25,"exposure":0.2,"dryness":0.15},"deposition":{"accumulation":0.45,"shelter":0.25,"mobility":0.2,"dryness":0.1}},"flux_reference_kg_m_s":{"snow":0.05,"mineral":0.02},"wind_height_m":10.0,"estimate":true,"relationships":["Li & Pomeroy (1997) threshold wind for snow transport","Pomeroy & Gray (1990) snow saltation flux","Bagnold (1941) fluid threshold and cubic saltation law","Owen (1964) threshold correction","Thorpe & Mason (1966) sublimation (snow and sleet only)"],"snow_finder":{"endpoint":"/api/v1/snow/find","unchanged":true,"answers":"ski-quality snow: freshness, melt-freeze crust, shading, snow cover","difference":"/conditions/find answers a different question -- where the wind is MOVING the chosen material and where it is landing -- for snow, sleet, sand, dust or soil. material='snow' here is blowing-snow mobility, not ski quality; use /snow/find for that."},"disclaimer":"Every value is an ESTIMATE from a steady-state, per-cell saltation scheme driven by INTERPOLATED daily weather history, not a solved wind field and not a sediment budget. No supply limit, no bed depth, no avalanche or air-quality assessment of any kind.","cannot":["It does not know how much material is actually available: a bare rock slab in a sand study scores on wind alone.","It reduces the whole window to ONE wind value per sample point (a mean and a peak), in both window modes, so even a one-day hourly window cannot resolve a single storm hour or a terrain-channelled jet -- submit a job for that.","A chosen window is limited by what the reanalysis has published: it lags real time by days, and an unpublished window is refused (not_published_for_window), not filled in.","Deposition is relative to the chosen domain (normalized by that domain's own 95th-percentile divergence), so deposition scores are not comparable between two different bboxes or mesh resolutions.","Surface moisture is a proxy from precipitation and humidity; there is no soil-moisture or snow-density observation behind it."]}}