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
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
| Parameter | Type | required | Example | Description |
|---|---|---|---|---|
| id | integer | required | 5179 | Match 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
{
"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_enstring
Example: "Magdeburg"away_goalsinteger
Example: 0away_zhstringnullableAway team Chinese name
Example: "马格德堡"bsnullnullableOver/under odds
competitionstringCompetition
Example: "German Bundesliga 2"crnullnullableCorners odds
eunullnullable1X2 odds
home_enstring
Example: "Ulm"home_goalsinteger
Example: 1home_zhstringnullableHome team Chinese name
Example: "阿克宁顿"kickoffstring
Example: "2025-04-12T19:00:00Z"odds_anumber
Example: 2.05odds_dnumber
Example: 3.4odds_hnumber
Example: 3.5resultstring
Example: "HOME_WIN"seasonstringSeason
Example: "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
| HTTP | message | When |
|---|---|---|
| 401 | missing API key / unauthorized | No X-API-Key, or the key is invalid or disabled |
| 400 | bad param … | Malformed parameter (e.g. id is neither a number nor u<uid>) |
| 301 | match 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 |
| 404 | not found | The match / team / competition does not exist, or is outside what this key can see (external keys see only matches inside the open coverage) |
| 429 | rate limit exceeded / daily quota exceeded | The key's per-minute rate or daily quota is exceeded |
| 429 | server busy, retry later | The server's concurrency slots are full (only 2 heavy requests at a time); retry after Retry-After seconds |
| 500 | query error | The query failed on the server; you may retry |