Get Oddpool ID by ticker
curl --request GET \
--url https://api.oddpool.com/reference/v2/events/lookupimport requests
url = "https://api.oddpool.com/reference/v2/events/lookup"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.oddpool.com/reference/v2/events/lookup', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.oddpool.com/reference/v2/events/lookup",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.oddpool.com/reference/v2/events/lookup"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.oddpool.com/reference/v2/events/lookup")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.oddpool.com/reference/v2/events/lookup")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_bodyMatched events
Get Oddpool ID by ticker
Resolve a Kalshi, Polymarket, or Polymarket US ticker to its Oddpool event, outcomes, and venue sides.
GET
/
reference
/
v2
/
events
/
lookup
Get Oddpool ID by ticker
curl --request GET \
--url https://api.oddpool.com/reference/v2/events/lookupimport requests
url = "https://api.oddpool.com/reference/v2/events/lookup"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.oddpool.com/reference/v2/events/lookup', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.oddpool.com/reference/v2/events/lookup",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.oddpool.com/reference/v2/events/lookup"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.oddpool.com/reference/v2/events/lookup")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.oddpool.com/reference/v2/events/lookup")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_bodyGive this endpoint a Kalshi, Polymarket, or Polymarket US id and it returns the matched event: its Oddpool ID, every venue that lists it, every outcome, the entity each outcome refers to, and the venue ticker you trade on each side.
Kalshi input can be an event ticker or a market ticker (a market ticker resolves to its parent event). Polymarket input can be a conditionId, event slug, or numeric event id. Polymarket US input is the market slug.
Query parameters
Pass eitheroddpool_id, or venue + id.
string
kalshi, polymarket, or polymarket_us (see Supported venues). Required when you pass id.string
The venue’s id. Kalshi: event or market ticker. Polymarket: conditionId (
0x…), event slug, or numeric event id. Polymarket US: market slug.string
An Oddpool event id (
OPI-XXXXXXXX) instead of a venue id.Request
curl -H "X-API-Key: your_api_key" \
"https://api.oddpool.com/reference/v2/events/lookup?venue=kalshi&id=KXBRASILEIROGAME-26MAY30GPACOR-GPA"
import requests
r = requests.get(
"https://api.oddpool.com/reference/v2/events/lookup",
headers={"X-API-Key": "your_api_key"},
params={"venue": "kalshi", "id": "KXBRASILEIROGAME-26MAY30GPACOR-GPA"},
)
event = r.json()
Response
A matched event. Every field is defined in Response fields.{
"oddpool_id": "OPI-OO4GBEZJ",
"title": "Gremio vs Corinthians",
"subject_domain": "Sports",
"classified_at": "2026-05-25T18:42:11Z",
"venue_listings": [
{
"oddpool_id": "OPL:KALSHI:KXBRASILEIROGAME-26MAY30GPACOR",
"venue": "kalshi",
"venue_event_id": "KXBRASILEIROGAME-26MAY30GPACOR",
"venue_question": "Who will win the Brasileirão match Grêmio vs Corinthians on May 30?"
},
{
"oddpool_id": "OPL:POLYMARKET:445404",
"venue": "polymarket",
"venue_event_id": "445404",
"venue_question": "Grêmio vs Corinthians: Match Result"
}
],
"venue_pairs": [
{
"venue_a": "kalshi",
"venue_a_event_id": "KXBRASILEIROGAME-26MAY30GPACOR",
"venue_b": "polymarket",
"venue_b_event_id": "445404",
"basis_class": "identical",
"outcome_universe": "identical"
}
],
"outcomes": [
{
"oddpool_id": "OPO:OO4GBEZJ:GREMIO-FBPA-JITQ",
"label": "Grêmio FBPA",
"outcome_kind": "multi_class_named",
"outcome_params": {},
"entity": {
"oddpool_id": "OPE:TEAM:GREMIO-FBPA",
"kind": "team",
"canonical_name": "Grêmio FBPA",
"aliases": ["Grêmio", "Gremio", "Tricolor Gaúcho"],
"wikidata_qid": "Q190301",
"metadata": {
"league": "Campeonato Brasileiro Série A",
"sport": "association football",
"city": "Porto Alegre"
}
},
"venue_listings": [
{
"oddpool_id": "OPL:KALSHI:KXBRASILEIROGAME-26MAY30GPACOR-GPA",
"venue": "kalshi",
"venue_market_id": "KXBRASILEIROGAME-26MAY30GPACOR-GPA",
"venue_event_id": "KXBRASILEIROGAME-26MAY30GPACOR",
"venue_yes_token": null,
"venue_no_token": null,
"venue_question": "Gremio"
},
{
"oddpool_id": "OPL:POLYMARKET:0X830BC4CBE4FC945B6CEE65EB1B0A5FEBACB16004C4C7B702A20376E6E12B1429",
"venue": "polymarket",
"venue_market_id": "0x830bc4cbe4fc945b6cee65eb1b0a5febacb16004c4c7b702a20376e6e12b1429",
"venue_event_id": "445404",
"venue_yes_token": "30372052209701849468461148034092137114942310389987253992056832502897412952481",
"venue_no_token": "74064390857285423190264600895526377480606423020566358098133374778358135580812",
"venue_question": "Grêmio FBPA"
}
],
"venue_pairs": [
{
"venue_a": "kalshi",
"venue_b": "polymarket",
"fungible": false,
"divergence_axes": ["condition_scope"],
"divergence_reason": "Both resolve Yes if Grêmio wins in 90 minutes plus stoppage time, but Kalshi sends cancellation/reschedule over two weeks to fair price while Polymarket keeps postponed games open and canceled-without-makeup resolves No."
}
]
}
]
}
Errors
Returns404 when no match exists for the id:
{
"detail": {
"error_code": "EVENT_NOT_FOUND",
"error": "no_canonical_match",
"venue": "kalshi",
"id": "KXNONEXIST-99"
}
}