Benchmark Labs
Forecast API

30 forecast models. One clean API.

Built for trading desks and anyone who needs programmatic weather — the Benchmark Labs forecast plus 29 global and regional models (ECMWF, GFS, ICON, GEM, UKMO, JMA, HRRR and more), every model in one hourly schema, any location, up to 16 days out. Sign in to see the docs and your API key.

What you get

30 forecast modelsBenchmark Labs (default), ECMWF IFS + AIFS, NOAA GFS/HRRR/NBM, ICON, GEM/HRDPS, Météo-France, UKMO, JMA, Nordic blends, MeteoSwiss, NWS and more
Hourly resolutionTemperature, wind, humidity, precipitation, snow, precip probability
Any locationQuery by latitude/longitude, worldwide
ActualsMeasured conditions from the nearest weather station — verify which model is actually right
Simple authPersonal API key — works from Python, Excel, cron, anything that can make an HTTP request
Free trial14 days · up to 10 locations · unlimited pulls on those locations

Access is enabled per company. If your team isn't set up yet, contact info@benchmarklabs.com.

Sign in

Use your work email — access is enabled per company, so everyone on an approved domain gets in.

Not enabled yet

isn't part of an organization with access to the Forecast API. Ask us to enable your company's email domain — every colleague on it gets access at once.

Contact info@benchmarklabs.com to activate your team.

Set a new password

Your API key

Your locations

The first 10 unique coordinates you pull are locked to your account automatically (rounded to 2 decimal places ≈ 1 km — nearby jitter reuses the same slot). Pull these as often as you like. Locations are shared account-wide when access is enabled for your whole domain.

Your usage

calls today
last 7 days
last 30 days
daily limit

Quick start

One endpoint. Pass a latitude, a longitude, a model, and your key:


    

Your key can go in the X-API-Key header, an Authorization: Bearer header, or the ?key= query parameter — whichever is easiest in your tooling.

Endpoint reference

GET /v1/forecast

ParamRequiredDescription
latyesLatitude, −90 … 90
lonyesLongitude, −180 … 180
modelnoOne of the model ids below. Default benchmark.
unitsnometric (default) or imperial
keynoYour API key, if not sent as a header

Models

idModelTime scaleCoverage

Every model returns one value per hour, in UTC, for its full horizon (a model's native step can be coarser at long lead times — values are served as a uniform hourly series). GET /v1/models returns this list as JSON (no auth needed).

Response

{
  "location": { "lat": 39.74, "lon": -104.99 },
  "model": "benchmark",
  "units": "metric",
  "generated_at": "2026-08-04T22:00:00Z",
  "offsetMinutes": -360,            // location's UTC offset
  "hourly": [
    {
      "time": "2026-08-04T23:00:00.000Z",   // UTC
      "tempC": 23.0,          // °C   (imperial: tempF, °F)
      "rh": 38,               // relative humidity %
      "windMs": 3.1,          // m/s  (imperial: windMph)
      "windDir": 210,         // degrees, meteorological
      "precipMm": 0,          // mm/hour (imperial: precipIn)
      "snowMm": 0,            // mm/hour (imperial: snowIn)
      "precipChance": 10,     // %
      "uvIndex": 6,
      "feelsLikeC": 23.5      // (imperial: feelsLikeF)
    }
  ]
}

Fields a model does not provide come back as null (e.g. NWS has no hourly precipitation amounts or UV).

Time zones

Every time value is UTC (ISO-8601, Z suffix), top-of-hour, for every model and observation source — join series from different models directly on time. Forecast series start at the current hour: no past values, ever. offsetMinutes is the location's current UTC offset — local time = time + offsetMinutes minutes. Station observation responses also include the IANA timeZone name (e.g. America/Los_Angeles). One caveat: offsetMinutes is the offset right now — if a daylight-saving change falls inside a 15-day horizon, convert with a proper tz library (Python zoneinfo) using the timeZone name instead of adding a fixed offset.

Errors

StatuserrorMeaning
401missing_key / invalid_keyNo key, or the key is wrong or revoked
403not_enabledAccount not activated
403trial_expiredTrial ended — contact us to continue
403location_limitNew location beyond your plan's cap; response lists your locked locations
429rate_limitedPer-minute (60) or daily cap reached — check scope and Retry-After
400bad_request / unknown_model / model_unavailable_for_locationFix the request (NWS is US-only)
502upstream_unavailableThe model's feed hiccuped — retry shortly

Limits

Trial default: 10 locations, unlimited pulls on them up to 10,000 calls/day, soft limit 60 calls/minute. Forecasts update continuously; pulling more than once per 10 minutes per location returns the same data. Need more locations or volume? Talk to us.

Observations — actual measured conditions

Forecasts across models tell you the spread (how much the models disagree — a direct uncertainty signal). Observations tell you the truth: what actually happened, so you can score which model has been most accurate at your locations lately.

GET /v1/observations

ParamRequiredDescription
lat, lonyesSame as the forecast endpoint — counts toward the same location pool
sourcenostation (default): recent hourly measurements from the nearest official weather station, with station id, name and distance. US only. current: single current-conditions snapshot at the point, worldwide.
hoursnoHow far back (station source only), 1–168. Default 48.
unitsnometric (default) or imperial

Station response

{
  "location": { "lat": 32.72, "lon": -117.16 },
  "source": "station",
  "station": {
    "id": "KSAN", "name": "San Diego International Airport",
    "lat": 32.73, "lon": -117.18, "distance_km": 2.1
  },
  "timeZone": "America/Los_Angeles",
  "offsetMinutes": -420,
  "hours": 48,
  "hourly": [
    { "time": "...", "tempC": 22.8, "rh": 64, "windMs": 4.1, "windDir": 290,
      "precipMm": 0, "dewPointC": 15.6, "pressureHpa": 1013.2 }
  ]
}

Score the models against reality

Pull yesterday's forecasts each day, store them, then compare against station actuals — after a couple of weeks you know exactly which model to trust at each of your locations:


  

Code examples

Python


    

Excel (Power Query)

Data → Get Data → From Other Sources → Blank Query, then:


    

Compare all models at one location


  
Forecast data is drawn from multiple third-party numerical weather models and is provided as-is for informational purposes; it is not financial advice. See the Terms of Use. Model data © respective providers · NWS data via weather.gov · multi-model data via Open-Meteo.com.