Get a matched event
curl --request GET \
--url https://api.oddpool.com/reference/v2/events/{opi}import requests
url = "https://api.oddpool.com/reference/v2/events/{opi}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.oddpool.com/reference/v2/events/{opi}', 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/{opi}",
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/{opi}"
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/{opi}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.oddpool.com/reference/v2/events/{opi}")
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 a matched event
Fetch a matched event by its Oddpool ID.
GET
/
reference
/
v2
/
events
/
{opi}
Get a matched event
curl --request GET \
--url https://api.oddpool.com/reference/v2/events/{opi}import requests
url = "https://api.oddpool.com/reference/v2/events/{opi}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.oddpool.com/reference/v2/events/{opi}', 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/{opi}",
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/{opi}"
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/{opi}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.oddpool.com/reference/v2/events/{opi}")
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_bodyFetch one event by its Oddpool ID. Returns the same event object as Get Oddpool ID by ticker.
Path parameters
string
required
The event id, e.g.
OPI-OO4GBEZJ.Request
curl -H "X-API-Key: your_api_key" \
"https://api.oddpool.com/reference/v2/events/OPI-OO4GBEZJ"
import requests
r = requests.get(
"https://api.oddpool.com/reference/v2/events/OPI-OO4GBEZJ",
headers={"X-API-Key": "your_api_key"},
)
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 event has this id:
{
"detail": {
"error_code": "EVENT_NOT_FOUND",
"error": "no_canonical_match",
"oddpool_id": "OPI-NONEXIST"
}
}
⌘I