curl --request GET \
--url https://api.routeur.app/v1/relations/{left_venue}/{left_id}/{right_venue}/{right_id} \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.routeur.app/v1/relations/{left_venue}/{left_id}/{right_venue}/{right_id}"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.routeur.app/v1/relations/{left_venue}/{left_id}/{right_venue}/{right_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.routeur.app/v1/relations/{left_venue}/{left_id}/{right_venue}/{right_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"graph_run": 812,
"data": {
"relation": "contradicts",
"graph_relation": "contradicts",
"direction": "mutually_exclusive",
"cross_venue": true,
"left": {
"venue": "kalshi",
"id": "KXNFLSPREAD-26SEP14DENKC-KC21",
"event_id": "KXNFLSPREAD-26SEP14DENKC",
"title": "Kansas City wins by over 20.5 points?",
"yes_label": "Yes",
"no_label": "No",
"rules_hash": "9f2c61d0a4be",
"strike": {
"type": "greater",
"floor": "41/2",
"rules_template_hash": "51c0e2"
},
"event_mutually_exclusive": false,
"variable": "NFL margin of Kansas City, Denver vs Kansas City, 2026-09-14 ET",
"interval": "(20.5, ∞)",
"settlement": {
"payout_currency": "USD",
"scope": "the game's final score; neither venue restricts periods"
},
"first_seen_at": "2026-09-08T14:00:00Z"
},
"right": {
"venue": "polymarket",
"id": "nfl-den-kc-2026-09-15-spread-away-1pt5",
"event_id": "99",
"title": "Spread: Broncos (-1.5)",
"yes_label": "Broncos",
"no_label": "Chiefs",
"rules_hash": "0c77e1b9d2aa",
"strike": {
"type": "greater",
"floor": "3/2",
"rules_template_hash": "a1d4f0"
},
"event_mutually_exclusive": false,
"variable": "NFL margin of Broncos, Broncos vs Chiefs, 2026-09-14 ET",
"interval": "(1.5, ∞)",
"settlement": {
"payout_currency": "USDC",
"scope": "the game's final score; neither venue restricts periods",
"game_starts_at": "2026-09-15T00:15:00Z"
},
"first_seen_at": "2026-09-09T02:30:00Z"
},
"steps": [
{
"step": "game_quantity",
"left": "NFL margin of Kansas City, Denver vs Kansas City, 2026-09-14 ET",
"right": "NFL margin of Broncos, Broncos vs Chiefs, 2026-09-14 ET",
"result": "same_kind"
},
{
"step": "same_game",
"detail": "cross-venue: same nfl game scheduled 2026-09-14 ET, matched by team codes and team names; both settle on the game's final score; neither venue restricts periods; postponement and cancellation settle differently",
"result": "same"
},
{
"step": "orient_margin",
"detail": "the contracts name opposite teams' margins; Broncos's margin (1.5, ∞) is (-∞, -1.5) on Kansas City's margin",
"right": "(-∞, -1.5)",
"result": "negated"
},
{
"step": "intervals",
"left": "(20.5, ∞)",
"right": "(-∞, -1.5)",
"result": "contradicts"
},
{
"step": "conclusion",
"relation": "contradicts"
}
],
"evidence": [
"cross-venue: same nfl game scheduled 2026-09-14 ET, matched by team codes and team names; both settle on the game's final score; neither venue restricts periods; postponement and cancellation settle differently"
],
"reproduced": true,
"found_by": {
"id": 790,
"graph_version": "contract-graph/v1",
"started_at": "2026-09-09T03:00:00Z",
"finished_at": "2026-09-09T03:04:12Z"
},
"confirmed_by": {
"id": 812,
"graph_version": "contract-graph/v1",
"started_at": "2026-09-14T11:00:00Z",
"finished_at": "2026-09-14T11:03:58Z"
},
"first_seen_at": "2026-09-09T03:04:12Z",
"last_confirmed_at": "2026-09-14T11:03:58Z"
}
}{
"error": {
"code": "invalid_parameter",
"message": "Invalid or unsupported query parameter: limit."
}
}{
"error": {
"code": "api_key_required",
"message": "Send an API key in the X-API-Key header or as a Bearer token."
}
}{
"error": {
"code": "relation_not_found",
"message": "No current proof relates these markets: the latest graph does not relate their current contract versions."
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}Why two markets are related
The proof trail behind a relation in the latest graph, stated from the left market’s side: both contract versions with the structured terms the proof read (event, variable, Yes interval, rules hash, settlement), the ordered proof steps, the evidence recorded when the relation was found, and the graph runs that found and last confirmed it.
Steps are rebuilt from the stored contract versions with the same code
that builds the graph. reproduced is false when that rebuild no longer
yields the stored relation, for example because the venue changed
metadata outside the rules hash; the steps then end with
not_reproduced and the recorded conclusion.
Step kinds: usable, same_event, same_variable, intervals,
mutually_exclusive, game_quantity, same_game, orient_margin,
econ_quantity, not_reproduced and conclusion. Intervals use
interval notation over exact decimals: (20.5, ∞) is “more than 20.5”.
Either market may be given first. 404 with relation_not_found means
both markets are listed but the latest graph does not relate their
current contract versions.
curl --request GET \
--url https://api.routeur.app/v1/relations/{left_venue}/{left_id}/{right_venue}/{right_id} \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.routeur.app/v1/relations/{left_venue}/{left_id}/{right_venue}/{right_id}"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.routeur.app/v1/relations/{left_venue}/{left_id}/{right_venue}/{right_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.routeur.app/v1/relations/{left_venue}/{left_id}/{right_venue}/{right_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"graph_run": 812,
"data": {
"relation": "contradicts",
"graph_relation": "contradicts",
"direction": "mutually_exclusive",
"cross_venue": true,
"left": {
"venue": "kalshi",
"id": "KXNFLSPREAD-26SEP14DENKC-KC21",
"event_id": "KXNFLSPREAD-26SEP14DENKC",
"title": "Kansas City wins by over 20.5 points?",
"yes_label": "Yes",
"no_label": "No",
"rules_hash": "9f2c61d0a4be",
"strike": {
"type": "greater",
"floor": "41/2",
"rules_template_hash": "51c0e2"
},
"event_mutually_exclusive": false,
"variable": "NFL margin of Kansas City, Denver vs Kansas City, 2026-09-14 ET",
"interval": "(20.5, ∞)",
"settlement": {
"payout_currency": "USD",
"scope": "the game's final score; neither venue restricts periods"
},
"first_seen_at": "2026-09-08T14:00:00Z"
},
"right": {
"venue": "polymarket",
"id": "nfl-den-kc-2026-09-15-spread-away-1pt5",
"event_id": "99",
"title": "Spread: Broncos (-1.5)",
"yes_label": "Broncos",
"no_label": "Chiefs",
"rules_hash": "0c77e1b9d2aa",
"strike": {
"type": "greater",
"floor": "3/2",
"rules_template_hash": "a1d4f0"
},
"event_mutually_exclusive": false,
"variable": "NFL margin of Broncos, Broncos vs Chiefs, 2026-09-14 ET",
"interval": "(1.5, ∞)",
"settlement": {
"payout_currency": "USDC",
"scope": "the game's final score; neither venue restricts periods",
"game_starts_at": "2026-09-15T00:15:00Z"
},
"first_seen_at": "2026-09-09T02:30:00Z"
},
"steps": [
{
"step": "game_quantity",
"left": "NFL margin of Kansas City, Denver vs Kansas City, 2026-09-14 ET",
"right": "NFL margin of Broncos, Broncos vs Chiefs, 2026-09-14 ET",
"result": "same_kind"
},
{
"step": "same_game",
"detail": "cross-venue: same nfl game scheduled 2026-09-14 ET, matched by team codes and team names; both settle on the game's final score; neither venue restricts periods; postponement and cancellation settle differently",
"result": "same"
},
{
"step": "orient_margin",
"detail": "the contracts name opposite teams' margins; Broncos's margin (1.5, ∞) is (-∞, -1.5) on Kansas City's margin",
"right": "(-∞, -1.5)",
"result": "negated"
},
{
"step": "intervals",
"left": "(20.5, ∞)",
"right": "(-∞, -1.5)",
"result": "contradicts"
},
{
"step": "conclusion",
"relation": "contradicts"
}
],
"evidence": [
"cross-venue: same nfl game scheduled 2026-09-14 ET, matched by team codes and team names; both settle on the game's final score; neither venue restricts periods; postponement and cancellation settle differently"
],
"reproduced": true,
"found_by": {
"id": 790,
"graph_version": "contract-graph/v1",
"started_at": "2026-09-09T03:00:00Z",
"finished_at": "2026-09-09T03:04:12Z"
},
"confirmed_by": {
"id": 812,
"graph_version": "contract-graph/v1",
"started_at": "2026-09-14T11:00:00Z",
"finished_at": "2026-09-14T11:03:58Z"
},
"first_seen_at": "2026-09-09T03:04:12Z",
"last_confirmed_at": "2026-09-14T11:03:58Z"
}
}{
"error": {
"code": "invalid_parameter",
"message": "Invalid or unsupported query parameter: limit."
}
}{
"error": {
"code": "api_key_required",
"message": "Send an API key in the X-API-Key header or as a Bearer token."
}
}{
"error": {
"code": "relation_not_found",
"message": "No current proof relates these markets: the latest graph does not relate their current contract versions."
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}Authorizations
Path Parameters
The left market's venue.
kalshi, polymarket The left market's id.
^[A-Za-z0-9][A-Za-z0-9_.-]{0,199}$The right market's venue.
kalshi, polymarket The right market's id.
^[A-Za-z0-9][A-Za-z0-9_.-]{0,199}$