List Games
curl --request GET \
--url https://api.predexon.com/v2/sports/games \
--header 'x-api-key: <api-key>'import requests
url = "https://api.predexon.com/v2/sports/games"
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.predexon.com/v2/sports/games', 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.predexon.com/v2/sports/games",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$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.predexon.com/v2/sports/games"
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))
}HttpResponse<String> response = Unirest.get("https://api.predexon.com/v2/sports/games")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.predexon.com/v2/sports/games")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"games": [
{
"game_id": "mlb-ari-pit-2026-05-07",
"title": "Arizona Diamondbacks vs Pittsburgh Pirates",
"league": "mlb",
"league_name": "MLB",
"sport": "baseball",
"game_date": "2026-05-07",
"status": "open",
"venues_available": 3,
"total_volume": 895447.602333,
"total_liquidity": 40231.55,
"outcomes": [
{
"outcome": "ari",
"label": "Arizona Diamondbacks",
"yes": {
"predexon_id": "px-xz7fw6lsywv2rnwr"
},
"no": {
"predexon_id": "px-c3dftfrdu5unmk3g"
}
},
{
"outcome": "pit",
"label": "Pittsburgh Pirates",
"yes": {
"predexon_id": "px-c3dftfrdu5unmk3g"
},
"no": {
"predexon_id": "px-xz7fw6lsywv2rnwr"
}
}
]
}
],
"pagination": {
"limit": 1,
"has_more": true,
"pagination_key": "eyJybyI6MS..."
}
}Sports Discovery API
List Games
Compact game/outcome discovery view backed by canonical sports tables
GET
/
v2
/
sports
/
games
List Games
curl --request GET \
--url https://api.predexon.com/v2/sports/games \
--header 'x-api-key: <api-key>'import requests
url = "https://api.predexon.com/v2/sports/games"
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.predexon.com/v2/sports/games', 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.predexon.com/v2/sports/games",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$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.predexon.com/v2/sports/games"
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))
}HttpResponse<String> response = Unirest.get("https://api.predexon.com/v2/sports/games")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.predexon.com/v2/sports/games")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"games": [
{
"game_id": "mlb-ari-pit-2026-05-07",
"title": "Arizona Diamondbacks vs Pittsburgh Pirates",
"league": "mlb",
"league_name": "MLB",
"sport": "baseball",
"game_date": "2026-05-07",
"status": "open",
"venues_available": 3,
"total_volume": 895447.602333,
"total_liquidity": 40231.55,
"outcomes": [
{
"outcome": "ari",
"label": "Arizona Diamondbacks",
"yes": {
"predexon_id": "px-xz7fw6lsywv2rnwr"
},
"no": {
"predexon_id": "px-c3dftfrdu5unmk3g"
}
},
{
"outcome": "pit",
"label": "Pittsburgh Pirates",
"yes": {
"predexon_id": "px-c3dftfrdu5unmk3g"
},
"no": {
"predexon_id": "px-xz7fw6lsywv2rnwr"
}
}
]
}
],
"pagination": {
"limit": 1,
"has_more": true,
"pagination_key": "eyJybyI6MS..."
}
}Overview
Returns broad sports games with canonical outcomes. This endpoint is the compact discovery view: venues are summarized at the game level, and each outcome exposes the canonicalpredexon_id used for routing and lookup.
For per-venue execution detail, prices, token IDs, condition IDs, and market titles, use GET /v2/sports/markets or GET /v2/sports/outcomes/{predexon_id}.
Query Parameters
| Param | Type | Default | Description |
|---|---|---|---|
sport | string | - | Filter by sport: basketball, soccer, hockey, baseball. |
league | string | - | Filter by league code (e.g. nba, epl). See league codes. |
status | string | open | open or closed. |
game_date | string | - | Exact date, YYYY-MM-DD. See date conventions. |
game_date_from | string | - | Inclusive lower bound, YYYY-MM-DD. |
game_date_to | string | - | Inclusive upper bound, YYYY-MM-DD. |
search | string | - | Case-insensitive search against market titles. |
sort_by | string | game_date_asc | game_date_asc or game_date_desc. |
limit | int | 50 | 1-200. |
pagination_key | string | - | Opaque cursor from the previous response. Omit on the first request. |
Pagination
Sports list endpoints use cursor pagination. Pass the returnedpagination.pagination_key into the next request. Do not use offset-based pagination.
{
"pagination": {
"limit": 50,
"has_more": true,
"pagination_key": "eyJybyI6NTA..."
}
}
Response Fields
Game
| Field | Type | Description |
|---|---|---|
game_id | string | Canonical game identifier (e.g. nba-atl-nyk-2026-04-18). |
title | string | Display title (e.g. "Atlanta Hawks vs New York Knicks"). |
league | string | League code. |
league_name | string | Human-readable league name. |
sport | string | Sport name. |
game_date | string | Calendar date, YYYY-MM-DD. |
status | string | "open" or "closed". |
venues_available | int | Number of venues offering this game. |
total_volume | number? | USD volume summed across all venues. |
total_liquidity | number? | USD liquidity summed across all venues. |
outcomes[] | array | One entry per tradeable side. |
Outcome
| Field | Type | Description |
|---|---|---|
outcome | string | Canonical outcome code (team code or "draw"). |
label | string | Human-readable label. |
yes.predexon_id | string | Canonical predexon_id for this outcome when buying YES. |
no.predexon_id | string? | Canonical predexon_id for buying NO on that venue question/selection when an executable NO listing exists. In 2-way games this may equal the sibling YES outcome ID; in 3-way soccer it points to an explicit negation outcome such as “Draw does not happen.” |
predexon_id is canonical across venues. The same team/draw outcome for the same game has one predexon_id, even when several venues list it./games is intentionally compact. It does not return venue-native identifiers. Use /markets for venue comparison and /outcomes/{predexon_id} for route resolution.Example
GET /v2/sports/games?league=mlb&limit=1
{
"games": [
{
"game_id": "mlb-ari-pit-2026-05-07",
"title": "Arizona Diamondbacks vs Pittsburgh Pirates",
"league": "mlb",
"league_name": "MLB",
"sport": "baseball",
"game_date": "2026-05-07",
"status": "open",
"venues_available": 3,
"total_volume": 895447.602333,
"total_liquidity": 40231.55,
"outcomes": [
{
"outcome": "ari",
"label": "Arizona Diamondbacks",
"yes": { "predexon_id": "px-xz7fw6lsywv2rnwr" },
"no": { "predexon_id": "px-c3dftfrdu5unmk3g" }
},
{
"outcome": "pit",
"label": "Pittsburgh Pirates",
"yes": { "predexon_id": "px-c3dftfrdu5unmk3g" },
"no": { "predexon_id": "px-xz7fw6lsywv2rnwr" }
}
]
}
],
"pagination": {
"limit": 1,
"has_more": true,
"pagination_key": "eyJybyI6MS..."
}
}
When to Use This vs /markets
| Use Case | Endpoint |
|---|---|
| Trading UI — show compact game/outcome list | /games (this endpoint) |
Order routing — find venue for a predexon_id | GET /outcomes/{predexon_id} |
| Arbitrage detection — compare prices across venues | /markets |
| Venue-specific metadata (market_id, condition_id, etc.) | /markets |
| Building a data feed with full venue detail | /markets |
Caching
Responses are cached for 60 seconds.Authorizations
Data key provided by Predexon. The trading key used by the Order Router on trade.predexon.com is a separate credential.
Query Parameters
Filter by sport.
Available options:
basketball, soccer, hockey, baseball Filter by league code (e.g. nba, epl).
Market status.
Available options:
open, closed Exact game date (YYYY-MM-DD).
Games on or after date (YYYY-MM-DD).
Games on or before date (YYYY-MM-DD).
Search game/market titles.
Sort order.
Available options:
game_date_asc, game_date_desc Max games to return.
Required range:
1 <= x <= 200Cursor from the previous response. Omit on the first request.
Response
200 - application/json
Successful response
