Introduction
One API for Kalshi and Polymarket prediction markets, matched across both venues, with the arbitrage that appears between them.
dino.markets matches related markets across Kalshi and Polymarket and gives you one feed for both venues. You get the best available price on each side and the size you could fill at that price. When the two venues disagree by more than the fees, you get the arbitrage.
There are two ways to read the data.
The REST API is a best-effort snapshot of the matched feed and the opportunities open right now. It runs on every plan, including Free, and it is the fastest way to see the data and try a query. The snapshot is about two minutes behind on every plan, so it is built for exploring rather than for firing on.
The WebSocket stream is the real-time push. It sends Market price and state changes with no polling; when a Market's signal becomes arb, that frame includes depth and max_stake. It does not emit the REST Opportunity object. The full stream runs on Basic, Premium, and Pro; Free gets a curated sample channel taste.
Start here
The Quickstart pulls your first matched feed over REST, then connects the stream. It takes about two minutes, and the first half runs on a free key.
What you can read
/v2/markets is the matched, unified Market catalog across both venues. /v2/arbitrage returns confirmed Opportunities with exact snapshot execution legs and conservative fee-inclusive sizing estimates. /v2/pairs/{market_id} and /v2/categories describe one Market in full and the categories currently available in the matched feed. The same data is available to coding agents through a native MCP server, free on every plan.
The reference covers the REST API, the WebSocket stream, the Market object, and the MCP server. Two guides go deeper on specific parts of the API: Settlement data covers reading cross-venue settlement disclosure before treating a spread as tradeable, and Webhooks covers registering an endpoint for new matched pairs and price-gap alerts instead of polling.
Authentication
Every request carries your API key as a bearer token. Create and reveal a key once in the dashboard, then send it on every call:
Authorization: Bearer sk_live_...
Keys are scoped to your organization and your plan. The plan decides what the API returns to that key: every key, Free included, reads the REST snapshot and can mint a stream ticket, but a Free ticket is entitled to only the curated sample channel — the full market stream needs Basic, Premium, or Pro.