# Durable price evidence and capture coverage

Retain observed DraftKings changes and sampled FanDuel game/futures markets beyond the upstream store window, with explicit import clocks, gaps and storage limits.

Canonical page: https://getoddsapi.com/docs/history-archive

## 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/history-archive
Reviewed: 2026-11-07 UTC

Retain observed DraftKings changes and sampled FanDuel game/futures markets beyond the upstream store window, with explicit import clocks, gaps and storage limits.

## Read only evidence that was actually captured

GET /api/v1/history/archive requires source=draftkings or fanduel, one native event_id, UTC from/to boundaries of at most 31 days, and a matching source grant plus selected bookmaker. limit is 1–200 and after is a decimal-string archive record ID. Successful pages cost one credit.

Each record preserves observed_at from its source and a separate recorded_at archive receipt. DraftKings records are retained changes copied from the existing source history. FanDuel records are normalized snapshots of currently retained game/futures markets. Intermediate FanDuel changes and source removals cannot be reconstructed from scheduled current snapshots. Separately imported, verified native history backups can supply actual retained change evidence. Recovery rows preserve source history IDs; FanDuel selection_state is null when its full base is missing, and selection_changes retains the raw source delta.

```bash
curl --fail-with-body "https://getoddsapi.com/api/v1/history/archive?source=draftkings&event_id=espn-draftkings:espn:NBA:123&from=2026-11-01T00:00:00Z&to=2026-11-07T00:00:00Z&limit=20" -H "Authorization: Bearer $GETODDS_API_KEY"
```

## Inspect activation and missing capture intervals

GET /api/v1/history/coverage?source=draftkings reports whether capture has ever run, whether its scheduled secret is configured, retained source-clock bounds, recent run receipts and expected executions that are missing or overdue beyond a sixty-second scheduler grace. A configured secret is not proof that a scheduler is running: use last_success_at and the receipts.

The latest 100 scheduled receipts are bounded. Up to 20 separate recovery_imports report verified artifact progress; a complete artifact import does not imply complete source history. Native IDs deduplicate overlapping backups and existing DraftKings replay; private backup locations are not exposed. An incomplete sweep is partial; a failed import keeps its last committed page checkpoint and reports the failure. An expired DraftKings replay anchor triggers an explicit resync warning and imports only the history still retained by the source. Numeric source-sequence gaps never by themselves establish data loss.

## Understand retention and operational limits

The archive is GetOdds-owned and append-only. It does not modify the source collectors or their retention. Default per-source evidence budget is 256 MiB, configurable by the operator; it counts serialized JSON evidence plus 512 bytes per row, not all physical PostgreSQL storage. At the budget boundary capture pauses without deleting old evidence or advancing the failed page checkpoint. Coverage exposes the storage state and failure.

Scheduled collection runs bounded batches every five minutes when activated; this is not per-market cadence. At 11,251 FanDuel game markets and at most 500 records per run, a sweep takes at least 115 minutes plus futures, longer when pages require smaller batches. Each source has an exclusive expiring capture lease, atomic page writes and checkpoint updates, and idempotent source-record deduplication. Independent backfill imports only retained source evidence with original observation times.

capture_complete=false and history_complete=false remain explicit even after a successful sweep. Before activation, during source outages, between sampling intervals, and before the oldest available source history, absent observations stay unknown. This is not a complete bookmaker archive or an official closing/settlement record.

## Questions

### Does importing old rows create missing historical prices?

No. Backfill copies only source evidence that still exists and preserves its actual capture clock. Missing observations are never generated.

### Why are observation and import clocks different?

observed_at comes from the source capture. recorded_at is when GetOdds imported the evidence. A recent import does not make an old quote fresh.

### What happens at the storage budget?

Capture records a storage-budget failure and pauses before committing that page. Existing evidence is preserved; the operator must deliberately increase capacity or choose a separate archival policy.

## Sources

- [Retained change replay](https://getoddsapi.com/docs/odds-replay)
- [FanDuel native markets](https://getoddsapi.com/docs/fanduel-markets)
- [Bookmaker source selection](https://getoddsapi.com/docs/bookmaker-selection)

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.
