Guides · 7 September 2026 · updated 13 October 2026

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:

StatusMeaning
scheduledThe game has not started.
liveThe game is under way.
finalThe game is over and SockOdds has published its result.
postponedThe game will not be played at its scheduled time.
cancelledThe 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_start and status before you act on a game.
  • Expect no result for a cancelled game.
  • Grade bets only from GET /v1/results, never from a price disappearing.

Search across the SockOdds documentation and catalogue.