Weather signals for agents
Get pinged the instant a city's daily high
crosses into a new Polymarket bucket.
A bucket crossing is a physical fact — timestamped, structured JSON your agent pulls over plain x402 HTTP (or pushed to Telegram, optional). Paid per signal in USDC. No keys, no accounts.
$ curl https://api.isocast.dev/v1/signals?city=nyc
→ 402 Payment Required
accepts: { scheme:"exact", network:"eip155:8453",
asset:"USDC", maxAmountRequired:"0.010" }
extra: { binding:"keccak256(payer,city,count,salt)" }
$ curl … -H "X-PAYMENT: <x402 signature>"
→ 200 OK
{ "city":"KJFK", "new":{ "reading":71, "bucket":"70-74°F" },
"prev_bucket":"65-69°F", "crossed_at":"2026-07-26T18:22:04Z" }Bucket crossings are
physically irreversible.
Once a day's observed high crosses a bucket boundary, the lower buckets can no longer resolve YES — a one-directional fact the market must reprice around. Isocast reports the crossing. What you do with it is your model's call.
Physical, not predictive
We report the observation, not a forecast. A signal fires only when the measured daily high has actually crossed a bucket boundary.
First-mover latency
The crossing is pushed within seconds of the reading. You see the physical fact before the market finishes re-reading it.
Machine-readable
Structured JSON over Telegram and a pull API — the city, market URL, old/new bucket, and live odds. No scraping, no parsing HTML.
Pay once. Get pushed. Backfill anytime.
One settlement per bundle — then free off-chain pushes draw it down.
Buy a bundle via x402
Your agent pays USDC on Base — no account, no keys. One settlement buys N signals for a city and credits your prepaid balance (paidThroughSeq += count).
POST /v1/signals?city=nyc&count=100 → 402 → pay → 200Signals push to your Telegram
Per-user chat_id fan-out: a machine-readable JSON message the instant a city crosses a bucket. Entitlement is keyed to your wallet, so changing the target never costs a re-payment.
push → chat_id (while paidThroughSeq ≥ signal.seq)Backfill / poll any time
Signals are immutable and sequentially numbered. Pull GET /v1/signals?city=X&since=<seq> to replay anything a crashed consumer missed, up to paidThroughSeq.
GET /v1/signals?city=nyc&since=41 → [ … ]Every city, live.
Each city's current observed daily high — in its market's own unit (°F for US, °C elsewhere) — alongside its monotonic seq signal counter. Refreshes every 60 seconds.
Pay per signal. Buy in bundles.
One settlement buys a bundle; each signal draws it down. The per-signal price falls as the bundle grows.
| Tier | Signals | Price / signal | Total (USDC) |
|---|---|---|---|
| Min | 2 | 0.005 | 0.010 |
| Starter | 20 | 0.005 | 0.100 |
| StandardDEFAULT | 100 | 0.0045 | 0.450 |
| Pro | 500 | 0.0040 | 2.000 |
| Whale | 2000 | 0.0035 | 7.000 |
Minimum spend 0.01 USDC. Settled on Base via x402; discounts are per-settlement (the count bought in one tx). Unused signals do not expire.
One-off? GET /v1/spot?city=SLUGbuys a snapshot of a city's latest signal for 0.01 USDC — a single signal, payable by a stock x402 client (no binding nonce).
Why bundles? Settlement carries a flat ~0.001 USDC network fee per transaction, so one settlement per purchase — never per signal — keeps the fee a rounding error and larger bundles cheapest.
A real signal payload.
This is exactly what a crossing looks like on the wire — buy a bundle to get these pushed live to your Telegram.
Built for agents, documented for developers.
API quickstart
Free endpoints, the paid 402 flow, and a full curl transcript.
/v1/cities · /v1/sampleTelegram setup
Register a delivery chat_id with a wallet-signed intent — no re-payment to change it.
push · per-user fan-outAdd to your MCP client config, then run:
{
"mcpServers": {
"isocast": {
"command": "npx",
"args": ["isocast-mcp"]
}
}
}