How SockOdds Handles Postponed, Delayed and Cancelled Events
Event status values, moved start times and old prices, so your reconciliation code has nothing to guess.
Fixtures move. Rain delays a game, a match is postponed a week, a fixture is called off. This post explains what SockOdds API v1 does in each case, so the code that keeps your own records in step has nothing to guess.
The status field
Every event carries a status and a scheduled_start. The contract defines five status values:
| Status | Meaning |
|---|---|
scheduled | The game has not started. |
live | The game is under way. |
final | The game is over and SockOdds has published its result. |
postponed | The game will not be played at its scheduled time. |
cancelled | The game will not be played. |
Read it from any event, for example GET /v1/events/{event_id}:
curl -sS "https://api.sockodds.com/v1/events/ev_000ckk0zrx33" \
-H "Authorization: Bearer $SOCKODDS_API_KEY"const response = await fetch("https://api.sockodds.com/v1/events/ev_000ckk0zrx33", {
headers: { Authorization: `Bearer ${process.env.SOCKODDS_API_KEY}` },
});
console.log(JSON.stringify(await response.json(), null, 2));import json, os, urllib.request
request = urllib.request.Request(
"https://api.sockodds.com/v1/events/ev_000ckk0zrx33",
headers={"Authorization": "Bearer " + os.environ["SOCKODDS_API_KEY"]},
)
with urllib.request.urlopen(request) as response:
print(json.dumps(json.load(response), indent=2))Response from a local copy of the API with invented test prices
{
"data": {
"id": "ev_000ckk0zrx33",
"name": "Australia v New Zealand",
"league": {
"key": "rlwc",
"name": "Rugby League World Cup"
},
"scheduled_start": "2026-10-15T09:05:00.000Z",
"status": "scheduled",
"participants": [
{
"role": "away",
"identity": {
"key": "new_zealand_rugby_league",
"name": "New Zealand"
}
},
{
"role": "home",
"identity": {
"key": "australia_rugby_league",
"name": "Australia"
}
}
]
},
"meta": {
"count": 1,
"cursor": null
},
"links": {
"next": null
}
}A game moves: the id stays
When the official fixture source moves a game, SockOdds moves scheduled_start on the same event. The event id, its participants and its official references do not change, and bookmaker prices keep attaching to the same event. Key your own records on the ev_ id and re-read scheduled_start rather than storing it once.
A cancelled event drops out of GET /v1/events lists, but you can still read it by id to see its status.
Find a game from an official id
If your own data uses an official match id, GET /v1/events/lookup turns it into the SockOdds event. Send refs to check up to 100 ids in one request; ids that match nothing are left out of the answer. If two event records are ever merged into one, the lookup returns the event that survived, so an official id stays a safe way back to the right event.
curl -sS "https://api.sockodds.com/v1/events/lookup?source=nrl&refs=20261310110" \
-H "Authorization: Bearer $SOCKODDS_API_KEY"const response = await fetch("https://api.sockodds.com/v1/events/lookup?source=nrl&refs=20261310110", {
headers: { Authorization: `Bearer ${process.env.SOCKODDS_API_KEY}` },
});
console.log(JSON.stringify(await response.json(), null, 2));import json, os, urllib.request
request = urllib.request.Request(
"https://api.sockodds.com/v1/events/lookup?source=nrl&refs=20261310110",
headers={"Authorization": "Bearer " + os.environ["SOCKODDS_API_KEY"]},
)
with urllib.request.urlopen(request) as response:
print(json.dumps(json.load(response), indent=2))Response from a local copy of the API with invented test prices
{
"data": [
{
"source": "nrl",
"ref": "20261310110",
"event": {
"id": "ev_000ckk0zrx33",
"name": "Australia v New Zealand",
"league": {
"key": "rlwc",
"name": "Rugby League World Cup"
},
"scheduled_start": "2026-10-15T09:05:00.000Z",
"status": "scheduled",
"participants": [
{
"role": "away",
"identity": {
"key": "new_zealand_rugby_league",
"name": "New Zealand"
}
},
{
"role": "home",
"identity": {
"key": "australia_rugby_league",
"name": "Australia"
}
}
]
}
}
],
"meta": {
"count": 1,
"cursor": null
},
"links": {
"next": null
}
}Lookups accept official sources only (espn, afl, nrl), never a bookmaker's own listing id. See identifiers.
Old prices are left out
A price is only current while it is fresh. Each quote carries observed_at, and a quote older than 10 minutes is withheld from current odds responses. When a game is delayed or called off and bookmakers stop updating it, its prices fall out of the response instead of being served as if they were new. An empty market is not a price of zero and not a sign the game is off: check status.
Results only from official sources
A game becomes final when SockOdds publishes its result, and results come only from official result sources, never from a bookmaker. An outcome that official evidence cannot settle is left out, not guessed, so a postponed or abandoned game simply has no verdicts until there is something official to grade. See results.
Reconciling, in short
- Key your records on the event id, never on teams and a date.
- Re-read
scheduled_startandstatusbefore you act on a game. - Expect no result for a
cancelledgame. - Grade bets only from
GET /v1/results, never from a price disappearing.