# Polymarket Weather Markets + Station Data \[$0.02/city-day] (`perchpermits/polymarket-weather-markets-stations`) Actor

Every Polymarket daily highest and lowest temperature ladder (50 cities worldwide) joined to the airport station its rules settle on: NYC is LaGuardia, not Central Park. High/low recomputed as the rules read it; 325 of 326 settled ladders landed in the paid bracket. Free official APIs only.

- **URL**: https://apify.com/perchpermits/polymarket-weather-markets-stations.md
- **Developed by:** [Perch Data](https://apify.com/perchpermits) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 ladder joined to its settling stations

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

## Polymarket Weather Markets + Settling Station Data

Every Polymarket daily **highest** and **lowest** temperature ladder, about 50 cities worldwide, one row per city-day, joined to the airport station the market's own rules settle on.

### Why the station matters

Polymarket names a specific station in each market's rules, and it is often not the one you would guess or the one another venue uses for the same city:

| City | Polymarket settles on | Kalshi settles on |
|---|---|---|
| New York | LaGuardia (KLGA) | Central Park |
| Chicago | O'Hare (KORD) | Midway |
| Denver | Buckley Space Force Base (KBKF) | Denver Intl |
| Dallas | Love Field (KDAL) | DFW |
| Paris | Le Bourget (LFPB) | none |
| London | London City (EGLC) | none |

This actor reads the station from every market's rules text on every run, so a changed station is picked up the day it changes.

### What a row contains

- **Ladder:** every bracket with bid, ask, implied probability, last trade, volume and liquidity; the market's favourite and probability-weighted expected temperature; the paid bracket once settled.
- **Station:** ICAO code, name, source type (NOAA station page, Weather Underground, Hong Kong Observatory), time zone, and the market's unit (°F or °C).
- **Observations** (joined rows): the station's reports for its local calendar day, recomputed the way the rules read them: whole degrees, routine hourly reports only where the rules say "Hourly Data". You get the running high and low with times, the latest reading, and whether the day is complete.
- **Floor rule-outs:** brackets the day's running high (or low) has already made impossible.
- **Forecast:** the National Weather Service daily high or low, for US stations.
- **Verdict:** where the running value, the forecast and the market favourite each land; the final bracket once the day is complete; and the paid bracket once Polymarket settles.

### Verified

Every settled ladder is archived daily with the bracket Polymarket paid and the value this actor recomputes from the settling station's own reports. Over Sep 14 to 17, 2026 (51 cities, highs and lows, °F and °C), the recomputed value landed in the paid bracket **325 times out of 326**.

- **The one miss:** Manila's low on Sep 16. The station's routine reports reached 25°C and Polymarket paid 26°C. It stays in the record.
- **No call:** 82 more ladders. Hong Kong settles on the Observatory's daily extract rather than an airport report, a few stations settle on a Weather Underground page with no reports in NOAA's feed, and some days in that first backfill started before the oldest report NOAA still serves.
- **Test suite:** a fixed set of 89 of those ladders is recomputed in `scripts/verify_settled.py` on every build.

### Input

| Field | Default | Meaning |
|---|---|---|
| `kind` | `both` | `high`, `low` or `both` |
| `cities` | all | Polymarket city slugs: `nyc`, `london`, `tokyo`, `los-angeles`... |
| `dateFrom` / `dateTo` | none | Look up each listed city's ladder for every day in the range, open or settled. Needs `cities`. |
| `join` | `true` | Add the station join (charged as `joined-ladder`) |
| `maxEvents` | 100 | Stop after this many ladders |

### Pricing

Pay per event: `ladder` for a plain ladder row, `joined-ladder` for a row joined to its station. The join is capped up front to what your run budget allows, and rows past the cap come back plain.

### Sources

All free, official and keyless: Polymarket's public Gamma API, NOAA Aviation Weather Center METARs, and api.weather.gov. The official settlement value is always the one on the market's resolution page. This actor recomputes it from the same reports; it is not affiliated with Polymarket or NOAA.

If the Aviation Weather Center is unreachable, US stations fall back to the same raw METARs served by api.weather.gov, and each row says which feed it used in `station.reports_source`. Only routine reports count either way — the 5-minute automated readings are left out, exactly as the resolution page leaves them out. Stations outside the US have no free official second source, so those rows fail loudly rather than quietly serving a number nobody settles on.

Also by Perch Data: [Kalshi Weather Markets + NWS Station Data](https://apify.com/perchpermits/kalshi-weather-markets-nws).

# Actor input Schema

## `kind` (type: `string`):

`high` for daily highest temperature ladders, `low` for daily lowest, or both.

## `cities` (type: `array`):

Optional. Polymarket city slugs to keep: nyc, chicago, miami, dallas, denver, atlanta, austin, houston, seattle, los-angeles, san-francisco, toronto, mexico-city, sao-paulo, buenos-aires, london, paris, madrid, milan, munich, amsterdam, warsaw, helsinki, istanbul, moscow, tel-aviv, jeddah, karachi, lucknow, tokyo, seoul, busan, beijing, shanghai, shenzhen, guangzhou, singapore, manila, taipei, wellington, cape-town and more. Empty = every open ladder.

## `dateFrom` (type: `string`):

Optional ISO date. With a date, the actor looks up each listed city's ladder for every day in the range, open or settled (settled rows carry the paid bracket). Needs Cities.

## `dateTo` (type: `string`):

Optional ISO date, inclusive. Defaults to Target date from.

## `join` (type: `boolean`):

Read the station from each market's rules and add its reports for the local day, the brackets already ruled out, the US forecast, and a verdict. Charged as joined-ladder; off returns plain ladders.

## `maxEvents` (type: `integer`):

Stop after this many city-day ladders.

## `requestDelaySeconds` (type: `number`):

Politeness delay for the public APIs.

## Actor input object example

```json
{
  "kind": "both",
  "join": true,
  "maxEvents": 100,
  "requestDelaySeconds": 0.25
}
```

# Actor output Schema

## `results` (type: `string`):

Every ladder with its brackets and, when joined, observations, forecast, floor\_rule\_outs and verdict.

## `resultsCsv` (type: `string`):

The same rows flattened.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("perchpermits/polymarket-weather-markets-stations").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("perchpermits/polymarket-weather-markets-stations").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 '{}' |
apify call perchpermits/polymarket-weather-markets-stations --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,perchpermits/polymarket-weather-markets-stations"
        }
    }
}
```

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/3hZ5FKA2MY5lYptN8/builds/378XpLNhX3L0RkM2f/openapi.json
