← Back to API docs

GET/api/v1/matches/odds/histories

Get a match's odds history
Odds packageactivebetacoreAvailable (scoped)

Description

Returns the odds history of one match from every bookmaker, from the opening line to the moment of the request (update it when the 'odds updates' endpoint reports a change; use it as a supplement)

Range: opening line, pre-match line, in-play line
The first line of each market from each bookmaker is the opening line; from the opening line to kick-off it is the pre-match line; after kick-off it is the in-play line

Request rate: 120/min

Notes:
Odds changes come from the live odds endpoint, which returns the changes of the last 60 seconds for all matches; keep them locally
Use this endpoint to fill gaps when something was missed

Access

Request
GET https://api.sports.csap.ai/api/v1/matches/odds/histories
Auth
Header X-API-Key: <your key> (Authorization: Bearer <key> also works; ?key= is still accepted but discouraged, because the key ends up in URLs and logs)
External keys
Available (scoped)External keys can call it, but only data inside the open scope is returned.
Rate limits
3000 per minute · 200000 per day · Set per key (rate_per_min and quota_daily returned by /api/v1/account are authoritative; the numbers above are a trial key's). Beyond them the answer is 429. In addition, heavy requests such as whole-table snapshots and statistics lists without a match id are processed 2 at a time for the whole platform; a request that cannot get a slot receives 429 with Retry-After. Responses do not carry X-RateLimit-* headers for now. See the general guide

Request parameters 1

ParameterTyperequiredExampleDescription
idintegerrequired5179Match id

Example request

curl "https://api.sports.csap.ai/api/v1/matches/odds/histories?id=5179" \
  -H "X-API-Key: YOUR_API_KEY"

Try it

Example response

Real response with an external key at 09/11/2026, 14:28 UTC: HTTP 200, 1000 rows, 272 ms (data cut to 2 rows)

{
  "code": 0,
  "data": [
    {
      "asia": null,
      "away_goals": 0,
      "away_zh": "马格德堡",
      "bs": null,
      "competition": "German Bundesliga 2",
      "cr": null,
      "eu": null,
      "home_goals": 1,
      "home_zh": null,
      "kickoff": "2025-04-12T19:00:00Z",
      "odds_a": 2.05,
      "odds_d": 3.4,
      "odds_h": 3.5,
      "result": "HOME_WIN",
      "season": "2024/25",
      "source": "SX9f74ee",
      "source_id": null,
      "updated_at": 1793878545218,
      "公司id": null,
      "away": "Magdeburg",
      "home": "Ulm"
    },
    {
      "asia": null,
      "away_goals": 1,
      "away_zh": null,
      "bs": null,
      "competition": "English League Two",
      "cr": null,
      "eu": null,
      "home_goals": 3,
      "home_zh": "阿克宁顿",
      "kickoff": "2025-11-15T23:00:00Z",
      "odds_a": 2.82,
      "odds_d": 3.3,
      "odds_h": 2.32,
      "result": "HOME_WIN",
      "season": "2025/26",
      "source": "SX9f74ee",
      "source_id": null,
      "updated_at": 1793878513298,
      "公司id": null,
      "away": "Bristol Rvs",
      "home": "Accrington"
    }
  ],
  "message": "success",
  "success": true
}

Response fields 21

asianullnullableAsian handicap odds (line: positive, home gives the handicap; negative, away gives the handicap)
away_enstringExample: "Magdeburg"
away_goalsintegerExample: 0
away_zhstringnullableAway team Chinese nameExample: "马格德堡"
bsnullnullableOver/under odds
competitionstringCompetitionExample: "German Bundesliga 2"
crnullnullableCorners odds
eunullnullable1X2 odds
home_enstringExample: "Ulm"
home_goalsintegerExample: 1
home_zhstringnullableHome team Chinese nameExample: "阿克宁顿"
kickoffstringExample: "2025-04-12T19:00:00Z"
odds_anumberExample: 2.05
odds_dnumberExample: 3.4
odds_hnumberExample: 3.5
resultstringExample: "HOME_WIN"
seasonstringSeasonExample: "2024/25"
sourcestringSource code (S1, S2…)Example: "SX9f74ee"
source_idnullnullableId within the source
updated_atintegerLast update time (UTC, ISO 8601; incremental sync with the time parameter goes by it)Example: 1793878545218
公司idnullnullableBookmaker id, see status codes -> bookmaker ids

Errors

HTTPmessageWhen
401missing API key / unauthorizedNo X-API-Key, or the key is invalid or disabled
400bad param …Malformed parameter (e.g. id is neither a number nor u<uid>)
301match merged into <gmid>Queried by an old match id that has been merged into a new gmid: Location points to the new address and the body carries moved_to
404not foundThe match / team / competition does not exist, or is outside what this key can see (external keys see only matches inside the open coverage)
429rate limit exceeded / daily quota exceededThe key's per-minute rate or daily quota is exceeded
429server busy, retry laterThe server's concurrency slots are full (only 2 heavy requests at a time); retry after Retry-After seconds
500query errorThe query failed on the server; you may retry