# Weather Station Data for Kalshi & Polymarket Traders (`evolve-data/weather-station-data`) Actor

Live high/low so far, METAR observations and official NWS daily climate reports for US weather stations. Enter a station or a Kalshi temperature series (KXHIGHNY) and get the referenced station's data. Public government data, no API keys.

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

## Pricing

$1.00 / 1,000 weather records

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

## Weather Station Data for Kalshi & Polymarket Traders

Live and historical data from official US weather stations: the **high and low so far today**, every **METAR observation**, and the **official NWS daily climate reports**. Built for weather-market traders, but it works for any US station.

Enter a station id **or a Kalshi temperature series** (e.g. `KXHIGHNY`, `KXLOWTCHI`), and the Actor looks up which station that market references (for example New York → Central Park `KNYC`, Chicago → Midway `KMDW`) and returns its data. No login, no API keys.

### What you get

**Today so far** (`today`), one record per station:

- High and low so far for the current **NWS climate day**, which runs midnight to midnight *local standard time* even during daylight saving time (a common source of mistakes)
- Current temperature, time of the high and low, number of observations
- The latest NWS daily climate report for today, with its issue time and a `preliminary` flag when it was issued before the day ended

**Observations** (`observations`): every hourly METAR and special SPECI report with temperature (°F/°C), dewpoint, wind, gusts, visibility, pressure, flight category and the raw METAR. Up to 360 hours back, or any date range going back decades.

**Daily climate reports** (`dailyClimate`): the official NWS CLI daily high and low (with times), normals, records, precipitation and snow for any date range.

### Example: "today" record

```json
{
  "type": "today",
  "station": "KNYC",
  "stationName": "New York City, Central Park",
  "kalshiSeries": "KXHIGHNY",
  "climateDate": "2026-09-23",
  "currentTempF": 66,
  "highSoFarF": 66,
  "highSoFarTimeLocal": "2026-09-23T13:51:00",
  "lowSoFarF": 55,
  "nwsClimateReportHighF": 67,
  "nwsClimateReportPreliminary": true
}
```

### Use cases

- Track the running daily high and low for weather-market positions on a schedule (every 5–15 minutes)
- Backtest temperature strategies with years of official daily highs and lows
- Check how hourly METAR readings compare with the official daily value
- Aviation, agriculture, energy and research pipelines that need clean station data

### Important

- Kalshi's US temperature markets currently resolve **according to The Weather Company** for the NWS station named in the rules. This Actor gives you the underlying official NWS station data, which is what that value is measured from, but it is **not** the settlement source itself. Always check the market rules.
- The high and low so far come from hourly and special METAR reports. The official daily value uses 1-minute data and can differ by a degree or so.
- US stations only. International markets (Seoul, London…) are not covered.

### Data sources

Official public-domain data from the National Weather Service (api.weather.gov), the NOAA Aviation Weather Center (aviationweather.gov), and the Iowa Environmental Mesonet ASOS/CLI archive. Market-to-station mapping comes from Kalshi's public market rules.

### Pricing

Pay per record, and nothing for failed stations. Schedule it as often as you like and set a maximum cost per run.

Questions or a station that doesn't work? Open an issue. Issues are answered within 24 hours.

# Actor input Schema

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

US weather stations. Use an ICAO id (KNYC, KMDW), a 3-letter id (NYC), an NWS climate report id (CLINYC) or a Kalshi temperature series (KXHIGHNY, KXLOWCHI) and the referenced station is found automatically.

## `modes` (type: `array`):

today = running high/low so far for the current NWS climate day (local standard time) plus the latest NWS climate report. observations = every METAR/SPECI report. dailyClimate = official NWS daily climate reports (high, low, normals, records, precipitation).

## `hoursBack` (type: `integer`):

For recent observations when no start date is set. Up to 360 hours.

## `startDate` (type: `string`):

For history: daily climate reports and observations from this date (YYYY-MM-DD). Observations go back decades. Default for climate reports: 30 days ago.

## `endDate` (type: `string`):

Last date to include (YYYY-MM-DD). Default: today.

## Actor input object example

```json
{
  "stations": [
    "KXHIGHNY",
    "KMDW"
  ],
  "modes": [
    "today"
  ],
  "hoursBack": 24
}
```

# Actor output Schema

## `records` (type: `string`):

Today-so-far summaries, observations and daily climate reports.

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

Resolved stations and any problems.

# 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": [
        "KXHIGHNY",
        "KMDW"
    ],
    "modes": [
        "today"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("evolve-data/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": [
        "KXHIGHNY",
        "KMDW",
    ],
    "modes": ["today"],
}

# Run the Actor and wait for it to finish
run = client.actor("evolve-data/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": [
    "KXHIGHNY",
    "KMDW"
  ],
  "modes": [
    "today"
  ]
}' |
apify call evolve-data/weather-station-data --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,evolve-data/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/NgDpCyaATLee0s7Pa/builds/tgX4e63D307jKpkvu/openapi.json
