# Conditional arbitrage and cross-book value references

Analyze recent stored DraftKings and FanDuel prices with explicit event evidence, freshness filters, rounded stake allocation and conditional settlement assumptions.

Canonical page: https://getoddsapi.com/docs/opportunity-feeds

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

Analyze recent stored DraftKings and FanDuel prices with explicit event evidence, freshness filters, rounded stake allocation and conditional settlement assumptions.

## Two authenticated read feeds

GET /api/v1/arbitrage-bets returns positive two-outcome price combinations under an explicit completed-normal-game assumption. GET /api/v1/value-bets compares an offered price with the other book’s normalized two-outcome implied probability. The latter is a cross-book reference, not an estimate of true win probability or guaranteed expected value.

One bearer key must have both draftkings and fanduel source grants, and both bookmakers must be selected on the customer account. Admission checks both under the customer lock before either store is read. Successful pages cost one shared credit; denied requests and source errors do not become empty successful pages.

```bash
curl --fail-with-body "https://getoddsapi.com/api/v1/arbitrage-bets?league=NFL&event_match=bounded_time&max_age_seconds=600&max_skew_seconds=120&bankroll=100" -H "Authorization: Bearer $GETODDS_API_KEY"

curl --fail-with-body "https://getoddsapi.com/api/v1/value-bets?league=NFL&event_match=bounded_time&bookmaker=draftkings" -H "Authorization: Bearer $GETODDS_API_KEY"
```

## Understand exactly what is conditional

Every response includes the versioned policy completed-normal-game-v1. It assumes both normal full-game contracts settle on the same completed game including overtime, with no cancellation, abandonment, postponement, venue change, void, dead heat or discretionary exception. It also assumes both displayed prices can be accepted together at the hypothetical stakes. These assumptions are not verified execution or settlement equivalence.

FanDuel prices originate from its New Jersey feed. DraftKings prices are ESPN provider-100 observations, with no verified sportsbook jurisdiction. Primary normal-game rules support the overtime interpretation for the selected basketball and football contracts, but source exception rules differ. market_contract_comparability=false, official_settlement_verified=false and guaranteed_profit=false remain explicit. Fees, taxes, account limits and available stakes are not included; maximum_stake is null.

## Conservative events and market contracts

Supported leagues are NBA, NCAAB, NFL and NCAAF. Basketball moneylines require exactly two outcomes. Spread and total analysis requires matching half-point lines; integer lines, pushes, football moneylines, draws, alternate markets, quarters, halves, player props and regulation-only contracts are excluded.

FanDuel requires exact native MONEY_LINE, MATCH_HANDICAP_(2-WAY) or TOTAL_POINTS_(OVER/UNDER) types, open markets and active selections. The stored period field alone is insufficient: some upstream second-half types have been normalized as game. DraftKings requires an explicit pre-game state and quote observations from the same atomic state batch. Retained historical line variants are excluded. Both scheduled starts must remain more than two minutes ahead.

The default event_match=exact requires unique full home and away team names, sport, league and identical scheduled UTC start. Explicit event_match=bounded_time allows at most 120 seconds of start difference, reports the signed difference and labels the association as noncanonical. Full-name normalization uses NFC, lowercase and whitespace only. Both source universes must agree uniquely before price filtering or pagination; incomplete or conflicting metadata prevents a match. Existing exact /mappings behavior is unchanged.

## Freshness, filters and honest empty results

hours accepts 1–72, default 48. Metadata must have been observed within 15 minutes. max_age_seconds accepts 30–600, default 600; max_skew_seconds accepts 0–600, default 120. These are collector observation clocks, not upstream price-change timestamps. The response exposes both quote ages and the gap between source observations. Collector cadence can leave no qualifying pair under a tighter threshold.

Optional league and market filter outputs; market accepts moneyline, spread or total. min_edge_percent accepts 0–100 with at most four decimal places. Unknown or repeated parameters return 400. limit accepts 1–100, default 50, and offset accepts 0–10000. Results sort by descending conditional margin or reference edge, then stable ID. Pages are not frozen snapshots.

The response reports matched, unmatched and ambiguous event counts, eligible price pairs, skew exclusions and positive-result counts. Empty data means no qualifying positive result in that bounded observed sample under those filters. It does not prove universal absence of opportunities. Source failures return 503; clipped candidate universes return 422. Candidate reads are bounded to 2,000 events per source and 10,000 native markets.

## Allocation and reference calculations

Arbitrage compares both cross-book outcome combinations using exact rational American-odds conversions. A positive reciprocal-price edge must remain positive after allocating the hypothetical bankroll to whole cents and rounding each possible payout down to cents. The result reports both stakes, both payouts and minimum profit in cents. bankroll is USD, defaults to 100 and accepts 1–1,000,000 with at most two decimal places. all_combinations defaults to false and selects the best valid combination per event and contract; true returns both if positive.

Value-reference analysis uses bookmaker=draftkings by default, or fanduel, with the other source as reference. For each complete reference book, probability = (1 / side decimal) / sum(1 / each decimal). Reference edge = offered decimal × reference probability − 1. The reference book must have 0–50% overround; underround and incomplete books are excluded. A positive reference edge is disagreement between observed books, not calibrated win probability.

American prices must be valid integers and consistent with stored decimal prices. The service derives full-precision decimal values from those actual American prices; it never fabricates a quote, probability model, executable stake limit, source update clock or positive result.

## Questions

### Is this guaranteed executable arbitrage?

No. It is conditional analysis of recent stored prices. Availability, simultaneous execution, fees, limits and settlement exceptions are not verified.

### Why can the exact query return nothing while bounded_time returns matches?

Some observed providers schedule the same full-name fixture a minute apart. Only the explicit bounded_time option permits up to 120 seconds, while preserving bidirectional uniqueness and exposing the discrepancy.

### Does value-bets predict the true chance of winning?

No. It returns a labeled no-vig reference from the other book, with no true-probability or guaranteed expected-value claim.

## Sources

- [FanDuel NJ rules, October 2026](https://policies.fanduel.com/SB/NJ/2026-10-15T12-42-58.html)
- [Massachusetts regulator-hosted DraftKings rules, August 2025](https://massgaming.com/wp-content/uploads/DraftKings-House-Rules-8.18.25.pdf)
- [Exact event mappings](https://getoddsapi.com/docs/event-mappings)
- [Gateway OpenAPI](https://getoddsapi.com/openapi.json)

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.
