SofaScore API endpoint
Returns one match's betting markets and choices. Returns 404 when SofaScore has no odds for the match.
/sofascore/event-oddsQuery parameters:
id: required. Numeric SofaScore event (match) id.Notable response behavior:
404 when SofaScore has no odds for the match.name (e.g. "Full time", "Both teams to score"), an optional group/period, and choices with a fractional value and whether it winning (settled markets only).| Field | Filled in, of 18 checked | Values in the sample |
|---|---|---|
| name | 18 | “Full time” and 9 other values |
| group | 18 | “1X2” and 8 other values |
| period | 18 | Full-time (17), 1st half (1) |
| choices | 18 | median 2 entries |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| id | string | Yes | Numeric SofaScore event (match) id | 14025013 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/sofascore/event-odds?id=14025013" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"event_id": 14025013,
"count": 1,
"source_url": "https://api.sofascore.com/api/v1/event/14025013/odds/1/all",
"fetched_at": "2026-07-08T16:45:00Z",
"markets": [
{
"name": "Full time",
"group": "1X2",
"period": "Full-time",
"choices": [
{
"name": "1",
"value": "29/100",
"winning": true
},
{
"name": "X",
"value": "13/2"
},
{
"name": "2",
"value": "9/2"
}
]
}
]
}
}Request schema
No body schema
Response schema
#/definitions/sofascore.eventOddsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | sofascore.EventOddsResponse | No | ||||
| data.count | integer | No | Number of markets returned. | |||
| data.event_id | integer | No | SofaScore event id the odds belong to. | |||
| data.fetched_at | string | No | Time the data was fetched, in UTC (RFC 3339). | |||
| data.markets | array | No | Betting markets for the match. | |||
| data.markets[].choices | array | No | Outcomes that can be selected in this market. | |||
| data.markets[].choices[].name | string | No | 1 | Outcome label, for example 1, X or 2. | ||
| data.markets[].choices[].value | string | No | 29/100 | Fractional odds, for example 29/100. | ||
| data.markets[].choices[].winning | boolean | No | True when this outcome won. | |||
| data.markets[].group | string | No | 1X2 | Market group, for example 1X2. | ||
| data.markets[].name | string | No | Full time | Market name, for example "Full time". | ||
| data.markets[].period | string | No | Full-time | Part of the match the market covers, for example "Full-time". | ||
| data.markets[].suspended | boolean | No | True while the market is suspended. | |||
| data.source_url | string | No | SofaScore URL the data was read from. | |||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/sofascore/event-odds?id=14025013" \
-H "x-api-key: $CRAWLORA_API_KEY"