# Replay retained odds changes with a sequence checkpoint

Read bounded stored offer-change snapshots in sequence order, resume within the seven-day window and handle expired anchors explicitly.

Canonical page: https://getoddsapi.com/docs/odds-replay

## Free API key

Get a free GetOdds API key: **1,000 requests per UTC day and 60 per minute, no card**. One key covers REST and the hosted MCP server.

Sign up: https://getoddsapi.com/sign-up?ref=ai-claudebot

## Quickstart

1. Create an account at https://getoddsapi.com/sign-up?ref=ai-claudebot, open https://getoddsapi.com/dashboard and issue a key with the sources you need (draftkings, fanduel, betrivers, prizepicks or underdog). Keep it in a server environment variable named GETODDS_API_KEY.
2. Read current DraftKings NBA spreads with curl:

```bash
curl --fail-with-body "https://getoddsapi.com/api/v1/odds?sport=NBA&market=spread&fresh_only=true&limit=50" \
  -H "Authorization: Bearer $GETODDS_API_KEY"
```

3. The same request in Python (standard library only):

```python
import json, os, urllib.request

req = urllib.request.Request(
    "https://getoddsapi.com/api/v1/odds?sport=NBA&market=spread&fresh_only=true&limit=50",
    headers={"Authorization": "Bearer " + os.environ["GETODDS_API_KEY"]},
)
with urllib.request.urlopen(req) as res:
    rows = json.load(res)["data"]
for row in rows:
    print(row["away"], "at", row["home"], row["side"], row["line"], row["american"], row["observed_at"])
```

4. Check `observed_at`, `age_seconds` and `stale` on every row before using a price. Full reference: https://getoddsapi.com/docs

## Use with Claude (MCP)

```bash
claude mcp add --transport http getodds https://getoddsapi.com/api/mcp \
  --header "Authorization: Bearer $GETODDS_API_KEY"
```

The MCP tools follow the key's source grants and share its allowance. Setup guide: https://getoddsapi.com/use-with-claude

## Pricing

| Plan | Allowance | Price |
| --- | --- | --- |
| Free key | 1,000 requests a day, 60 a minute | $0, no card |
| Developer Bundle | 10,000 requests or credits a month on each of four sources | $149 a month |

Free development allowance: 1,000 requests per UTC day and 60 per minute per account, with no payment step. Paid: the Developer Bundle at $149 per month, with 10,000 monthly requests or credits on each of four sources.
Details: https://getoddsapi.com/bundle

## Guide


Canonical: https://getoddsapi.com/docs/odds-replay
Reviewed: 2026-11-07 UTC

Read bounded stored offer-change snapshots in sequence order, resume within the seven-day window and handle expired anchors explicitly.

## Start one bounded replay

GET /api/v1/odds/replay?after=0&limit=50 starts at the first available retained change within the last seven days. Use a bearer API key granted DraftKings, with DraftKings selected in your account bookmaker preferences. Each successful page costs one shared credit and uses the existing request allowance.

The response contains actual stored offer snapshots captured when a price or line changed. It is not a full market snapshot, a complete capture archive or a live WebSocket. Empty data means no matching retained records, not an invented unchanged state.

## Continue through a fixed upper sequence

The first response reports pagination.through: the highest eligible source sequence visible to that SQL statement. Continue using after=next_after and the same through until replay_complete is true. Keep event_ids, sport and market filters unchanged while paging. Each page returns at most 200 records, ascending by seq.

The watermark fixes an upper sequence; it does not freeze a database snapshot across requests. Each request reads bounds, anchor validity and records in one SQL snapshot. Retention and source availability can change between requests.

When replay_complete is true, save next_after and omit through in a later request to capture a new upper watermark. An empty source returns through="0" and next_after="0". Sequence strings can exceed JavaScript’s safe integer range: keep them as strings or use BigInt.

```bash
curl --fail-with-body \
  "https://getoddsapi.com/api/v1/odds/replay?after=0&limit=50" \
  -H "Authorization: Bearer $GETODDS_API_KEY"
```

## Filter without confusing gaps and missing data

Optional event_ids accepts up to 20 distinct IDs. sport accepts NFL, NBA, NHL, NCAAF, NCAAB, MLB, EPL or MLS. market accepts moneyline, spread or total. On a completed filtered page, next_after advances to through even when no rows match; this checkpoints the scanned range.

The history sequence is global. Numbers can be skipped because another source used them or a transaction rolled back. A numeric gap alone is not evidence of a lost change. Deleted or expired anchor records are detectable; arbitrary missing records in the middle of a range are not.

## Handle410 RESYNC_REQUIRED

Every nonzero after or through anchor must still identify a record in the seven-day DraftKings source window. A missing, expired, foreign-source or future anchor returns410 RESYNC_REQUIRED instead of pretending the replay is complete.

Restart with after=0 and review your downstream state. No synthetic catch-up records or silently invented history are supplied. Retained price snapshots also omit market-removal, cancellation and settlement events, so they cannot reconstruct a complete current bookmaker state by themselves.

## Use HTTP while SDK helpers catch up

This route currently has its own documented HTTP contract. Existing advanced SDK and MCP query helpers do not automatically gain replay support. Do not pass replay cursors to the offset-paginated history or changed-since endpoints; their semantics differ.

## Questions

### Does this guarantee every bookmaker change was captured?

No. It replays actual retained observations. Capture completeness is explicitly false.

### Can I resume after seven days?

Only if the anchor remains within the exposed seven-day source window. Otherwise the service returns410 and requires a fresh bootstrap.

### Is this a WebSocket replay service?

No. It is a bounded, authenticated HTTP replay endpoint. Continuous delivery and connection recovery are separate work.

## Sources

- [GetOdds OpenAPI](https://getoddsapi.com/openapi.json)
- [Retained sportsbook history](https://getoddsapi.com/docs/sportsbook)
- [Search and changed-since reads](https://getoddsapi.com/docs/sportsbook-search)

Independent product; not affiliated with the operators named. No picks or predicted profits.

---

GetOdds is an independent developer product and is not affiliated with any sportsbook or pick’em operator. Prices describe data, not betting advice.
