NWS Official Weather: Daily High/Low & METAR Data avatar

NWS Official Weather: Daily High/Low & METAR Data

Pricing

from $20.00 / 1,000 daily climate reports

Go to Apify Store
NWS Official Weather: Daily High/Low & METAR Data

NWS Official Weather: Daily High/Low & METAR Data

Official NOAA/NWS daily climate reports for about 600 US stations as clean JSON: max and min temperature with times, precipitation, snow, wind, records, normals, preliminary vs final. Plus hourly METAR observations for any station. Public-domain data from api.weather.gov, no key, no scraping.

Pricing

from $20.00 / 1,000 daily climate reports

Rating

0.0

(0)

Developer

Tenzin Phuntsok

Tenzin Phuntsok

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

14 days ago

Last modified

Share

Get the official NOAA / National Weather Service daily high and low, precipitation, snow, wind, records and normals for about 600 US stations as clean JSON rows, plus hourly METAR observations for any NWS station. Pick stations and dates, click Start, and download the dataset or pull it through the API. Public-domain government data, straight from api.weather.gov: no key, no scraping, no browser.

What does NWS Official Weather do?

The National Weather Service publishes a Climatological Report (Daily), product code CLI, for each of its climate stations every day. It is fixed-width text written for humans. This Actor fetches those reports and parses them field by field, and it also fetches the station's raw hourly observations.

  • Daily climate report: the official maximum and minimum temperature with the time each occurred, average temperature, precipitation, snowfall and snow depth, heating and cooling degree days, peak wind and gust, sky cover, humidity, the record and normal values for the date, and the normals for tomorrow. Preliminary and final versions of the report are kept apart.
  • Station observations: the hourly and special observations for any NWS/ICAO station (temperature, dewpoint, humidity, wind, gust, pressure, visibility, cloud layers, raw METAR), converted to US units.

Run it once for a date range, or schedule it daily to build your own history. Results are available as JSON, CSV or Excel, through the API, or chained into another Actor such as Dataset to Google Sheets Sync.

Who is NWS weather data for?

  • Prediction-market and weather-derivative traders who want the official NWS daily high and low, not a third-party estimate, with the preliminary and final report versions kept apart.
  • Analysts, dashboards and AI agents that need one clean row per station-day instead of parsing fixed-width government text.
  • Anyone who needs recent station observations with the original METAR attached.

Important: exchanges such as Kalshi and Polymarket settle each market on the source named in that market's rules (for many temperature markets that is The Weather Company, not NWS directly). This Actor returns the official NWS data; it does not claim to be the settlement source for any contract. Check the market rules yourself.

How to get NWS daily climate reports

  1. Open the Input tab and enter one or more station ids such as KNYC (Central Park), KMDW (Chicago Midway) or KMIA (Miami).
  2. Leave Data on daily_climate for the climate report, or switch to observations or both.
  3. Set the start date (yesterday by default) and optionally an end date, up to 31 days per run.
  4. Click Start. The Output tab shows one row per station-day; download it as JSON, CSV or Excel, or read it through the API.
  5. To build a history, create a Schedule that runs every morning after about 8 AM local time, when the final report for the previous day has been issued.

Input

