curl --request GET \
--url https://api.routeur.app/v1/relations/{left_venue}/{left_id}/{right_venue}/{right_id}/verification \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.routeur.app/v1/relations/{left_venue}/{left_id}/{right_venue}/{right_id}/verification"
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}/verification', 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}/verification"
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))
}{
"data": {
"relation": "equivalent",
"graph_relation": "equivalent",
"family": "sports",
"cross_venue": true,
"first_seen_run": 790,
"verification": {
"verdict": "consistent",
"left_result": "yes",
"right_result": "yes",
"settled_at": "2026-09-15T03:10:00Z",
"verified_at": "2026-09-15T03:37:12Z"
},
"label": {
"label": "correct",
"reason": "Same game, same total, both settle on the final score.",
"labeled_at": "2026-09-14T16:02:11Z"
},
"bucket": {
"relation": "equivalent",
"family": "sports",
"cross_venue": true,
"checked": 412,
"violated": 0,
"unverifiable": 9,
"violation_rate": "0.0000",
"violation_rate_low": "0.0000",
"violation_rate_high": "0.0093",
"first_settled_at": "2026-08-02T01:15:00Z",
"last_settled_at": "2026-09-15T03:10:00Z",
"labels": {
"correct": 38,
"wrong": 0,
"unsure": 2,
"precision": "1.0000",
"precision_low": "0.9075",
"precision_high": "1.0000"
},
"wrong_relations_still_live": 0,
"released": true
}
}
}{
"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 stored proof relates these markets."
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}Did a relation hold when the markets settled
Whether a proven relation held once both markets settled, and how a reviewer judged it, stated from the left market’s side. Unlike the proof trail this works after the markets have left the listing, since settled markets are no longer in the latest graph: the newest stored proof between the two markets is used.
verification is present once both markets have settled: consistent
when the relation held, violated when it did not, unverifiable when
a side settled scalar or void or the relation makes no claim (overlaps).
label is present once a reviewer has judged the relation. bucket
carries the figures for the relation’s type and proof family, as on
/v1/accuracy, so one verdict can be weighed against its family’s
record.
curl --request GET \
--url https://api.routeur.app/v1/relations/{left_venue}/{left_id}/{right_venue}/{right_id}/verification \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.routeur.app/v1/relations/{left_venue}/{left_id}/{right_venue}/{right_id}/verification"
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}/verification', 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}/verification"
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))
}{
"data": {
"relation": "equivalent",
"graph_relation": "equivalent",
"family": "sports",
"cross_venue": true,
"first_seen_run": 790,
"verification": {
"verdict": "consistent",
"left_result": "yes",
"right_result": "yes",
"settled_at": "2026-09-15T03:10:00Z",
"verified_at": "2026-09-15T03:37:12Z"
},
"label": {
"label": "correct",
"reason": "Same game, same total, both settle on the final score.",
"labeled_at": "2026-09-14T16:02:11Z"
},
"bucket": {
"relation": "equivalent",
"family": "sports",
"cross_venue": true,
"checked": 412,
"violated": 0,
"unverifiable": 9,
"violation_rate": "0.0000",
"violation_rate_low": "0.0000",
"violation_rate_high": "0.0093",
"first_settled_at": "2026-08-02T01:15:00Z",
"last_settled_at": "2026-09-15T03:10:00Z",
"labels": {
"correct": 38,
"wrong": 0,
"unsure": 2,
"precision": "1.0000",
"precision_low": "0.9075",
"precision_high": "1.0000"
},
"wrong_relations_still_live": 0,
"released": true
}
}
}{
"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 stored proof relates these markets."
}
}{
"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}$Response
The verdict and label.
Show child attributes
Show child attributes