Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when the user asks about event probabilities, prediction market odds, what people are betting on, Polymarket/Kalshi prices, sports markets — or about the things you CANNOT get from a public API: historical price/volume/orderbook time series, smart-money positioning, whale leaderboards, wallet P&L, wallet identity and on-chain clustering, and canonical IDs matching the same question across venues. 58 endpoints over Polymarket, Kalshi, Limitless, Opinion, Predict.Fun, dFlow, Binance Futures, s
.claude/skills/blockrunai-prediction-markets/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 76% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 243% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 28% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 177% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 104% | 0% |
55 endpoints across Polymarket, Kalshi, Limitless, Opinion, Predict.Fun, Binance Futures, sports, and the UMA oracle — one x402 gateway, no Predexon account or API key.
What is worth paying for. Current market lists are free from public APIs. These are not, and cannot be backfilled after the fact:
One tool, three params. Method auto-routes: POST when body is set, GET otherwise.
tsblockrun_markets({ path: "polymarket/events", params: { limit: "10" } }) blockrun_markets({ path: "polymarket/candlesticks/0xCONDITION_ID", params: { interval: "1440" } }) blockrun_markets({ path: "polymarket/wallet/identities", body: { addresses: ["0xabc...", "0xdef..."] }})
Paths are relative — no /api/v1/pm/ prefix. Use agent_id to bill a child agent's budget.
Paid calls can run in parallel on Base: each EIP-3009 authorization carries its own random nonce, so concurrent calls from one wallet cannot collide. The Solana payload has no nonce field — distinctness comes from the SDK (@blockrun/llm >= 3.8.4), so keep that floor if you fan out on Solana.
Current parameter contracts that prevent paid 4xx responses:
markets/search (its search term is q), then resolve theselected market with polymarket/markets/keyset + condition_id.
polymarket/markets{,/keyset} the free-text filter is search, notq. Use status:"open" rather than Gamma's active/closed, and sort rather than order/ascending. end_after/end_before are supported (Unix seconds).
interval is integer minutes (1440, not 1h) and isoptional — the server has a default. Which intervals a market can serve varies: 1440 may work where 60 returns a paid 400. Optional start_time/end_time are Unix seconds.
polymarket/orderbooks requires token_id, start_time, and end_time; thetimes are Unix milliseconds.
min_trades, min_volume,min_roi, min_realized_pnl, min_total_pnl, min_win_rate, or min_profit_factor. window only scopes the time range and is not sufficient alone (verified: window-only returns a paid 400). Use { window: "30d", min_trades: "100" }; narrower cohorts are fine.
markets/listings is retired upstream (410 Gone) — the MCP blocks it before payment.| Tier | Price | What | |---|---|---| | All endpoints | $0.0085 | Market data, events, history, candles, orderbooks, trades, leaderboard, sports, UMA, wallet analytics, smart money, identity + clustering, cross-venue matching, Binance |
Pass-through pricing, 0% BlockRun margin — settles straight to Predexon's Base treasury.
| User wants… | path | Tier | |---|---|---| | Same question across venues | markets | 1 | | Search every venue at once | markets/search | 2 | | Resolve a canonical outcome ID | outcomes/{predexon_id} | 1 | | Equivalent markets (arbitrage) | matching-markets | 2 | | Active matched pairs | matching-markets/pairs | 2 | | Active Polymarket events | polymarket/events | 1 | | Polymarket markets | polymarket/markets | 1 | | Large result sets (stable paging) | polymarket/markets/keyset | 1 | | Crypto up/down markets | polymarket/crypto-updown | 1 | | Current/historical price of a token | polymarket/market-price/{token_id} | 1 | | Price history (OHLCV) | polymarket/candlesticks/{condition_id} | 1 | | OHLCV for one outcome | polymarket/candlesticks/token/{token_id} | 1 | | Volume over time (YES/NO split) | polymarket/volume-chart/{condition_id} | 1 | | Historical orderbook snapshots | polymarket/orderbooks | 1 | | Historical trades | polymarket/trades | 1 | | Merges / splits / redeems for a user | polymarket/activity | 1 | | Cumulative volume for a market | polymarket/markets/{token_id}/volume | 1 | | Open interest history | polymarket/markets/{condition_id}/open_interest | 1 | | Positions (filterable) | polymarket/positions | 1 | | Global smart-wallet leaderboard | polymarket/leaderboard | 1 | | Leaderboard for one market | polymarket/leaderboard/market/{condition_id} | 1 | | Cohort performance by trading style | polymarket/cohorts/stats | 1 | | Top holders of a market | polymarket/market/{condition_id}/top-holders | 1 | | Smart money on a market | polymarket/market/{condition_id}/smart-money | 2 | | Markets smart wallets just entered | polymarket/markets/smart-activity | 2 | | Full smart-wallet profile | polymarket/wallet/{wallet} | 2 | | Per-market breakdown for a wallet | polymarket/wallet/{wallet}/markets | 2 | | Wallets with similar portfolios | polymarket/wallet/{wallet}/similar | 2 | | Wallet P&L + realized series | polymarket/wallet/pnl/{wallet} | 2 | | Wallet open/historical positions | polymarket/wallet/positions/{wallet} | 2 | | Wallet volume by BUY/SELL side | polymarket/wallet/volume-chart/{wallet} | 2 | | Batch wallet profiles | polymarket/wallets/profiles | 2 | | Filter wallets by markets traded | polymarket/wallets/filter | 2 | | Wallet identity (ENS/Twitter/etc) | polymarket/wallet/identity/{wallet} | 2 | | Bulk identity (≤200, POST) | polymarket/wallet/identities | 2 | | On-chain cluster for a wallet | polymarket/wallet/{address}/cluster | 2 | | UMA oracle questions by state | polymarket/uma/markets | 1 | | UMA status + timeline for a market | polymarket/uma/market/{condition_id} | 1 | | Kalshi markets | kalshi/markets | 1 | | Kalshi trades / orderbooks | kalshi/trades, kalshi/orderbooks | 1 | | Sports categories | sports/categories | 1 | | Sports markets by league | sports/markets | 1 | | One game, all venue outcomes | sports/markets/{game_id} | 1 | | Equivalent sports outcomes | sports/outcomes/{predexon_id} | 1 | | Limitless / Opinion / Predict.Fun markets | limitless/markets, opinion/markets, predictfun/markets | 1 | | Their historical orderbook snapshots | limitless/orderbooks, opinion/orderbooks, predictfun/orderbooks | 1 | | Binance candles / ticks | binance/candles/{symbol}, binance/ticks/{symbol} | 2 |
tsblockrun_markets({ path: "polymarket/events", params: { limit: "10" } })
Search every venue in one call, then resolve the canonical outcome.
tsblockrun_markets({ path: "markets/search", params: { q: "2028 presidential election" } }) blockrun_markets({ path: "outcomes/PXM-12345" }) // → venue listings + prices side by side
tsblockrun_markets({ path: "polymarket/candlesticks/0xCONDITION_ID", params: { interval: "1440", start_time: "<UNIX_SECONDS>", end_time: "<UNIX_SECONDS>" } }) blockrun_markets({ path: "polymarket/volume-chart/0xCONDITION_ID" }) blockrun_markets({ path: "polymarket/markets/0xCONDITION_ID/open_interest" }) blockrun_markets({ path: "polymarket/orderbooks", params: { token_id: "<TOKEN_ID>", start_time: "<UNIX_MILLISECONDS>", end_time: "<UNIX_MILLISECONDS>" } })
Positioning → then profile the wallets behind it.
ts// 1. Which high-performing wallets are in this market, and on which side blockrun_markets({ path: "polymarket/market/0xCONDITION_ID/smart-money", params: { window: "30d", min_trades: "100" } }) // 2. Profile the top wallet it returns — win rate, P&L, style blockrun_markets({ path: "polymarket/wallet/0xWHALE" }) // 3. What else are they in right now? blockrun_markets({ path: "polymarket/wallet/positions/0xWHALE" })
Identity plus the on-chain cluster: one trader often runs many wallets.
tsblockrun_markets({ path: "polymarket/wallet/identity/0xWHALE" }) // ENS, socials, portfolio blockrun_markets({ path: "polymarket/wallet/0xWHALE/cluster" }) // linked wallets + confidence blockrun_markets({ path: "polymarket/wallet/pnl/0xWHALE" }) // realized P&L series blockrun_markets({ path: "polymarket/wallet/0xWHALE/similar" }) // who trades like them
tsblockrun_markets({ path: "polymarket/leaderboard", params: { limit: "20" } }) // best wallets blockrun_markets({ path: "polymarket/markets/smart-activity" }) // where they just moved blockrun_markets({ path: "polymarket/cohorts/stats" }) // which style is working
Then trade it with blockrun_polymarket (see skills/polymarket-trading/SKILL.md). Real money — always dry-run first.
tsblockrun_markets({ path: "matching-markets", params: { status: "active" } }) blockrun_markets({ path: "matching-markets/pairs" })
tsblockrun_markets({ path: "sports/markets", params: { league: "NBA", status: "open" } }) blockrun_markets({ path: "sports/markets/GAME_ID" }) // every venue's price for that game
tsblockrun_markets({ path: "polymarket/uma/markets", params: { state: "proposed" } }) blockrun_markets({ path: "polymarket/uma/market/0xCONDITION_ID" }) // dispute timeline
bodyAlmost everything is GET → use params. Only bulk identity takes a body:
tsblockrun_markets({ path: "polymarket/wallet/identities", body: { addresses: ["0x1", "0x2"] } })
Prefer keyset over offset — stable across writes, faster on big tables.
tsconst p1 = blockrun_markets({ path: "polymarket/markets/keyset", params: { limit: "100" } }) // then pass the returned pagination.next_key back in: blockrun_markets({ path: "polymarket/markets/keyset", params: { limit: "100", pagination_key: "<next_key>" } })
polymarket/events/keyset works the same way.
Predexon returns raw upstream responses; shape varies by venue.
{ data: [...] } or { events: [...] }{ markets: [...] } with ticker, yes_bid, no_bid. Tickers look like KXBTC-25MAR14 (series + expiry).{ markets: [...] } with predexon_id + venue_listingsPrices are probabilities 0–1. 0.62 means the market implies 62%.
Inside the MCP, use blockrun_markets above. For standalone scripts:
pythonfrom blockrun_llm import setup_agent_wallet # setup_agent_solana_wallet() on Solana client = setup_agent_wallet() client.pm("polymarket/candlesticks/0xCONDITION_ID", interval="1440") client.pm_query("polymarket/wallet/identities", {"addresses": ["0xabc"]})
Requires pip install blockrun-llm and a funded USDC wallet (client.get_balance()).
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 13,490 | 9,109 | -32% | 1 | 1 | 0% | 2,295 | 4,432 | +93% | 0 | 0 | — |
case-02 | fail→fail | 8,454 | 5,760 | -32% | 1 | 1 | 0% | 1,418 | 4,095 | +189% | 0 | 0 | — |
case-03 | fail→fail | 8,775 | 11,485 | +31% | 1 | 1 | 0% | 1,736 | 4,716 | +172% | 0 | 0 | — |
case-04 | fail→pass | 13,738 | 3,038 | -78% | 1 | 1 | 0% | 2,345 | 4,124 | +76% | 0 | 0 | — |
case-05 | pass→pass | 12,752 | 2,932 | -77% | 1 | 1 | 0% | 2,197 | 4,094 | +86% | 0 | 0 | — |
case-06 | fail→pass | 7,106 | 2,426 | -66% | 1 | 1 | 0% | 1,156 | 3,970 | +243% | 0 | 0 | — |
case-07 | fail→pass | 21,420 | 3,318 | -85% | 1 | 1 | 0% | 3,333 | 4,256 | +28% | 0 | 0 | — |
case-08 | fail→pass | 9,845 | 5,001 | -49% | 1 | 1 | 0% | 1,539 | 4,257 | +177% | 0 | 0 | — |
case-09 | fail→pass | 17,501 | 2,938 | -83% | 1 | 1 | 0% | 2,006 | 4,084 | +104% | 0 | 0 | — |
case-10 | fail→pass | 14,969 | 6,084 | -59% | 1 | 1 | 0% | 2,308 | 4,793 | +108% | 0 | 0 | — |
case-11 | fail→pass | 10,498 | 3,901 | -63% | 1 | 1 | 0% | 1,716 | 4,262 | +148% | 0 | 0 | — |
case-12 | fail→pass | 13,967 | 2,557 | -82% | 1 | 1 | 0% | 2,330 | 3,974 | +71% | 0 | 0 | — |
case-13 | fail→pass | 17,106 | 3,406 | -80% | 1 | 1 | 0% | 2,929 | 4,210 | +44% | 0 | 0 | — |
case-14 | fail→pass | 9,291 | 3,310 | -64% | 1 | 1 | 0% | 1,687 | 4,055 | +140% | 0 | 0 | — |
case-15 | fail→pass | 15,502 | 2,626 | -83% | 1 | 1 | 0% | 2,673 | 4,003 | +50% | 0 | 0 | — |
case-16 | fail→pass | 11,009 | 3,358 | -69% | 1 | 1 | 0% | 1,938 | 4,282 | +121% | 0 | 0 | — |
case-17 | fail→pass | 5,658 | 1,827 | -68% | 1 | 1 | 0% | 1,002 | 3,911 | +290% | 0 | 0 | — |
case-18 | fail→pass | 16,080 | 3,982 | -75% | 1 | 1 | 0% | 2,637 | 4,203 | +59% | 0 | 0 | — |
case-19 | fail→pass | 9,803 | 8,952 | -9% | 1 | 1 | 0% | 1,292 | 4,057 | +214% | 0 | 0 | — |
case-20 | pass→pass | 13,239 | 13,564 | +2% | 1 | 1 | 0% | 2,290 | 5,930 | +159% | 0 | 0 | — |
case-21 | fail→fail | 5,917 | 7,966 | +35% | 1 | 1 | 0% | 941 | 4,796 | +410% | 0 | 0 | — |
case-22 | pass→pass | 8,404 | 11,473 | +37% | 1 | 1 | 0% | 1,295 | 5,517 | +326% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +68 percentage points is the difference between those two pass rates over the 19 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.