Skip to content

Point forecasts

GET https://api.vertexmaps.com/v1/forecast

Alias: /v1/point. One credit per location, per block of ten hourly variables, per model.

Parameter Values Default
latitude, longitude Comma lists of equal length, WGS84. Up to 50 locations; the response is an array when there are several. required
hourly Comma list of hourly fields.
current Comma list of hourly field names. Returns the value at the current hour.
daily Comma list of daily fields.
models Comma list of hrrr, rrfs, gfs, ecmwf (nam until 2026-10-14). Several models suffix every field with _model. hrrr
temperature_unit celsius, fahrenheit celsius
wind_speed_unit kmh, ms, mph, kn kmh
precipitation_unit mm, inch. Also drives snowfall (cm → inch) and snow_depth (m → inch). mm
timezone An IANA name, GMT, or auto. auto picks the CONUS zone from the coordinates. GMT
timeformat iso8601, unixtime iso8601
format json, csv, flatbuffers json
forecast_days 1–16, counted from today in the response timezone. all
forecast_hours 1–384, counted from the current hour. all
start_hour, end_hour YYYY-MM-DDTHH:MM in the response timezone.
elevation Metres. Overrides the DEM sample for the lapse correction. DEM
dry_run 1 returns {product, credits} without executing.

past_days, past_hours, start_date and end_date return 400 until history ships.

At least one of hourly, current or daily is required.

Standard (Open-Meteo names, Open-Meteo units):

temperature_2m dew_point_2m relative_humidity_2m cloud_cover cloud_cover_low cloud_cover_mid cloud_cover_high precipitation wind_speed_10m wind_direction_10m wind_gusts_10m cape surface_pressure pressure_msl boundary_layer_height snowfall snowfall_water_equivalent snow_depth snow_water_equivalent

Vertex:

Field Unit Meaning
wstar m/s Deardorff convective velocity scale: the strength of thermals.
hcrit m MSL Height where updraft falls below a usable climb rate.
top_of_lift m MSL Usable lift top: hcrit capped by cloud base when cumulus form. null when there is no usable lift.
top_of_lift_agl m AGL The same, above the model’s terrain.
cloud_base m MSL Cumulus base. null when the lifted parcel never saturates inside the mixed layer (a blue day).
cloud_base_agl m AGL
cu_depth m Cumulus depth. Large values mean overdevelopment.
smoke µg/m³ Near-surface smoke (HRRR only).
us_aqi AQI EPA PM2.5 AQI from the smoke field (HRRR only).
wind_speed_{1000..18000}ft, wind_direction_{1000..18000}ft Winds aloft at every 1,000 ft MSL step, earth-relative. Each level counts as one variable.

Availability by model: the soaring fields need boundary-layer fluxes, so they are HRRR, RRFS, NAM and GFS only. snowfall is HRRR and RRFS. smoke and us_aqi are HRRR. Asking a model for a field it lacks returns 400 naming both.

Older spellings (windspeed_10m, cloudcover, dewpoint_2m, thermal_velocity, cloudbase, …) are accepted and echoed back under the spelling you used.

current=temperature_2m,wind_speed_10m returns a current block at the most recent model hour plus current_units, with interval: 3600. On its own it costs half a credit.

"current": { "time": "2026-09-19T15:00", "interval": 3600, "temperature_2m": 24.1, "wind_speed_10m": 11.2 }

Aggregated over local calendar days of the response timezone, including partial days at either end:

temperature_2m_max temperature_2m_min precipitation_sum snowfall_sum wind_speed_10m_max wind_gusts_10m_max cloud_cover_mean relative_humidity_2m_mean cape_max wstar_max top_of_lift_max cloud_base_min smoke_max us_aqi_max

models=hrrr,gfs returns one object with every field suffixed by model on a shared hourly axis; hours a model does not cover are null. model, model_run and model_elevation become per-model maps.

{
"model": ["hrrr", "gfs"],
"model_run": { "hrrr": "2026-09-19T12:00Z", "gfs": "2026-09-19T06:00Z" },
"hourly": {
"time": [""],
"temperature_2m_hrrr": [18.8, 16.1, ""],
"temperature_2m_gfs": [15.3, 14.5, ""]
}
}

Each model bills separately.

format=csv returns one table per location: a comment line with the location, a header with units, then a row per hour.

# latitude=46.87 longitude=-113.99 elevation=976 timezone=America/Denver
time,temperature_2m (°C),wstar (m/s)
2026-09-19T09:00,14.2,0.6

format=flatbuffers returns the binary the official Open-Meteo SDKs decode (openmeteo-requests for Python, @openmeteo/sdk for TypeScript, and the Swift, Kotlin, Go and Rust clients): size-prefixed WeatherApiResponse messages, one per location and model. Times are unix seconds with the response’s UTC offset; several models come back as separate messages tagged with the model rather than as suffixed fields.

Variables are identified by the schema’s enums. Open-Meteo names map exactly (temperature_2m is Variable.temperature at altitude 2, temperature_2m_max adds Aggregation.maximum, winds aloft carry their level in metres). The Vertex fields (wstar, top_of_lift, cu_depth, smoke, …) have no enum entry and arrive as Variable.undefined; read them by position, which matches the order of your hourly= list.

import openmeteo_requests
om = openmeteo_requests.Client()
responses = om.weather_api("https://api.vertexmaps.com/v1/forecast", params={
"latitude": 46.87, "longitude": -113.99,
"hourly": ["temperature_2m", "wstar", "top_of_lift"],
"timezone": "auto", "apikey": "vtx_live_…",
})
hourly = responses[0].Hourly()
wstar = hourly.Variables(1).ValuesAsNumpy() # m/s, by position

model_run is the run the values come from. When the current run’s horizon is shorter than the retained synoptic run’s, later hours come from that run and model_run_extended names it. Hours not yet published by NOAA are null, never fabricated.