Developer Documentation

Oddpool API

Prediction market data across Kalshi, Polymarket, and Opinion.

Overview

The Oddpool API provides programmatic access to prediction market data across Kalshi, Polymarket, and Opinion — including whale trades, cross-venue arbitrage, price spreads, and full-text search.

All API requests should be made to:

https://api.oddpool.com

Quick start

bash
curl -H "X-API-Key: your_api_key" \
  "https://api.oddpool.com/arbitrage/current?min_net_cents=0.5"

For AI agents

A machine-readable version of these docs is available at /llms.txt — fetch it to get the full API reference as structured markdown.

Authentication

Authenticate requests by including your API key in the X-API-Key header. Generate API keys from your account settings.

Endpoint GroupRequired PlanPrice
Whale TrackingPro$30/mo
ArbitragePremium$100/mo
Price SpreadsPremium$100/mo
SearchPremium$100/mo

Security: Keep your API key confidential. Do not expose it in client-side code or public repositories.

Requests with invalid or expired credentials will receive a 401 or 403 response.

Rate Limits

API requests are rate limited to ensure platform stability.

LimitRate
Burst10 requests/second
Sustained1,000 requests/minute

Error Handling

The API uses standard HTTP response codes to indicate success or failure.

CodeDescription
200Success
400Bad request — Invalid parameters
401Unauthorized — Invalid API key
403Forbidden — No active subscription or insufficient tier
404Not found — Resource does not exist
429Rate limit exceeded
500Server error

Error response format:

json
{"detail": "Error message"}

Whale Tracking

Pro

Programmatic access to Whale Tracker. Build trading signals, power automated agents, or integrate whale alerts into your own workflows however you want to use them.

GET/whales/user/events

List all events you are currently tracking.

Example

curl -H "X-API-Key: your_api_key" \
  https://api.oddpool.com/whales/user/events

Response

json
{
  "tracked_events": [
    {
      "id": 65,
      "event_id": 65,
      "event_ticker": "KXBUNDESLIGAGAME-26JAN14KOEBMU",
      "event_title": "1. FC Cologne vs Bayern Munich",
      "platform": "kalshi",
      "whale_threshold_usd": 1000,
      "notify_on_whale_trade": true,
      "whale_count_24h": 12
    }
  ]
}
GET/whales/user/feed

Get whale trades for all your tracked events.

Parameters

NameTypeDescription
limitintegerMax results (1-500)(default: 50)
offsetintegerPagination offset(default: 0)
start_datedatetimeFilter by start date (ISO 8601)
end_datedatetimeFilter by end date (ISO 8601)
min_trade_sizefloatMinimum trade size in USD
platformstringFilter by platform: kalshi, polymarket
event_idintegerFilter to specific event

Example

curl -H "X-API-Key: your_api_key" \
  "https://api.oddpool.com/whales/user/feed?limit=10&platform=kalshi"

Response

json
{
  "trades": [
    {
      "id": 12345,
      "platform": "kalshi",
      "event_title": "1. FC Cologne vs Bayern Munich",
      "market_title": "Winner: Bayern Munich",
      "market_ticker": "KXBUNDESLIGAGAME-26JAN14KOEBMU-BMU",
      "outcome": "Bayern Munich",
      "timestamp": "2026-01-14T21:24:25Z",
      "taker_side": "yes",
      "trade_size_usd": 15000.00,
      "price": 0.78,
      "count": 1
    }
  ],
  "stats": {
    "total_volume_24h": 185195.0,
    "total_trades_24h": 151,
    "avg_trade_size": 1226.46
  },
  "pagination": {"limit": 10, "offset": 0, "total": 151}
}
GET/whales/user/stats

Get aggregated statistics for all tracked events.

Parameters

NameTypeDescription
periodstringTime period: 24h, 7d, all(default: 24h)

Example

curl -H "X-API-Key: your_api_key" \
  "https://api.oddpool.com/whales/user/stats?period=7d"

Response

json
{
  "period": "7d",
  "events": [
    {
      "event_id": 65,
      "event_ticker": "KXBUNDESLIGAGAME-26JAN14KOEBMU",
      "event_title": "1. FC Cologne vs Bayern Munich",
      "platform": "kalshi",
      "stats": {
        "trade_count": 151,
        "total_volume": 185195.0,
        "avg_trade_size": 1226.46,
        "market_count": 3
      },
      "markets": [...]
    }
  ]
}
GET/whales/user/event/{event_id}

Get whale trades for a specific tracked event.

Parameters

NameTypeDescription
event_idrequiredintegerEvent ID (path)
limitintegerMax results (1-500)(default: 50)
offsetintegerPagination offset(default: 0)
min_trade_sizefloatMinimum trade size in USD

Example

curl -H "X-API-Key: your_api_key" \
  "https://api.oddpool.com/whales/user/event/65?limit=20"
GET/whales/user/event/{event_id}/stats

Get statistics for a specific tracked event.

Parameters

NameTypeDescription
event_idrequiredintegerEvent ID (path)
periodstringTime period: 24h, 7d, all(default: 24h)

Example

curl -H "X-API-Key: your_api_key" \
  "https://api.oddpool.com/whales/user/event/65/stats?period=all"

Response

json
{
  "event_id": 65,
  "event_ticker": "KXBUNDESLIGAGAME-26JAN14KOEBMU",
  "event_title": "1. FC Cologne vs Bayern Munich",
  "platform": "kalshi",
  "period": "all",
  "stats": {
    "trade_count": 151,
    "total_volume": 185195.0,
    "avg_trade_size": 1226.46,
    "market_count": 3,
    "first_trade_at": "2026-01-14T19:51:59Z",
    "last_trade_at": "2026-01-14T21:24:25Z"
  },
  "markets": [
    {
      "market_ticker": "KXBUNDESLIGAGAME-26JAN14KOEBMU-BMU",
      "platform": "kalshi",
      "trade_count": 124,
      "total_volume": 156445.15,
      "avg_trade_size": 1261.65
    }
  ]
}
GET/whales/user/markets

