agentsclimarketplace

Check odds

Skill zachmayer/skills/.claude/skills/check-odds

Current prediction-market odds for a question — the default first stop for any question about a future event. Use when the user asks "what are the odds of X?", "will X happen?", "how likely is Y?", "what's the probability of X?", "check prediction markets", or "what does Metaculus/Manifold/Polymarket/Kalshi say about X?". Do NOT use when the user explicitly asks for a forecast or superforecast, wants to know whether the market is wrong, or wants forecasts scored/resolved (use superforecaster).From its SKILL.md

Install
npx -y skills add zachmayer/skills --skill check-odds

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

12.4 KB, as published. Nobody here has run it

Check Odds

Get current prediction-market prices for a question. Four platforms are one no-auth curl each and Metaculus needs a free token — run them all in parallel (parallel Bash calls inline; no need for one subagent per platform). All endpoints below were live-verified 2026-07-08; if one 4xx/5xxs, note it in output rather than silently skipping.

Search with short keywords, not the full question. Derive 1–3 keyword variants from the framed question (entity + event core: "Fed December", "FOMC cut" — not "Will the Fed cut rates at the December 2026 FOMC meeting?"); most venues' fuzzy search returns zero hits on full sentences. Try the variants before declaring "no markets found".

This skill produces three things: p_market (the synthesized market prior), the synthesis depth (deep / shallow / none — how much real, independent information the venues carry), and the per-platform table (cross-venue divergences are themselves signal). Standalone, this is the fast path to "what are the odds?"; the superforecaster skill consumes all three outputs as its anchor — depth sets how strong the evidence must be to move off it, and how much research the question deserves.

Market structures — synthesize, don't rank dogmatically

Each venue is an incentive structure with characteristic strengths and distortions. Notably, the best-calibrated venue has no money on it at all — so "real money beats play money" is not a law. Weight venues by track record and structure, and read disagreements structurally:

PlatformStructureStrengthsCharacteristic distortions
MetaculusReputation + scored calibrationBest public track record; superforecaster normsSlow to update on fast news; thin on pop culture
ManifoldPlay-money economy (designed incentives)Unmatched long-tail coverage; fastNo stakes on exotic questions; whale/meme distortion — judge each market on its crowd, not the currency
Kalshi, PolymarketReal money, CLOBDeepest books; skin-in-the-game; fast on newsTime-value: nobody corrects long-dated tail odds priced below the risk-free return, so rare-event prices sit too high; retail/narrative flow; manipulation incentive (below)
PredictItReal money, cappedUS-politics crowd wisdom$3,500 caps + 10%+5% fees structurally distort prices
Good Judgment OpenReputationSuperb calibrationNo API, not searchable — reference only

