MarketMaster API
Query our normalized, cross-platform prediction-market data — live edges and market snapshots across Kalshi, Polymarket, and more — over a fast, read-only REST API. It's the same engine that powers the scanner.
Introduction
The MarketMaster API gives you programmatic access to our cross-platform engine: edges (markets our model thinks are mispriced, ranked), markets (the latest normalized snapshot across venues), a single-market lookup, cross-platform arbitrage spreads, and the whale trade feed. Every endpoint is a simple GET that returns JSON. There are no SDKs to install — any HTTP client works.
Quickstart
Three steps to your first request:
1. Generate a key on your dashboard (Developer API card). Copy it — it's shown only once.
2. Send it in the x-api-key header.
3. Call an endpoint.
curl "https://api.marketmaster.live/v1/edges?limit=5" \ -H "x-api-key: mmk_live_your_key_here" \ -H "User-Agent: my-app/1.0"
Authentication
Authenticate every request with your API key in the x-api-key header. Keys look like mmk_live_… and are issued and managed from your dashboard. A key is shown once at creation; store it securely (e.g. an environment variable), never commit it to source control, and rotate it from the dashboard if it's ever exposed.
401.User-Agent header identifying your app. Requests with default library agents (e.g. python-urllib, some curl setups) can be rejected by our edge bot protection. Our official SDKs set one for you.Conventions
Base URL
https://api.marketmaster.live
| Format | All requests and responses are JSON. Responses include Content-Type: application/json. |
| Prices | All prices and fair values are probabilities in the range 0.0–1.0 (e.g. 0.43 = 43¢ / a 43% implied chance). |
| Timestamps | ISO 8601, UTC (e.g. 2026-06-20T21:25:12Z). |
| Venues | kalshi, polymarket, predictfun, manifold. |
| CORS | Enabled for all origins, so you can call the API directly from a browser app. |
| Pagination | List endpoints accept limit and offset and return limit, offset, and has_more (plus total where the full set is counted in-engine). Page by offset += limit until has_more is false. |
| Caching | Data endpoints send Cache-Control: public, max-age=30. Snapshots refresh every few minutes, so a ~30s cache is safe. |
Rate limits
Limits are enforced per key across two windows: a per-minute rate and a monthly quota. Pro is included with a MarketMaster Pro subscription.
| Tier | Rate | Monthly quota |
|---|---|---|
free | 60 requests / minute | 1,000 requests |
pro | 240 requests / minute | 200,000 requests |
Headers on every response
X-RateLimit-Limit-Minute | Your per-minute ceiling. |
X-RateLimit-Remaining-Minute | Requests left in the current minute. |
X-RateLimit-Limit-Month | Your monthly quota. |
X-RateLimit-Remaining-Month | Requests left this month. |
Exceeding the per-minute rate returns 429 rate_limited; exhausting the monthly quota returns 429 quota_exceeded. Both 429 responses include a Retry-After header (seconds to wait). Check /v1/status any time to see your remaining quota.
Edges
The most mispriced markets right now — our model's fair value versus the live price, ranked by the size of the edge. Returns one row per market, deduplicated to the latest reading.
Query parameters
| Parameter | Type | Description |
|---|---|---|
platform | string | Filter to a single venue: kalshi, polymarket, predictfun, manifold. |
category | string | Filter by category, e.g. politics, sports, crypto. |
limit | integer | Max rows. Default 50, max 200. |
offset | integer | Rows to skip, for pagination. Default 0. |
min_edge | number | Only return edges whose absolute edge is at least this many percentage points. |
Response: edges[]
| Field | Type | Description |
|---|---|---|
platform | string | The venue this market trades on. |
market_id | string | The venue's native market identifier. |
market_title | string | Human-readable market question. |
market_category | string | Category, e.g. politics. |
outcome | string | The outcome the edge is on: YES or NO. |
price | number | Live market price of that outcome (0–1). |
fair_value | number | Our model's estimated fair probability (0–1). |
edge_pct | number | Edge in percentage points — how far price sits from fair value. Larger = more mispriced. |
confidence | number | Model confidence in the estimate (0–1). |
match_group_id | integer | ID of the cross-venue match group. Markets sharing this ID are the same real-world event on different venues — useful for spotting arbitrage. |
expires_at | string | When the market closes (ISO 8601). |
computed_at | string | When this edge was computed (ISO 8601). |
Example
curl "https://api.marketmaster.live/v1/edges?platform=kalshi&limit=2" \ -H "x-api-key: mmk_live_your_key_here"
const res = await fetch( "https://api.marketmaster.live/v1/edges?platform=kalshi&limit=2", { headers: { "x-api-key": process.env.MM_API_KEY } } ); const { edges } = await res.json();
import requests
r = requests.get(
"https://api.marketmaster.live/v1/edges",
params={"platform": "kalshi", "limit": 2},
headers={"x-api-key": MM_API_KEY},
)
edges = r.json()["edges"]
{
"count": 2,
"edges": [
{
"platform": "kalshi",
"market_id": "PRES-2028-DEM",
"market_title": "Will a Democrat win the 2028 election?",
"market_category": "politics",
"outcome": "YES",
"price": 0.43,
"fair_value": 0.51,
"edge_pct": 8.0,
"confidence": 0.62,
"match_group_id": 1836280,
"expires_at": "2028-11-07T05:00:00Z",
"computed_at": "2026-06-20T21:25:12Z"
}
],
"generated_at": "2026-06-20T21:25:34Z"
}
Markets
The latest snapshot of tracked markets across every venue — title, category, YES/NO price, 24-hour volume, and close time. Sorted by 24h volume (most active first).
Query parameters
| Parameter | Type | Description |
|---|---|---|
source | string | Filter by venue (alias: platform). |
category | string | Filter by category. |
limit | integer | Max rows. Default 100, max 500. |
offset | integer | Rows to skip, for pagination. Default 0. |
Response: markets[]
| Field | Type | Description |
|---|---|---|
source | string | The venue. |
source_market_id | string | The venue's native market id. |
title | string | Market question. |
category | string | Category. |
outcome_shape | string | Market structure, e.g. binary. |
yes_price | number | Current YES price (0–1). |
no_price | number | Current NO price (0–1). |
volume_24h_usd | number | null | 24-hour traded volume in USD, when available. |
close_time | string | null | When the market closes (ISO 8601). |
last_trade_at | string | null | Timestamp of the last trade (ISO 8601). |
fetched_at | string | When we last snapshotted this market (ISO 8601). |
Example
curl "https://api.marketmaster.live/v1/markets?category=politics&limit=50" \ -H "x-api-key: mmk_live_your_key_here"
Market
A single market's latest snapshot plus any live edges we've computed for it. Identify it by source + id.
Query parameters
| Parameter | Type | Description |
|---|---|---|
source | string · required | Venue: kalshi, polymarket, predictfun, manifold. |
id | string · required | The venue's native market id (source_market_id). |
Response
Returns market (same shape as a markets[] row) and edges[] (same shape as edges[], most recent first). An unknown id returns 404 not_found.
curl "https://api.marketmaster.live/v1/market?source=kalshi&id=PRES-2028-DEM" \ -H "x-api-key: mmk_live_your_key_here"
Arbitrage
Cross-platform price spreads for the same outcome on matched markets — the data behind the scanner's compare view. For each match group it reports the cheapest and dearest real-money venue for an outcome and the spread between them, ranked widest first.
Query parameters
| Parameter | Type | Description |
|---|---|---|
min_spread | number | Only return spreads at least this many percentage points wide. |
limit | integer | Max rows. Default 50, max 200. |
offset | integer | Rows to skip, for pagination. Default 0. |
Response: opportunities[]
| Field | Type | Description |
|---|---|---|
match_group_id | integer | The cross-venue match group. |
title | string | Market question. |
outcome | string | The outcome being compared (YES/NO). |
spread_pct | number | Dearest minus cheapest YES price, in percentage points. |
buy_yes | object | Cheapest venue: { platform, market_id, price }. |
sell_yes | object | Dearest venue: { platform, market_id, price }. |
computed_at | string | When these prices were computed (ISO 8601). |
The response also carries a top-level disclaimer string restating the gross/indicative caveat.
curl "https://api.marketmaster.live/v1/arbitrage?min_spread=2&limit=10" \ -H "x-api-key: mmk_live_your_key_here"
Whales
Recent large real-money trades (whale fills) across venues, newest first.
Query parameters
| Parameter | Type | Description |
|---|---|---|
source | string | Filter by venue. |
min | integer | Minimum trade size in USD. |
limit | integer | Max rows. Default 50, max 200. |
offset | integer | Rows to skip, for pagination. Default 0. |
Response: trades[]
| Field | Type | Description |
|---|---|---|
source | string | The venue. |
source_market_id | string | The venue's native market id. |
trader_name | string | null | Public trader handle, when available. |
side | string | Trade side (e.g. buy/sell). |
outcome | string | Outcome traded. |
size_usd | number | Notional trade size in USD. |
price | number | Trade price (0–1). |
title | string | Market question. |
trade_time | string | When the trade printed (ISO 8601). |
tx_hash | string | null | On-chain transaction hash, for on-chain venues. |
curl "https://api.marketmaster.live/v1/whales?min=10000&limit=20" \ -H "x-api-key: mmk_live_your_key_here"
Status
Returns your key's tier, limits, and current usage. Useful for monitoring remaining quota.
Response
{
"ok": true,
"tier": "free",
"limits": { "minute": 60, "month": 1000 },
"usage": { "minute": 3, "month": 412 }
}
Errors
Errors return the appropriate HTTP status with a JSON envelope:
{ "error": { "code": "rate_limited", "message": "Per-minute rate limit exceeded. Slow down and retry." } }
| Status | Code | Meaning |
|---|---|---|
401 | missing_api_key | No x-api-key header was sent. |
401 | invalid_api_key | The key is malformed, unknown, or revoked. |
429 | rate_limited | Per-minute rate exceeded — back off and retry. |
400 | invalid_parameter | A query parameter was invalid (unknown platform/source, or a missing required id). |
404 | not_found | No resource matched (e.g. /v1/market with an unknown id). |
429 | quota_exceeded | Monthly quota exhausted — resets at the start of the month, or upgrade. |
500 | auth_error | Temporary problem validating the key — retry shortly. |
502 | upstream_error | Transient problem loading data — retry shortly. |
Versioning & changes
The API is versioned in the path (/v1/). We may add new fields to responses at any time, so write clients that ignore unknown fields. Breaking changes — removing or renaming fields, changing types — would ship under a new version. This is an early release; endpoints and limits may still evolve.
Disclaimer
Edge and fair-value figures are model estimates provided for informational purposes only. They are not trading advice and not a guarantee of profit. Data is provided as-is, without warranty. You are responsible for complying with the terms and applicable laws of any venue you trade on.