API Docs
/api/location
/api/typicalweather
/api/countries
/api/metrics
/api/anomalies
/api/compare
/api/timeseries
/api/anom
/api/degreedays
/api/dailycomp
/api/events
/api/climatetrends
/api/climatecomps
/api/breaking
/api/recentextremes
/api/extremes
/api/besttime
/api/bestplace
/api/seasonal
/api/fcastevalbygroup
/api/fcastevalbylocation
Get Token
Use Weathersight inside Claude
Connect Claude to Weathersight and ask about climate normals, anomalies, extremes, and long-term trends in plain language.
- The URL above is copied to your clipboard.
- Claude opens on Settings → Connectors → Add custom connector.
- Paste the URL, click Add, then Connect and sign in.
Signing in creates your Weathersight API token if you don't already have one. API docs
Returns meta information for a location given a name, locid, or lat/lon.
When to use: Obtain the canonical locid needed by all location-specific API calls. Typically the first call in any workflow.
Performance: Fast — precomputed lookup.
Prerequisites: None — this is the entry point.
Investigate: Call first whenever the user names a city or region; cache the locid for all subsequent calls in the session. Use 'City, State Country' format (e.g. 'Austin TX USA').
Augment: Resolve city names from the article to locids early; reuse them throughout augmentation to avoid repeated name lookups.
Request
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| token | Token | Required | |
| name | Common name of metro or metro area. for ex: New York, Beijing, Mumbai Airport | Optional | |
| locid | Unique Location Identifier | Optional | |
| latlon | Latitude,Longitude ex: 40.78,-73.97 | Optional |
Response
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| name | Standard location name | Yes | |
| locid | Unique Location Identifier | Yes | |
| friendly | Friendly name for location | Yes | |
| lat | Latitude | Yes | |
| long | Longitude | Yes | |
| timezone | Timezone | Yes | |
| country | Unique Country Identifier | No | |
| icao | ICAO code | No | |
| elevation | Elevation(m) | No | |
| wmo | WMO id | No |
Returns statistical distributions of weather attributes (temperature, precipitation, wind, etc.) for a location and time period.
When to use: Establish the climatological baseline — what is 'normal' for this location and period. Use before discussing anomalies.
Date format: YYYY[MM[DD]]: YYYYMMDD for a specific week, YYYYMM for a month, YYYY for a seasonal or annual overview. Note: YYYYMMDD does not give info about daily obs. If a date is specified it corresponds to the week. Use /events for daily history.
Performance: Computed on demand; moderate speed. Avoid date spans wider than one year.
Prerequisites: Use /location to obtain a locid first.
Investigate: Good for grounding anomaly claims — e.g. 'Is 35°C in July unusual for Madrid?' Check distributions before asserting extremeness.
Augment: Use to provide climatological context before describing observed anomalies in an article.
Request
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| token | Token | Required | |
| ymd_start | Start of period (YYYY[MMDD]) | Required | |
| ymd_end | End of period (YYYY[MMDD]) | Required | |
| name | Common name of metro or metro area. for ex: New York, Beijing, Mumbai Airport | Optional | |
| locid | Unique Location Identifier | Optional | |
| latlon | Latitude,Longitude ex: 40.78,-73.97 | Optional | |
| hour_start | Hour Start (00 to 24) | Optional | 24 |
| hour_end | Hour End (00 to 24) | Optional | 24 |
| lookback | Years looked back[1] (1 to 40) | Optional | 30 |
Response
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| duration | Duration in days | Yes | |
| observations | Distribution of various daily observations: Mapping of metric-name: Dist | Yes | |
| conditions | Distribution of various weather conditions Mapping of metric-name: Dist | Yes | |
| probs | Same as conditions expressed as number of occurences in a 100 day period. Mapping of metric-name: Dist | Yes | |
| pcps | Distribution of sum of precipiation. Mapping of metric-name: Dist | Yes | |
| means | Distribution of means across periods. Mapping of metric-name: Dist | Yes | |
| >> | Dist: N: int , X: int , mean: float , stddev: float , min: float , max: float , p1: float , p5: float , p10: float , p25: float , p50: float , p75: float , p90: float , p95: float , p99: float , max_key: str , min_key: str | Yes |
Returns countries with their canonical country IDs used in all other API calls.
When to use: Resolve country names to canonical IDs, or obtain the full list of supported countries. This list rarely changes.
Performance: Fast — static data; safe to cache across calls.
Prerequisites: None.
Investigate: Call once if country-level filtering is needed; cache the result for the session.
Augment: Fetch country IDs before making country-filtered calls to /anomalies or /breaking.
Request
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| token | Token | Required | |
| ctryid | Country Id | Optional |
Response
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| countries | Applicable countries found. List[country] | Yes | |
| country.ctryid | Country Id | Yes | |
| country.name | Country Name | Yes | |
| country.regions | List of region ids | Yes |
Returns the catalogue of all supported weather metric identifiers with units and categories.
When to use: Resolve metric IDs to human-friendly names, units, and categories. Call once and cache per session.
Performance: Fast — static data; safe to cache for the lifetime of a session.
Prerequisites: None.
Investigate: Call once at session start; use metric.id as a lookup key throughout the conversation.
Augment: Translate metric IDs into readable labels for article text and chart axes.
Request
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| token | Token | Required |
Response
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| metrics | Supported metrics List[metric] | Yes | |
| metric.id | Metric Id | Yes | |
| metric.name | Metric Friendly Name | Yes | |
| metric.cat | Metric category [temp | dew| precip| storm| wind| air] | Yes | |
| metric.type | One of Count | Sum | Dist Count.{count, N, X} , Sum.{sum, N, X}. See Dist above. | Yes | |
| metric.dist | If '1' available as distribution Dist in some contexts. ex. A distrib of obs.is_rain.count returned by /typicalweather. If '0', the metric is the mean,min,max,median of a metric appearing in an outlier or anomaly. | Yes |
Returns precomputed anomalous observations for locations in a given time period and scope.
When to use: Survey anomalous weather at regional or global scale quickly without specifying individual cities.
Date format: YYYY[MM[DD]]: YYYY for annual anomalies (scope=year), YYYYMM for monthly (scope=month), YYYYMMDD for weekly or daily (scope=week/day).
Performance: Fast — retrieves precomputed data.
Prerequisites: None; global or country-filtered. Use /countries for country IDs.
Investigate: Good early call to identify which locations experienced anomalies before drilling into specifics with /anom or /dailycomp.
Augment: Use for a first-pass global scan to identify story-worthy anomalies before fetching per-location detail.
Request
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| token | Token | Required | |
| ymd | Time Period YYYY[MMDD] | Required | |
| anomaly_type | Anomaly Type [HIGH | LOW] | Optional | |
| scope | Scope Type [week | month | year] | Optional | |
| period_type | Period Type [MONTH | WEEK | YEAR | DAY | FULL_DAY | FUTURE_DAY] | Optional | DAY |
| name | Common name of metro or metro area. for ex: New York, Beijing, Mumbai Airport | Optional | |
| latlon | Latitude,Longitude ex: 40.78,-73.97 | Optional | |
| locid | Unique Location Identifier | Optional | |
| z | Minimum avg std-devs departure from mean | Optional | 0 |
| ctryid | Country IDs (comma sep) returned by /api/countries | Optional | |
| metrics | One of metrics returned by /api/metrics. Overrides 'CAT' | Optional | |
| category | Metrics Category[Not Available] as defined by /api/metrics | Optional |
Response
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| anomalies | Results List[anomaly] | Yes | |
| anomaly.locid | Unique Location Id | Yes | |
| anomaly.lat | Latitude | Yes | |
| anomaly.long | Longitude | Yes | |
| anomaly.obs_start | Start of observation period YYYY[MMDD] | Yes | |
| anomaly.obs_end | End of observeation period YYYY[MMDD] | Yes | |
| anomaly.obs_dur | Number of observations seen N[h | d] ex 24h in a day or 30d in a month | Yes | |
| anomaly.base_start | Start of baseline period YYYY[MMDD] | Yes | |
| anomaly.base_end | End of baseline period YYYY[MMDD] | Yes | |
| anomaly.base_dur | Number of obs seen in baseline period N[h | d] : ex 24h in a day or 30d in a month | Yes | |
| anomaly.obs_period | Observation Period (in years) | Yes | |
| anomaly.base_period | Baseline Period (in years) | Yes | |
| anomaly.outliers | List of metrics and their comparison data List[outlier] | Yes | |
| outlier.obs_metric | Name of metric as defined in /api/metric | Yes | |
| outlier.percentile | Percentile of metric breached. ex: p1 (new p1), p99 (new p99) , max (new maximum) | Yes | |
| outlier.obs_N | Number of valid observations for this metric | Yes | |
| outlier.obs_X | Number of missing observations for this metric | Yes | |
| outlier.base_N | Number of valid baseline observations | Yes | |
| outlier.base_X | Number of missing baseline observations | Yes | |
| outlier.obs_val | Observed value | Yes | |
| outlier.base_val | Baseline value | Yes | |
| outlier.base_mean | Mean of baseline | Yes | |
| outlier.base_stddev | Std deviation of baseline | Yes | |
| outlier.min | Min value of baseline | Yes | |
| outlier.max | Max value of baseline | Yes | |
| outlier.max_key | Max key of baseline | Yes | |
| outlier.min_key | Min key of baseline | Yes | |
| outlier.obs_min_key | Min key of observation if min is set | Yes | |
| outlier.obs_max_key | Max key of observation if max is set | Yes |
Compares a location's observed weather period against the corresponding periods in a historical baseline distribution.
When to use: Quantify how extreme a specific period was across all metrics at once — e.g. how anomalous was March 2025 at New York vs the 1991–2020 baseline.
Date format: YYYY[MM[DD]]: YYYYMMDD for a specific day or short window (period_type DAY/WEEK), YYYYMM for a month (period_type MONTH), YYYY for an annual comparison (period_type YEAR).
Performance: Computed on demand; fast for short periods.
Prerequisites: Use /location to obtain a locid first.
Investigate: Best for 'how unusual was [period] at [location]?' — returns percentile and z-score across all metrics simultaneously. Set baseline_offset=1 for the standard 1991–2020 baseline.
Augment: Provides the precise statistical framing ('the hottest March in 30 years') before describing the anomaly in prose.
Request
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| token | Token | Required | |
| ymd_start | Start of period (YYYY[MMDD]) | Required | |
| ymd_end | End of period (YYYY[MMDD]) | Required | |
| name | Common name of metro or metro area. for ex: New York, Beijing, Mumbai Airport | Optional | |
| latlon | Latitude,Longitude ex: 40.78,-73.97 | Optional | |
| locid | Unique Location Identifier | Optional | |
| period_type | Period Type [ MONTH | YEAR | WEEK | DAY | FULL_DAY | FUTURE_DAY] | Optional | DAY |
| baseline_period | Baseline period in years | Optional | 30 |
| baseline_offset | Baseline offset in years | Optional | 1 |
| observed_period | Observed period | Optional | 1 |
Response
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| comparisons | Results List[comparison] | Yes | |
| comparison.locid | Unique Location Id | Yes | |
| comparison.lat | Latitude | Yes | |
| comparison.long | Longitude | Yes | |
| comparison.obs_start | Start of observation period YYYY[MMDD] | Yes | |
| comparison.obs_end | End of observeation period YYYY[MMDD] | Yes | |
| comparison.obs_dur | Number of observations seen N[h | d] ex 24h in a day or 30d in a month | Yes | |
| comparison.base_start | Start of baseline period YYYY[MMDD] | Yes | |
| comparison.base_end | End of baseline period YYYY[MMDD] | Yes | |
| comparison.base_dur | Number of obs seen in baseline period N[h | d] : ex 24h in a day or 30d in a month | Yes | |
| comparison.obs_period | Observation Period (in years) | Yes | |
| comparison.base_period | Baseline Period (in years) | Yes | |
| comparison.outliers | List of metrics and their comparison data List[outlier] | Yes | |
| outlier.obs_metric | Name of metric as defined in /api/metric | Yes | |
| outlier.percentile | Percentile of metric breached. ex: p1 (new p1), p99 (new p99) , max (new maximum) | Yes | |
| outlier.obs_N | Number of valid observations for this metric | Yes | |
| outlier.obs_X | Number of missing observations for this metric | Yes | |
| outlier.base_N | Number of valid baseline observations | Yes | |
| outlier.base_X | Number of missing baseline observations | Yes | |
| outlier.obs_val | Observed value | Yes | |
| outlier.base_val | Baseline value | Yes | |
| outlier.base_mean | Mean of baseline | Yes | |
| outlier.base_stddev | Std deviation of baseline | Yes | |
| outlier.min | Min value of baseline | Yes | |
| outlier.max | Max value of baseline | Yes | |
| outlier.max_key | Max key of baseline | Yes | |
| outlier.min_key | Min key of baseline | Yes | |
| outlier.obs_min_key | Min key of observation if min is set | Yes | |
| outlier.obs_max_key | Max key of observation if max is set | Yes |
Returns aggregated metric values as a yearly or monthly timeseries for a location.
When to use: Detect long-term trends and compute statistical significance (r-squared, p-value). Best suited for multi-decade spans.
Date format: mm_dd_start/mm_dd_end as MMDD (day-of-year window, not a calendar year); year_start/year_end as YYYY. Note: Use mm_dd_start/mm_dd_end as MM when months are specified and MMDD when week-level granularity is needed. When day-level info is needed use /events or /dailycomp.
Performance: Computed on demand; slower for large date ranges or many metrics.
Prerequisites: Use /location to obtain a locid first.
Investigate: Use for trend analysis ('Is max temperature at location X increasing over decades?'). Combine with r-squared post-processing for significance.
Augment: Provides decadal trend context alongside current anomalies ('temperatures have risen 1.5°C over 40 years').
Request
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| token | Token | Required | |
| metrics | Comma separated list of tuple describing aggregation function:metric_id.attribute ex: sum:obs.is_rain.count, avg:max_t.p99 agg_func = {sum,avg,min,max}. See /api/metrics for metric and attribtutes | Required | |
| name | Common name of metro or metro area. for ex: New York, Beijing, Mumbai Airport | Optional | |
| latlon | Latitude,Longitude ex: 40.78,-73.97 | Optional | |
| locid | Unique Location Identifier | Optional | |
| year_start | Year start start YYYY | Optional | 1975 |
| year_end | Year end YYYY | Optional | 2025 |
| month_day_start | Month day start MM[DD] | Optional | |
| month_day_end | Month day start MM[DD] | Optional | |
| hour_start | Hour Start (00 to 24) | Optional | 24 |
| hour_end | Hour End (00 to 24) | Optional | 24 |
| groupby | Aggregating key: Year | Month | Week | Hour | Optional | Year |
| src_type | Data source type: Obs (station observations) | ERA5 (reanalysis gridded data) | Optional | Obs |
Response
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| locid | Unique Location identifier | Yes | |
| lat | Latitude of location | Yes | |
| lon | Longitude of location | Yes | |
| xvals | List of x-values | Yes | |
| yvals | Dict of metric : list of y-values | Yes |
Returns observations with 1991–2020 baseline comparisons at daily, weekly, or monthly granularity for a location and period.
When to use: Graph or tabulate recent anomalies at a location for a specific period — e.g. 'how did last month compare to normal?'
Date format: YYYYMMDD for ymd; use groupby (day/week/month) to control granularity. For 'last week' use YYYYMMDD of 7 days ago. For 'last month' use YYYYMM of prior month.
Performance: Computed on demand; moderate speed.
Prerequisites: Use /location to obtain a locid first.
Investigate: Use after /anomalies or /breaking. Identifies a city of interest; provides per-day/week detail for drill-down. Combine groupby=DAY/FULL_DAY with a recent date range for 'recent days with departure from normal' queries.
Augment: Provides the per-period anomaly series for prose ('temperatures were above normal for 12 of the past 14 days').
Request
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| token | Token | Required | |
| ymd_start | Start of period (YYYY[MMDD]) | Required | |
| ymd_end | End of period (YYYY[MMDD]) | Required | |
| name | Common name of metro or metro area. for ex: New York, Beijing, Mumbai Airport | Optional | |
| latlon | Latitude,Longitude ex: 40.78,-73.97 | Optional | |
| locid | Unique Location Identifier | Optional | |
| period_type | Period Type [ MONTH | YEAR | WEEK | DAY | FULL_DAY | FUTURE_DAY] | Optional | FULL_DAY |
| observed_period | Observed period | Optional | 1 |
Response
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| loc | Location information | Yes | |
| ts | List of datestamps (YYYYMMDD). Its length is equal to length of lists appearing in vals, N, vals_ts, baseline. | Yes | |
| vals | Values (float) of the metrics corresponding to ts. It is dict with metric id (See /metrics) as the key and a list of corresponding values of the metric as the value. If a value is missing or unknown, null appears. | Yes | |
| N | Number of data points available per metric, corresponding to ts. It is dict with metric id (See /metrics) as the key and a list of corresponding int as the value. | Yes | |
| vals_ts | Timestamps at which max or min of metric was recorded, corresponding to ts. It is dict with metric id (See /metrics) as the key and a list of corresponding values of the metric as the value. If a value is missing or unknown, null appears. | Yes | |
| baseline | Distributions of the metrics corresponding to baseline period, corresponding to ts. It is dict with metric id (See /metrics) as the key and a list of corresponding Dist objects (See Dist above) corresponding to the distributions of the metrics the value. If a value is missing or unknown, null appears. | Yes |
Returns cumulative degree-day indicators (heating/cooling/growing) for a location and period using ERA5 reanalysis data.
When to use: Estimate energy demand anomalies or agricultural stress in a recent or upcoming period.
Date format: YYYYMMDD for ymd_start and ymd_end. Maximum interval is 14 days per call.
Performance: Computed on demand using ERA5; moderate speed. Keep intervals to ≤14 days.
Prerequisites: Requires lat/lon directly — no locid needed.
Investigate: Use when the query involves power grid strain or energy demand. For forecast context, use future ymd dates.
Augment: Adds quantitative energy-demand context to heatwave or cold snap stories.
Request
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| token | Token | Required | |
| latlon | Latitude,Longitude ex: 40.78,-73.97 | Required | |
| ymd_start | Start of period (YYYYMMDD) | Optional | |
| ymd_end | End of period (YYYYMMDD) | Optional | |
| is_forecast | Forecast requested? (0|1) | Optional | 1 |
| indicators | Comma separated list of indicator names. ['hdd'|'cdd'|'wbcdd'|'gdd] | Optional | hdd,cdd,wbcdd |
| base_temp_C | Base temperature in °C for all indicators | Optional | 18.3 |
| unit | Degree days as measured in F|C | Optional | C |
Response
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| meta | Meta information of location | Yes | |
| indicators | Dict[str, List[List[(float, Dict['N': float, 'mean': float, 'std': float])]. The key is the indicator name. The value is a matrix with first row and col describing the start and end labels of the days and other cells are a pair of the indicator value and the baseline; described by its mean(mean), std deviation (std) and the number of years used for its computation (N). The cumulative value of period starting on day value[row][0] and ending on value[0][col] is found in value[row+1][col+1]. The maximum period length is 14 days. | Yes |
Returns per-day observed values with percentiles and z-scores vs a sliding N-day window over a historical baseline.
When to use: Graph heatwaves, cold spells, and other streaks by showing daily departures from normal. Also compare two separate periods or locations using z-scores or percentiles for normalized severity.
Date format: YYYYMMDD for ymd_start and ymd_end. Keep ranges ≤30 days for fast response; up to 90 days is feasible.
Performance: Computed on demand; slower for long date ranges.
Prerequisites: Use /location to obtain a locid first.
Investigate: Best for detailed day-by-day anomaly investigation once approximate dates and location are known. Use separate calls for two periods to compare heatwave severity via z-score. Do NOT use for ranking top-N events across years — call /events with criteria for that and post-process the response.
Augment: Provides the daily series needed to describe the arc of a heatwave or cold snap in a news narrative.
Request
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| token | Token | Required | |
| ymd_start | Observation start date (YYYYMMDD), max 5-year span | Required | |
| ymd_end | Observation end date (YYYYMMDD) | Required | |
| name | Location name, e.g. New York | Optional | |
| latlon | Latitude,Longitude ex: 40.78,-73.97 | Optional | |
| locid | Unique Location Identifier | Optional | |
| category | Category: Temp | Prcp | Wind | Humidity | Optional | Temp |
| baseline_year_start | Baseline year start YYYY | Optional | 1991 |
| baseline_year_end | Baseline year end YYYY | Optional | 2020 |
| window | Sliding window days (3-7) | Optional | 7 |
Response
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| locid | Unique Location Id | Yes | |
| lat | Latitude | Yes | |
| lon | Longitude | Yes | |
| dates | Ordered list of observation date strings e.g. ['2025-06-01', '2025-06-02', ...] | Yes | |
| num_years | Number of baseline years e.g. 30 for 1991-2020 | Yes | |
| avg_coverage | Dict of metric_key -> average baseline coverage fraction across dates e.g. {'max_t': 0.94}. Values near 1.0 indicate dense baseline data. | Yes | |
| metrics | Dict of metric_key -> per-day arrays dict[metric -> metric_data]. All arrays are parallel to 'dates' (one value per date). | Yes | |
| metrics.{key}.values | Observed values (scaled to display units), None where missing e.g. [38.2, 37.5, None, ...] | Yes | |
| metrics.{key}.pcts | Percentile of each observed value within the baseline window (0-100). e.g. 98.5 means the obs exceeded 98.5% of baseline days. None if obs missing. | Yes | |
| metrics.{key}.sigmas | Z-score of each observed value vs baseline mean/stddev. e.g. 2.3 means 2.3 standard deviations above baseline mean. None if obs missing. | Yes | |
| metrics.{key}.p1 … p99 | Baseline window percentiles for each date: p1, p5, p10, p25, p50, p75, p90, p95, p99. Computed from a ±window/2 day sliding window across baseline years. | Yes | |
| metrics.{key}.bmin / bmax | Baseline window minimum and maximum for each date. | Yes | |
| metrics.{key}.mean | Baseline window mean for each date. | Yes | |
| metrics.{key}.stddev | Baseline window standard deviation for each date. | Yes | |
| metrics.{key}.coverage | Baseline data coverage fraction for each date: actual_pts / (window * num_years). e.g. 0.90 means 90% of expected baseline values were present. | Yes |
Finds days matching one or more compound weather conditions (e.g. hot + humid, rainy + windy) for a location. Returns up to 5000 most-recent matching events plus the total count.
When to use: Count occurrences of compound weather events across years, study extreme or unusual day combinations, or identify streaks of such events.
Date format: year_start/year_end as YYYY; month_day_start/month_day_end as MMDD for seasonal filtering within each year.
Performance: Computed on demand; returns up to 5000 most-recent matches.
Prerequisites: Use /location to obtain a locid first.
Investigate: Use when the query involves compound conditions — 'how many days had both extreme heat and thunderstorms?' Combine numeric and condition metrics with AND/OR logic.
Augment: Provides event frequency counts for framing rarity in a story ('only 3 such days in the past 20 years').
Notes: Numeric metrics: cloudiness, dewp, dpd, gust, hail_size, hi, insolation, max_dewp, max_dpd, max_hi, max_t, max_wbgt, max_wbulb, max_wind, min_dewp, min_t, min_wchill, rain, rain_12hr, rain_1hr, rain_3hr, rain_6hr, snow, snow_12hr, snow_1hr, snow_3hr, snow_6hr, snow_depth, temp, visibility, wbgt, wbulb, wchill, wind, wind_dir. Condition metrics: is_drizzle, is_dust, is_duststorm, is_fog, is_frozen_rain, is_funnel_cloud, is_hail, is_haze, is_heavy_rain, is_heavy_snow, is_ice_pellets, is_mist, is_rain, is_smoke, is_snow, is_squall, is_thunderstorm. Do not specify lower or upper bound when dealing with absolutes unless it is required. Sensible defaults are populated automatically and if the values provided fall out of those, the request is deemed invalid.
Request
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| token | Token | Required | |
| criteria | JSON array of criteria objects. Each criterion is either a numeric criterion {"metric":" | Required | |
| name | Location name, e.g. New York | Optional | |
| latlon | Latitude,Longitude ex: 40.78,-73.97 | Optional | |
| locid | Unique Location Identifier | Optional | |
| year_start | Year start (YYYY) | Optional | 2024 |
| year_end | Year end (YYYY, inclusive) | Optional | 2026 |
| month_day_start | Month-day start filter MMDD e.g. 0601 (June 1). Omit for full year. | Optional | |
| month_day_end | Month-day end filter MMDD e.g. 0831 (Aug 31). Omit for full year. | Optional | |
| baseline | Baseline period used to resolve sigma/percentile bounds, format YYYY_YYYY | Optional | 1991_2020 |
Response
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| locid | Location identifier | Yes | |
| name | Location display name | Yes | |
| total_events | Total number of matching events (before 5000 cap) | Yes | |
| events | List of event rows, most recent first, capped at 5000 | Yes | |
| datestamp | Date of event (YYYYMMDD) | Yes | |
| max_t | Max temperature °C (always present, null if unavailable) | Yes | |
| max_t_complete | True if max_t is from direct observation (not derived), always present | Yes | |
| min_t | Min temperature °C (always present, null if unavailable) | Yes | |
| min_t_complete | True if min_t is from direct observation (not derived), always present | Yes | |
| rain | Rainfall mm (always present, null if unavailable) | Yes | |
| rain_complete | True if rainfall measurement covers the full day, always present | Yes | |
| snow | Snowfall mm (always present, null if unavailable) | Yes | |
| temp | Mean temperature °C (always present, null if unavailable) | Yes | |
| dewp | Mean dewpoint °C (always present, null if unavailable) | Yes | |
| wind | Mean wind speed km/hr (always present, null if unavailable) | Yes | |
| max_wind | Max wind speed km/hr (always present, null if unavailable) | Yes | |
| gust | Max gust km/hr (always present, null if unavailable) | Yes | |
| conditions | Comma-separated active weather conditions (always present, null if none) | Yes | |
| criteria_met | Dict of metric -> 1/0 for each must_have=false criterion: 1 = criterion satisfied for this row, 0 = not satisfied. Always present; empty dict if no optional criteria were supplied. | Yes |
Returns monthly timeseries of selected climate trend metrics for one or more locations, suitable for long-term trend analysis.
When to use: Retrieve long-term monthly timeseries for statistical trend analysis across any number of locations including globally. Use num_years and avg_N to filter sparse records.
Date format: years as YYYY- range (e.g. '1975-' for 1975 to present); months as MM or MM-MM range (e.g. '06' for June, '06-08' for June–August, 'All' for annual).
Performance: Bulk query — can be slow for global or many-location queries. Filter with locids, lat_lon/radius_km, or countries to improve speed.
Prerequisites: Use /location to obtain locids first for point queries.
Investigate: Use for global or regional trend analysis. Metric name format: 'agg_func:metric_id.attribute' (e.g. 'avg:max_t.p50'). Check num_years to confirm data completeness before citing a trend.
Augment: Backs trend claims with long-term data across many locations (e.g. 'temperatures rising across Southeast Asia').
Notes: Example metrics: avg:max_t.p50, avg:obs.temp.mean, sum:obs.is_rain.count. See /api/metrics for full list.
Request
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| token | Token | Required | |
| metrics | Comma-separated metric(s) in format agg_func:metric_id.attribute. Example: avg:max_t.p50. Available: avg:max_t.mean, avg:max_t.p10, avg:max_t.p5, avg:max_t.p90, avg:max_t.p95, avg:max_wind.p95, avg:min_t.mean, avg:min_t.p10, avg:min_t.p5, avg:min_t.p90, avg:min_t.p95, avg:obs.dewp.mean, avg:obs.dewp.p5, avg:obs.dewp.p95, avg:obs.dpd.mean, avg:obs.dpd.p95, avg:obs.rain.p95, avg:obs.rainh.p95, avg:obs.snow.p95, avg:obs.temp.mean, avg:obs.temp.p5, avg:obs.temp.p50, avg:obs.temp.p95, avg:obs.wbulb.mean, avg:obs.wbulb.p95, avg:obs.wind.mean, avg:obs.wind.p5, avg:obs.wind.p50, avg:obs.wind.p95, sum:obs.is_fog.count, sum:obs.is_hail.count, sum:obs.is_rain.count, sum:obs.is_smoke.count, sum:obs.is_snow.count, sum:obs.is_thunderstorm.count, sum:obs.rain.sum, sum:obs.snow.sum | Required | |
| src_type | Data source: Obs (station observations) | ERA5 (reanalysis). ERA5 provides global coverage including ocean areas. | Optional | Obs |
| years | Year range string. Known values: '1975-' (data from 1975 onward). | Optional | 1975- |
| months | Single month ('06') or hyphenated range ('03-05' for March-May, '06-08' for June-August) or 'All' for annual trends. Example: '06' or '03-05'. | Optional | |
| locids | Comma-separated list of location IDs (as returned by /api/location). Example: '037720_99999,432950_99999'. Use locids for point queries. | Optional | |
| lat_lon | Latitude,Longitude of area centre (e.g. '51.5,-0.1'). Used with radius_km for area search. Ignored when locids is set. | Optional | |
| radius_km | Search radius in km around lat_lon. Default 100. | Optional | 100 |
| countries | Comma-separated ISO country codes to filter results (e.g. 'GB,FR'). | Optional | |
| num_years | Minimum number of years with non-null data. Use to filter sparse records. | Optional | 0 |
| avg_N | Minimum average number of days per period for years with data. | Optional | 0 |
Response
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| results | Results List[trend] | Yes | |
| trend.locid | Unique Location Id | Yes | |
| trend.geohash | Geohash of location (precision 7) | Yes | |
| trend.lat | Latitude | Yes | |
| trend.lon | Longitude | Yes | |
| trend.elev | Elevation in metres above MSL | Yes | |
| trend.area | Geohash area prefix (precision 3) | Yes | |
| trend.country | ISO country code | Yes | |
| trend.src_type | Data source used: Obs or ERA5 | Yes | |
| trend.metric | Metric name e.g. 'avg:max_t:p50'. See /api/metrics. | Yes | |
| trend.years | Year range of data e.g. '1983-2024' | Yes | |
| trend.month | Month or season filter used e.g. '06', '06-08', '00' (All/annual) | Yes | |
| trend.num_years | Count of years with non-null data. Use to filter sparse records. | Yes | |
| trend.avg_N | Average number of daily observations per period for years with data. | Yes | |
| trend.mvals | Timeseries values dict | Yes | |
| trend.mvals.xvals | List of years as ints e.g. [1983, 1984, ...] | Yes | |
| trend.mvals.yvals_by_metric | Dict of metric -> list of float values, one per year in xvals. Null where data is absent. e.g. {'avg:max_t:p50': [28.1, 27.9, ...]} | Yes |
Returns monthly distributions of selected metrics for locations compared against a baseline period.
When to use: Compute normalized and absolute deviations from a baseline, inter-annual and intra-annual variations within months and seasons. Check base_N and obs_N to assess data completeness.
Date format: obs_years as YYYY or YYYY-YYYY range; months as MM or MM-MM (e.g. '06', '06-08', 'All' for annual).
Performance: Bulk query — can be slow for global or large-area queries. Filter with locids, lat_lon/radius_km, or countries.
Prerequisites: Use /location to obtain locids first for point queries.
Investigate: Use to compare a recent season or year against the long-term baseline across many locations simultaneously. Combine with /climatetrends for trend context.
Augment: Identifies which locations had the most anomalous season compared to their historical distribution.
Notes: Metric format: 'max_t' = distribution of daily Maximum Temperature over the period; 'max_t.means' = distribution of annual means of max_t (1 value per year); 'rain_sum' (accumulations) and 'obs.is_thunderstorm' (counts) follow the same pattern.
Request
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| token | Token | Required | |
| metrics | Metric to compare. Available: max_t, max_t.means, max_wind, max_wind.means, min_t, min_t.means, obs.dewp, obs.dewp.means, obs.dpd, obs.dpd.means, obs.gust, obs.heatindex, obs.heatindex.means, obs.is_dust, obs.is_fog, obs.is_frozen_rain, obs.is_hail, obs.is_haze, obs.is_ice_pellets, obs.is_rain, obs.is_smoke, obs.is_snow, obs.is_squall, obs.is_thunderstorm, obs.rain, obs.rainh, obs.snow, obs.snowh, obs.temp, obs.temp.means, obs.wbulb, obs.wbulb.means, obs.wind, obs.wind.means, rain_sum, snow_sum | Required | |
| src_type | Data source: Obs (station observations) | ERA5 (reanalysis). | Optional | Obs |
| obs_years | Observation year or range (e.g. '2024' or '2020-2024'). Values can range from 2024 to current year, or a single hyphenated range e.g. 1981-2010. | Optional | |
| base_years | Baseline period. Available: 1991-2020. | Optional | 1991-2020 |
| months | Single month ('06') or hyphenated range ('MM-MM'). Seasons: '12-02' (Dec-Feb), '12-03' (Dec-Mar), '10-11' (Oct-Nov), '03-05' (Mar-May), '06-08' (Jun-Aug), '06-09' (Jun-Sep). Use 'All' for annual. Example: '06' or '06-09'. | Optional | |
| locids | Comma-separated location IDs (as returned by /api/location). Example: '037720_99999,432950_99999'. | Optional | |
| lat_lon | Latitude,Longitude of area centre (e.g. '51.5,-0.1'). Used with radius_km for area search. Ignored when locids is set. | Optional | |
| radius_km | Search radius in km around lat_lon. Default 100. | Optional | 100 |
| countries | Comma-separated ISO country codes to filter (e.g. 'GB,FR'). | Optional |
Response
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| results | Results List[comp] | Yes | |
| comp.locid | Unique Location Id | Yes | |
| comp.geohash | Geohash of location (precision 7) | Yes | |
| comp.lat | Latitude | Yes | |
| comp.lon | Longitude | Yes | |
| comp.elev | Elevation in metres above MSL | Yes | |
| comp.area | Geohash area prefix (precision 3) | Yes | |
| comp.country | ISO country code | Yes | |
| comp.src_type | Data source used: Obs or ERA5 | Yes | |
| comp.metric | Metric name e.g. 'max_t' (distribution), 'max_t.means' (annual means), 'rain_sum' (accumulation). See /api/metrics. | Yes | |
| comp.obs_years | Observed year(s) e.g. '2024' or '1981-2010' | Yes | |
| comp.base_years | Baseline period e.g. '1991-2020' | Yes | |
| comp.month | Month or season filter used e.g. '06', '06-08', '00' (All/annual) | Yes | |
| comp.obs_N | Number of observations in the observed period. | Yes | |
| comp.base_N | Number of observations in the baseline period. | Yes | |
| comp.obs | Quantile distribution of the observed period dict. For distribution metrics (e.g. max_t): full distribution of daily values (e.g. p50 is the 16th highest of 31 days for a month). For means/counts/accumulations (e.g. max_t.means, rain_sum): single value per obs_years — all quantiles are equal. | Yes | |
| comp.base | Quantile distribution of the baseline dict. For distribution metrics: spans base_years * period_days values (e.g. 31*30 values for May 1991-2020). For means/accumulations: one value per year in base_years (e.g. 30 values). | Yes | |
| comp.obs.{q} / comp.base.{q} | Quantile keys present in both obs and base dicts: min, p1, p5, p10, p25, p50, p75, p90, p95, p99, max. | Yes |
Returns anomalous weather conditions (breaking news) across the world or specified countries in the very recent past (observations) or immediate future (forecast).
When to use: First call when looking for current or upcoming notable weather events globally or by country.
Date format: No date params — always returns the most recent ~3 days of observations (breaking_type=obs) or next 7 days of forecast (breaking_type=forecast).
Performance: Fast — retrieves precomputed anomaly snapshots.
Prerequisites: Use /countries to get country IDs for filtering.
Investigate: Start here for any 'what's happening right now?' or 'what's forecast this week?' query; follow up with /anom or /dailycomp for per-location detail.
Augment: Primary source for identifying breaking weather news stories globally; use ctryid to narrow scope by country.
Request
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| token | Token | Required | |
| metric_category | Filter by metric category. Values: A (All), T (Temperature), P (Precipitation), H (Humidity/Dew Point), W (Wind). | Optional | A |
| breaking_type | Type of anomaly source. Values: obs (recent observations, ~last 3 days), forecast (upcoming 0-7 days). | Optional | obs |
| ctryid | Comma-separated country codes to filter (as returned by /api/countries). Leave empty for global results. | Optional |
Response
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| anomalies | Results List[anomaly] | Yes | |
| anomaly.locid | Unique Location Id | Yes | |
| anomaly.name | Location name | Yes | |
| anomaly.city | City name | Yes | |
| anomaly.country | Country name | Yes | |
| anomaly.lat | Latitude | Yes | |
| anomaly.lon | Longitude | Yes | |
| anomaly.geohash | Geohash of location | Yes | |
| anomaly.elevation | Elevation in metres above MSL | Yes | |
| anomaly.obs_start | Start of observation period YYYYMMDD e.g. '20250401' | Yes | |
| anomaly.obs_end | End of observation period YYYYMMDD | Yes | |
| anomaly.obs_dur | Duration in days: 1=day, 7=week, 30=month, 365=year | Yes | |
| anomaly.pt | Period type: DAYH (hourly-derived day) | FULL_DAY | FUTURE_DAY | Yes | |
| anomaly.anomalies | Anomalous metrics for this location List[outlier] | Yes | |
| outlier.obsm | Metric name of the observation e.g. 'max_t.max'. See /api/metrics. | Yes | |
| outlier.comps | Baseline comparisons for this metric List[comp] | Yes | |
| comp.obsm_f | Friendly observed metric name e.g. 'Daily High Temp' | Yes | |
| comp.oq | Observed quantile compared: min | max | mean | Yes | |
| comp.bq | Baseline quantile breached: min | p1 | p50 | max | Yes | |
| comp.scope | Comparison scope: week | month | year | Yes | |
| comp.val | Observed value | Yes | |
| comp.bval | Baseline value at the breached quantile | Yes | |
| comp.min | Baseline minimum | Yes | |
| comp.max | Baseline maximum | Yes | |
| comp.med | Baseline median (p50) | Yes | |
| comp.mean | Baseline mean | Yes | |
| comp.std | Baseline standard deviation | Yes | |
| comp.min_dt | Date of baseline minimum YYYYMMDD | Yes | |
| comp.max_dt | Date of baseline maximum YYYYMMDD | Yes | |
| comp.intensity | Z-score (standard deviations from mean). Positive = above average, negative = below. | Yes | |
| comp.intensity_f | Friendly intensity label e.g. 'Extreme High', 'Moderate Low' | Yes | |
| comp.rp | Estimated return period in years. 0 if not applicable. | Yes | |
| comp.summary | Plain-text description of the anomaly e.g. 'Hottest day on record for this location in May' | Yes | |
| comp.period | Baseline history length in years e.g. 30 | Yes | |
| comp.base_N | Number of valid baseline observations | Yes | |
| comp.N | Number of valid observations in obs period | Yes | |
| comp.ut | Unit of val/bval/min/max e.g. 'C', 'mm', 'km/hr' | Yes | |
| comp.start | Start of baseline period YYYYMMDD | Yes | |
| comp.end | End of baseline period YYYYMMDD | Yes |
Returns recent weather records (all-time or period-of-record extremes) for the world or specified countries.
When to use: Find which locations have broken or nearly broken records in a recent date window. Set history_years ≥ 15 to ensure a meaningful period of record.
Date format: YYYYMMDD for ymd_start and ymd_end. Keep windows ≤ 3 months per call for reasonable performance.
Performance: Computed on demand; slower for large date ranges. Start with scope='monthly' or 'yearly'; fall back to 'weekly' for near-records.
Prerequisites: Use /countries for country IDs; use /location for locids.
Investigate: Use after /breaking identifies a record-breaking event to get precise extreme-value context. For US locations use period_type='DAY'; for non-US use 'FULL_DAY'. Hourly-derived metrics (wet bulb, wind gusts) for non-US require period_type='DAY'.
Augment: Provides the 'record' framing for a story — 'hottest day ever recorded at this station.' Note: FULL_DAY and DAY expose different metric sets.
Request
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| token | Token | Required | |
| period_type | Period type. Values: DAY (US daily obs), FULL_DAY (non-US daily obs), FUTURE_DAY (forecast). | Optional | FULL_DAY |
| ymd_start | Start date YYYYMMDD. Defaults to 15 days ago. | Optional | |
| ymd_end | End date YYYYMMDD. Defaults to today. | Optional | |
| history_years | Minimum years of history required to qualify as a record. Use >= 15 for meaningful records. | Optional | 5 |
| ctryid | Comma-separated country codes to filter (as returned by /api/countries). | Optional | |
| metrics | Applicable metrics. For period_type DAY: ('temp.max','temp.min', 'temp.mean', 'rain.mean', 'snow.mean', 'dewp.mean', 'wbulb.max', 'heatindex.max', 'wbgt.max', 'dpd.max','gust.max','wind.max','rainh.max') For period_type FULL_DAY/FUTURE_DAY: ('max_t.mean','min_t.mean','temp.mean','rain.mean','snow.mean','dewp.mean','max_wind'.mean) | Optional | max_t.mean |
| scope | Record scope. Values: month (monthly records), week (weekly records), year (annual records). | Optional | month |
Response
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| results | Results List[extreme] | Yes | |
| extreme.locid | Unique Location Id | Yes | |
| extreme.name | Location name | Yes | |
| extreme.country_code | ISO country code e.g. 'US' | Yes | |
| extreme.lat | Latitude | Yes | |
| extreme.lon | Longitude | Yes | |
| extreme.elev | Elevation in metres above MSL | Yes | |
| extreme.period_type | Period type of the record: DAY | FULL_DAY | FUTURE_DAY | Yes | |
| extreme.metric | Metric name e.g. 'max_t.mean'. See /api/metrics. | Yes | |
| extreme.ymd | Date of the record YYYYMMDD e.g. '20250615' | Yes | |
| extreme.anomaly_type | Direction of record: HIGH (new maximum) | LOW (new minimum) | Yes | |
| extreme.scope | Record scope: weekly | monthly | yearly | Yes | |
| extreme.value | Observed value that set the record e.g. '42.1' | Yes | |
| extreme.history_years | Years of history used to establish the record e.g. 30 | Yes |
Returns extreme value analysis (return periods) for a specified location and metric.
When to use: Quantify the statistical rarity of a record or near-record value. Typically called after other APIs establish that an observation is anomalous.
Performance: Computed on demand; moderate speed.
Prerequisites: Use /location to obtain a locid first. Prefer level='area' over 'city' for better recall and longer period of record.
Investigate: Use after /recentextremes or /anom establishes a high value; provides the return-period framing ('a once-in-50-year event').
Augment: Provides the statistical rarity framing needed for record-event stories. Try both src_types 'Obs' and 'ERA5' for non-US locations to account for discontinuous station records.
Request
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| token | Token | Required | |
| name | Common name of metro or metro area. for ex: New York, Beijing, Mumbai Airport | Optional | |
| latlon | Latitude,Longitude ex: 40.78,-73.97 | Optional | |
| locid | Unique Location Identifier | Optional | |
| src_type | Data source: Obs (station observations) | ERA5 (reanalysis). ERA5 recommended for precipitation outside US. | Optional | Obs |
| level | Aggregation level: city (single station) | area (nearby stations pooled). Use 'area' to improve period of record. | Optional | area |
| metric_category | Metric category. Values: AVG_TEMP, DEWPH, DPD, MAX_TEMP, MIN_TEMP, PRCP, RAINH, SNOW, SNOWH, WBULB, WIND. Example: MAX_TEMP for maximum temperature extremes. | Optional | MAX_TEMP |
| exceedance_type | Exceedance direction: High (probability of exceeding value) | Low (probability of being below value). | Optional | High |
| model_type | Statistical model: '' (empirical/default) | MLE (maximum likelihood estimate). | Optional | |
| window_size | Rolling window in days. Temperature metrics (MAX_TEMP, MIN_TEMP, AVG_TEMP, DEWPH, WBULB, DPD): 1, 2, 3. Precipitation metrics (PRCP, SNOW, RAINH, SNOWH): 1, 2, 3, 4, 7. | Optional | 1 |
| month | Two-digit month filter (e.g. '06' for June). Leave empty for all months. | Optional | |
| season | Season filter as 'MM-MM' (e.g. '06-08' for Jun-Aug, '12-02' for Dec-Feb). Overridden by 'month' if both are set. | Optional |
Response
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| locid | Location identifier used for the analysis | Yes | |
| period | Period of record inferred from available data e.g. '1973-2024' | Yes | |
| months_covered | Months included in analysis e.g. 'Jan-Dec' (full year) or 'Jun' | Yes | |
| window_size | Rolling window size used (days) | Yes | |
| N | Total number of observations in the period | Yes | |
| coverage_pct | Data coverage as percentage of expected observations e.g. 30 years -> expected ~10950; coverage_pct = N/10950 * 100 | Yes | |
| results | Return period values List[result] | Yes | |
| result.metric | Metric key used e.g. 'MAX_TEMP_1' (MAX_TEMP window=1). | Yes | |
| result.value | Threshold value at this return period in native units e.g. 38.2 (°C) or 120.5 (mm) | Yes | |
| result.return_period | Return period in years e.g. 2, 5, 10, 50, 100. Results are sorted in increasing order of return period. | Yes |
Given a location, ranks the weeks or months whose historical climatology best matches a set of weather criteria (most optional criteria met first; all MUST criteria satisfied by every result).
When to use: Answer 'when is the best time to visit X for weather like Y?' Choose when_type=week or month over the 1996-2025 baseline.
Date format: when_type: week|month|day. Historical basis only for week/month.
Performance: Sub-second per location.
Prerequisites: Use /location to obtain a locid first.
Investigate: Rank a location's calendar by weather suitability. For a specific upcoming day's forecast, use /api/anom with period_type=FUTURE_DAY.
Augment: Find the typical best window for an activity at a place.
Notes: Every criterion metric name is literal and fully qualified: the 'avg:' prefix, then the metric base (observation metrics keep their 'obs.' segment), then the attribute — e.g. avg:max_t.p50, avg:obs.rain.sum, avg:obs.is_rain.count. Dropping 'avg:' or 'obs.' is an error; the criteria parameter below lists every valid name. For daily forecasts use /api/anom (period_type=FUTURE_DAY). Weekly/monthly forecasts are planned.
Request
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| token | Token | Required | |
| criteria | JSON array of criteria, passed as a string. Example: [{"metric":"avg:max_t.p50","lb":18,"ub":28,"must_have":true},{"metric":"avg:obs.rain.sum","ub":40,"must_have":true},{"metric":"avg:obs.is_rain.count","ub":6,"must_have":false}] Each element has: metric (required, one of the exact names listed below), lb and ub (optional numeric lower/upper bounds, unscaled natural units; set at least one), and must_have (true = hard filter every result must satisfy, false = optional, only used to rank results). At least one criterion with must_have=true is required. Metric names are literal and case-sensitive. Each is the prefix 'avg:' + the metric base + '.' + the attribute — for example avg:obs.rain.sum and avg:max_t.p50. Never drop the 'avg:' prefix and never drop the 'obs.' segment: 'obs.rain.sum', 'rain.sum' and 'avg:rain.sum' are all rejected. 'avg' means the mean across the baseline years for that week/month bucket. lb/ub are unscaled natural units (°C, mm, km/h, oktas, days). Percentile metrics — p1 = low tail, p50 = median, p99 = high tail: avg:max_t.p1, avg:max_t.p50, avg:max_t.p99, avg:min_t.p1, avg:min_t.p50, avg:min_t.p99, avg:obs.dewp.p1, avg:obs.dewp.p50, avg:obs.dewp.p99, avg:obs.dewph.p1, avg:obs.dewph.p50, avg:obs.dewph.p99, avg:obs.wbulb.p1, avg:obs.wbulb.p50, avg:obs.wbulb.p99, avg:obs.wbgt.p1, avg:obs.wbgt.p50, avg:obs.wbgt.p99, avg:obs.temp.p1, avg:obs.temp.p50, avg:obs.temp.p99, avg:obs.heatindex.p1, avg:obs.heatindex.p50, avg:obs.heatindex.p99 (°C); avg:obs.wind.p1, avg:obs.wind.p50, avg:obs.wind.p99 (km/h); avg:obs.cloudcover.p1, avg:obs.cloudcover.p50, avg:obs.cloudcover.p99 (oktas). Tail-percentile metrics: avg:obs.gust.p99 (km/h); avg:obs.rain.p95, avg:obs.rain.p99, avg:obs.snow.p95, avg:obs.snow.p99 (mm). Accumulation over the bucket: avg:obs.rain.sum, avg:obs.snow.sum (mm). Day-counts within the bucket: avg:obs.is_snow.count, avg:obs.is_rain.count, avg:obs.is_hail.count, avg:obs.is_thunderstorm.count, avg:obs.is_fog.count, avg:obs.is_smoke.count (days). Use exactly one of the names above as the criterion 'metric'; anything else returns an error listing the valid names. | Required | |
| name | Location name, e.g. New York | Optional | |
| latlon | Latitude,Longitude ex: 40.78,-73.97 | Optional | |
| locid | Unique Location Identifier | Optional | |
| when_type | week | month | day | Optional | week |
| when_basis | historical | forecast | Optional | historical |
| baseline | Baseline year range YYYY-YYYY | Optional | 1996-2025 |
| max_results | Max results | Optional | 25 |
Response
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| location | Location metadata (locid, name, city_name, lat, lon, elevation, country) | Yes | |
| baseline | Echoed baseline for historical results | Yes | |
| when_type | week | month | day | Yes | |
| results | Ranked list, most criteria met first | Yes | |
| time | MMDD-MMDD (week), MM (month), or YYYYMMDD (day) | Yes | |
| criteria_met | List of {metric,value} for satisfied optional criteria | Yes | |
| criteria_met_count | Number of optional criteria met | Yes | |
| record | Full metric record for the bucket | Yes |
Given a single week, month, or day, ranks locations whose weather best matches a set of criteria (most optional criteria met first; all MUST criteria satisfied by every result). Filter by lat/lon+radius or countries.
When to use: Answer 'where has the best weather for week/month/day X?'
Date format: scope=day + time=YYYYMMDD (forecast); scope=week + time=MMDD; scope=month + time=MM. Defaults: week of today+14, month today+1, day today+1.
Performance: Filter by area/countries to keep fast.
Prerequisites: None; supply lat/lon+radius_km or a country list.
Investigate: Rank places for a given time window. scope=day uses forecasts.
Augment: Find the best destinations for a target week/month.
Notes: Every criterion metric name is literal and fully qualified: the 'avg:' prefix, then the metric base (observation metrics keep their 'obs.' segment), then the attribute — e.g. avg:max_t.p50, avg:obs.rain.sum, avg:obs.is_rain.count. Dropping 'avg:' or 'obs.' is an error; the criteria parameter below lists every valid name. scope=day queries forecasts; week/month query the 1996-2025 historical baseline.
Request
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| token | Token | Required | |
| criteria | JSON array of criteria, passed as a string. Example: [{"metric":"avg:max_t.p50","lb":18,"ub":28,"must_have":true},{"metric":"avg:obs.rain.sum","ub":40,"must_have":true},{"metric":"avg:obs.is_rain.count","ub":6,"must_have":false}] Each element has: metric (required, one of the exact names listed below), lb and ub (optional numeric lower/upper bounds, unscaled natural units; set at least one), and must_have (true = hard filter every result must satisfy, false = optional, only used to rank results). At least one criterion with must_have=true is required. Metric names are literal and case-sensitive. Each is the prefix 'avg:' + the metric base + '.' + the attribute — for example avg:obs.rain.sum and avg:max_t.p50. Never drop the 'avg:' prefix and never drop the 'obs.' segment: 'obs.rain.sum', 'rain.sum' and 'avg:rain.sum' are all rejected. 'avg' means the mean across the baseline years for that week/month bucket. lb/ub are unscaled natural units (°C, mm, km/h, oktas, days). Percentile metrics — p1 = low tail, p50 = median, p99 = high tail: avg:max_t.p1, avg:max_t.p50, avg:max_t.p99, avg:min_t.p1, avg:min_t.p50, avg:min_t.p99, avg:obs.dewp.p1, avg:obs.dewp.p50, avg:obs.dewp.p99, avg:obs.dewph.p1, avg:obs.dewph.p50, avg:obs.dewph.p99, avg:obs.wbulb.p1, avg:obs.wbulb.p50, avg:obs.wbulb.p99, avg:obs.wbgt.p1, avg:obs.wbgt.p50, avg:obs.wbgt.p99, avg:obs.temp.p1, avg:obs.temp.p50, avg:obs.temp.p99, avg:obs.heatindex.p1, avg:obs.heatindex.p50, avg:obs.heatindex.p99 (°C); avg:obs.wind.p1, avg:obs.wind.p50, avg:obs.wind.p99 (km/h); avg:obs.cloudcover.p1, avg:obs.cloudcover.p50, avg:obs.cloudcover.p99 (oktas). Tail-percentile metrics: avg:obs.gust.p99 (km/h); avg:obs.rain.p95, avg:obs.rain.p99, avg:obs.snow.p95, avg:obs.snow.p99 (mm). Accumulation over the bucket: avg:obs.rain.sum, avg:obs.snow.sum (mm). Day-counts within the bucket: avg:obs.is_snow.count, avg:obs.is_rain.count, avg:obs.is_hail.count, avg:obs.is_thunderstorm.count, avg:obs.is_fog.count, avg:obs.is_smoke.count (days). Use exactly one of the names above as the criterion 'metric'; anything else returns an error listing the valid names. | Required | |
| scope | day | week | month | Optional | week |
| time | YYYYMMDD (day), MMDD (week), or MM (month) | Optional | |
| baseline | Baseline year range YYYY-YYYY | Optional | 1996-2025 |
| max_results | Max results | Optional | 100 |
| latlon | Latitude,Longitude for area search ex: 40.78,-73.97 | Optional | |
| radius_km | Radius km for area search | Optional | 100 |
| ctryid | Comma-separated ISO country codes (mutually exclusive with latlon) | Optional |
Response
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| scope | day | week | month | Yes | |
| time | Resolved time bucket | Yes | |
| baseline | Echoed baseline for historical results | Yes | |
| results | Ranked list, most criteria met first | Yes | |
| locid | Location identifier | Yes | |
| location | Location metadata (lat, lon, elevation, country, name, city_name) | Yes | |
| criteria_met | List of {metric,value} for satisfied optional criteria | Yes | |
| criteria_met_count | Number of optional criteria met | Yes | |
| record | Full metric record | Yes |
Seasonal (monthly) forecast anomalies for the next six months, with the local climatology they are measured against. Each result gives, per metric: the ERA5 baseline mean (means), its interannual standard deviation (std), the predicted anomaly (anom, in degrees C / mm / km/h) and how unusual that is, both as standard deviations (norm) and as a percentile rank among the last 30 years (perc).
When to use: Answer 'will next month be hotter/wetter than normal here?' or 'where is the coming season predicted to be most unusual?'
Date format: ym_start and ym_end are YYYYMM, inclusive. For a single month set both to the same value. Defaults to next month through next month + 5.
Performance: Filter by locid, ctryid or latlon+radius_km to keep fast; a whole-world month slice is about 4000 rows and fits in one page.
Prerequisites: None; supply locid, name, latlon+radius_km, ctryid, or nothing at all for a global query.
Investigate: Rank places by how abnormal the coming months look. Use sort=perc:obs.rain.sum for rainfall and sort=norm:max_t.mean for heat.
Augment: Back claims about the coming season with the predicted anomaly and how it compares with the local 30-year normal.
Notes: Monthly resolution only — for daily forecasts use typicalweather. The forecast is ECMWF SEAS5; its anomalies are relative to SEAS5's own 1991-2020 model climatology, so means + anom approximates rather than equals the predicted absolute.
Request
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| token | Token | Required | |
| src_type | Forecast model to read: SEAS5 (ECMWF seasonal). SEAS5 is currently the only value, so this can be omitted. | Optional | SEAS5 |
| ym_start | First target month as YYYYMM, e.g. 202611. For a single month set ym_start and ym_end to the same value. Defaults to next month. | Optional | |
| ym_end | Last target month as YYYYMM, inclusive. Must be at least ym_start. Defaults to ym_start plus 5 months. | Optional | |
| locid | Location id from /api/location, e.g. 724940_23234 | Optional | |
| name | Place name, e.g. 'San Francisco'. Ignored if locid is set | Optional | |
| latlon | Centre of an area search as 'lat,lon' ex: 37.62,-122.4 | Optional | |
| radius_km | Radius km for latlon, 1 to 2000 | Optional | 100 |
| ctryid | Comma-separated ISO country codes (mutually exclusive with latlon) | Optional | |
| criteria | JSON array of criteria, passed as a string. Optional for this API: omit it to get every location for the requested months. Example: [{"metric":"norm:max_t.mean","lb":1.5,"must_have":true},{"metric":"perc:obs.rain.sum","ub":15,"must_have":true}] Each element has: metric (required, one of the exact names listed below), lb and ub (optional numeric lower/upper bounds), and must_have (true = hard filter every result must satisfy, false = optional, only used to rank). Metric names are literal and case-sensitive: a prefix plus the metric base plus '.' plus the attribute, e.g. norm:max_t.mean, perc:obs.rain.sum. Never drop the prefix and never drop the 'obs.' segment. The seven metrics are: max_t.mean, min_t.mean, obs.temp.mean, obs.dewp.mean (C); obs.wind.mean (km/h); obs.rain.sum, obs.snow.sum (mm). Filterable prefixes: 'norm:' = anomaly divided by that place's interannual standard deviation (|1| unusual, |2| strongly unusual, |3|+ rare); 'perc:' = percentile rank of the prediction among the last 30 years, 0 to 100 (90 = hotter/wetter than 90% of them, 50 = typical); 'anom:' = the absolute anomaly in natural units, which is not comparable between places. Prefer 'perc:' for obs.rain.sum and obs.snow.sum, whose year-to-year distributions are skewed, and note 'norm:' is absent where interannual variability is near zero. The 'avg:' and 'std:' attributes are returned for display but cannot be filtered on. Full list: anom:max_t.mean, anom:min_t.mean, anom:obs.temp.mean, anom:obs.dewp.mean, anom:obs.wind.mean, anom:obs.rain.sum, anom:obs.snow.sum, norm:max_t.mean, norm:min_t.mean, norm:obs.temp.mean, norm:obs.dewp.mean, norm:obs.wind.mean, norm:obs.rain.sum, norm:obs.snow.sum, perc:max_t.mean, perc:min_t.mean, perc:obs.temp.mean, perc:obs.dewp.mean, perc:obs.wind.mean, perc:obs.rain.sum, perc:obs.snow.sum | Optional | |
| metrics | Comma-separated metrics to return: max_t.mean, min_t.mean, obs.temp.mean, obs.dewp.mean, obs.wind.mean, obs.rain.sum, obs.snow.sum. The metric named by sort is always returned as well, whether or not it is listed here. Defaults to all seven. | Optional | |
| fields | 'full' for everything, 'compact' for locid/lat/lon/ym plus anom, norm and perc of the requested metrics only | Optional | full |
| sort | One of: 'criteria' (most optional criteria met first), 'locid' (id order, resumable with cursor), or an attribute name to rank by how far from normal it is: 'norm:METRIC' or 'perc:METRIC', e.g. norm:obs.rain.sum. Those are the same names used in criteria, and they order most-abnormal-first in either direction — use criteria to pick a direction (e.g. lb 0 for hotter than normal only). Defaults to criteria when criteria are given, otherwise locid. | Optional | |
| limit | Results per page, 1 to 4000. 4000 covers every location in one page | Optional | 100 |
| cursor | next_cursor from a previous response. Only valid with sort=locid; sending it with a ranked sort is an error | Optional | |
| offset | Offset into a ranked result (any sort except locid). offset plus limit must be at most 4000. Use cursor, not offset, with sort=locid | Optional | 0 |
| baseline | Baseline year range YYYY-YYYY | Optional | 1996-2025 |
Response
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| ym_start | First target month returned, YYYYMM | Yes | |
| ym_end | Last target month returned, YYYYMM | Yes | |
| baseline | Baseline year range behind means and std | Yes | |
| metrics | Metrics present on each result | Yes | |
| count | Number of results in this page | Yes | |
| truncated | True when more matched than the ranking ceiling | Yes | |
| results | Ranked list of results | Yes | |
| locid | Location identifier | Yes | |
| location | Location metadata (lat, lon, elevation, country, name, city_name) | Yes | |
| ym | Target month, YYYYMM | Yes | |
| run_ymd | Date this forecast was indexed, YYYYMMDD | Yes | |
| basis_type | Source of the climatology (ERA5) | Yes | |
| means | Baseline mean per metric | Yes | |
| std | Interannual standard deviation per metric | Yes | |
| anom | Predicted anomaly per metric, natural units | Yes | |
| norm | Anomaly divided by the standard deviation, per metric | Yes | |
| perc | Percentile rank of the prediction, 0-100, per metric | Yes | |
| criteria_met | List of {metric,value} for satisfied optional criteria | Yes | |
| criteria_met_count | Number of optional criteria met | Yes | |
| note | Explanation when truncated | No | |
| error | Error message when the request could not be served | No | |
| next_cursor | Cursor for the next page (sort=locid only) | No |
Scores how well each forecast model actually performed at each of many locations, by comparing what the models predicted against what was then observed. Returns one score matrix per location, models by evaluation metrics, for a single weather metric at a single lead time, plus the winning model per location.
When to use: Answer 'which forecast model is most accurate here?' at scale — to map the best model by region, to check whether a specific model is worth using over the default blend, or to compare physical and AI models across the world.
Date format: ymd_start and ymd_end are YYYYMMDD and inclusive. Inclusive day range as YYYYMMDD. Defaults to the 14 days ending yesterday; today is never included because it has not been verified yet. At most 180 days, which is also how much history the index retains.
Performance: Filter by ctryid, latlon+radius_km or a small sample_pct to keep it fast; a global 5 percent sample over 14 days is a few hundred locations.
Prerequisites: None. Supply locid, name, latlon+radius_km, ctryid, or nothing at all with a sample_pct for an unbiased global sample.
Investigate: Use this to find where a model is strong or weak. Ask for one metric and one lead_time at a time; compare models by reading across each row of evals, and use winners for the answer at a glance.
Augment: Back a claim about forecast reliability with the measured error of the named model at that place over the recent past.
Notes: Forecasts come from Open-Meteo. Lead time is the number of days ahead the forecast was issued, so lead_time 1 is yesterday's forecast for today; only the indexed lead times are available. The WN2 model is an ensemble mean, which is smoother than the deterministic models and so tends to score slightly better on mae and rmse and slightly worse on extremes. A score is null, never zero, when its sample was too small to measure: fewer than 5 verified days for mae, rmse, mse, bias and ets, or fewer than 10 for acc.
Request
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| token | Token | Required | |
| ctryid | Comma-separated ISO country codes from /api/countries, e.g. US,CA. Omit for a global query. This endpoint compares many locations and has no single-location argument; for one place use fcastevalbylocation | Optional | |
| sample_pct | Percent of the world's locations to sample, from 0.1 to 100. Sampling is by stable hash bucket, so every location has an equal chance of being selected and the sample is unbiased by geography. The granularity is one bucket, which is 2.5 percent, and a request is rounded up to whole buckets; the response reports the sample_pct_effective actually served and the buckets drawn. Defaults to 5 percent for a global query, and to 100 when ctryid is given, because sampling exists to bound a world-sized scan and naming countries is already a restriction. | Optional | |
| seed | Any string. The sample of locations is drawn deterministically from it, so the same seed always returns the same locations. Every response reports the seed it used, including when one was not supplied, so any result can be reproduced exactly by sending that seed back. | Optional | |
| models | Forecast models, given as comma-separated keys: auto (Open-Meteo's own per-location blend — what a caller gets by default), IFS (ECMWF IFS 0.25 degree, physical NWP), GFS (NCEP GFS), AIFS (ECMWF AIFS, machine-learned, deterministic), WN2 (Google WeatherNext 2, ensemble mean). Defaults to all of them. | Optional | |
| metric | Metric names are literal and case-sensitive. Never drop the 'obs.' segment and never drop the '.mean' suffix. The eight metrics are: max_t.mean, min_t.mean, obs.temp.mean, obs.dewp.mean (C); obs.rain.mean, obs.snow.mean (mm); obs.wind.mean, obs.gust.mean (km/hr). They are daily quantities: max_t.mean and min_t.mean are the day's high and low, obs.temp.mean the day's mean temperature, obs.dewp.mean the day's mean dew point, obs.rain.mean and obs.snow.mean the day's total precipitation and snowfall, obs.wind.mean the day's mean wind speed and obs.gust.mean the day's maximum gust. Exactly one metric per request. Full list: max_t.mean, min_t.mean, obs.temp.mean, obs.dewp.mean, obs.rain.mean, obs.snow.mean, obs.wind.mean, obs.gust.mean | Optional | obs.temp.mean |
| lead_time | Forecast lead time in days. A lead time is how many days ahead the forecast was issued, so lead time 1 is yesterday's forecast for today and lead time 10 is a forecast made ten days before the day it describes. Only these lead times are indexed: 1, 2, 3, 5, 7, 10. Asking for any other lead time is an error, not an empty result. One value only here; use fcastevalbylocation to compare lead times. | Optional | 1 |
| ymd_start | Inclusive day range as YYYYMMDD. Defaults to the 14 days ending yesterday; today is never included because it has not been verified yet. At most 180 days, which is also how much history the index retains. | Optional | |
| ymd_end | Last day evaluated, YYYYMMDD, inclusive | Optional | |
| eval_metrics | Evaluation metrics, comma-separated, any of: 'mae' mean absolute error in the metric's own unit, lower is better; 'rmse' root mean squared error, same unit, lower is better, more sensitive to large misses than mae; 'mse' the same squared, lower is better; 'bias' mean signed error, positive means the model forecasts too high, zero is best; 'acc' anomaly correlation coefficient from -1 to 1, higher is better, which measures whether the model got the departure from the local seasonal normal right rather than just the absolute value, so a model that always forecasts the local average scores near zero however small its mae; 'ets' equitable threat score from -1/3 to 1, higher is better, the standard precipitation score, which is only valid for the accumulation metrics obs.rain.mean and obs.snow.mean and uses the threshold argument. Defaults to mae,rmse,acc. IMPORTANT for obs.rain.mean and obs.snow.mean: mae, rmse, mse and bias are measured on WET DAYS ONLY, meaning days where the observed total was at or above the threshold, because a daily rain total is zero on most days and an all-days average mostly measures days both sides correctly called dry. So for rain, mae answers 'when it actually rained, how far off was the amount' and n counts wet days, not days. ets still scores every day, wet and dry, because the dry days are what make it meaningful. For every other metric all scores use every day. A cell whose sample was too small is returned as null, never as zero. | Optional | mae,rmse,acc |
| threshold | Precipitation threshold in mm per day for the 'ets' eval metric, ignored otherwise. A day counts as a wet-day event when the total is at or above this. Useful rungs are 0.2, 1.0, 5.0, 10.0, 25.0. | Optional | 1.0 |
| limit | Maximum locations returned, 1 to 4000 | Optional | 500 |
Response
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| metric | The weather metric evaluated | Yes | |
| unit | Natural unit of that metric; mae, rmse and bias are in it | Yes | |
| lead_time | Forecast lead time in days | Yes | |
| ymd_start | First day evaluated, YYYYMMDD | Yes | |
| ymd_end | Last day evaluated, YYYYMMDD | Yes | |
| days | Number of days in the range | Yes | |
| models | Ordered list of model keys — the ROWS of every matrix | Yes | |
| eval_metrics | Ordered list of score names — the COLUMNS | Yes | |
| sample_pct | Sample percent requested or defaulted | Yes | |
| sample_pct_effective | Sample percent actually served | Yes | |
| seed | The seed the sample was drawn from, generated when none was supplied. Send it back as the seed argument to get exactly these locations again | Yes | |
| buckets | Sample buckets drawn, for transparency; empty when the whole population was used. Not a request argument -- reproduce a sample with seed | Yes | |
| count | Number of locations returned | Yes | |
| scanned | Number of evaluation records read | Yes | |
| truncated | True when the scan hit its ceiling and stopped early | Yes | |
| results | One entry per location | Yes | |
| locid | Location identifier | Yes | |
| location | Location metadata (name, country, lat, lon, elevation) | Yes | |
| evals | The score matrix for that location. It has exactly one row per entry of the top-level models list, in that order, and within each row exactly one value per entry of the top-level eval_metrics list, in that order. So evals[i][j] is the score of models[i] under eval_metrics[j]. The shape never varies between locations. A value is null, never zero, when that model had no verified days at that location or too few to measure the score; read the matching entry of n to tell those apart. A location with no records at all is omitted from results entirely rather than returned as a matrix of nulls, so an empty results list with count 0 means nothing matched -- see note for why | Yes | |
| n | Sample behind each row of evals, same order as models. Days, except for obs.rain.mean and obs.snow.mean where it counts WET days, since their mae, rmse, mse and bias are measured on wet days only. A zero means no verified sample, so that whole row is null | Yes | |
| n_days | Days behind ets, shaped exactly like n. Identical to n except for obs.rain.mean and obs.snow.mean, where n counts only wet days while ets still scores every day -- so a null ets is explained by this number, not by n | Yes | |
| error_basis | 'wet_days' when mae, rmse, mse and bias were measured only on days whose observed total reached the threshold (obs.rain.mean, obs.snow.mean), 'all_days' otherwise. ets always scores every day | Yes | |
| winners | The best model per eval metric, as a mapping from the eval metric name to a model key. Lowest wins for mae, rmse, mse and absolute bias; highest wins for acc and ets. Ties break by the order of the models list. An eval metric whose column was entirely null is absent from this mapping rather than being given an arbitrary winner | Yes | |
| note | Explanation when truncated | No | |
| error | Error message when the request could not be served | No |
Scores how well each forecast model performed at ONE location, across several forecast lead times and across a sliding time window. Shows both how fast accuracy decays as the forecast reaches further ahead, and how accuracy at a given lead time has varied over recent weeks.
When to use: Answer 'how far ahead can I trust the forecast here?' or 'has the forecast been unusually poor here lately?' Use fcastevalbygroup instead to compare many locations at one lead time.
Date format: ymd_start and ymd_end are YYYYMMDD and inclusive. Inclusive day range as YYYYMMDD. Defaults to the 14 days ending yesterday; today is never included because it has not been verified yet. At most 180 days, which is also how much history the index retains.
Performance: Fast: one location. The cost grows with the number of lead times and the length of the range.
Prerequisites: A location: locid from /api/location, or name, or latlon.
Investigate: Ask for several lead_times at once (e.g. 1,3,5,7) to get the skill-decay curve in one call. Set window to get a moving average and see the trend over time rather than one number.
Augment: Quantify how reliable a forecast for this place actually is at the lead time being written about.
Notes: Forecasts come from Open-Meteo. Lead time is the number of days ahead the forecast was issued; only the indexed lead times are available. A score is null, never zero, when its sample was too small to measure: fewer than 5 verified days for mae, rmse, mse, bias and ets, or fewer than 10 for acc.
Request
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| token | Token | Required | |
| locid | Location id from /api/location, e.g. 725030_14732 | Optional | |
| name | Place name, e.g. 'San Francisco'. Ignored if locid is set | Optional | |
| latlon | 'lat,lon' ex: 37.62,-122.4. Used if locid and name are absent | Optional | |
| models | Forecast models, given as comma-separated keys: auto (Open-Meteo's own per-location blend — what a caller gets by default), IFS (ECMWF IFS 0.25 degree, physical NWP), GFS (NCEP GFS), AIFS (ECMWF AIFS, machine-learned, deterministic), WN2 (Google WeatherNext 2, ensemble mean). Defaults to all of them. | Optional | |
| metric | Metric names are literal and case-sensitive. Never drop the 'obs.' segment and never drop the '.mean' suffix. The eight metrics are: max_t.mean, min_t.mean, obs.temp.mean, obs.dewp.mean (C); obs.rain.mean, obs.snow.mean (mm); obs.wind.mean, obs.gust.mean (km/hr). They are daily quantities: max_t.mean and min_t.mean are the day's high and low, obs.temp.mean the day's mean temperature, obs.dewp.mean the day's mean dew point, obs.rain.mean and obs.snow.mean the day's total precipitation and snowfall, obs.wind.mean the day's mean wind speed and obs.gust.mean the day's maximum gust. Exactly one metric per request. Full list: max_t.mean, min_t.mean, obs.temp.mean, obs.dewp.mean, obs.rain.mean, obs.snow.mean, obs.wind.mean, obs.gust.mean | Optional | obs.temp.mean |
| lead_times | Comma-separated forecast lead times in days. A lead time is how many days ahead the forecast was issued, so lead time 1 is yesterday's forecast for today and lead time 10 is a forecast made ten days before the day it describes. Only these lead times are indexed: 1, 2, 3, 5, 7, 10. Asking for any other lead time is an error, not an empty result. They become the outermost axis of the evals structure, in ascending order. | Optional | 1 |
| ymd_start | Inclusive day range as YYYYMMDD. Defaults to the 14 days ending yesterday; today is never included because it has not been verified yet. At most 180 days, which is also how much history the index retains. | Optional | |
| ymd_end | Last day evaluated, YYYYMMDD, inclusive | Optional | |
| window | Sliding window in days for the moving average. A 14 day range with a 7 day window yields 8 windows. Defaults to the whole range, which yields exactly one window | Optional | |
| eval_metrics | Evaluation metrics, comma-separated, any of: 'mae' mean absolute error in the metric's own unit, lower is better; 'rmse' root mean squared error, same unit, lower is better, more sensitive to large misses than mae; 'mse' the same squared, lower is better; 'bias' mean signed error, positive means the model forecasts too high, zero is best; 'acc' anomaly correlation coefficient from -1 to 1, higher is better, which measures whether the model got the departure from the local seasonal normal right rather than just the absolute value, so a model that always forecasts the local average scores near zero however small its mae; 'ets' equitable threat score from -1/3 to 1, higher is better, the standard precipitation score, which is only valid for the accumulation metrics obs.rain.mean and obs.snow.mean and uses the threshold argument. Defaults to mae,rmse,acc. IMPORTANT for obs.rain.mean and obs.snow.mean: mae, rmse, mse and bias are measured on WET DAYS ONLY, meaning days where the observed total was at or above the threshold, because a daily rain total is zero on most days and an all-days average mostly measures days both sides correctly called dry. So for rain, mae answers 'when it actually rained, how far off was the amount' and n counts wet days, not days. ets still scores every day, wet and dry, because the dry days are what make it meaningful. For every other metric all scores use every day. A cell whose sample was too small is returned as null, never as zero. | Optional | mae,rmse,acc |
| threshold | Precipitation threshold in mm per day for the 'ets' eval metric, ignored otherwise. A day counts as a wet-day event when the total is at or above this. Useful rungs are 0.2, 1.0, 5.0, 10.0, 25.0. | Optional | 1.0 |
Response
| Parameter | Desc | Presence | Default |
|---|---|---|---|
| locid | Location identifier | Yes | |
| location | Location metadata (name, country, lat, lon, elevation) | Yes | |
| metric | The weather metric evaluated | Yes | |
| unit | Natural unit of that metric | Yes | |
| ymd_start | First day evaluated, YYYYMMDD | Yes | |
| ymd_end | Last day evaluated, YYYYMMDD | Yes | |
| days | Number of days in the range | Yes | |
| window | Sliding window length in days | Yes | |
| num_windows | Number of windows: days minus window plus one | Yes | |
| windows | The windows, oldest first, each with ymd_start and ymd_end | Yes | |
| lead_times | Ordered lead times — the FIRST axis of evals | Yes | |
| models | Ordered model keys — the SECOND axis of evals | Yes | |
| eval_metrics | Ordered score names — the THIRD axis of evals | Yes | |
| scanned | Number of evaluation records read | Yes | |
| count | Number of non-null scores in evals; 0 when nothing matched, in which case evals and n are empty lists | Yes | |
| truncated | True when the scan hit its ceiling and stopped early | Yes | |
| evals | A four-level nested list indexed in this order: lead time, then model, then eval metric, then window. So evals[a][b][c][d] is the score of models[b] under eval_metrics[c] for lead_times[a], computed over windows[d]. The lengths of the four levels are exactly the lengths of lead_times, models, eval_metrics and windows, in that order, and never vary. The innermost list is the moving-average series, oldest window first; with the default window it has exactly one element. A value is null when that window had too few verified days. When NOTHING matched the request at all, evals is an empty list rather than a structure full of nulls, and count is 0 -- see note for why | Yes | |
| n | Sample per cell, nested exactly like evals. Days, except for obs.rain.mean and obs.snow.mean where it counts WET days. A zero means no verified sample and the matching evals value is null. Unlike fcastevalbygroup this structure is always fully shaped: a lead time with no records at all is still present, filled with nulls | Yes | |
| n_days | Days behind ets, shaped exactly like n. Identical to n except for obs.rain.mean and obs.snow.mean, where n counts only wet days while ets still scores every day -- so a null ets is explained by this number, not by n | Yes | |
| error_basis | 'wet_days' when mae, rmse, mse and bias were measured only on days whose observed total reached the threshold (obs.rain.mean, obs.snow.mean), 'all_days' otherwise. ets always scores every day | Yes | |
| error | Error message when the request could not be served | No |
Get Token