Skip to main content
Routeur is a read-only data service for prediction markets on Kalshi and Polymarket: every listed market, the relations proven between contracts, live and recorded prices, order books, mispricing leads, unusual-flow signals and strategies measured against settled history. An agent reaches it three ways, REST, a Server-Sent Events stream and a remote MCP server, all with the same API key, the same limits and the same data. Nothing on any surface places an order or changes an account.

What an agent can do

Every question above is answered from public venue data. Routeur never sees an account, a wallet or a position, and there is no tool that takes one.

Everything is read-only

Every MCP tool is annotated readOnlyHint: true, idempotentHint: true, destructiveHint: false and openWorldHint: false, and every REST operation is a GET. There is no write path: no orders, no follows, no posting, no account changes. Routeur is not a broker, exchange or adviser. If user-scoped actions ever arrive they will be a separate, clearly marked surface behind OAuth, not a silent addition to these tools.

The three surfaces

The MCP server runs each tool through the same handler that serves the REST API, in-process, carrying your key. Validation, caching, rate limits and metering are identical to a REST call, and the endpoint tools return the endpoint’s JSON body unchanged.

Authentication

Send your Routeur API key as Authorization: Bearer <key> or X-API-Key: <key> on every request, to every surface; both headers were accepted by the MCP endpoint when this page was verified. Keys look like rk_live_<12-character id>_<43-character secret>, are shown once, and are issued by the Routeur team during the private preview. A request without a key gets 401 with WWW-Authenticate: Bearer realm="routeur"; a malformed, unknown or revoked key gets 401 as well. Keep the key server-side or in a desktop client’s config, never in a browser, a public repository or a URL. See Authentication.

What a tool call costs

Your MCP calls and your REST calls are the same traffic on the same key, so the per-minute limit and daily quota of your tier apply to both together. Each tool’s description states its cost. When a call runs over a limit, it comes back as a tool result with isError: true and a message naming rate_limited or daily_quota_exceeded and the seconds to wait; the protocol call itself succeeds, so the model can read the reason and wait. One tool call is bounded at 25 seconds including every REST request it makes.

The server

What it exposes

Tools. Five composed tools answer whole questions and return compact rows with the ids to drill into: find_opportunities, compare_venues, explain_relation, market_snapshot, search_markets. Every documented GET endpoint is also a tool named after its operation (get_market, list_relations, get_market_book, get_relation_proof, …), taking that endpoint’s parameters and returning its JSON body. A new endpoint becomes a tool when it is added to the API. See the tool reference. Resources. Four concept pages an agent should read before quoting a number, served as text/markdown and free to read: routeur://concepts/glossary, routeur://concepts/relations, routeur://concepts/leads-and-fees, routeur://concepts/prices. The OpenAPI document at routeur://openapi.json. Three live lists, each costing one request: routeur://categories, routeur://topics and the template routeur://topics/{slug}. Prompts. scan_for_mispricings (category, min_volume_usd), brief_me_on_event (event, required) and backtest_price_band (band, side, category, venue, horizon_days). Each returns one user message naming the tools to call in order and the traps to avoid. The workflows page walks through the same sequences with observed output. Instructions. initialize returns server instructions that summarise the five composed tools and the three rules below; clients that honour instructions show them to the model automatically.

What the model must know before it quotes a number

These are the misreadings that happen most. The server states them in its instructions and its concept resources; the reading order page expands them into the ten facts an agent needs.
  • Prices are asks per contract that pays $1, as exact decimal strings such as "0.52". The spread is yes_ask_usd + no_ask_usd - 1, what crossing costs; a wide spread is a thin book, not an edge.
  • A relation is proven from structured terms and exact arithmetic, never guessed. No relation coming back means none was proven, not that two markets are unrelated.
  • A gap between venues is only money when both books have size and fees leave something. Only leads with depth.executable: true could be filled at a profit when the books were read.
  • Strategy and calibration figures are settled history, before fees, and are not a forecast.
  • Kalshi is read every 15 minutes, Polymarket every 30, trades every minute, and the graph is rebuilt hourly; every graph-derived answer names its graph_run.

Connect a client

Claude Code & Claude Desktop

One command, or a custom connector with a request header.

Cursor

A mcp.json entry with the key from the environment.

OpenAI: Responses API, Agents SDK, Codex, ChatGPT

Hosted MCP tool, a Python client, or the Codex CLI.

Any MCP client

The protocol over curl, SDK clients, and mcp-remote for stdio-only clients.
  • Reading order for LLMs: the pages to read, in order, and the ten facts to hold.
  • Tool reference: every tool and argument, generated from the server.
  • Agent workflows: five worked sequences with observed output.
  • Rate limits, Data freshness, Data and limitations.
  • Plain-text descriptions for agents that read a site first: https://routeur.app/llms.txt and https://routeur.app/llms-full.txt; this documentation site serves https://docs.routeur.app/llms.txt and /llms-full.txt as well.