# US Weather Station Data: METAR + NWS Climate (Kalshi stations) (`mikee368/us-weather-station-data`) Actor

Latest METAR observations plus the official NWS Daily Climate Report (CLI) max/min temperature for US stations, with a preset for common Kalshi settlement stations (KNYC, KMDW, KLAX, KAUS, KMIA, KDEN, KPHL). Source: NOAA/National Weather Service (public domain).

- **URL**: https://apify.com/mikee368/us-weather-station-data.md
- **Developed by:** [Mike Berckmoes](https://apify.com/mikee368) (community)
- **Categories:** Automation, Developer tools, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.50 / 1,000 station observations

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## US Weather Station Data: METAR + NWS Daily Climate Report (Kalshi settlement stations)

Get the **latest METAR observation** and the **official NWS Daily Climate Report (CLI) max/min temperature** for US weather stations in one small, cheap run. It includes a preset for the stations that commonly settle Kalshi daily high-temperature markets: New York Central Park (KNYC), Chicago Midway (KMDW), Los Angeles (KLAX), Austin (KAUS), Miami (KMIA), Denver (KDEN) and Philadelphia (KPHL).

Run it with an empty input `{}` and you get KNYC, KMDW and KLAX right away.

### What you get (one row per station)

| Field | Example |
|---|---|
| `stationId`, `stationName` | `KNYC`, `New York Central Park, NY` |
| `observedAt` (UTC), `tempC`, `tempF`, `dewpointC` | `2026-10-03T22:51:00Z`, `18.3`, `64.9`, `6.1` |
| wind, visibility, altimeter, sea-level pressure, flight category | `windSpeedKt`, `visibilityMi`, `altimeterInHg`, ... |
| 6 h / 24 h max-min from the METAR, precipitation | `maxT6hC`, `minT24hC`, `precipIn` |
| `rawMetar` | `METAR KNYC 032251Z AUTO 00000KT 10SM CLR 18/06 A3028 ...` |
| `climate`: latest CLI report (often **preliminary**, e.g. "valid as of 4 PM") | `{reportDate, isFinal, validAsOf, maxF, maxTimeLocal, minF, minTimeLocal, issuedAt, productUrl}` |
| `climateFinal`: latest **final** full-day CLI report | `{reportDate: "2026-10-02", isFinal: true, maxF: 83, maxTimeLocal: "4:14 PM", ...}` |
| `fetchedAt`, `source`, `attribution` | |

### Input

- **Stations**: ICAO IDs (`KNYC`, `KMDW`, ...). A comma-separated string also works.
- **Station preset**: `kalshiHighTemp` adds the 7 stations listed above. Always check each market's own rules for the exact settlement source and report.
- **Include NWS Daily Climate Report** (default on): adds `climate` and `climateFinal`.
- **Only new since last run**: watch mode for schedules. A station is only output when it has a newer METAR or a new CLI report than the previous run with the same **Monitor ID**.

### Typical uses

- Schedule it every 10–30 minutes and send new observations to a webhook, Google Sheets or your own database.
- After the day ends, record the final official daily max/min per station for backtesting and data analysis.
- Get a quick morning check of overnight lows and the preliminary afternoon high.

### How it works, and why it is cheap

- **One request** downloads the official aviationweather.gov bulk METAR file (latest report for every station), then filters it locally.
- api.weather.gov is used only for the CLI reports. Requests are sequential and gentle, with an identifying User-Agent.
- It runs at 128 MB memory and usually takes a few seconds.
- It is robust: if a source or station is down, the run still **succeeds** with whatever data is available, and the status message tells you what was missing.

### Pricing

Pay per result: you pay only for station rows that are pushed to the dataset. There is no start fee.

### Limitations

- METAR and CLI data are only as timely as NWS publishes them. CLI reports usually appear in the late afternoon (preliminary) and early the next morning (final).
- Times in `maxTimeLocal`/`minTimeLocal` are local standard time, as printed in the NWS report.
- For stations outside the preset, the CLI location is guessed as the ICAO ID without the leading "K". If no CLI report exists for that location, `climate` is empty and the METAR data is still returned.
- This is a data tool, not advice of any kind. It contains no market or betting data.

### Data source and attribution

Source: NOAA/National Weather Service (public domain). Data comes from aviationweather.gov and api.weather.gov. This Actor is independent and not affiliated with or endorsed by NOAA, the National Weather Service or Kalshi.

# Actor input Schema

## `stations` (type: `array`):

ICAO station IDs, e.g. KNYC (Central Park), KMDW (Chicago Midway), KLAX. Leave empty for KNYC, KMDW, KLAX.

## `stationPreset` (type: `string`):

Adds a ready-made list of stations to 'Stations'. Always check each market's own rules for the exact settlement source.

## `includeClimateReport` (type: `boolean`):

Adds the latest CLI report (often preliminary, 'valid as of 4 PM') and the latest FINAL full-day report with official max/min °F and times.

## `newSinceLastRun` (type: `boolean`):

Watch mode for schedules: output a station only if it has a newer METAR or a new CLI report than the previous run with the same Monitor ID.

## `monitorId` (type: `string`):

Separate memory per schedule/task for 'Only new since last run'.

## Actor input object example

```json
{
  "stations": [
    "KNYC",
    "KMDW",
    "KLAX"
  ],
  "stationPreset": "none",
  "includeClimateReport": true,
  "newSinceLastRun": false,
  "monitorId": "default"
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset with one row per station

## `summary` (type: `string`):

Sources OK/failed, requests, missing stations

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "stations": [
        "KNYC",
        "KMDW",
        "KLAX"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mikee368/us-weather-station-data").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "stations": [
        "KNYC",
        "KMDW",
        "KLAX",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("mikee368/us-weather-station-data").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "stations": [
    "KNYC",
    "KMDW",
    "KLAX"
  ]
}' |
apify call mikee368/us-weather-station-data --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mikee368/us-weather-station-data"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/j4M3bXfJ0Je4bSq9S/builds/GYjIyLQEXWzdobJ4x/openapi.json
