Current Conditions - Observed
Weather happening now at any point on Earth.
Weather happening now at any point on Earth. Values are measured wherever a qualifying
observation exists, and by default temperature and dew point are brought to the current minute
along the short-range model trend in the US (adjust_to_now=false returns them as measured).
Points with no qualifying observation get the nearest forecast hour, labelled
source: "forecast" (observed_only=true returns a 404 instead).
How a point is answered
- Station report when a weather station is within 15 km of the point. Reports are at most
75 minutes old (stations report hourly and on significant changes). In the US, Alaska,
Hawaii, Puerto Rico and Guam the station must also be within 150 m of the point's ground
elevation; elsewhere the point's elevation is not known, so a nearby station at a different
height (a valley airport for a mountain town) can still be used. Compare
stations[].elevation_manddistance_kmif that matters. - Analysis in the US, Alaska, Hawaii, Puerto Rico and Guam when no station is that close: a 2.5 km gridded analysis of surface observations at the point, refreshed every 15 minutes (hourly outside the lower 48), used only when a station is within 60 km to anchor it.
- Nearest station within
max_distance_km(default 50) everywhere else. - Forecast hour nearest the current time, only when nothing above
qualifies or observations are briefly unavailable.
sourceisforecast,fallbackgives the reason and the nearest station that did not qualify,present_weather_observedis false and the weather code and text are the forecast's own. The forecast covers land and coastal waters in the Northern Hemisphere, so open ocean or a remote Southern Hemisphere point with no station still gets a 404.details.forecast_codethen gives the forecast's reason, the same code/forecast/point/returns there (OCEAN_LOCATION_UNSUPPORTED,LOCATION_OUT_OF_BOUNDS). If the forecast is only temporarily unavailable the answer is a 503DATA_UNAVAILABLE, not a 404.
Pass observed_only=true to never receive a forecast: those points get a 404
NO_OBSERVATION_NEARBY, and an observation outage a 503.
If station reports stop refreshing, reports still under 75 minutes old keep being served with
feed_delayed: true.
Brought up to now. A report or analysis can be up to 75 minutes old, and temperature moves
fastest exactly when people look (the morning warm-up). In the US, temperature and dew point are
carried from their observation time to now along the short-range model trend at the point. On
150 US stations during a morning warm-up this cut the error of hour-old reports from 1.8 °C to
0.7 °C, and of the analysis from 1.8 °C to 1.0 °C. time_adjustment gives the change and the
measured values; adjust_to_now=false turns it off. Feels-like and humidity use the adjusted
values. Sky and weather are always as reported.
Wind is the same current wind and gust as /observations/wind/: a 15-minute wind analysis
corrected to nearby station reports, with a global model blend where there are none. wind
says which was used, its valid time and age. The values are whole numbers here (one decimal
there), calm (under 0.5 m/s) is 0 with no direction on both, and wind_gust stays null unless
the gust is at least 10 knots over the sustained wind. A station within 5 km of the point keeps
its own reported wind, direction and gust unless the grid is over 40 minutes newer than its
report. The point's own source (station,
analysis or forecast) also supplies the wind when the wind grid is missing or over 90
minutes old, when a station report is over 40 minutes newer than the grid, or, with
observed_only=true, where the grid has only model wind; wind.fallback_reason says which.
source, observed_at, data_age_seconds, wind and stations[] say exactly where every
value came from. stations[].used_for lists what each station supplied, and raw_report is the report as
issued, for audit.
Sky always comes from a station report, never the analysis, and weather only from a station that can observe weather. Stations without a precipitation sensor, or with a sensor reported down, are skipped, since their silence does not mean it is dry.
Rain and thunder now. A station report is the weather at the point only when it is under 10 minutes old and within 5 km. Otherwise, where they cover the point, observed radar and lightning decide rain and thunder, so a storm that arrived after the last report, or ended before the next one, is right:
- Lightning within 10 km in the last 5 to 12 minutes is a thunderstorm at the point (
TS), 10 to 20 km a thunderstorm in the vicinity (VCTS), and none clears a station's oldTS. - Radar (the national radar mosaic, lower 48, 1 km every 2 minutes, mean over a 3 x 3 km box) of 0.2 mm/h or more is precipitation at the point. Its rate sets the intensity: light under 2.5 mm/h, heavy over 7.6 mm/h. The type is the station's own (snow, freezing rain) when it reported one, otherwise snow at or below 0 °C, rain at 2 °C or more, unknown precipitation between.
- Radar under 0.2 mm/h clears a station's rain and hail. Its drizzle and snow stand, since those often fall below the radar beam.
- Precipitation is never added where both radar and the station are dry.
radar and lightning give the values used, their time and why either is missing.
present_weather[].sources and weather_sources say what observed each part. Where neither radar
nor lightning covers the point the station report stands as reported. When nothing within 40 km
can detect weather but a station observed the sky, the code describes the sky alone and
present_weather_observed is false. With no observed sky or weather either, the code and sky
fields are null. A forecast fallback point gets the observed code instead of the forecast's when
radar or lightning shows rain or a storm there.
precipitation_probability is 100 while precipitation is observed and null otherwise. A client
showing a "now" precipitation chance should show it instead of the forecast's for the current hour;
/forecast/point/?include=current already does that (see current_hour there).
Weather codes use the same table as /forecast/point/ weather_code, so a client can
share one icon set:
| Codes | Meaning |
|---|---|
| 0-4 | Sunny/Clear, Mostly Sunny/Mostly Clear, Partly Cloudy, Mostly Cloudy, Overcast |
| 10-15 | Haze or dust, mist and fog, smoke |
| 20-22 | Breezy, Windy, Very Windy (only when dry) |
| 30-46 | Drizzle and rain; 46 is rain with strong wind |
| 32, 50-56 | Flurries and snow; 55 blowing snow, 56 blizzard |
| 60-62 | Sleet |
| 70-73 | Freezing rain, ice storm |
| 80-91 | Mixed precipitation |
| 92 | Thunderstorm in the vicinity |
| 94-96 | Thunderstorm, strong thunderstorm, severe thunderstorm |
| 98 | Funnel cloud or tornado |
weather_description is display text for the condition at this moment ("Light Rain",
"Blizzard", "Mostly Clear" at night). Show it as given, rather than the forecast table's
likelihood labels. Rain or snow at the point outranks a thunderstorm only in the vicinity, which
then becomes the secondary code.
During rain or a thunderstorm at or near the point, temperature and dew point are not carried
forward along the model trend (time_adjustment.reason active_weather): the model does not
time a storm's outflow.
Response time: under 100 ms for a point seen before. The first request for a new point in the
US analysis domains can take up to about a second while the ground elevation and analysis are
looked up; elevation is then cached for 30 days, the analysis for 15 minutes and the trend for
up to an hour. Radar and lightning are read alongside the station lookup and never hold a request
more than half a second; a slow read is reported as read_failed and skipped for 30 seconds.
Token-based authentication with required prefix "Token"
In: header
Query Parameters
true (default): in the US, carry temperature and dew point from their observation time to now along the short-range model trend at the point (see time_adjustment). false: return the measured values unchanged.
Value in
- "false"
- "true"
Latitude in decimal degrees (-90 to 90). Any point on Earth.
floatLongitude in decimal degrees (-180 to 180).
floatFurthest station, in km, that may stand in for the point when no station is within 15 km. 1 to 150, default 50. Lower it to demand a closer report; a point with nothing in range gets a 404 rather than a distant reading.
floatfalse (default): where no observation qualifies, or observations are briefly unavailable, answer with the forecast for this minute (source: "forecast"). true: observations only; such points get a 404 or 503 instead.
Value in
- "false"
- "true"
english (default): °F, mph, miles, inHg, feet, inches. metric: °C, km/h, km, hPa, metres, millimetres.
Value in
- "english"
- "metric"
Response Body
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/observations/current/?lat=32.8974&lon=-97.022"{ "location": { "lat": 32.8974, "lon": -97.022, "elevation_m": null }, "source": "station", "observed_at": "2026-10-02T14:56:00Z", "data_age_seconds": 540, "units": "english", "unit_labels": { "temperature": "F", "wind_speed": "mph", "visibility": "mi", "pressure": "inHg", "ceiling": "ft", "precipitation": "in", "precipitation_rate": "in/h", "distance": "mi" }, "conditions": { "temperature": 73.9, "dewpoint": 72, "relative_humidity": 94, "feels_like": 73.9, "wind_speed": 10, "wind_direction": 10, "wind_direction_cardinal": "N", "wind_variable": false, "wind_gust": null, "visibility": 10, "visibility_more_than": true, "visibility_less_than": false, "pressure_sea_level": null, "altimeter": 30.03, "cloud_cover": "overcast", "ceiling": 700, "cloud_layers": [ { "cover": "broken", "base": 700, "type": null }, { "cover": "broken", "base": 1500, "type": null }, { "cover": "overcast", "base": 3400, "type": null } ], "present_weather": [], "present_weather_observed": true, "weather_sources": [ "station", "lightning", "radar" ], "precipitation_observed": false, "thunder_observed": false, "precipitation_probability": null, "precipitation_rate": 0, "precipitation_last_hour": null, "precipitation_last_hour_trace": false, "weather_code": 4, "weather_description": "Overcast", "weather_code_secondary": null, "weather_description_secondary": null, "is_day": true }, "radar": { "available": true, "valid_time": "2026-10-02T15:02:00Z", "data_age_seconds": 180, "precipitation_rate": 0, "precipitation_rate_max": 0, "reason": null }, "lightning": { "available": true, "nearest_distance": 635.5, "window_minutes": 12, "sources": [ "satellite" ], "reason": null }, "wind": { "source": "station", "valid_time": "2026-10-02T14:56:00Z", "data_age_seconds": 540, "fallback_reason": "station_nearby" }, "time_adjustment": { "applied": false, "reason": "no_trend", "from": "2026-10-02T14:56:00Z", "to": "2026-10-02T14:56:00Z", "temperature": 0, "dewpoint": 0, "measured_temperature": 73.9, "measured_dewpoint": 72 }, "stations": [ { "id": "KDFW", "name": "Dallas-Ft Worth Intl", "state": "TX", "country": "US", "lat": 32.8974, "lon": -97.022, "elevation_m": 168, "distance_km": 0, "bearing_deg": 0, "observed_at": "2026-10-02T14:56:00Z", "data_age_seconds": 540, "report_type": "SPECI", "raw_report": "SPECI KDFW 021456Z 01009KT 10SM BKN007 BKN015 OVC034 23/22 A3003 RMK AO2 T02330222", "used_for": [ "temperature", "humidity", "wind", "visibility", "pressure", "sky", "weather" ] } ], "feed_delayed": false, "fallback": null}
