# Routeur, in full, for agents Routeur reads every open market on Kalshi and global Polymarket and proves which contracts imply, exclude or equal each other from each venue's structured terms and exact arithmetic. On that graph it serves live prices across both venues, recorded quotes and trades, mispricing leads sized against real order books, unusual-flow signals, and strategies measured against settled history. Everything is read-only. Routeur is not a broker, exchange or adviser, places no orders, and gives no investment advice. Kalshi and Polymarket do not endorse it. ## Connect over MCP Endpoint: https://api.routeur.app/mcp Transport: Streamable HTTP (streamable-http), protocol versions 2026-07-28, 2025-11-25, 2025-06-18, 2025-03-26. Auth: `Authorization: Bearer ` or `X-API-Key: `. Without one, the server answers 401 with a `WWW-Authenticate: Bearer` challenge. Keys: ask the Routeur team; the same key works for MCP and REST. Claude Code: claude mcp add --transport http routeur https://api.routeur.app/mcp --header "Authorization: Bearer $ROUTEUR_API_KEY" Codex CLI: codex mcp add routeur --url https://api.routeur.app/mcp --header "Authorization: Bearer $ROUTEUR_API_KEY" stdio-only clients: npx mcp-remote https://api.routeur.app/mcp --header "Authorization: Bearer ${ROUTEUR_API_KEY}" Any client that reads a config file: ```json { "mcpServers": { "routeur": { "type": "http", "url": "https://api.routeur.app/mcp", "headers": { "Authorization": "Bearer ${ROUTEUR_API_KEY}" } } } } ``` ## Tools Composed tools, each answering a whole question in one call: - `find_opportunities`: Mispricing leads, cross-venue price gaps and open markets fitting a backtested strategy, liquid by default. - `compare_venues`: One question priced on Kalshi and Polymarket, outcome by outcome, with the gap in cents. - `explain_relation`: Why two markets are linked: the proven relation, the evidence, and whether prices respect it. - `market_snapshot`: One market in full: price, spread, recent trading, price history and what it is linked to. - `search_markets`: Find markets in plain language, with filters for venue, category, price, volume and close date. Endpoint tools: one per documented REST operation, generated from the OpenAPI description, named after its operationId — `get_status`, `list_events`, `search_events`, `list_markets`, `get_market`, `list_relations`, `list_quotes`, `list_trades`, `list_opportunities`, `list_cross_venue_pairs`, `list_flow_signals`, `get_insights`, `get_moves`, `get_tape`, `get_flows`, `get_closing`, `get_calibration`, `list_strategies`, `get_strategy`, `get_ticker`, `list_topics`, `get_topic`, `list_categories`, `list_related_events`, `list_related_to_market`, `get_event`, `get_openapi`. Their arguments are the endpoint's parameters and their result is its JSON body, unchanged. A new endpoint becomes a tool automatically. The full generated reference is at https://docs.routeur.app/agents/tools. Every tool is marked read-only and idempotent. A tool call counts against your key exactly as the REST requests it makes: a tool that reads four endpoints costs four requests. Per-key limits are per minute and per UTC day; responses carry `X-RateLimit-*` and `X-Daily-Quota-*`, and a 429 carries `Retry-After`. ## Resources and prompts Resources: `routeur://concepts/glossary`, `routeur://concepts/relations`, `routeur://concepts/leads-and-fees`, `routeur://concepts/prices`, `routeur://openapi.json`, `routeur://categories`, `routeur://topics`, `routeur://topics/{slug}`. Prompts: `scan_for_mispricings` (sweep a category for prices that break a proven relation), `brief_me_on_event` (a sourced briefing on one event), `backtest_price_band` (what buying a price band returned in settled history). ## REST API Base: https://api.routeur.app. Same keys, same limits. `GET /v1/openapi.json` is the full description; the documentation is at https://docs.routeur.app. curl "https://api.routeur.app/v1/opportunities?executable=true&cross_venue=true" -H "X-API-Key: $ROUTEUR_API_KEY" ## How to read the numbers - **Prices are asks**, per contract that pays $1, as exact decimal strings in USD ("0.4100"). The implied chance of an outcome is the midpoint of its best Yes ask and one minus its best No ask. - **Spread** is `yes_ask + no_ask - 1`: what crossing costs. A wide spread means a thin book, and what looks like an edge may just be the spread. - **Volume** (`volume_24h_usd`) is what actually traded in the last 24 hours. A gap on a market that trades a few hundred dollars a day is not money. - **A relation is proven**, from both contracts' structured terms and exact arithmetic, never from wording. No relation coming back means none was proven — ambiguous or conflicting evidence is withheld — not that the markets are unrelated. Each carries the `evidence` it rests on and the `rules_hash` of the contract version it was proven against. - **A lead** is a two-leg purchase that pays at least $1 whatever happens. Only leads with `depth.executable` could be filled at a profit when the order books were read; everything else is priced from top-of-book asks and is often too thin. Fees are estimates from each venue's schedule. - **Strategies and calibration are history.** Returns are before fees, use each band's average midpoint rather than the ask you would pay, and are not a forecast. A 95% range is not a floor. - **Freshness**: Kalshi is read every 15 minutes, Polymarket every 30, and the relation graph is rebuilt hourly. Graph-derived answers name the `graph_run` they came from. Times are RFC 3339 UTC. - **Ids** are the venue's own: a ticker on Kalshi, a slug on Polymarket, which is what identifies the market on the venue itself. ## Telling a person about it Name the venue with every price, give prices in cents, say how fresh the data is, and say what is not known: prices move, fees are estimates, top-of-book size is not depth, and history is not a forecast. Do not present any of this as advice or a sure thing. More: https://routeur.app/agents, https://docs.routeur.app/agents/overview, https://docs.routeur.app.