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.

REST · JSON API-key auth CORS-enabled v1

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.

The API is read-only. It never places trades, moves funds, or exposes any individual user's data — only public market data.

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
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.

Treat your key like a password. Requests without a valid key return 401.
Always send a 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
FormatAll requests and responses are JSON. Responses include Content-Type: application/json.
PricesAll prices and fair values are probabilities in the range 0.01.0 (e.g. 0.43 = 43¢ / a 43% implied chance).
TimestampsISO 8601, UTC (e.g. 2026-06-20T21:25:12Z).
Venueskalshi, polymarket, predictfun, manifold.
CORSEnabled for all origins, so you can call the API directly from a browser app.
PaginationList 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.
CachingData 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.

TierRateMonthly quota
free60 requests / minute1,000 requests
pro240 requests / minute200,000 requests

Headers on every response

X-RateLimit-Limit-MinuteYour per-minute ceiling.
X-RateLimit-Remaining-MinuteRequests left in the current minute.
X-RateLimit-Limit-MonthYour monthly quota.
X-RateLimit-Remaining-MonthRequests 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

GET/v1/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

ParameterTypeDescription
platformstringFilter to a single venue: kalshi, polymarket, predictfun, manifold.
categorystringFilter by category, e.g. politics, sports, crypto.
limitintegerMax rows. Default 50, max 200.
offsetintegerRows to skip, for pagination. Default 0.
min_edgenumberOnly return edges whose absolute edge is at least this many percentage points.

Response: edges[]

FieldTypeDescription
platformstringThe venue this market trades on.
market_idstringThe venue's native market identifier.
market_titlestringHuman-readable market question.
market_categorystringCategory, e.g. politics.
outcomestringThe outcome the edge is on: YES or NO.
pricenumberLive market price of that outcome (0–1).
fair_valuenumberOur model's estimated fair probability (0–1).
edge_pctnumberEdge in percentage points — how far price sits from fair value. Larger = more mispriced.
confidencenumberModel confidence in the estimate (0–1).
match_group_idintegerID of the cross-venue match group. Markets sharing this ID are the same real-world event on different venues — useful for spotting arbitrage.
expires_atstringWhen the market closes (ISO 8601).
computed_atstringWhen this edge was computed (ISO 8601).

Example

curl
curl "https://api.marketmaster.live/v1/edges?platform=kalshi&limit=2" \
  -H "x-api-key: mmk_live_your_key_here"
JavaScript
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();
Python
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"]
Response
{
  "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

GET/v1/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

ParameterTypeDescription
sourcestringFilter by venue (alias: platform).
categorystringFilter by category.
limitintegerMax rows. Default 100, max 500.
offsetintegerRows to skip, for pagination. Default 0.

Response: markets[]

FieldTypeDescription
sourcestringThe venue.
source_market_idstringThe venue's native market id.
titlestringMarket question.
categorystringCategory.
outcome_shapestringMarket structure, e.g. binary.
yes_pricenumberCurrent YES price (0–1).
no_pricenumberCurrent NO price (0–1).
volume_24h_usdnumber | null24-hour traded volume in USD, when available.
close_timestring | nullWhen the market closes (ISO 8601).
last_trade_atstring | nullTimestamp of the last trade (ISO 8601).
fetched_atstringWhen we last snapshotted this market (ISO 8601).

Example

curl
curl "https://api.marketmaster.live/v1/markets?category=politics&limit=50" \
  -H "x-api-key: mmk_live_your_key_here"

Market

GET/v1/market

A single market's latest snapshot plus any live edges we've computed for it. Identify it by source + id.

Query parameters

ParameterTypeDescription
sourcestring · requiredVenue: kalshi, polymarket, predictfun, manifold.
idstring · requiredThe 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
curl "https://api.marketmaster.live/v1/market?source=kalshi&id=PRES-2028-DEM" \
  -H "x-api-key: mmk_live_your_key_here"

Arbitrage

GET/v1/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.

Spreads are indicative and gross of fees, slippage, and bid/ask depth — they are not guaranteed arbitrage. Always confirm executable prices on the venue.

Query parameters

ParameterTypeDescription
min_spreadnumberOnly return spreads at least this many percentage points wide.
limitintegerMax rows. Default 50, max 200.
offsetintegerRows to skip, for pagination. Default 0.

Response: opportunities[]

FieldTypeDescription
match_group_idintegerThe cross-venue match group.
titlestringMarket question.
outcomestringThe outcome being compared (YES/NO).
spread_pctnumberDearest minus cheapest YES price, in percentage points.
buy_yesobjectCheapest venue: { platform, market_id, price }.
sell_yesobjectDearest venue: { platform, market_id, price }.
computed_atstringWhen these prices were computed (ISO 8601).

The response also carries a top-level disclaimer string restating the gross/indicative caveat.

curl
curl "https://api.marketmaster.live/v1/arbitrage?min_spread=2&limit=10" \
  -H "x-api-key: mmk_live_your_key_here"

Whales

GET/v1/whales

Recent large real-money trades (whale fills) across venues, newest first.

Query parameters

ParameterTypeDescription
sourcestringFilter by venue.
minintegerMinimum trade size in USD.
limitintegerMax rows. Default 50, max 200.
offsetintegerRows to skip, for pagination. Default 0.

Response: trades[]

FieldTypeDescription
sourcestringThe venue.
source_market_idstringThe venue's native market id.
trader_namestring | nullPublic trader handle, when available.
sidestringTrade side (e.g. buy/sell).
outcomestringOutcome traded.
size_usdnumberNotional trade size in USD.
pricenumberTrade price (0–1).
titlestringMarket question.
trade_timestringWhen the trade printed (ISO 8601).
tx_hashstring | nullOn-chain transaction hash, for on-chain venues.
curl
curl "https://api.marketmaster.live/v1/whales?min=10000&limit=20" \
  -H "x-api-key: mmk_live_your_key_here"

Status

GET/v1/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." } }
StatusCodeMeaning
401missing_api_keyNo x-api-key header was sent.
401invalid_api_keyThe key is malformed, unknown, or revoked.
429rate_limitedPer-minute rate exceeded — back off and retry.
400invalid_parameterA query parameter was invalid (unknown platform/source, or a missing required id).
404not_foundNo resource matched (e.g. /v1/market with an unknown id).
429quota_exceededMonthly quota exhausted — resets at the start of the month, or upgrade.
500auth_errorTemporary problem validating the key — retry shortly.
502upstream_errorTransient 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.