Skip to content

Fixtures

A fixture is a single game available to bet on. It carries the teams, the date, and the rules for betting on it, and it changes only when the schedule changes.

This endpoint is public, so no API key and no signature are needed. The examples below use the signed helper for consistency with the rest of the documentation, and a plain unsigned request works just as well.

GET /fixtures

Optional filters are league, team, and bettingOpen.

{
  "contractId": "MLB_CLE_DET_260813",
  "league": "MLB",
  "homeTeam": "DET",
  "awayTeam": "CLE",
  "homeTeamName": "Detroit Tigers",
  "awayTeamName": "Cleveland Guardians",
  "startTime": "2026-08-13T22:40:00Z",
  "acceptingBets": true,
  "gameEnded": false,
  "minContracts": 10
}

The contractId reads as league, away team, home team, date, and it is the identifier every other endpoint expects, so the date is not repeated as its own field. The short team codes are what a bet sends as team, while homeTeamName and awayTeamName are the full names for display. startTime is the scheduled first pitch or kickoff in UTC, and minContracts is the smallest bet allowed. Contract counts are whole numbers and are sent as integers, and a quantity with a fraction is rounded down.

acceptingBets reflects the on chain state of the fixture's contract, so it is a necessary condition for betting but not a sufficient one. Quoting also needs a live price from the sports feed, and that feed can report a market closed while the contract is still open on chain. When it does, POST /order/rfq answers 503 with code -2019 even though acceptingBets was true. Treat a quote as the real test of whether a bet can be placed.

gameEnded is true once the game is over. An ended fixture stays on the board for a while and carries homeScore and awayScore, plus period1, period2, and period3 for period detail, and refTime, the moment the underlying data was last updated. Those extra fields are absent while a game is still scheduled.

All snippets use the client from Authentication.

Example

const fixtures = await signedGet("/fixtures", { bettingOpen: "true", limit: 10 });
console.log("fixtures:", fixtures.total, fixtures.fixtures[0].contractId);
fixtures = signedGet("/fixtures", {"bettingOpen": "true", "limit": 10})
print("fixtures:", fixtures["total"], fixtures["fixtures"][0]["contractId"])
var fixtures struct {
    Total    int `json:"total"`
    Fixtures []struct {
        ContractID string `json:"contractId"`
        AwayTeam   string `json:"awayTeam"`
        HomeTeam   string `json:"homeTeam"`
    } `json:"fixtures"`
}
signedGet("/fixtures", url.Values{"bettingOpen": {"true"}, "limit": {"10"}}, &fixtures)
fmt.Println("fixtures:", fixtures.Total, fixtures.Fixtures[0].ContractID)

Filtering and paging

const mlb = await signedGet("/fixtures", { league: "MLB" });
const nyy = await signedGet("/fixtures", { team: "NYY" });
const page2 = await signedGet("/fixtures", { limit: 5, offset: 5 });
mlb = signedGet("/fixtures", {"league": "MLB"})
nyy = signedGet("/fixtures", {"team": "NYY"})
page2 = signedGet("/fixtures", {"limit": 5, "offset": 5})
signedGet("/fixtures", url.Values{"league": {"MLB"}}, &fixtures)
signedGet("/fixtures", url.Values{"team": {"NYY"}}, &fixtures)
signedGet("/fixtures", url.Values{"limit": {"5"}, "offset": {"5"}}, &fixtures)