FieldDefaultMeaning
stations["KNYC"]Station ids. Examples: KNYC Central Park, KMDW Chicago Midway, KMIA Miami, KLAX Los Angeles, KDEN Denver, KPHL Philadelphia, KAUS Austin, KSFO San Francisco, KBOS, KATL, KDFW, KSEA.
modedaily_climatedaily_climate, observations or both.
startDateyesterdayYYYY-MM-DD, today, yesterday or -N (N days ago).
endDatesame as startUp to 31 days per run.
timezoneAmerica/New_YorkIANA zone used to resolve today / yesterday. Observation day boundaries follow each station's own time zone (from NWS station metadata); this is only the fallback.
reportslatestlatest = newest report per day (final once issued, else the latest preliminary). final = final reports only. all = every issuance.
observationIntervalhourlyhourly = one observation per clock hour. metar = every observation with a raw METAR, including specials. all = every record (5-minute data at ASOS airports, about 300 rows a day).
includeRawTextfalseAttach the original report text to each climate row.
cliLocationsnoneOverride the 3-letter climate location code for a station, e.g. {"PAGS": "GUS"}. K-stations use the last three letters (KNYC = NYC); the main Alaska, Hawaii, Puerto Rico and Pacific airports (PAFA, PANC, PAJN, PABR, PHNL, PHOG, PHTO, PHLI, TJSJ, PGUM, NSTU and others) are built in. Any other non-K station needs an entry here.
maxConcurrency4Parallel requests to api.weather.gov (1-8), shared across all stations.

Example: the final report for Chicago Midway and Miami for the last three days.

{
"stations": ["KMDW", "KMIA"],
"mode": "daily_climate",
"startDate": "-3",
"endDate": "yesterday",
"reports": "final"
}

Output

One row per station-day (climate) or per observation. You can download the dataset as JSON, CSV, Excel or HTML. Climate row, main fields:

{
"type": "climate_report",
"station": "KNYC",
"cliLocation": "NYC",
"locationName": "CENTRAL PARK NY",
"office": "KOKX",
"date": "2026-09-24",
"reportType": "final",
"validAsOfLocal": null,
"issuedLocal": "233 AM EDT FRI SEP 25 2026",
"issuedAt": "2026-09-25T06:33:00+00:00",
"maxTempF": 66,
"maxTempTime": "15:05",
"maxTempIsRecord": false,
"maxTempRecordF": 91,
"maxTempRecordYears": [2017],
"maxTempNormalF": 73,
"maxTempDepartureF": -7,
"maxTempLastYearF": 80,
"minTempF": 53,
"minTempTime": "06:44",
"minTempRecordF": 40,
"minTempRecordYears": [1963],
"minTempNormalF": 60,
"avgTempF": 60,
"precipIn": 0,
"precipTrace": false,
"precipMonthToDateIn": 2.21,
"precipYearToDateIn": 33.56,
"snowIn": 0,
"snowDepthIn": 0,
"heatingDegreeDays": 5,
"coolingDegreeDays": 0,
"highestWindMph": 17,
"highestWindDirection": "NE",
"highestGustMph": 32,
"avgWindMph": 10,
"avgSkyCover": 0.4,
"weatherObserved": [],
"humidityHighestPct": 74,
"humidityLowestPct": 42,
"normals": {
"for": "today",
"maxNormalF": 73,
"maxRecordF": 90,
"maxRecordYears": [1970],
"minNormalF": 59,
"minRecordF": 40,
"minRecordYears": [1887]
},
"productId": "d328a89d-29f7-474e-9de8-c96a5ca3cb5e",
"sourceUrl": "https://api.weather.gov/products/d328a89d-29f7-474e-9de8-c96a5ca3cb5e",
"source": "NOAA/NWS Climatological Report (Daily, product CLI) via api.weather.gov",
"licence": "US Government work, public domain",
"fetchedAt": "2026-09-25T13:02:11.000Z",
"tables": { "temperature": [], "precipitation": [], "snowfall": [], "heating": [], "cooling": [] }
}

Notes on climate rows

  • reportType is preliminary for the afternoon or early-morning versions ("VALID AS OF ... LOCAL TIME") and final for the full-day report issued after local midnight. validAsOfLocal carries the cut-off time of a preliminary report.
  • Times such as maxTempTime are local standard time as printed by NWS, in 24-hour HH:MM.
  • precipTrace / snowTrace are true when NWS printed T (a trace); the numeric value is then 0.
  • *IsRecord is true when NWS flagged the value with R (record set or tied).
  • tables holds every row of the report's fixed-width table (observed, time, record, record years, normal, departure, last year) for precipitation, snowfall and degree days, so nothing is lost.
  • Missing values (MM in the report) are null. A day whose max and min are both MM is still returned (NWS says the data is missing), with a note in the log.
  • Not every office publishes every column. reportColumns lists the columns that office prints (for example Emporia KS prints no record values, Seattle prints no normals). A field whose column is absent is null. About 84% of stations use the full layout.

