Skip to main content
The Router is a catalog-backed, cross-venue search surface. It fans a single query across every venue PMXT ingests and returns a unified list of events, sorted by 24h volume. Unlike the venue pass-through (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.

Endpoint

GET https://api.pmxt.dev/v0/events
Authorization: Bearer pmxt_live_...

Query parameters

ParameterTypeDefaultNotes
querystringFull-text ILIKE over event title and slug.
limitinteger50Max rows, capped at 500.
offsetinteger0Standard pagination offset.
closedbooleanfalseInclude events whose closes_at has passed.
categorystringExact match on normalized category.
exchangestringFilter to a single venue (polymarket, kalshi, …).

Example

curl "https://api.pmxt.dev/v0/events?query=election&limit=2" \
  -H "Authorization: Bearer pmxt_live_..."
{
  "data": [
    {
      "eventId": "e344d660-5e22-411f-b516-ea37a0d9c3cb",
      "title": "2028 US Presidential Election",
      "volume24h": 12345678.9,
      "markets": [
        {
          "marketId": "…",
          "title": "Will Gavin Newsom win?",
          "outcomes": [
            { "label": "Yes", "price": 0.31, "priceChange24h":  0.02 },
            { "label": "No",  "price": 0.69, "priceChange24h": -0.02 }
          ]
        }
      ]
    }
  ],
  "meta": { "count": 2, "limit": 2, "offset": 0 }
}
Every event comes back with its child markets and each market’s outcomes, nested inline — no second fetch. Exactly the same shape as UnifiedEvent.

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 against prediction_markets.events + prediction_markets.markets + prediction_markets.outcomes. See Catalog vs Live for the full rationale.