POST /api/:exchange/:method), the
Router is GET-based, browser-friendly, and never falls through to a
live venue call. It is always served from the Postgres catalog.
Pick the shape by the endpoint you hit:
GET /v0/events— events with their child markets and outcomes nested inline.GET /v0/markets— flat per-market rows with their outcomes inline.
Endpoints
Query parameters
| Parameter | Type | Default | Notes |
|---|---|---|---|
query | string | — | Full-text ILIKE over title and slug. |
limit | integer | 50 | Max rows, capped at 500. |
offset | integer | 0 | Standard pagination offset. |
closed | boolean | false | Include closed / resolved rows. |
category | string | — | Exact match on normalized category. |
exchange | string | — | Filter to a single venue (polymarket, kalshi, …). |
Events shape
UnifiedEvent.
Markets shape
Events vs markets
| You want… | Use |
|---|---|
| A single answer for a topic with many questions | GET /v0/events |
| A flat list ranked across all events | GET /v0/markets |
| The full venue surface (writes, OHLCV, …) | POST /api/:exchange/:method |
Latency
Typical p95 on a warm catalog: ~10 ms per request, regardless of venue. Cross-venue fan-out that would take 2–5 seconds live is served by a single indexed SQL query againstprediction_markets.events +
prediction_markets.markets + prediction_markets.outcomes.
See Unified Schema for the full rationale.
