Skip to Content
API ReferenceOdds Delta

Odds Delta

Get only the odds that have changed since a given timestamp. This endpoint returns the same odds format as /odds but filtered to items updated after your since value, making it ideal for polling clients that want incremental updates without re-fetching the full snapshot.

GET /api/v1/odds/delta

Authentication

Requires API key. Available to all tiers.

Use the server_time from each response as the since value for your next request. This ensures you never miss updates and never receive duplicates.

Query Parameters

ParameterTypeDefaultDescription
sincestringrequiredISO 8601 timestamp. Only return odds updated after this time (e.g., 2026-02-11T12:00:00Z)
sportsbookstringallComma-separated sportsbook IDs (e.g., draftkings,fanduel)
sportstringallFilter by sport (e.g., basketball, football)
leaguestringallFilter by league (e.g., nba, nfl)
marketstringallFilter by market type (e.g., moneyline, spread, total). Supports category aliases — see Odds: Market Category Aliases.
eventstring-Filter by event ID
livebooleanfalseReturn only live/in-play events
sortstring-Sort field with optional - prefix for descending (e.g., -odds_american, odds_probability)
fieldsstringallComma-separated field names to include (e.g., id,sportsbook,odds_american)
min_oddsnumber-Minimum American odds filter (e.g., -110)
max_oddsnumber-Maximum American odds filter (e.g., +200)
statestringUS state code for sportsbook deep links (e.g., nj, ny, il). When set, deep_link URLs include ?state=XX so the redirect targets the correct state-specific sportsbook domain.
limitinteger50Max results per page (max 500)
offsetinteger0Pagination offset. Must be ≤ 500. For older changes, advance since to the previous response’s server_time rather than using offset.

The since parameter is required. Omitting it returns a 400 validation_error error.

since has a 10-minute retention window for removals. Odds removals older than 10 minutes are pruned from memory. If you send a since older than that, the data array still honors your timestamp, but the removed list can only contain odds removed within the last 10 minutes — and since_clamped: true will be set on the response. Advance since at the cadence in the Polling Pattern section below to avoid this.

Example Requests

# Get all odds changes in the last 30 seconds curl -X GET "https://api.sharpapi.io/api/v1/odds/delta?since=2026-02-11T12:00:00Z&league=nba" \ -H "X-API-Key: YOUR_API_KEY"

Response

Success (200)

{ "success": true, "data": [ { "id": "draftkings_33483153_moneyline_PHO", "sportsbook": "draftkings", "event_id": "33483153", "sport": "basketball", "league": "nba", "home_team": "PHI 76ers", "away_team": "PHO Suns", "market_type": "moneyline", "selection": "PHO Suns", "selection_type": "away", "odds_american": -150, "odds_decimal": 1.667, "odds_probability": 0.60, "line": null, "event_start_time": "2026-02-11T19:00:00Z", "last_seen_at": "2026-02-11T12:00:15.125Z", "is_live": false, "status": "upcoming" } ], "meta": { "count": 1, "total": 1, "server_time": "2026-02-11T12:00:20.000Z", "books_changed": ["draftkings"], "pagination": { "limit": 50, "offset": 0, "has_more": false, "next_offset": null }, "filters": { "since": "2026-02-11T12:00:00Z", "league": "nba" } } }

Response Headers

X-RateLimit-Limit: 300 X-RateLimit-Remaining: 299 X-RateLimit-Reset: 1737853200 X-Data-Delay: 0 X-Request-Id: req_delta_abc123

Error Responses

400 Missing since parameter

{ "error": { "code": "validation_error", "message": "The 'since' parameter is required for the delta endpoint", "docs": "https://docs.sharpapi.io/en/api-reference/odds-delta" } }

400 Offset too large

{ "error": { "code": "offset_too_large", "message": "offset must be <= 500; advance `since` to the previous response's `updated_at` to retrieve older changes", "max_offset": 500 } }

401 Unauthorized

{ "error": { "code": "unauthorized", "message": "Invalid or missing API key", "docs": "https://docs.sharpapi.io/en/authentication" } }

Delta Response Schema

The data array contains the same odds objects as the /odds endpoint. Only odds updated after the since timestamp are included.

The meta object includes two additional fields:

FieldTypeDescription
meta.server_timestringISO 8601 server timestamp. Use as the since value for your next request
meta.books_changedarrayList of sportsbook IDs that had updates in this delta

Truncation and Clamping Flags

Two optional top-level boolean flags appear only when the server had to apply a safety limit to the response. Well-behaved clients polling at the recommended cadence never see them.

FieldTypeDescription
removed_truncatedbooleanPresent and true when the removed array hit the 1000-entry server cap. There are more removed odds the server didn’t include. Usually means your since is too old or your filters are too broad — narrow the window or filter set and re-poll.
since_clampedbooleanPresent and true when since was older than the server’s 10-minute removal retention. The data array still honors your original since, but removed is restricted to the last 10 minutes of removals. Advance since to meta.server_time each call to avoid this.

Polling Pattern

The recommended polling pattern uses server_time to chain requests:

  1. Make an initial request with since set to a recent timestamp
  2. Read meta.server_time from the response
  3. Use that server_time as the since value in your next request
  4. Repeat on your desired interval (e.g., every 5 seconds)

This ensures:

  • No gaps - server_time is the server’s clock, so you won’t miss updates due to clock drift
  • No duplicates - each delta window is non-overlapping
  • Minimal payload - only changed odds are returned

If no odds have changed since your since timestamp, the response will have an empty data array and count: 0. This is normal and expected during quiet periods.

Last updated on