Two real-money distortions deserve explicit checks:

  • Time-value floor. A trader who thinks a 5¢ year-out contract is worth 1¢ earns ~4% locking capital for a year — the risk-free rate. Long-dated tails on real-money books are systematically un-corrected; discount them, and lean on Metaculus/Manifold for rare-event odds.
  • Manipulation. Real payoffs create incentives to move the settlement source, not just the price (Kalshi's June 2026 Spotify market settled on ~500k bot streams that cost the manipulator a few hundred dollars against a ~$3M market). When the settlement metric is cheap to move — streams, follower/post counts, a single sensor — a late one-sided price move near resolution reads as manipulation intent unless primary data explains it. This is a weight and a depth cap, not just a flag: such venues take the step-4 haircut below and can never make the synthesis deep by themselves.

Criteria validation — does this market measure the user's event? The anchor is only as good as this check. Before a venue enters the synthesis, read its actual resolution rules (contract terms / rules page — titles lie) and confirm it resolves on the event being modeled, not a correlated proxy: a "game delayed" market is not a "game rained out" market — delay bundles every cause, and the umbrella decision rides on rain alone. Per venue, one verdict: match (enters synthesis) · proxy (evidence only — name how it differs in caveats, expect divergence, never anchor on it) · different event (dropped, named in output). If no match survives, that IS the answer — p_market: none, however loudly the proxies quote a number.

Synthesis → p_market (mechanical recipe — the evidence-weighted median):

  1. Drop venues that failed criteria validation above (a proxy informs caveats, not the number).
  2. Convert each surviving venue to a midpoint probability on the 0–1 scale (Kalshi quotes integer cents — divide by 100; everyone else already returns 0–1).
  3. Assign weights: revealed Metaculus CP (≥~20 forecasters) 4 · real-money book ≥$100k 2 · thin real-money 1 · play-money 1 · PredictIt 0.5.
  4. Halve any venue that is visibly stale (no trades/updates in days on a moving story), priced below ~5¢ on a long-dated contract (time-value floor), or settles on a cheap-to-move metric (manipulation, above).
  5. p_market = weighted median: sort by price, take the first price where cumulative weight reaches half the total.
  6. Before accepting an outlier's exclusion or a wide spread, explain it from structure (criteria difference, fees, time-value, manipulability, stale crowd) — an explained divergence is an adjustment; only unexplained divergence is candidate mispricing. Cross-structure agreement (reputation + play-money + real-money within a few points) is the strongest market signal there is; note it.

Synthesis depth:

  • Deep: (revealed Metaculus CP with forecaster_count ≥ ~20 or a ≥$100k real-money book) and corroborated within ~15 points by at least one other structure — both conditions, whichever venue leads.
  • Shallow: anything less — one thin/uncorroborated venue, or venues still >15 points apart after structural explanation (flag it — usually a criteria mismatch, occasionally real mispricing).
  • None: no market whose criteria match. "No markets found" is informative — say it explicitly per platform.

Venues change. New markets and aggregators appear (and die) regularly: when you discover one, live-verify its API and consider adding it to the table. If a valuable data source needs credentials or account setup, prompt the user to connect it rather than working around the gap — reliable data feeds are the system's foundation.

Access & auth

1. Metaculus — token required (free: metaculus.com account settings → API token)

curl -s -H "Authorization: Token $METACULUS_TOKEN" \
  "https://www.metaculus.com/api/posts/?search=QUERY&limit=5&statuses=open&forecast_type=binary&with_cp=true"

Use /api/posts/ — the older /api2/questions/?search= ignores search terms (verified 2026-07-08). Per result: .results[].title, CP = .results[].question.aggregations.recency_weighted.latest.centers[0] (if null, try the key named by .question.default_aggregation_method instead of recency_weighted), and forecaster count from ...latest.forecaster_count or the post's forecasts_count.

CP is gated by account API tier — nothing client-side fixes it (verified 2026-07-09): standard accounts show api_access_tier: "restricted" at /api/users/me/ and get all-null aggregations on every question — open, closed, even ones that account has forecast — while search, titles, and statuses work fine. Anonymous API calls are Cloudflare-blocked. Bot accounts do not help: a fresh bot token (is_bot: true) is equally restricted (verified) — bots exist to submit forecasts, not read the crowd. The bulk export /api/data/download/ hits the same production gate (live-tested; the permissive logic visible in Metaculus's open-source repo is not what production enforces). Tiers, from their source + API docs: restricted → benchmarking (CP on a few hundred benchmark questions, meant for bot training/eval) → unrestricted (written agreement). The sanctioned path up: the Metaculus Data Needs Form and/or [email protected], disclosing the use — their Terms restrict using CP to train or evaluate AI/ML models without written permission, and anchoring an AI forecaster to CP is exactly that, so ask rather than work around. Until granted: report "Metaculus: CP unavailable via API (restricted tier)" loudly, pull CP from WebSearch site:metaculus.com QUERY snippets (they routinely quote it) as table/caveat evidence only — snippet CP never enters the weighted median — and treat the synthesis as missing its strongest venue — degraded coverage, never silently skipped. If the token is missing entirely: mark Metaculus unavailable, continue with the other venues, and ask the user to add a token after delivering the result.

2. Manifold — no auth

curl -s "https://api.manifold.markets/v0/search-markets?term=QUERY&sort=liquidity&filter=open&limit=5"

Extract: question, probability (0–1), url, volume, uniqueBettorCount. Unmatched long-tail coverage.

3a. Polymarket — no auth

curl -s "https://gamma-api.polymarket.com/public-search?q=QUERY&events_status=active&limit_per_type=5"
.events[] | {title, slug, volume, liquidity,
             markets: [.markets[] | {question, outcomes: (.outcomes|fromjson),
                                     prices: (.outcomePrices|fromjson), volume}]}

outcomePrices/outcomes are stringified JSON — pipe through fromjson. Prices are 0–1. Event URL: https://polymarket.com/event/<slug>. URL-encode spaces. Do NOT use /events?title_contains= (unranked, includes closed markets).

3b. Kalshi — no auth

curl -s "https://api.elections.kalshi.com/v1/search/series?query=KEYWORD"
.current_page[] | {event_title, event_ticker,
                   markets: [.markets[] | {ticker, yes_bid, yes_ask, last_price, volume}]}

Integer prices are cents (yes_bid: 9 = 9%); *_dollars string fields exist in v2. Use short keywords — the fuzzy ranker degrades on long queries. api.elections.kalshi.com is canonical (api.kalshi.com does not resolve). Full catalog fallback: trade-api/v2/events?with_nested_markets=true&status=open (cursor-paginated).

4. PredictIt — no auth, US politics only

curl -s "https://www.predictit.org/api/marketdata/all/"

Returns all ~200 markets; no server-side search — filter client-side by whole-word match on name/shortName ("Maine" contains "ai"). Extract contracts[].lastTradePrice (0–1); keys are camelCase (live-verified 2026-07-08). Rate limit ~1 req/min. Skip for non-political questions.

Dropped (do not re-add without re-verifying): Betfair (auth-walled), Smarkets (no search), Adjacent News (dead) — all verified unusable 2026-07-06.

Output format

## Prediction Market Odds: <topic>

| Platform | Question | Probability | Liquidity | Criteria | Link |
|----------|----------|-------------|-----------|----------|------|
| Metaculus | ... | 11% | 150 forecasters | match | [link] |
| Manifold | ... | 11.9% | 95k mana | match | [link] |
| Polymarket | ... | 10.5% | $1.65M vol | match | [link] |
| Kalshi | ... | 9% | 8.3M contracts | match | [link] |
| PredictIt | (not political — skipped) | | | | |

**p_market: 0.11 (evidence-weighted median; Metaculus CP 0.11 leads, Polymarket 0.105 corroborates)** — depth: deep
Cross-structure spread: 9–12% — reputation, play-money, and real-money venues agree.
Caveats: <thin books, hidden predictions, criteria mismatches, time-value on long-dated tails, manipulable settlement metric>

No matching markets anywhere: the line reads p_market: none — depth: none (no number — don't invent one). Downstream, the base rate becomes the prior, and a ledger row logs without --market-p/--market-source.

Don't editorialize — prices, liquidity, caveats. Everything else this output needs (parallel calls, criteria matching, divergence explanation, per-platform "no market") is specified above.

Keep looking

Skills are one crate of 627,801. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.