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

  1. 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_m and distance_km if that matters.
  2. 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.
  3. Nearest station within max_distance_km (default 50) everywhere else.
  4. Forecast hour nearest the current time, only when nothing above qualifies or observations are briefly unavailable. source is forecast, fallback gives the reason and the nearest station that did not qualify, present_weather_observed is 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_code then 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 503 DATA_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 old TS.
  • 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:

CodesMeaning
0-4Sunny/Clear, Mostly Sunny/Mostly Clear, Partly Cloudy, Mostly Cloudy, Overcast
10-15Haze or dust, mist and fog, smoke
20-22Breezy, Windy, Very Windy (only when dry)
30-46Drizzle and rain; 46 is rain with strong wind
32, 50-56Flurries and snow; 55 blowing snow, 56 blizzard
60-62Sleet
70-73Freezing rain, ice storm
80-91Mixed precipitation
92Thunderstorm in the vicinity
94-96Thunderstorm, strong thunderstorm, severe thunderstorm
98Funnel 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.

GET
/observations/current/

Authorization

Authorization<token>

Token-based authentication with required prefix "Token"

In: header

Query Parameters

adjust_to_now?string

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"
lat*number

Latitude in decimal degrees (-90 to 90). Any point on Earth.

Formatfloat
lon*number

Longitude in decimal degrees (-180 to 180).

Formatfloat
max_distance_km?number

Furthest 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.

Formatfloat
observed_only?string

false (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"
units?string

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}