Observation rows

Main fields: station, stationName, stationTimeZone, timestamp (UTC), tempF, tempC, dewpointF, humidityPct, windDirectionDeg, windSpeedMph, windGustMph, pressureInHg, seaLevelPressureMb, visibilityMi, precipLastHourIn, maxTempLast24HoursF, minTempLast24HoursF, heatIndexF, windChillF, cloudLayers, textDescription, rawMetar, sourceUrl.

How much does NWS weather data cost?

Pay per event, Apify platform usage included:

EventPrice
Daily climate report row$0.02
Hourly observation row$0.001
Actor start$0.00005

Examples: one station every day for a year is about $7.30; ten stations scheduled daily for 30 days is about $6; a full day of hourly observations for one station is about $0.024. You are charged only for rows actually written to the dataset. A run that returns no rows fails and charges only the start event. Current prices are always on the Pricing tab.

Limits and tips

  • api.weather.gov keeps roughly the last 7 days of climate reports and observations. Older dates return no rows. Schedule the Actor daily if you want to build a history.
  • The final climate report for a day is normally issued between about 1 AM and 8 AM local time the next day. Run after that, or use reports: latest to get the preliminary version meanwhile.
  • Not every observation station has a climate report. About 600 do; the list is at https://api.weather.gov/products/types/CLI/locations. If a station's report is filed under a code the Actor cannot derive, use cliLocations. You can also pass the 3-letter code itself as the station ("FAI") in daily_climate mode.
  • Three Pacific offices (Palau TKR, Chuuk TKK, Tinian T11) publish a free-form report that is not parsed; they return a warning instead of a row.
  • A run that produces no rows fails, with the reason in the status message. Only the Actor start event is charged for such a run.
  • A station that fails (unknown id, NWS error) is reported in the log and status message; the other stations still return rows.
  • Rows are written in batches per station; the order of stations in the dataset is not guaranteed.
  • If a run is stopped (timeout, abort, platform restart), use Resurrect on the run: it continues with the stations that were not finished. After a hard stop, stations finished in the last two seconds before the stop may appear twice.
  • NWS asks for modest request rates. Keep maxConcurrency low for large station lists.
  • Airport ASOS stations report every 5 minutes; the default observationInterval: hourly keeps one record per hour so a day is about 24 rows, not 300.

Data source and licence

Data is produced by the US National Weather Service and retrieved from https://api.weather.gov. NWS states that its information "is in the public domain and may be used without charge for any lawful purpose". This Actor is not affiliated with or endorsed by NOAA or the NWS; it only names them as the source of the unaltered data. Each row carries source, sourceUrl and licence so you can cite it.

Other Actors by osel_house

FAQ and support

Is this the number Kalshi or Polymarket settles on?

Not necessarily. Each market names its own settlement source in its rules; for many temperature markets that is The Weather Company. This Actor gives you the official NWS report, which is often the same reading but is not the contract's source. Read the market rules.

Why is yesterday's report marked preliminary?

The final report is issued the next day, usually between 1 AM and 8 AM local time. Until then reports: latest returns the newest preliminary version with reportType: preliminary. Run again later, or schedule the run after 8 AM local time.

Can I get data older than a week?

No. api.weather.gov keeps about seven days. Schedule the Actor daily to accumulate your own archive, and send the rows to a Google Sheet or a database.

Something broke?

Open an issue in the Issues tab with the run id and the station and date you asked for. Parsing problems on an unusual report are usually fixed within a day. Custom variants (other NWS products, other output formats) can be built on request.