List all markets for your tracked events.

Example

curl -H "X-API-Key: your_api_key" \
  https://api.oddpool.com/whales/user/markets

Response

json
{
  "markets": [
    {
      "market_id": 370,
      "market_ticker": "KXBUNDESLIGAGAME-26JAN14KOEBMU-BMU",
      "market_title": "Winner: Bayern Munich",
      "event_id": 65,
      "event_title": "1. FC Cologne vs Bayern Munich",
      "platform": "kalshi",
      "whale_count_24h": 45
    }
  ],
  "total_markets": 3
}
GET/whales/user/market/{market_id}/stats

Get statistics for a specific market.

Parameters

NameTypeDescription
market_idrequiredintegerMarket ID (path)
periodstringTime period: 24h, 7d, all(default: 24h)

Example

curl -H "X-API-Key: your_api_key" \
  "https://api.oddpool.com/whales/user/market/370/stats?period=all"

Response

json
{
  "market_id": 370,
  "market_ticker": "KXBUNDESLIGAGAME-26JAN14KOEBMU-BMU",
  "market_title": "Winner: Bayern Munich",
  "platform": "kalshi",
  "period": "all",
  "stats": {
    "period": "all",
    "trade_count": 124,
    "total_volume": 156445.15,
    "avg_trade_size": 1261.65,
    "first_trade_at": "2026-01-14T19:51:59Z",
    "last_trade_at": "2026-01-14T21:24:25Z"
  }
}
GET/whales/user/market/{market_id}/trades

Get whale trades for a specific market.

Parameters

NameTypeDescription
market_idrequiredintegerMarket ID (path)
limitintegerMax results (1-500)(default: 50)
offsetintegerPagination offset(default: 0)
min_trade_sizefloatMinimum trade size in USD

Example

curl -H "X-API-Key: your_api_key" \
  "https://api.oddpool.com/whales/user/market/370/trades?limit=10"

Arbitrage

Premium

Programmatic access to Arbitrage Dashboard and Price Spreads. Two types of cross-venue signals, updated in real time.

What you can build

  • Arb bot: poll for risk-free cross-venue opportunities and execute automatically
  • Spread alerts: get notified when venue disagreement exceeds your threshold
  • Price dashboard: track how the same outcome is priced across Kalshi, Polymarket, and Opinion
GET/arbitrage/current

Find markets where buying YES on one venue and NO on another costs less than $1 combined. The gap is risk-free profit.

Example: “Will the Fed cut rates?” — YES is 42¢ on Kalshi, NO is 55¢ on Polymarket. Buy both for 97¢. One side pays $1, so you pocket 3¢ per contract guaranteed.

Parameters

NameTypeDescription
min_net_centsfloatMinimum net profit after fees, in cents(default: 0)
minutesintegerLookback window in minutes(default: 10000)

Example

curl -H "X-API-Key: your_api_key" \
  "https://api.oddpool.com/arbitrage/current?min_net_cents=0.5&minutes=10"

Response

net_cents is your per-contract profit after all fees.

json
[
  {
    "event_id": 42,
    "event_title": "Fed rate decision March",
    "kalshi_event_ticker": "KXFEDDECISION-26MAR",
    "polymarket_event_slug": "fed-rate-march",
    "opinion_market_id": null,
    "market_type": "binary",
    "outcome_key": "yes",
    "label": "25bps cut",
    "timestamp": "2026-03-11T14:30:00",
    "resolution_time": "2026-03-19T18:00:00",
    "kalshi": {
      "yes_ask": 0.42, "no_ask": 0.60,
      "volume": 150000, "volume_24h": 12000,
      "open_interest": 80000
    },
    "polymarket": {
      "yes_ask": 0.39, "no_ask": 0.63,
      "volume": 200000.0, "volume_24h": 15000.0,
      "liquidity": 50000.0
    },
    "opinion": {
      "yes_ask": null, "no_ask": null,
      "volume": null, "volume_24h": null,
      "liquidity": null
    },
    "buy_yes_market": "polymarket",
    "buy_no_market": "kalshi",
    "gross_cents": 1.0,
    "fee_cents": 0,
    "net_cents": 1.0
  }
]
GET/arbitrage/current/difference

Find where venues disagree on the same outcome's price. A large spread signals potential mispricing.

Example: “Will the Fed cut rates?” — YES is 42¢ on Kalshi but 39¢ on Polymarket. If you think the true price is closer to 42¢, Polymarket is offering a discount.
Unlike arbitrage, price spreads are not risk-free. They highlight venue disagreement, which can signal a trading edge.

Parameters

NameTypeDescription
minutesintegerLookback window in minutes(default: 10000)

Example

curl -H "X-API-Key: your_api_key" \
  "https://api.oddpool.com/arbitrage/current/difference?minutes=10"

Response

json
[
  {
    "event_id": 42,
    "event_title": "Fed rate decision March",
    "kalshi_event_ticker": "KXFEDDECISION-26MAR",
    "polymarket_event_slug": "fed-rate-march",
    "opinion_market_id": null,
    "market_type": "binary",
    "outcome_key": "yes",
    "label": "25bps cut",
    "timestamp": "2026-03-11T14:30:00",
    "resolution_time": "2026-03-19T18:00:00",
    "side": "YES",
    "side1": "Kalshi",
    "side2": "Polymarket",
    "side1_price": 0.42,
    "side2_price": 0.39,
    "diff": 0.03
  }
]

Support

Questions about the API? Contact us at avi@oddpool.com