{"openapi":"3.0.3","info":{"title":"Weather API","version":"2.0.0","description":"<p>This API provides several categories of gridded weather datasets:</p>\r<ol>\r  <li>\r    <strong>NLDAS-2 Forcing Data</strong>\r    <ul>\r      <li><strong>Resolution:</strong> 0.125&deg; &times; 0.125&deg; (~14 km &times; 14 km)</li>\r      <li><strong>Coverage:</strong> CONUS, 25&deg;N–53&deg;N, 125&deg;W–67&deg;W</li>\r      <li><strong>Availability:</strong> 2015-01-01 to present (with ~3-day latency)</li>\r      <li><strong>Content:</strong> Hourly atmospheric forcing variables used to drive the land-surface models (temperature, humidity, wind, radiation, precipitation, etc.).</li>\r    </ul>\r  </li>\r  <li>\r    <strong>NLDAS-2 Mosaic Land-Surface Model (LSM)</strong>\r    <ul>\r      <li><strong>Resolution:</strong> 0.125&deg; &times; 0.125&deg; (identical to the forcing grid)</li>\r      <li><strong>Availability:</strong> 2015-01-01 to present</li>\r      <li><strong>Content:</strong> Mosaic LSM surface and subsurface diagnostics, including energy fluxes, soil moisture/temperature layers, snow fields, canopy variables, etc.</li>\r    </ul>\r  </li>\r  <li>\r    <strong>MRMS Precipitation</strong>\r    <ul>\r      <li><strong>Resolution:</strong> 1 km &times; 1 km</li>\r      <li><strong>Availability:</strong> 2015-06-05 to present (within ~2 hours)</li>\r      <li><strong>Content:</strong> Radar-based precipitation totals (hourly).</li>\r    </ul>\r  </li>\r</ol>\r<p>The API also provides miscellaneous other location-based data, including elevation, watersheds, hardiness zones, MLRA, etc. </p>\r<hr>\r<h3>NLDAS-2 Forcing Parameters and MRMS</h3>\r<table id=\"Columns\">\r  <thead>\r    <tr>\r      <th>Parameter</th>\r      <th>Level, Layer</th>\r      <th>Database Column</th>\r      <th>Shorthand</th>\r      <th>Unit</th>\r      <th>Data Source</th>\r    </tr>\r  </thead>\r  <tbody>\r    <tr>\r      <td>Air temperature</td>\r      <td>2m above ground</td>\r      <td>air_temperature</td>\r      <td>TMP</td>\r      <td>&deg;C</td>\r      <td><a target=\"_blank\" rel=\"noreferrer\" href=\"https://ldas.gsfc.nasa.gov/nldas/v2/forcing\">NLDAS-2</a></td>\r    </tr>\r    <tr>\r      <td>Specific humidity</td>\r      <td>2m above ground</td>\r      <td>humidity</td>\r      <td>SPFH</td>\r      <td>kg kg<sup>-1</sup></td>\r      <td><a target=\"_blank\" rel=\"noreferrer\" href=\"https://ldas.gsfc.nasa.gov/nldas/v2/forcing\">NLDAS-2</a></td>\r    </tr>\r    <tr>\r      <td>Relative humidity</td>\r      <td>2m above ground</td>\r      <td>relative_humidity</td>\r      <td></td>\r      <td>fraction</td>\r      <td><a target=\"_blank\" rel=\"noreferrer\" href=\"https://ldas.gsfc.nasa.gov/nldas/v2/forcing\">NLDAS-2</a></td>\r    </tr>\r    <tr>\r      <td>Atmospheric pressure</td>\r      <td>Surface</td>\r      <td>pressure</td>\r      <td>PRES</td>\r      <td>Pa</td>\r      <td><a target=\"_blank\" rel=\"noreferrer\" href=\"https://ldas.gsfc.nasa.gov/nldas/v2/forcing\">NLDAS-2</a></td>\r    </tr>\r    <tr>\r      <td>Zonal wind speed</td>\r      <td>10m above ground</td>\r      <td>zonal_wind_speed</td>\r      <td>UGRD</td>\r      <td>m s<sup>-1</sup></td>\r      <td><a target=\"_blank\" rel=\"noreferrer\" href=\"https://ldas.gsfc.nasa.gov/nldas/v2/forcing\">NLDAS-2</a></td>\r    </tr>\r    <tr>\r      <td>Meridional wind speed</td>\r      <td>10m above ground</td>\r      <td>meridional_wind_speed</td>\r      <td>VGRD</td>\r      <td>m s<sup>-1</sup></td>\r      <td><a target=\"_blank\" rel=\"noreferrer\" href=\"https://ldas.gsfc.nasa.gov/nldas/v2/forcing\">NLDAS-2</a></td>\r    </tr>\r    <tr>\r      <td>Wind speed</td>\r      <td>10m above ground</td>\r      <td>wind_speed</td>\r      <td></td>\r      <td>m s<sup>-1</sup></td>\r      <td><a target=\"_blank\" rel=\"noreferrer\" href=\"https://ldas.gsfc.nasa.gov/nldas/v2/forcing\">NLDAS-2</a></td>\r    </tr>\r    <tr>\r      <td>Downward short-wave radiation flux</td>\r      <td>Surface</td>\r      <td>shortwave_radiation</td>\r      <td>DSWRF</td>\r      <td>W m<sup>-2</sup></td>\r      <td><a target=\"_blank\" rel=\"noreferrer\" href=\"https://ldas.gsfc.nasa.gov/nldas/v2/forcing\">NLDAS-2</a></td>\r    </tr>\r    <tr>\r      <td>Downward long-wave radiation flux</td>\r      <td>Surface</td>\r      <td>longwave_radiation</td>\r      <td>DLWRF</td>\r      <td>W m<sup>-2</sup></td>\r      <td><a target=\"_blank\" rel=\"noreferrer\" href=\"https://ldas.gsfc.nasa.gov/nldas/v2/forcing\">NLDAS-2</a></td>\r    </tr>\r    <tr>\r      <td>Rain fraction of total cloud water</td>\r      <td>Surface</td>\r      <td>convective_precipitation</td>\r      <td>FRAIN</td>\r      <td>proportion</td>\r      <td><a target=\"_blank\" rel=\"noreferrer\" href=\"https://ldas.gsfc.nasa.gov/nldas/v2/forcing\">NLDAS-2</a></td>\r    </tr>\r    <tr>\r      <td>Convective Available Potential Energy</td>\r      <td>180m above ground</td>\r      <td>potential_energy</td>\r      <td>CAPE</td>\r      <td>J kg<sup>-1</sup></td>\r      <td><a target=\"_blank\" rel=\"noreferrer\" href=\"https://ldas.gsfc.nasa.gov/nldas/v2/forcing\">NLDAS-2</a></td>\r    </tr>\r    <tr>\r      <td>Potential Evaporation</td>\r      <td>Surface</td>\r      <td>potential_evaporation</td>\r      <td>PEVAP</td>\r      <td>kg m<sup>-2</sup></td>\r      <td><a target=\"_blank\" rel=\"noreferrer\" href=\"https://ldas.gsfc.nasa.gov/nldas/v2/forcing\">NLDAS-2</a></td>\r    </tr>\r    <tr>\r      <td rowSpan=\"2\">Rainfall</td>\r      <td rowSpan=\"2\">Surface</td>\r      <td rowSpan=\"2\">precipitation</td>\r      <td rowSpan=\"2\">APCP</td>\r      <td rowSpan=\"2\">mm</td>\r      <td><a target=\"_blank\" rel=\"noreferrer\" href=\"https://ldas.gsfc.nasa.gov/nldas/v2/forcing\">NLDAS-2</a></td>\r    </tr>\r    <tr>\r      <td><a target=\"_blank\" rel=\"noreferrer\" href=\"https://www.nssl.noaa.gov/projects/mrms/\">MRMS</a></td>\r    </tr>\r    <tr>\r      <td>Growing degree days</td>\r      <td>&mdash;</td>\r      <td>gdd</td>\r      <td></td>\r      <td></td>\r      <td>Derived</td>\r    </tr>\r  </tbody>\r</table>\r<hr>\r<h3>NLDAS-2 Mosaic Land-Surface Model (LSM) Parameters</h3>\r<p>\r  These variables describe\r  <strong>surface energy balance, vegetation, soil layers, canopy water, snowpack, and hydrology</strong>,\r  and are available through the <a href=\"/redoc#Attributes\"><code>attributes</code> parameter</a>.\r</p>\r<table>\r  <thead>\r    <tr>\r      <th>Parameter</th>\r      <th>Units</th>\r      <th>Description</th>\r    </tr>\r  </thead>\r  <tbody>\r    <tr>\r      <td>nswrs</td>\r      <td>W/m²</td>\r      <td>Net shortwave radiation flux at the surface (downward minus reflected).</td>\r    </tr>\r    <tr>\r      <td>nlwrs</td>\r      <td>W/m²</td>\r      <td>Net longwave radiation flux at the surface (downward minus upward).</td>\r    </tr>\r    <tr>\r      <td>dswrf</td>\r      <td>W/m²</td>\r      <td>Downward shortwave radiation flux at the surface (incoming solar).</td>\r    </tr>\r    <tr>\r      <td>dlwrf</td>\r      <td>W/m²</td>\r      <td>Downward longwave radiation flux at the surface (incoming thermal IR).</td>\r    </tr>\r    <tr>\r      <td>lhtfl</td>\r      <td>W/m²</td>\r      <td>Latent heat net flux (energy associated with evapotranspiration).</td>\r    </tr>\r    <tr>\r      <td>shtfl</td>\r      <td>W/m²</td>\r      <td>Sensible heat net flux (heating of the air from the surface).</td>\r    </tr>\r    <tr>\r      <td>gflux</td>\r      <td>W/m²</td>\r      <td>Ground heat flux (heat into or out of the soil).</td>\r    </tr>\r    <tr>\r      <td>snohf</td>\r      <td>W/m²</td>\r      <td>Snow phase-change heat flux (energy for snowmelt and refreezing).</td>\r    </tr>\r    <tr>\r      <td>asnow</td>\r      <td>kg/m² per hour (≈ mm/hour)</td>\r      <td>Total solid precipitation (snowfall) accumulated over the period.</td>\r    </tr>\r    <tr>\r      <td>arain</td>\r      <td>kg/m² per hour (≈ mm/hour)</td>\r      <td>Total liquid precipitation (rainfall) accumulated over the period.</td>\r    </tr>\r    <tr>\r      <td>evp</td>\r      <td>kg/m² per hour (≈ mm/hour)</td>\r      <td>Total evaporation / evapotranspiration from the surface.</td>\r    </tr>\r    <tr>\r      <td>ssrun</td>\r      <td>kg/m² per hour (≈ mm/hour)</td>\r      <td>Storm surface runoff (overland flow) from the grid cell.</td>\r    </tr>\r    <tr>\r      <td>bgrun</td>\r      <td>kg/m² per hour (≈ mm/hour)</td>\r      <td>Baseflow / groundwater runoff (subsurface drainage).</td>\r    </tr>\r    <tr>\r      <td>snom</td>\r      <td>kg/m² per hour (≈ mm/hour)</td>\r      <td>Snowmelt rate (water-equivalent snowmelt).</td>\r    </tr>\r    <tr>\r      <td>avsft</td>\r      <td>K</td>\r      <td>Average surface skin temperature.</td>\r    </tr>\r    <tr>\r      <td>albdo</td>\r      <td>% (0–100)</td>\r      <td>Broadband surface albedo (fraction of shortwave radiation reflected).</td>\r    </tr>\r    <tr>\r      <td>weasd</td>\r      <td>kg/m² (≈ mm SWE)</td>\r      <td>Water equivalent of accumulated snow depth (snow water equivalent).</td>\r    </tr>\r    <tr>\r      <td>snowc</td>\r      <td>% (0–100)</td>\r      <td>Snow cover fraction of the grid cell.</td>\r    </tr>\r    <tr>\r      <td>snod</td>\r      <td>m</td>\r      <td>Snow depth.</td>\r    </tr>\r    <tr>\r      <td>tsoil</td>\r      <td>K</td>\r      <td>Soil temperature (layer-dependent depth).</td>\r    </tr>\r    <tr>\r      <td>soilm1</td>\r      <td>kg/m²</td>\r      <td>Soil moisture content in layer 1 (top layer).</td>\r    </tr>\r    <tr>\r      <td>soilm2</td>\r      <td>kg/m²</td>\r      <td>Soil moisture content in layer 2.</td>\r    </tr>\r    <tr>\r      <td>soilm3</td>\r      <td>kg/m²</td>\r      <td>Soil moisture content in layer 3.</td>\r    </tr>\r    <tr>\r      <td>soilm4</td>\r      <td>kg/m²</td>\r      <td>Soil moisture content in layer 4.</td>\r    </tr>\r    <tr>\r      <td>soilm5</td>\r      <td>kg/m²</td>\r      <td>Soil moisture content in layer 5.</td>\r    </tr>\r    <tr>\r      <td>soilm6</td>\r      <td>kg/m²</td>\r      <td>Soil moisture content in layer 6 (deepest layer).</td>\r    </tr>\r    <tr>\r      <td>mstav1</td>\r      <td>% (0–100)</td>\r      <td>Moisture availability (relative soil wetness) for upper soil.</td>\r    </tr>\r    <tr>\r      <td>mstav2</td>\r      <td>% (0–100)</td>\r      <td>Moisture availability (relative soil wetness) for deeper/column soil.</td>\r    </tr>\r    <tr>\r      <td>evcw</td>\r      <td>W/m²</td>\r      <td>Canopy water evaporation heat flux.</td>\r    </tr>\r    <tr>\r      <td>trans</td>\r      <td>W/m²</td>\r      <td>Transpiration heat flux (through vegetation).</td>\r    </tr>\r    <tr>\r      <td>evbs</td>\r      <td>W/m²</td>\r      <td>Direct evaporation from bare soil (latent heat flux).</td>\r    </tr>\r    <tr>\r      <td>sbsno</td>\r      <td>W/m²</td>\r      <td>Sublimation from snow (latent heat flux from snow surface).</td>\r    </tr>\r    <tr>\r      <td>cnwat</td>\r      <td>kg/m²</td>\r      <td>Plant canopy surface water storage (intercepted water).</td>\r    </tr>\r    <tr>\r      <td>acond</td>\r      <td>m/s</td>\r      <td>Aerodynamic conductance between surface/canopy and atmosphere.</td>\r    </tr>\r    <tr>\r      <td>ccond</td>\r      <td>m/s</td>\r      <td>Canopy (stomatal) conductance aggregated over vegetation.</td>\r    </tr>\r    <tr>\r      <td>lai</td>\r      <td>dimensionless (m²/m²)</td>\r      <td>Leaf Area Index (leaf area per unit ground area).</td>\r    </tr>\r    <tr>\r      <td>veg</td>\r      <td>% (0–100)</td>\r      <td>Vegetation cover fraction of the grid cell.</td>\r    </tr>\r  </tbody>\r</table>\r<hr>\r"},"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{}},"paths":{"/hourly":{"get":{"summary":"Hourly weather data","tags":["Weather"],"description":"<p><strong>Returns hourly gridded weather data from NLDAS-2 and MRMS datasets.</strong></p>\n  <h3>Parameters</h3>\n  <ul>\n    <li>\n      <code>email</code><br>\n      <em style=\"color:#c00; font-weight:600;\">(required)</em>\n      <p>A valid email address used for communication about API usage or changes.</p>\n      <p>If the address is found to be invalid, API access will be disabled for that email.</p>\n      <hr>\n    </li>\n    <li>\n      <code>start</code> and <code>end</code><br>\n      <em style=\"color:#c00; font-weight:600;\">(required)</em>\n      <p>\n        Specify the date range for the query in <code>YYYY-MM-DD</code> or <code>YYYY-MM-DD HH:MM</code> format, or as a <strong>relative day offset</strong> (e.g., -15 = 15 days ago, 0 = today).\n      </p>\n      <h4>Examples</h4>\n      <ul>\n        <li>\n          <p><strong>Specific month (Nov 2018)</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35&amp;lon=-80&amp;start=2018-11-01&amp;end=2018-11-30&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35&amp;<em style=\"color: brown\">lon=</em>-80&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n        </li>\n        <li>\n          <p>\n            ℹ️ Note: NLDAS-2 data is typically delayed by a few days for quality control, so the most recent days may be missing.\n            Data for missing days is automatically \"predicted\" based on 5-year averages.\n            You'll see a <code>predicted</code> column when that occurs:\n          </p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35&amp;lon=-80&amp;start=-15&amp;end=0&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35&amp;<em style=\"color: brown\">lon=</em>-80&amp;<em style=\"color: brown\">start=</em>-15&amp;<em style=\"color: brown\">end=</em>0&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n          <p>This also allows you to retrieve <strong>forecast data for future dates</strong>:</p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35&amp;lon=-80&amp;start=30&amp;end=60&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35&amp;<em style=\"color: brown\">lon=</em>-80&amp;<em style=\"color: brown\">start=</em>30&amp;<em style=\"color: brown\">end=</em>60&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n        </li>\n      </ul>\n      <hr>\n    </li>\n    <li>\n      <code>lat</code> and <code>lon</code><br>\n      <em>(required if <code>location</code> is missing)</em>\n      <p>Latitude and longitude in decimal degrees (<strong>WGS84</strong>).</p>\n      <ul>\n        <li>Latitude range: -90 to 90</li>\n        <li>Longitude range: -180 to 180</li>\n      </ul>\n      <h4>Examples</h4>\n      <ul>\n        <li>\n          <p><strong>Single point</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35&amp;lon=-80&amp;start=2018-11-01&amp;end=2018-11-30&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35&amp;<em style=\"color: brown\">lon=</em>-80&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n        </li>\n        <li>\n          <p><strong>Multiple points</strong> (must have equal numbers of latitudes and longitudes)</p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35,40&amp;lon=-80,-77&amp;start=2018-11-01&amp;end=2018-11-30&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35,40&amp;<em style=\"color: brown\">lon=</em>-80,-77&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n        </li>\n      </ul>\n      <hr>\n    </li>\n    <li>\n      <code>location</code><br>\n      <em>(required if <code>lat</code> and <code>lon</code> are missing)</em>\n      <p>\n        A free-form location input such as an <strong>address</strong>, <strong>ZIP code</strong>, <strong>city</strong>, <strong>county</strong>, or <strong>state</strong>.\n        If not an exact address, the API returns results for the centroid of the location's bounding box.\n      </p>\n      <p>Punctuation, capitalization, and common abbreviations are all accepted.</p>\n      <h4>Examples <em style=\"font-weight: normal;\">(each pair below returns the same result)</em></h4>\n      <ul>\n        <li>\n          <p><strong>Empire State Building:</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;location=350 5th Ave, New York, NY 10118&amp;start=2018-11-01&amp;end=2018-11-30&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">location=</em>350 5th Ave, New York, NY 10118&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;location=Empire State Building&amp;start=2018-11-01&amp;end=2018-11-30&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">location=</em>Empire State Building&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n        </li>\n        <li>\n          <p><strong>Athens Georgia:</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;location=Athens GA&amp;start=2018-11-01&amp;end=2018-11-30&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">location=</em>Athens GA&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;location=athens georgia&amp;start=2018-11-01&amp;end=2018-11-30&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">location=</em>athens georgia&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n        </li>\n        <li>\n          <p><strong>Kansas:</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;location=Kansas&amp;start=2018-11-01&amp;end=2018-11-30&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">location=</em>Kansas&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;location=KS&amp;start=2018-11-01&amp;end=2018-11-30&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">location=</em>KS&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n        </li>\n      </ul>\n      <hr>\n    </li>\n    <li id=\"Attributes\">\n      <code>attributes</code>\n      <em>(optional)</em>\n      <p>Comma-separated list of attributes to include in the output.</p>\n      <h4>Default:</h4>\n      <code style=\"margin-left: 2rem; display: block;\">\n        date, lat, lon, air_temperature, humidity, relative_humidity, pressure, zonal_wind_speed, meridional_wind_speed, wind_speed,\n        longwave_radiation, convective_precipitation, potential_energy, potential_evaporation, shortwave_radiation, precipitation\n      </code>\n      <h4>Mosaic land-surface model (LSM) parameters are also available:</h4>\n      <code style=\"margin-left: 2rem; display: block;\">\n        nswrs, nlwrs, dswrf, dlwrf, lhtfl, shtfl, gflux, snohf, asnow, arain, evp, ssrun, bgrun, snom, avsft, albdo, weasd, snowc,\n        snod, tsoil, soilm1, soilm2, soilm3, soilm4, soilm5, soilm6, mstav1, mstav2, evcw, trans, evbs, sbsno, cnwat, acond, ccond,\n        lai, veg\n      </code>\n      <h4>Notes</h4>\n      <ul>\n        <li><code>date</code> is always included, even if omitted from the list.</li>\n        <li><code>lat</code> and <code>lon</code> are automatically included when using <code>options=rect</code>.</li>\n        <li>\n          You may specify <strong>GRIB variable short names</strong> instead of full column names\n          (e.g., <code>TMP</code> for <code>air_temperature</code>, <code>APCP</code> for <code>precipitation</code>).\n          <br>\n          The output column names will still use the database field names.\n        </li>\n        <li>\n          <code>mosaic</code> is shorthand for all Mosaic attributes.<br>\n          <code>nldas</code> is shorthand for all NLDAS-2 forcing attributes.<br>\n        </li>\n      </ul>\n      <h4>Examples</h4>\n      <ul>\n        <li>\n          <p><strong>Air temperature and Rain (full column names)</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35.5&amp;lon=-80.8&amp;start=2018-11-01&amp;end=2018-11-30&amp;attributes=air_temperature,precipitation&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.5&amp;<em style=\"color: brown\">lon=</em>-80.8&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">attributes=</em>air_temperature,precipitation&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n        </li>\n        <li>\n          <p><strong>Air temperature and Rain (GRIB short names)</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35.5&amp;lon=-80.8&amp;start=2018-11-01&amp;end=2018-11-30&amp;attributes=TMP,APCP&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.5&amp;<em style=\"color: brown\">lon=</em>-80.8&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">attributes=</em>TMP,APCP&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n        </li>\n        <li>\n          <p><strong>Mosaic attributes only</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35.5&amp;lon=-80.8&amp;start=2018-11-01&amp;end=2018-11-30&amp;attributes=mosaic&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.5&amp;<em style=\"color: brown\">lon=</em>-80.8&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">attributes=</em>mosaic&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n        </li>\n        <li>\n          <p><strong>Air temperature and Mosaic attributes only</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35.5&amp;lon=-80.8&amp;start=2018-11-01&amp;end=2018-11-30&amp;attributes=air_temperature,mosaic&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.5&amp;<em style=\"color: brown\">lon=</em>-80.8&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">attributes=</em>air_temperature,mosaic&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n        </li>\n      </ul>\n      <hr>\n    </li>\n    <li>\n      <code>options</code><br>\n      <em>(optional)</em>\n      <p>A comma-separated list of modifiers</p>\n      <h4>Available values</h4>\n      <ul>\n        <li>\n          <code>utc|gmt</code><br>\n          <p>Outputs results in <strong>Coordinated Universal Time (UTC)</strong> instead of local time.</p>\n          <ul>\n            <li>\n              <p><strong>Local time (default):</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35&amp;lon=-80&amp;start=2018-11-01&amp;end=2018-11-30&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35&amp;<em style=\"color: brown\">lon=</em>-80&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n            </li>\n            <li>\n              <p><strong>UTC time:</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35&amp;lon=-80&amp;start=2018-11-01&amp;end=2018-11-30&amp;options=utc&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35&amp;<em style=\"color: brown\">lon=</em>-80&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">options=</em>utc&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n            </li>\n          </ul>\n          <p>\n            When returning local time, the API may need to query Google’s timezone service the <em>first</em> time it sees a new location;\n            after that, results are served from cache.\n            Using UTC skips timezone lookups altogether, but it requires clients to handle any time-zone conversions themselves.\n          </p>\n          <hr>\n        </li>\n        <li>\n          <code>mrms</code><br>\n          <p>Output MRMS precipitation data instead of NLDAS-2.</p>\n          <p>This option is ignored when using the <code>stats</code> parameter or when <code>options=rect</code>.</p>\n          <p>\n            ⚠️ <strong>Performance note</strong>: MRMS provides 1 km × 1 km data —\n            about <strong>169 MRMS grid cells for each NLDAS-2 cell</strong>.\n            Queries using MRMS can therefore be much slower and heavier on the database. Use only when the higher resolution of MRMS is required.\n          </p>\n          <p><strong>Examples</strong></p>\n          <ul>\n            <li>\n              <p><strong>NLDAS-2 precipitation:</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35&amp;lon=-80&amp;start=2018-11-01&amp;end=2018-11-30&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35&amp;<em style=\"color: brown\">lon=</em>-80&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n            </li>\n            <li>\n              <p><strong>MRMS precipitation:</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35&amp;lon=-80&amp;start=2018-11-01&amp;end=2018-11-30&amp;options=mrms&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35&amp;<em style=\"color: brown\">lon=</em>-80&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">options=</em>mrms&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n            </li>\n          </ul>\n          <hr>\n        </li>\n        <li>\n          <code>rect</code>\n          <p>Treats two latitude/longitude pairs as opposite corners of a rectangle (NE:SW or NW:SE).</p>\n          <ul>\n            <li>\n              <p><strong>Using lat/lon pairs</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35,35.2&amp;lon=-80,-79.2&amp;start=2018-11-01&amp;end=2018-11-30&amp;options=rect&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35,35.2&amp;<em style=\"color: brown\">lon=</em>-80,-79.2&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">options=</em>rect&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n            </li>\n            <li>\n              <p><strong>Using a location</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;location=clarke county georgia&amp;start=2018-11-01&amp;end=2018-11-30&amp;options=rect&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">location=</em>clarke county georgia&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">options=</em>rect&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n            </li>\n          </ul>\n          <p>Data within the defined rectangle is returned at the available grid resolution.</p>\n          <hr>\n        </li>\n        <li>\n          <code>graph</code>\n          <p>Provides basic graphing options when <code>output=html</code>.</p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;location=clarke county georgia&amp;start=2018-11-01&amp;end=2018-11-30&amp;options=rect,graph&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">location=</em>clarke county georgia&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">options=</em>rect,graph&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n          <hr>\n        </li>\n      </ul>\n      <hr>\n    </li>\n    <li>\n      <code>explain=true</code><br>\n      <em>(optional)</em>\n      <p>\n        Executes an <strong>SQL</strong> <code>EXPLAIN</code> statement on the generated query.<br>\n        Useful for <strong>troubleshooting</strong>, <strong>performance analysis</strong>, or <strong>query optimization</strong>.<br>\n        Only recommended for debugging — results are intended for technical inspection.\n      </p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35&amp;lon=-80&amp;start=-30&amp;end=60&amp;explain=true&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35&amp;<em style=\"color: brown\">lon=</em>-80&amp;<em style=\"color: brown\">start=</em>-30&amp;<em style=\"color: brown\">end=</em>60&amp;<em style=\"color: brown\">explain=</em>true&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n      <hr>\n    </li>\n    <li>\n      <code>output=[json|html|csv]</code><br>\n      <em>(optional, defaults to <code>json</code>)</em>\n      <p>\n        Specifies the format of the response:\n        </p><ul>\n          <li><code>json</code> – Standard structured data (default)</li>\n          <li><code>html</code> – Browser-friendly table view.  (Click a column header to sort.)</li>\n          <li><code>csv</code> – Comma-separated values, suitable for spreadsheets</li>\n        </ul>\n      <p></p>\n      <h4>Examples</h4>\n      <ul>\n        <li>\n          <p><strong>JSON output</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35.5&amp;lon=-80.8&amp;start=2018-11-01&amp;end=2018-11-30\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.5&amp;<em style=\"color: brown\">lon=</em>-80.8&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30</a></strong>\n            </div>\n        </li>\n        <li>\n          <p><strong>HTML output</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35.5&amp;lon=-80.8&amp;start=2018-11-01&amp;end=2018-11-30&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.5&amp;<em style=\"color: brown\">lon=</em>-80.8&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n        </li>\n        <li>\n          <p><strong>CSV output</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35.5&amp;lon=-80.8&amp;start=2018-11-01&amp;end=2018-11-30&amp;output=csv\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.5&amp;<em style=\"color: brown\">lon=</em>-80.8&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">output=</em>csv</a></strong>\n            </div>\n        </li>\n      </ul>\n      <hr>\n    </li>\n    <li>\n      <code>stats</code><br>\n      <em>(optional)</em>\n      <p>\n        Applies SQL-style statistical functions to one or more attributes.<br>\n        Supports functions such as <code>avg</code>, <code>min</code>, <code>max</code>, <code>sum</code>, and <code>count</code>.\n      </p>\n      <h4>Examples</h4>\n      <ul>\n        <li>\n          <p><strong>Average air temperature and rainfall</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35.5&amp;lon=-80.8&amp;start=2018-01-01&amp;end=2019-01-01&amp;stats=avg(air_temperature),avg(precipitation)&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.5&amp;<em style=\"color: brown\">lon=</em>-80.8&amp;<em style=\"color: brown\">start=</em>2018-01-01&amp;<em style=\"color: brown\">end=</em>2019-01-01&amp;<em style=\"color: brown\">stats=</em>avg(air_temperature),avg(precipitation)&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n        </li>\n        <li>\n          <p><strong>Maximum temperature and total precipitation</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35.5&amp;lon=-80.8&amp;start=2018-01-01&amp;end=2019-01-01&amp;stats=max(air_temperature),sum(precipitation)&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.5&amp;<em style=\"color: brown\">lon=</em>-80.8&amp;<em style=\"color: brown\">start=</em>2018-01-01&amp;<em style=\"color: brown\">end=</em>2019-01-01&amp;<em style=\"color: brown\">stats=</em>max(air_temperature),sum(precipitation)&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n        </li>\n      </ul>\n      <hr>\n    </li>\n    <li>\n      <code>group=[doy|month|year|growingyear]</code><br>\n      <em>(optional, ignored if <code>stats</code> is missing)</em>\n      <p>Groups the statistical results by a chosen time period.</p>\n      <h4>Options</h4>\n      <ul>\n        <li><code>doy</code> – Day of year</li>\n        <li><code>month</code> – Month</li>\n        <li><code>year</code> – Calendar year</li>\n        <li><code>growingyear</code> – August through July</li>\n      </ul>\n      <h4>Examples</h4>\n      <ul>\n        <li>\n          <p><strong>Average air temperature per day of year</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35.5&amp;lon=-80.8&amp;start=2018-01-01&amp;end=2019-01-01&amp;stats=avg(air_temperature)&amp;group=doy&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.5&amp;<em style=\"color: brown\">lon=</em>-80.8&amp;<em style=\"color: brown\">start=</em>2018-01-01&amp;<em style=\"color: brown\">end=</em>2019-01-01&amp;<em style=\"color: brown\">stats=</em>avg(air_temperature)&amp;<em style=\"color: brown\">group=</em>doy&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n        </li>\n        <li>\n          <p><strong>Average air temperature per month</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35.5&amp;lon=-80.8&amp;start=2018-01-01&amp;end=2019-01-01&amp;stats=avg(air_temperature)&amp;group=month&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.5&amp;<em style=\"color: brown\">lon=</em>-80.8&amp;<em style=\"color: brown\">start=</em>2018-01-01&amp;<em style=\"color: brown\">end=</em>2019-01-01&amp;<em style=\"color: brown\">stats=</em>avg(air_temperature)&amp;<em style=\"color: brown\">group=</em>month&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n        </li>\n        <li>\n          <p><strong>Average air temperature per year</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35.5&amp;lon=-80.8&amp;start=2018-01-01&amp;end=2019-01-01&amp;stats=avg(air_temperature)&amp;group=year&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.5&amp;<em style=\"color: brown\">lon=</em>-80.8&amp;<em style=\"color: brown\">start=</em>2018-01-01&amp;<em style=\"color: brown\">end=</em>2019-01-01&amp;<em style=\"color: brown\">stats=</em>avg(air_temperature)&amp;<em style=\"color: brown\">group=</em>year&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n        </li>\n        <li>\n          <p><strong>Average air temperature per growing year (Aug-Jul)</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35.5&amp;lon=-80.8&amp;start=2018-01-01&amp;end=2019-01-01&amp;stats=avg(air_temperature)&amp;group=growingyear&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.5&amp;<em style=\"color: brown\">lon=</em>-80.8&amp;<em style=\"color: brown\">start=</em>2018-01-01&amp;<em style=\"color: brown\">end=</em>2019-01-01&amp;<em style=\"color: brown\">stats=</em>avg(air_temperature)&amp;<em style=\"color: brown\">group=</em>growingyear&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n        </li>\n      </ul>\n      <hr>\n    </li>\n  </ul>\n  <h3>Pagination and filtering</h3>\n  <p>\n    <code>limit</code> <em>(optional)</em><br>\n    Restricts the number of rows returned. If omitted, all matching records are included.\n  </p>\n  <p>\n    <code>offset</code> <em>(optional)</em><br>\n    Starting position (<strong>0-based</strong>) for returned rows. Use with <code>limit</code> for pagination.\n  </p>\n  <p>\n    <code>order</code> <em>(optional, defaults to <code>date</code>)</em><br>\n    Sort field for results. Append <code>desc</code> for descending order (e.g., <code>order=air_temperature desc</code>).\n  </p>\n  <p>\n    <code>where</code> <em>(optional)</em><br>\n    Conditional filter. Supports SQL-style comparisons: =, &lt;&gt;, &gt;, &lt;, &gt;=, &lt;=, and logical AND / OR.\n  </p>\n  <h4>Examples</h4>\n  <ul>\n    <li>\n      <p><strong>First 10 records (no filter)</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35.5&amp;lon=-80.8&amp;start=2018-11-01&amp;end=2018-11-30&amp;limit=10&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.5&amp;<em style=\"color: brown\">lon=</em>-80.8&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">limit=</em>10&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>Next 10 records (skip the first 10)</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35.5&amp;lon=-80.8&amp;start=2018-11-01&amp;end=2018-11-30&amp;limit=10&amp;offset=10&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.5&amp;<em style=\"color: brown\">lon=</em>-80.8&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">limit=</em>10&amp;<em style=\"color: brown\">offset=</em>10&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>Sort by descending air temperature</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35.5&amp;lon=-80.8&amp;start=2018-11-01&amp;end=2018-11-30&amp;order=air_temperature desc&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.5&amp;<em style=\"color: brown\">lon=</em>-80.8&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">order=</em>air_temperature desc&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>Filter: precipitation &gt; 10 mm</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35.5&amp;lon=-80.8&amp;start=2018-01-01&amp;end=2018-12-31&amp;where=precipitation>10&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.5&amp;<em style=\"color: brown\">lon=</em>-80.8&amp;<em style=\"color: brown\">start=</em>2018-01-01&amp;<em style=\"color: brown\">end=</em>2018-12-31&amp;<em style=\"color: brown\">where=</em>precipitation&gt;10&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>Combined: top 10 records where precipitation &gt; 10 mm (sorted high→low)</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hourly?email=jd@ex.com&amp;lat=35.5&amp;lon=-80.8&amp;start=2018-01-01&amp;end=2018-12-31&amp;where=precipitation>10&amp;order=precipitation desc&amp;limit=10&amp;output=html\">/hourly?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.5&amp;<em style=\"color: brown\">lon=</em>-80.8&amp;<em style=\"color: brown\">start=</em>2018-01-01&amp;<em style=\"color: brown\">end=</em>2018-12-31&amp;<em style=\"color: brown\">where=</em>precipitation&gt;10&amp;<em style=\"color: brown\">order=</em>precipitation desc&amp;<em style=\"color: brown\">limit=</em>10&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n    </li>\n  </ul>","parameters":[{"schema":{"type":"string","format":"email"},"example":"jd@ex.com","in":"query","name":"email","required":true,"description":"Email"},{"schema":{"type":"string","format":"date-time"},"example":"2018-11-01","in":"query","name":"start","required":true,"description":"Start date in YYYY-MM-DD format"},{"schema":{"type":"string","format":"date-time"},"example":"2018-11-30","in":"query","name":"end","required":true,"description":"End date in YYYY-MM-DD format"},{"schema":{"type":"string"},"example":-79,"in":"query","name":"lat","required":false,"description":"Latitude"},{"schema":{"type":"string"},"example":-79,"in":"query","name":"lon","required":false,"description":"Longitude"},{"schema":{"type":"string"},"in":"query","name":"attributes","required":false,"description":"Attributes"},{"schema":{"type":"string"},"in":"query","name":"options","required":false,"description":"Options"},{"schema":{"type":"boolean"},"in":"query","name":"explain","required":false,"description":"Explain"},{"schema":{"type":"string"},"examples":{"json":{"value":"json"},"csv":{"value":"csv"},"html":{"value":"html"}},"in":"query","name":"output","required":false},{"schema":{"type":"string"},"in":"query","name":"stats","required":false,"description":"Stats"},{"schema":{"type":"string"},"in":"query","name":"group","required":false,"description":"Group"},{"schema":{"type":"number"},"in":"query","name":"limit","required":false,"description":"Limit"},{"schema":{"type":"number"},"in":"query","name":"offset","required":false,"description":"Offset"},{"schema":{"type":"string"},"in":"query","name":"order","required":false,"description":"Order"},{"schema":{"type":"string"},"in":"query","name":"where","required":false,"description":"Where"}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"additionalProperties":true,"properties":{},"type":"object"}}}}}}}},"/daily":{"get":{"summary":"Daily weather data","tags":["Weather"],"description":"<p>Returns daily NLDAS-2 data aggregated from hourly records.</p>\n  <p>Supports the same parameters as <code>/hourly</code>, <strong>except</strong> <code>options=mrms</code> (not supported).</p>\n  <h4>Columns based on the sum of hourly data</h4>\n  <code style=\"display: block; margin-left: 1rem;\">\n    precipitation<br>\n    longwave_radiation<br>\n    shortwave_radiation<br>\n    potential_energy<br>\n    potential_evaporation<br>\n    convective_precipitation\n  </code>\n  <h4>Columns based on statistical hourly data</h4>\n  <code style=\"display: block; margin-left: 1rem;\">\n    min_air_temperature, max_air_temperature, avg_air_temperature<br>\n    min_humidity, max_humidity, avg_humidity<br>\n    min_relative_humidity, max_relative_humidity, avg_relative_humidity<br>\n    min_pressure, max_pressure, avg_pressure<br>\n    min_zonal_wind_speed, max_zonal_wind_speed, avg_zonal_wind_speed,<br>\n    min_meridional_wind_speed, max_meridional_wind_speed, avg_meridional_wind_speed<br>\n    min_wind_speed, max_wind_speed, avg_wind_speed\n  </code>\n  <p>\n    In addition to the standard <code>/hourly</code> parameters,\n    this route can output <strong>Growing Degree Days (GDD)</strong> — available as the column <code>gdd</code>.\n    GDD is based on the calculations at\n    <a target=\"_blank\" href=\"https://ndawn.ndsu.nodak.edu/help-corn-growing-degree-days.html\">https://ndawn.ndsu.nodak.edu/help-corn-growing-degree-days.html</a>\n  </p>\n  <p>\n    The calculation uses the following parameters:\n  </p>\n  <ul>\n    <li><code>gddbase</code> – Base temperature threshold (°C).</li>\n    <li><code>gddmin</code> – Minimum daily temperature limit (°C).</li>\n    <li><code>gddmax</code> – Maximum daily temperature cap (°C).</li>\n  </ul>\n  <p><strong>Examples:</strong></p>\n  <ul>\n    <li>\n      <p><strong>Daily precipitation for a month (single point)</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/daily?email=jd@ex.com&amp;lat=35.5&amp;lon=-80.8&amp;start=2018-11-01&amp;end=2018-11-30&amp;attributes=lat,lon,precipitation&amp;output=html\">/daily?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.5&amp;<em style=\"color: brown\">lon=</em>-80.8&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">attributes=</em>lat,lon,precipitation&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>Daily min/max/avg air temperature for a year</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/daily?email=jd@ex.com&amp;lat=35.5&amp;lon=-80.8&amp;start=2018-01-01&amp;end=2018-12-31&amp;attributes=air_temperature&amp;output=html\">/daily?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.5&amp;<em style=\"color: brown\">lon=</em>-80.8&amp;<em style=\"color: brown\">start=</em>2018-01-01&amp;<em style=\"color: brown\">end=</em>2018-12-31&amp;<em style=\"color: brown\">attributes=</em>air_temperature&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>Use a place name instead of lat/lon</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/daily?email=jd@ex.com&amp;location=Athens%20GA&amp;start=2018-11-01&amp;end=2018-11-30&amp;attributes=precipitation,air_temperature&amp;output=html\">/daily?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">location=</em>Athens%20GA&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">attributes=</em>precipitation,air_temperature&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>Last 30 days (relative dates)</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/daily?email=jd@ex.com&amp;lat=35.5&amp;lon=-80.8&amp;start=-30&amp;end=0&amp;attributes=precipitation,air_temperature&amp;output=html\">/daily?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.5&amp;<em style=\"color: brown\">lon=</em>-80.8&amp;<em style=\"color: brown\">start=</em>-30&amp;<em style=\"color: brown\">end=</em>0&amp;<em style=\"color: brown\">attributes=</em>precipitation,air_temperature&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>Rectangle query (two corners; NE:SW or NW:SE)</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/daily?email=jd@ex.com&amp;lat=35.8,39.2&amp;lon=-80.4,-77.0&amp;start=2018-11-01&amp;end=2018-11-30&amp;options=rect&amp;attributes=precipitation&amp;output=html\">/daily?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.8,39.2&amp;<em style=\"color: brown\">lon=</em>-80.4,-77.0&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">options=</em>rect&amp;<em style=\"color: brown\">attributes=</em>precipitation&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>UTC timestamps instead of local time</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/daily?email=jd@ex.com&amp;lat=35.5&amp;lon=-80.8&amp;start=2018-11-01&amp;end=2018-11-30&amp;options=utc&amp;attributes=precipitation,air_temperature&amp;output=html\">/daily?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.5&amp;<em style=\"color: brown\">lon=</em>-80.8&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">options=</em>utc&amp;<em style=\"color: brown\">attributes=</em>precipitation,air_temperature&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>Filter + sort + paginate (top rainy days)</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/daily?email=jd@ex.com&amp;lat=35.5&amp;lon=-80.8&amp;start=2018-01-01&amp;end=2018-12-31&amp;where=precipitation>10&amp;order=precipitation%20desc&amp;limit=10&amp;output=html\">/daily?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.5&amp;<em style=\"color: brown\">lon=</em>-80.8&amp;<em style=\"color: brown\">start=</em>2018-01-01&amp;<em style=\"color: brown\">end=</em>2018-12-31&amp;<em style=\"color: brown\">where=</em>precipitation&gt;10&amp;<em style=\"color: brown\">order=</em>precipitation%20desc&amp;<em style=\"color: brown\">limit=</em>10&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>Daily Growing Degree Days</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/daily?email=jd@ex.com&amp;lat=35.5&amp;lon=-80.8&amp;start=2018-11-01&amp;end=2018-11-30&amp;attributes=lat,lon,gdd&amp;gddbase=10&amp;gddmin=10&amp;gddmax=30&amp;output=html\">/daily?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.5&amp;<em style=\"color: brown\">lon=</em>-80.8&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">attributes=</em>lat,lon,gdd&amp;<em style=\"color: brown\">gddbase=</em>10&amp;<em style=\"color: brown\">gddmin=</em>10&amp;<em style=\"color: brown\">gddmax=</em>30&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>Cumulative Growing Degree Days</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/daily?email=jd@ex.com&amp;lat=35.5&amp;lon=-80.8&amp;start=2018-11-01&amp;end=2018-11-30&amp;gddbase=10&amp;gddmin=10&amp;gddmax=30&amp;stats=sum(gdd)&amp;output=html\">/daily?<em style=\"color: brown\">email=</em>jd@ex.com&amp;<em style=\"color: brown\">lat=</em>35.5&amp;<em style=\"color: brown\">lon=</em>-80.8&amp;<em style=\"color: brown\">start=</em>2018-11-01&amp;<em style=\"color: brown\">end=</em>2018-11-30&amp;<em style=\"color: brown\">gddbase=</em>10&amp;<em style=\"color: brown\">gddmin=</em>10&amp;<em style=\"color: brown\">gddmax=</em>30&amp;<em style=\"color: brown\">stats=</em>sum(gdd)&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n    </li>\n  </ul>","parameters":[{"schema":{"type":"string","format":"email"},"example":"jd@ex.com","in":"query","name":"email","required":true,"description":"Email"},{"schema":{"type":"string","format":"date-time"},"example":"2018-11-01","in":"query","name":"start","required":true,"description":"Start date in YYYY-MM-DD format"},{"schema":{"type":"string","format":"date-time"},"example":"2018-11-30","in":"query","name":"end","required":true,"description":"End date in YYYY-MM-DD format"},{"schema":{"type":"string"},"example":35,"in":"query","name":"lat","required":false,"description":"Lat"},{"schema":{"type":"string"},"example":-79,"in":"query","name":"lon","required":false,"description":"Lon"},{"schema":{"type":"string"},"in":"query","name":"attributes","required":false,"description":"Attributes"},{"schema":{"type":"string"},"in":"query","name":"options","required":false,"description":"Options"},{"schema":{"type":"boolean"},"in":"query","name":"explain","required":false,"description":"Explain"},{"schema":{"type":"string"},"examples":{"json":{"value":"json"},"csv":{"value":"csv"},"html":{"value":"html"}},"in":"query","name":"output","required":false},{"schema":{"type":"string"},"in":"query","name":"stats","required":false,"description":"Stats"},{"schema":{"type":"string"},"in":"query","name":"group","required":false,"description":"Group"},{"schema":{"type":"number"},"in":"query","name":"limit","required":false,"description":"Limit"},{"schema":{"type":"number"},"in":"query","name":"offset","required":false,"description":"Offset"},{"schema":{"type":"string"},"in":"query","name":"order","required":false,"description":"Order"},{"schema":{"type":"string"},"in":"query","name":"where","required":false,"description":"Where"},{"schema":{"type":"string"},"in":"query","name":"gddbase","required":false,"description":"Gddbase"},{"schema":{"type":"string"},"in":"query","name":"gddmax","required":false,"description":"Gddmax"},{"schema":{"type":"string"},"in":"query","name":"gddmin","required":false,"description":"Gddmin"}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"additionalProperties":true,"properties":{},"type":"object"}}}}}}}},"/averages":{"get":{"summary":"5-year hourly weather averages","tags":["Weather"],"description":"<p>Returns <strong>5-year average NLDAS-2 data</strong> aggregated from hourly records.</p>\n  <p>Supports the same parameters as <code>/hourly</code>, <strong>except</strong> <code>options=mrms</code> (not supported).</p>\n  <p>For <code>start</code> and <code>end</code> dates, <strong>the year may be omitted</strong> (use <code>MM-DD</code> or <code>MM-DD HH:MM</code>).</p>\n  <p>If <code>start</code> and <code>end</code> dates are not provided, they default to '01-01' and '12-31'.</p>\n  <p>See <code>/hourly</code> for example queries, substituting <code>averages</code> for <code>hourly</code>.</p>","parameters":[{"schema":{"type":"string","format":"email"},"example":"jd@ex.com","in":"query","name":"email","required":true,"description":"Email"},{"schema":{"type":"string","format":"date-time"},"example":"2018-11-01","in":"query","name":"start","required":false,"description":"Start date in YYYY-MM-DD format"},{"schema":{"type":"string","format":"date-time"},"example":"2018-11-30","in":"query","name":"end","required":false,"description":"End date in YYYY-MM-DD format"},{"schema":{"type":"string"},"example":35,"in":"query","name":"lat","required":false,"description":"Latitude"},{"schema":{"type":"string"},"example":-79,"in":"query","name":"lon","required":false,"description":"Longitude"},{"schema":{"type":"string"},"in":"query","name":"attributes","required":false,"description":"Attributes"},{"schema":{"type":"string"},"in":"query","name":"options","required":false,"description":"Options"},{"schema":{"type":"boolean"},"in":"query","name":"explain","required":false,"description":"Explain"},{"schema":{"type":"string"},"examples":{"json":{"value":"json"},"csv":{"value":"csv"},"html":{"value":"html"}},"in":"query","name":"output","required":false},{"schema":{"type":"string"},"in":"query","name":"stats","required":false,"description":"Stats"},{"schema":{"type":"string"},"in":"query","name":"group","required":false,"description":"Group"},{"schema":{"type":"number"},"in":"query","name":"limit","required":false,"description":"Limit"},{"schema":{"type":"number"},"in":"query","name":"offset","required":false,"description":"Offset"},{"schema":{"type":"string"},"in":"query","name":"order","required":false,"description":"Order"},{"schema":{"type":"string"},"in":"query","name":"where","required":false,"description":"Where"}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"additionalProperties":true,"properties":{},"type":"object"}}}}}}}},"/yearly":{"get":{"summary":"Yearly weather data","tags":["Weather"],"description":"<p>\n    Returns <strong>minimum</strong>, <strong>maximum</strong>, and <strong>average</strong> temperature,\n    along with <strong>minimum</strong>, <strong>maximum</strong>, and <strong>average</strong> total precipitation for a specified range of years.\n  </p>\n  <p>\n    If the <code>year</code> parameter is omitted, results default to the last 5 years.\n  </p>\n  <h4>Examples</h4>\n  <ul>\n    <li>\n      <p><strong>10-year stats for a location</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/yearly?location=Athens GA&amp;year=2015-2024&amp;output=html\">/yearly?<em style=\"color: brown\">location=</em>Athens GA&amp;<em style=\"color: brown\">year=</em>2015-2024&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>Previous 5-year stats for a lat/lon</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/yearly?lat=35&amp;lon=-79&amp;output=html\">/yearly?<em style=\"color: brown\">lat=</em>35&amp;<em style=\"color: brown\">lon=</em>-79&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n    </li>\n  </ul>","parameters":[{"schema":{"type":"string"},"example":35,"in":"query","name":"lat","required":false,"description":"Latitude"},{"schema":{"type":"string"},"example":-79,"in":"query","name":"lon","required":false,"description":"Longitude"},{"schema":{"type":"string"},"examples":{"2020":{"value":"2020"},"2018-2020":{"value":"2018-2020"}},"in":"query","name":"year","required":false,"description":"Year or range of years (e.g., 2018-2020)"},{"schema":{"type":"string","format":"email"},"example":"jd@ex.com","in":"query","name":"email","required":true,"description":"Email"},{"schema":{"type":"string"},"examples":{"json":{"value":"json"},"csv":{"value":"csv"},"html":{"value":"html"}},"in":"query","name":"output","required":false}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"additionalProperties":true,"properties":{},"type":"object"}}}}}}}},"/yearlyprecipitation":{"get":{"summary":"Yearly Precipitation","tags":["Weather"],"description":"<p>Returns the closest precipitation data (inches) to (lat, lon), along with distance to the weather station in meters.</p>\n  <p>\n    Data is based on 15-year normals compiled from\n    <a href=\"https://www.ncei.noaa.gov/data/normals-annualseasonal/2006-2020/access/\" target=\"_blank\">\n      https://www.ncei.noaa.gov/data/normals-annualseasonal/2006-2020/access/\n    </a>\n  </p>\n  <h4>Examples</h4>\n  <ul>\n    <li>\n      <p><strong>Precipitation data for a location:</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/yearlyprecipitation?location=Athens Georgia\">/yearlyprecipitation?<em style=\"color: brown\">location=</em>Athens Georgia</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>Precipitation data for a lat/lon:</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/yearlyprecipitation?lat=35.032056&amp;lon=-80.873972\">/yearlyprecipitation?<em style=\"color: brown\">lat=</em>35.032056&amp;<em style=\"color: brown\">lon=</em>-80.873972</a></strong>\n            </div>\n    </li>\n  </ul>","parameters":[{"schema":{"type":"number"},"example":35,"in":"query","name":"lat","required":true,"description":"Latitude"},{"schema":{"type":"number"},"example":-79,"in":"query","name":"lon","required":true,"description":"Longitude"}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"lat":{"type":"number"},"lon":{"type":"number"},"rain":{"type":"number"},"distance":{"type":"number"}}}}}}}}},"/frost":{"get":{"summary":"Frost data","tags":["Weather"],"description":"<p>\n    Outputs the weather station, the dates of first and last freeze, and the dates of first and last frost.\n  </p>\n  <p>\n    Frost data is based on 30-year climate normals, downloaded from\n    <a target=\"_blank\" href=\"https://www.ncei.noaa.gov/products/land-based-station/us-climate-normals\">\n      https://www.ncei.noaa.gov/products/land-based-station/us-climate-normals\n    </a>\n  </p>\n  <h4>Examples</h4>\n  <ul>\n    <li>\n      <p><strong>Frost data for a location:</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/frost?location=Athens Georgia\">/frost?<em style=\"color: brown\">location=</em>Athens Georgia</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>Frost data for a lat/lon:</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/frost?lat=35.032056&amp;lon=-80.873972\">/frost?<em style=\"color: brown\">lat=</em>35.032056&amp;<em style=\"color: brown\">lon=</em>-80.873972</a></strong>\n            </div>\n    </li>\n  </ul>","parameters":[{"schema":{"type":"number"},"example":35,"in":"query","name":"lat","required":true,"description":"Latitude"},{"schema":{"type":"number"},"example":-79,"in":"query","name":"lon","required":true,"description":"Longitude"}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"lat":{"type":"number"},"lon":{"type":"number"},"station":{"type":"string"},"name":{"type":"string"},"firstfreeze":{"type":"string"},"firstfrost":{"type":"string"},"lastfreeze":{"type":"string"},"lastfrost":{"type":"string"}}}}}}}}},"/elevation":{"get":{"summary":"Elevation","tags":["Other"],"description":"Returns the elevation (meters) for the given latitude/longitude by querying\n  <a target=\"_blank\" href=\"https://open-elevation.com\">Open-Elevation</a>.\n  <h4>Examples</h4>\n  <ul>\n    <li>\n      <p><strong>Elevation data for a location:</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/elevation?location=Athens Georgia\">/elevation?<em style=\"color: brown\">location=</em>Athens Georgia</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>Elevation data for a lat/lon:</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/elevation?lat=35.032056&amp;lon=-80.873972\">/elevation?<em style=\"color: brown\">lat=</em>35.032056&amp;<em style=\"color: brown\">lon=</em>-80.873972</a></strong>\n            </div>\n    </li>\n  </ul>","parameters":[{"schema":{"type":"number"},"example":35,"in":"query","name":"lat","required":true,"description":"Latitude"},{"schema":{"type":"number"},"example":-79,"in":"query","name":"lon","required":true,"description":"Longitude"}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"latitude":{"type":"number"},"longitude":{"type":"number"},"elevation":{"type":"number"}}}}}}}}},"/watershed":{"get":{"summary":"Watershed","tags":["Other"],"description":"<p>\n    Returns watershed (HUC) attributes based on one of:\n  </p>\n  <ul>\n    <li>a point (<code>lat,lon</code>)</li>\n    <li>an address (<code>location</code>, which is geocoded to lat/lon)</li>\n    <li>a state filter (<code>state</code> - 2-letter abbreviation)</li>\n    <li>a HUC prefix (<code>huc</code>)</li>\n  </ul>\n  <p>If no filter is provided, returns the HUC12 containing the point.</p>\n  <p>\n    The optional <code>attributes</code> parameter is a comma-separated list of fields to return, which may include any of the following:\n    <br>\n    huc12, name, huc10, huc10name, huc8, huc8name, huc6, huc6name, huc4, huc4name, huc2, huc2name, tnmid, metasourceid,\n    sourcedatadesc, sourceoriginator, sourcefeatureid, loaddate, referencegnis_ids, areaacres, areasqkm, states, hutype, humod,\n    tohuc, noncontributingareaacres, noncontributingareasqkm, globalid, shape_length, shape_area, polygonarray, polygon\n  </p>\n  <p>\n    When <code>attributes</code> is omitted, a default set of identifiers and metadata is returned;\n    setting <code>polygon=true</code> includes geometry fields in that default.\n  </p>\n  <h4>Examples</h4>\n  <ul>\n    <li>\n      <p><strong>Watershed data for a lat/lon:</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/watershed?lat=35.032056&amp;lon=-80.873972\">/watershed?<em style=\"color: brown\">lat=</em>35.032056&amp;<em style=\"color: brown\">lon=</em>-80.873972</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>Watershed data for a location, with polygon:</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/watershed?location=Athens Georgia&amp;polygon=true\">/watershed?<em style=\"color: brown\">location=</em>Athens Georgia&amp;<em style=\"color: brown\">polygon=</em>true</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>Watershed data for a state:</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/watershed?state=RI\">/watershed?<em style=\"color: brown\">state=</em>RI</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>Watershed data for HUC prefix:</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/watershed?huc=0307010310\">/watershed?<em style=\"color: brown\">huc=</em>0307010310</a></strong>\n            </div>\n    </li>\n  </ul>","parameters":[{"schema":{"type":"number"},"example":35,"in":"query","name":"lat","required":false,"description":"Lat"},{"schema":{"type":"number"},"example":-79,"in":"query","name":"lon","required":false,"description":"Lon"},{"schema":{"type":"string"},"in":"query","name":"attributes","required":false,"description":"Attributes"},{"schema":{"type":"boolean"},"in":"query","name":"polygon","required":false,"description":"Polygon"},{"schema":{"type":"string"},"in":"query","name":"state","required":false,"description":"State"},{"schema":{"type":"string"},"in":"query","name":"huc","required":false,"description":"Huc"},{"schema":{"type":"string"},"in":"query","name":"location","required":false,"description":"Location"},{"schema":{"type":"string"},"examples":{"json":{"value":"json"},"csv":{"value":"csv"},"html":{"value":"html"}},"in":"query","name":"output","required":false}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"properties":{"huc12":{"type":"string"},"name":{"type":"string"},"huc10":{"type":"string"},"huc10name":{"type":"string"},"huc8":{"type":"string"},"huc8name":{"type":"string"},"huc6":{"type":"string"},"huc6name":{"type":"string"},"huc4":{"type":"string"},"huc4name":{"type":"string"},"huc2":{"type":"string"},"huc2name":{"type":"string"},"tnmid":{"type":"string"},"metasourceid":{"type":"string"},"sourcedatadesc":{"type":"string"},"sourceoriginator":{"type":"string"},"sourcefeatureid":{"type":"string"},"referencegnis_ids":{"type":"string"},"states":{"type":"string"},"hutype":{"type":"string"},"humod":{"type":"string"},"tohuc":{"type":"string"},"globalid":{"type":"string"},"polygon":{"type":"string"},"areaacres":{"type":"number"},"areasqkm":{"type":"number"},"noncontributingareaacres":{"type":"number"},"noncontributingareasqkm":{"type":"number"},"shape_length":{"type":"number"},"shape_area":{"type":"number"},"loaddate":{"type":"string","format":"date"},"polygonarray":{"type":"array","items":{}}},"type":"object"}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"string","enum":["Could not connect to database from 10.244.5.254"]}}}}}}}}},"/county":{"get":{"summary":"County","tags":["Other"],"description":"<p>Returns county metadata for the point at (<code>lat,lon</code>).</p>\n  <p>\n    Optionally accept <code>attributes</code> (comma-separated) to choose fields;\n    using polygon in attributes expands to polygonarray (GeoJSON coordinates) and polygon (WKT).\n  </p>\n  <p>\n    If <code>attributes</code> is omitted, returns <code>county, state, state_code, countyfips, statefips</code>;\n    setting <code>polygon=true</code> adds the geometry fields.\n  </p>\n  <h4>Examples</h4>\n  <ul>\n    <li>\n      <p><strong>County data for a location</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/county?location=Athens GA\">/county?<em style=\"color: brown\">location=</em>Athens GA</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>County data for a lat/lon</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/county?lat=35&amp;lon=-79\">/county?<em style=\"color: brown\">lat=</em>35&amp;<em style=\"color: brown\">lon=</em>-79</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>County data including polygon</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/county?lat=35&amp;lon=-79&amp;polygon=true\">/county?<em style=\"color: brown\">lat=</em>35&amp;<em style=\"color: brown\">lon=</em>-79&amp;<em style=\"color: brown\">polygon=</em>true</a></strong>\n            </div>\n    </li>\n  </ul>","parameters":[{"schema":{"type":"number"},"example":35,"in":"query","name":"lat","required":true,"description":"Latitude"},{"schema":{"type":"number"},"example":-79,"in":"query","name":"lon","required":true,"description":"Longitude"},{"schema":{"type":"string"},"in":"query","name":"attributes","required":false,"description":"Attributes"},{"schema":{"type":"boolean"},"in":"query","name":"polygon","required":false,"description":"Polygon"},{"schema":{"type":"string"},"examples":{"json":{"value":"json"},"csv":{"value":"csv"},"html":{"value":"html"}},"in":"query","name":"output","required":false}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"properties":{"county":{"type":"string"},"state":{"type":"string"},"state_code":{"type":"string"},"countyfips":{"type":"string"},"statefips":{"type":"string"},"polygon":{"type":"string"},"polygonarray":{"type":"array","items":{}}},"type":"object"}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"string","enum":["Could not connect to database from 10.244.5.254"]}}}}}}}}},"/hardinesszone":{"get":{"summary":"Hardiness Zone","tags":["Other"],"description":"<p>Returns hardiness zone metadata for the point at (<code>lat,lon</code>).</p>\n  <p>Setting <code>polygon=true</code> adds the geometry fields.</p>\n  <h4>Examples</h4>\n  <ul>\n    <li>\n      <p><strong>Hardiness zone data for a location</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hardinesszone?location=Athens GA\">/hardinesszone?<em style=\"color: brown\">location=</em>Athens GA</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>Hardiness zone data for a lat/lon</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hardinesszone?lat=35&amp;lon=-79\">/hardinesszone?<em style=\"color: brown\">lat=</em>35&amp;<em style=\"color: brown\">lon=</em>-79</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>Hardiness zone data including polygon</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hardinesszone?lat=35&amp;lon=-79&amp;polygon=true\">/hardinesszone?<em style=\"color: brown\">lat=</em>35&amp;<em style=\"color: brown\">lon=</em>-79&amp;<em style=\"color: brown\">polygon=</em>true</a></strong>\n            </div>\n    </li>\n  </ul>","parameters":[{"schema":{"type":"number"},"example":35,"in":"query","name":"lat","required":true,"description":"Latitude"},{"schema":{"type":"number"},"example":-79,"in":"query","name":"lon","required":true,"description":"Longitude"},{"schema":{"type":"boolean"},"in":"query","name":"polygon","required":false,"description":"Polygon"}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"zone":{"type":"string"},"trange":{"type":"string"},"zonetitle":{"type":"string"},"polygon":{"type":"string"},"id":{"type":"number"},"gridcode":{"type":"number"},"polygonarray":{"type":"array","items":{}}}}}}}}}},"/mlra":{"get":{"summary":"MLRA","tags":["Other"],"description":"<p>\n    Returns MLRA (Major Land Resource Area) data based on either a point (<code>lat,lon</code>) or a specific MLRA symbol (<code>mlra</code>).\n  </p>\n  <p>\n    If <code>mlra</code> is provided, returns the MLRA’s name, symbol, associated Land Resource Region (lrrsym, lrrname), and aggregated counties, states, codes, and FIPS values that intersect the MLRA;\n    optionally includes geometry fields when <code>polygon=true.</code>\n  </p>\n  <p>\n    If <code>lat/lon</code> are provided instead, returns the MLRA polygon(s) containing that point,\n    with attributes defined by the attributes parameter (comma-separated list, where polygon expands to both GeoJSON polygonarray and WKT polygon).\n    Defaults to returning name, mlrarsym, lrrsym, and lrrname.\n  </p>\n  <h4>Examples</h4>\n  <ul>\n    <li>\n      <p><strong>MLRA data for a location</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/mlra?location=Athens GA\">/mlra?<em style=\"color: brown\">location=</em>Athens GA</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>MLRA data for a lat/lon</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/mlra?lat=35&amp;lon=-79\">/mlra?<em style=\"color: brown\">lat=</em>35&amp;<em style=\"color: brown\">lon=</em>-79</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>MLRA data including polygon</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/mlra?lat=35&amp;lon=-79&amp;polygon=true\">/mlra?<em style=\"color: brown\">lat=</em>35&amp;<em style=\"color: brown\">lon=</em>-79&amp;<em style=\"color: brown\">polygon=</em>true</a></strong>\n            </div>\n    </li>\n  </ul>","parameters":[{"schema":{"type":"number"},"example":35,"in":"query","name":"lat","required":false,"description":"Lat"},{"schema":{"type":"number"},"example":-79,"in":"query","name":"lon","required":false,"description":"Lon"},{"schema":{"type":"string"},"in":"query","name":"attributes","required":false,"description":"Attributes"},{"schema":{"type":"boolean"},"in":"query","name":"polygon","required":false,"description":"Polygon"},{"schema":{"type":"string"},"in":"query","name":"mlra","required":false,"description":"Mlra"},{"schema":{"type":"string"},"examples":{"json":{"value":"json"},"csv":{"value":"csv"},"html":{"value":"html"}},"in":"query","name":"output","required":false}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"properties":{"name":{"type":"string"},"mlrarsym":{"type":"string"},"lrrsym":{"type":"string"},"lrrname":{"type":"string"},"counties":{"type":"string"},"states":{"type":"string"},"state_codes":{"type":"string"},"countyfips":{"type":"string"},"statefips":{"type":"string"},"polygon":{"type":"string"},"polygonarray":{"type":"array","items":{}}},"type":"object"}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"string","enum":["Could not connect to database from 10.244.5.254"]}}}}}}}}},"/rosetta":{"post":{"summary":"Rosetta","tags":["Other"],"description":"<p>\n    Predicts van Genuchten parameters from soil characterization data (sand, silt, clay; optional bulk density, th33, th1500).\n  </p>\n  <p>\n    Calls the API described at\n    <a href=\"https://github.com/usda-ars-ussl/rosetta-soil\">https://github.com/usda-ars-ussl/rosetta-soil</a>,\n    and simply handles the CORS issue with that server.\n  </p>\n  <p>\n    Currently used for the Water DST only.\n  </p>","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"soildata":{"type":"array","description":"Soildata","example":[[30,30,40,1.5,0.3,0.1],[20,60,20],[55,25,20,1.1]]},"output":{"type":"string","example":"json"}}}}}},"security":[{"ApiKeyAuth":[]}],"responses":{}}},"/status":{"get":{"summary":"Health check","tags":["Database Utilities"],"description":"<p>Returns database connection status.</p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/status\">/status</a></strong>\n            </div>","security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"status":{"type":"string"},"last_nldas_import":{"type":"string","format":"date-time"},"hours_since_last_nldas":{"type":"number"},"last_mrms_import":{"type":"string","format":"date-time"},"hours_since_last_mrms":{"type":"number"}}}}}}}}},"/databasesize":{"get":{"summary":"Database Size","tags":["Database Utilities"],"description":"<p>Returns the database size as a human-readable string (e.g., '12 TB').</p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/databasesize\">/databasesize</a></strong>\n            </div>","parameters":[{"schema":{"type":"string"},"examples":{"json":{"value":"json"},"csv":{"value":"csv"},"html":{"value":"html"}},"in":"query","name":"output","required":false}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"additionalProperties":false,"properties":{"pretty_size":{"type":"string"},"size":{"type":"integer"}},"type":"object"}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"string","enum":["Could not connect to database from 10.244.5.254"]}}}}}}}}},"/tables":{"get":{"summary":"Tables","tags":["Database Utilities"],"description":"<p>Returns tables in the weather schema with a positive estimated row count.</p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/tables?output=html\">/tables?<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>","parameters":[{"schema":{"type":"string"},"examples":{"json":{"value":"json"},"csv":{"value":"csv"},"html":{"value":"html"}},"in":"query","name":"output","required":false}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"additionalProperties":false,"properties":{"row_number":{"type":"integer"},"table":{"type":"string"},"rows":{"type":"number"},"pretty_rows":{"type":"string"}},"type":"object"}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"string","enum":["Could not connect to database from 10.244.5.254"]}}}}}}}}},"/counttablesrows":{"get":{"summary":"Count Tables Rows","tags":["Database Utilities"],"description":"<p>Returns the number of tables and approximate number of rows in the database.</p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/counttablesrows\">/counttablesrows</a></strong>\n            </div>","parameters":[{"schema":{"type":"string"},"examples":{"json":{"value":"json"},"csv":{"value":"csv"},"html":{"value":"html"}},"in":"query","name":"output","required":false}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"additionalProperties":false,"properties":{"tables":{"type":"integer"},"rows":{"type":"number"},"pretty_rows":{"type":"string"}},"type":"object"}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"string","enum":["Could not connect to database from 10.244.5.254"]}}}}}}}}},"/indexes":{"get":{"summary":"Indexes","tags":["Database Utilities"],"description":"<p>Lists all indexes on non-system tables, ordered by index name.</p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/indexes?output=html\">/indexes?<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>","parameters":[{"schema":{"type":"string"},"examples":{"json":{"value":"json"},"csv":{"value":"csv"},"html":{"value":"html"}},"in":"query","name":"output","required":false}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"additionalProperties":false,"properties":{"row_number":{"type":"integer"},"schemaname":{"type":"string"},"tablename":{"type":"string"},"indexname":{"type":"string"},"index_size":{"type":"string"},"index_total_size":{"type":"string"},"idx_scan":{"type":"integer"},"idx_tup_read":{"type":"integer"},"idx_tup_fetch":{"type":"integer"},"indexdef":{"type":"string"}},"type":"object"}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"string","enum":["Could not connect to database from 10.244.5.254"]}}}}}}}}},"/countindexes":{"get":{"summary":"Count Indexes","tags":["Database Utilities"],"description":"<p>Returns the number of indexes.</p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/countindexes\">/countindexes</a></strong>\n            </div>","parameters":[{"schema":{"type":"string"},"examples":{"json":{"value":"json"},"csv":{"value":"csv"},"html":{"value":"html"}},"in":"query","name":"output","required":false}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"additionalProperties":false,"properties":{"indexes":{"type":"integer"}},"type":"object"}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"string","enum":["Could not connect to database from 10.244.5.254"]}}}}}}}}},"/addresses":{"get":{"summary":"Addresses","tags":["Database Utilities"],"description":"<p>For all locations searched by address rather than coordinates, returns a list of matching addresses along with their latitude/longitude and bounding boxes.</p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/addresses?output=html\">/addresses?<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>","parameters":[{"schema":{"type":"string"},"examples":{"json":{"value":"json"},"csv":{"value":"csv"},"html":{"value":"html"}},"in":"query","name":"output","required":false}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"additionalProperties":false,"properties":{"row_number":{"type":"integer"},"address":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"},"lat1":{"type":"number"},"lon1":{"type":"number"},"lat2":{"type":"number"},"lon2":{"type":"number"}},"type":"object"}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"string","enum":["Could not connect to database from 10.244.5.254"]}}}}}}}}},"/running_queries":{"get":{"summary":"Running_ Queries","tags":["Database Utilities"],"description":"<p>View all currently-running queries.</p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/running_queries?output=html\">/running_queries?<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>","parameters":[{"schema":{"type":"string"},"examples":{"json":{"value":"json"},"csv":{"value":"csv"},"html":{"value":"html"}},"in":"query","name":"output","required":false}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"additionalProperties":false,"properties":{"pid":{"type":"integer"},"state":{"type":"string"},"runtime":{"type":"string"},"query":{"type":"string"}},"type":"object"}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"string","enum":["Could not connect to database from 10.244.5.254"]}}}}}}}}},"/partitions":{"get":{"summary":"Partitions","tags":["Database Utilities"],"description":"<p>View sizes per partition.</p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/partitions?output=html\">/partitions?<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>","parameters":[{"schema":{"type":"string"},"examples":{"json":{"value":"json"},"csv":{"value":"csv"},"html":{"value":"html"}},"in":"query","name":"output","required":false}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"additionalProperties":false,"properties":{"schema":{"type":"string"},"parent":{"type":"string"},"leaf_count":{"type":"integer"},"bytes":{"type":"number"},"total_size":{"type":"string"}},"type":"object"}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"string","enum":["Could not connect to database from 10.244.5.254"]}}}}}}}}},"/hits":{"get":{"summary":"API Hits","tags":["Database Utilities"],"description":"<p>\n    Retrieves recent API calls, including:\n  </p>\n  <ul>\n    <li><code>date</code> – timestamp of the request</li>\n    <li><code>ip</code> – client IP address</li>\n    <li><code>ms</code> – execution time in milliseconds</li>\n    <li><code>query</code> – request</li>\n  </ul>\n  <p>\n    By default, returns calls from the most recent <strong>14 days</strong>.\n    You can control the lookback window with the <code>days</code> query parameter (allowed range <code>1–30</code> days;\n    values above 30 are clamped to 30).\n  </p>\n  <p>\n    Results are sorted by <strong>descending date</strong> by default,\n    but can be sorted by <strong>descending execution time</strong> using the <code>order</code> query parameter.\n  </p>\n  <h4>Examples</h4>\n  <ul>\n    <li>\n      <p><strong>Recent API calls (last 14 days, sorted by date)</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hits?output=html\">/hits?<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>Recent API calls (last 7 days, sorted by date)</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hits?days=7&amp;output=html\">/hits?<em style=\"color: brown\">days=</em>7&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n    </li>\n    <li>\n      <p><strong>Recent API calls (last 30 days, sorted by time to run)</strong></p>\n            <div style=\"white-space: nowrap; overflow: auto;\">\n              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n              <strong><a target=\"_blank\" href=\"/hits?days=30&amp;order=ms&amp;output=html\">/hits?<em style=\"color: brown\">days=</em>30&amp;<em style=\"color: brown\">order=</em>ms&amp;<em style=\"color: brown\">output=</em>html</a></strong>\n            </div>\n    </li>\n  </ul>","parameters":[{"schema":{"type":"string","enum":["date","ms"]},"example":"date","in":"query","name":"order","required":false,"description":"Order"},{"schema":{"type":"number","default":14},"example":7,"in":"query","name":"days","required":false,"description":"Number of days to look back from today"},{"schema":{"type":"string"},"examples":{"json":{"value":"json"},"csv":{"value":"csv"},"html":{"value":"html"}},"in":"query","name":"output","required":false}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"additionalProperties":false,"properties":{"date":{"type":"string","format":"date-time"},"ip":{"type":"string","format":"ipv4"},"ms":{"type":"integer"},"query":{"type":"string"}},"type":"object"}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"string","enum":["Could not connect to database from 10.244.5.254"]}}}}}}}}},"/nvm2Data":{"get":{"summary":"NVM data","tags":["NLDAS vs. MRMS"],"description":"NVM data","parameters":[{"schema":{"type":"string"},"examples":{"json":{"value":"json"},"csv":{"value":"csv"},"html":{"value":"html"}},"in":"query","name":"output","required":false}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"additionalProperties":false,"properties":{"lat":{"type":"integer"},"lon":{"type":"integer"},"year":{"type":"integer"}},"type":"object"}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"string","enum":["Could not connect to database from 10.244.5.254"]}}}}}}}}},"/nvm2":{"get":{"summary":"NVM output","tags":["NLDAS vs. MRMS"],"description":"NVM output","parameters":[{"schema":{"type":"number"},"example":35,"in":"query","name":"lat","required":true,"description":"Latitude"},{"schema":{"type":"number"},"example":-79,"in":"query","name":"lon","required":true,"description":"Longitude"},{"schema":{"type":"number"},"example":2019,"in":"query","name":"year","required":false,"description":"Year"}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"string","enum":["Could not connect to database from 10.244.5.254"]}}}}}}}}},"/nvm2Query":{"get":{"summary":"NVM query","tags":["NLDAS vs. MRMS"],"description":"NVM query","parameters":[{"schema":{"type":"string"},"example":"mrms IS NOT NULL","in":"query","name":"condition","required":false,"description":"Condition"},{"schema":{"type":"string"},"examples":{"json":{"value":"json"},"csv":{"value":"csv"},"html":{"value":"html"}},"in":"query","name":"output","required":false}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"string","enum":["Could not connect to database from 10.244.5.254"]}}}}}}}}},"/nvm2Update":{"get":{"summary":"NVM update","tags":["NLDAS vs. MRMS"],"description":"NVM update","parameters":[{"schema":{"type":"string"},"in":"query","name":"red","required":false,"description":"Red"},{"schema":{"type":"string"},"in":"query","name":"orange","required":false,"description":"Orange"},{"schema":{"type":"string"},"in":"query","name":"mismatch","required":false,"description":"Mismatch"},{"schema":{"type":"string"},"in":"query","name":"delta","required":false,"description":"Delta"},{"schema":{"type":"string"},"in":"query","name":"diff","required":false,"description":"Diff"},{"schema":{"type":"string"},"in":"query","name":"mvm","required":false,"description":"Mvm"},{"schema":{"type":"string"},"in":"query","name":"mrms","required":false,"description":"Mrms"},{"schema":{"type":"string"},"in":"query","name":"lat","required":false,"description":"Lat"},{"schema":{"type":"string"},"in":"query","name":"lon","required":false,"description":"Lon"},{"schema":{"type":"string"},"examples":{"json":{"value":"json"},"csv":{"value":"csv"},"html":{"value":"html"}},"in":"query","name":"output","required":false}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"string","enum":["Could not connect to database from 10.244.5.254"]}}}}}}}}},"/mrv/categories":{"get":{"summary":"MRV Categories","tags":["MRV"],"description":"MRV Categories","parameters":[{"schema":{"type":"string"},"example":"SPAINCALIBRACIONPRISMA2025","in":"query","name":"state","required":false,"description":"State"},{"schema":{"type":"string"},"example":"25-0625","in":"query","name":"date","required":false,"description":"Date"},{"schema":{"type":"string"},"examples":{"json":{"value":"json"},"csv":{"value":"csv"},"html":{"value":"html"}},"in":"query","name":"output","required":false}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"additionalProperties":false,"properties":{"field":{"type":"string"},"category":{"type":"string"}},"type":"object"}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"string","enum":["Could not connect to database from 10.244.5.254"]}}}}}}}}},"/mrv/setcategory":{"get":{"summary":"MRV Set category","tags":["MRV"],"description":"MRV Set category","parameters":[{"schema":{"type":"string"},"in":"query","name":"state","required":false,"description":"State"},{"schema":{"type":"string"},"in":"query","name":"date","required":false,"description":"Date"},{"schema":{"type":"string"},"in":"query","name":"field","required":false,"description":"Field"},{"schema":{"type":"string"},"in":"query","name":"category","required":false,"description":"Category"},{"schema":{"type":"string"},"examples":{"json":{"value":"json"},"csv":{"value":"csv"},"html":{"value":"html"}},"in":"query","name":"output","required":false}],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"additionalProperties":true,"properties":{},"type":"object"}}}}}}}},"/redoc":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/":{"get":{"responses":{"200":{"description":"Default Response"}}}}}}