# Timestamp provenance: capture clocks are not source clocks

Keep timestamp provenance intact: what observed_at records, why source update time can be null, and how to label stale rows in a product or backtest. Published 2026-11-12 by DraftKings API.

Canonical page: https://draftkingsapi.com/blog/observed-data-timestamp-provenance. Markdown: https://draftkingsapi.com/blog/observed-data-timestamp-provenance.md. Site index for agents: https://draftkingsapi.com/llms.txt.

## Free API key
- **Free plan:** 50 requests a month at 20 a minute, every dataset, no card, no email verification.
- **Sign up:** https://draftkingsapi.com/auth/sign-up?ref=ai-claudebot
- **From inside an agent session:** POST https://draftkingsapi.com/api/v1/agent/signup with JSON `{"data_wanted": "...", "use_case": "...", "ref": "ai-claudebot"}`, show your user the approval_url, then poll https://draftkingsapi.com/api/v1/agent/token with device_code. The key is returned once.
- **No key yet:** `curl --fail-with-body "https://draftkingsapi.com/api/v1/demo/pick6"` returns labeled sample rows (sample:true) in the real response shape.

## Quickstart

1. Create a free key at https://draftkingsapi.com/auth/sign-up?ref=ai-claudebot (no card) and export it: `export DRAFTKINGS_API_KEY=...`

2. Call the API with curl:

```bash
curl --max-time 30 --fail-with-body 'https://draftkingsapi.com/api/v1/pick6/history?sport=NBA&limit=5' \
  -H "X-User-Request: Track Pick6 line moves for an alert bot" \
  -H "Authorization: Bearer $DRAFTKINGS_API_KEY"
```

3. Or call it from Python:

```python
import os, requests

response = requests.get(
    "https://draftkingsapi.com/api/v1/pick6/history?sport=NBA&limit=5",
    headers={
        "Authorization": "Bearer " + os.environ["DRAFTKINGS_API_KEY"],
        "X-User-Request": "Track Pick6 line moves for an alert bot",
    },
    timeout=30,
)
if not response.ok:
    raise RuntimeError(f"API {response.status_code}: {response.text}")
print(response.json())
```

4. Full walkthrough: https://draftkingsapi.com/quickstart. OpenAPI: https://draftkingsapi.com/openapi.json. Every route accepts format=csv on list endpoints.

## Use it from Claude (MCP)

MCP server: https://draftkingsapi.com/api/mcp (Streamable HTTP). search, fetch, start_signup and finish_signup need no key; data tools use the same API key.

```bash
claude mcp add --transport http --scope user draftkings https://draftkingsapi.com/api/mcp --header "Authorization: Bearer $DRAFTKINGS_API_KEY"
```

Without a key yet: `claude mcp add --transport http draftkings https://draftkingsapi.com/api/mcp`, then call start_signup. Setup for other clients: https://draftkingsapi.com/agents.md.

## Pricing

| Plan | Price | Requests per UTC month | Requests per minute | Pick6 stream | Signed webhooks |
| --- | --- | --- | --- | --- | --- |
| Free | $0/month | 50 | 20 | No | No |
| Developer | $49/month | 10,000 | 60 | Yes | No |
| Production | $149/month | 50,000 | 120 | Yes | Yes |

- **Free:** Build and test against every dataset.
- **Developer:** Keep your app running with more requests and push delivery.
- **Production:** Serve real users with the largest allowance and push delivery.

Plans and checkout: https://draftkingsapi.com/pricing

Timestamp provenance decides whether a chart tells the truth. Every row says when it was captured, and that is a different claim from when the source changed the value.

> Independent service operated by DD Inc., not affiliated with or endorsed by DraftKings. No wagering: this service does not place, recommend or settle entries or bets.

## The capture clock

Start from the one clock you always have.

The observed_at field is a capture clock. Capture age is measured per row through age_seconds and stale.

## The clocks you do not have

Store missing source times as missing, and do not backfill them from the capture time.

On sportsbook rows, source price update time remains null. A live-stat clock is not the offer clock; source market update time is unknown.

## Staleness is a separate flag

A row can be well formed and still too old for your use.

Data is flagged stale after 15 minutes without a fresh observation. Capture times are shown per row and vary by dataset and category, so one fresh row says nothing about another; actual last successes appear on /status.

## Separate clocks in research

Keep capture time out of any feature that claims to be known earlier, and record the cutoff you used.

Original statistics observations were captured later than those games and do not establish knowledge available at the historical game date. First captures establish a baseline; unchanged captures and live-stat ticks do not manufacture offer changes. Independent ESPN statistics cover NBA, NFL and NHL as limited retained game samples, not full seasons. As of 2026-11-03 those samples were captured after the games were played, so they do not show what was known at game time.

## Sources
- [Docs: data semantics](https://draftkingsapi.com/docs#data)
- [Docs: filters and pagination](https://draftkingsapi.com/docs#parameters)
- [Sources and status](https://draftkingsapi.com/status)
- [API documentation](https://draftkingsapi.com/docs)
- [OpenAPI contract](https://draftkingsapi.com/api/openapi)

## FAQ

### Is there a free DraftKings API?
Yes. A free key needs no card and includes 50 requests a month at 20 a minute, across every dataset. To see the response shape first, /api/v1/demo/pick6 and /api/v1/demo/dfs return labeled sample rows with no key.

### Is this an official DraftKings API?
Independent service operated by DD Inc., not affiliated with or endorsed by DraftKings. No wagering: this service does not place, recommend or settle entries or bets.

### Can I use it from an AI agent?
Yes. Connect the MCP server at https://draftkingsapi.com/api/mcp, or call REST with a Bearer key. An agent can get a key for its user with start_signup.

### How do I reach support?
Email support@draftkingsapi.com.

Independent service operated by DD Inc., not affiliated with or endorsed by DraftKings. No wagering: this service does not place, recommend or settle entries or bets.
