Skip to Content
API-ReferenzQuoten-Delta

Quoten-Delta

Ruft nur die Quoten ab, die sich seit einem bestimmten Zeitstempel geändert haben. Dieser Endpoint gibt dasselbe Quotenformat wie /odds zurück, jedoch gefiltert auf Einträge, die nach Ihrem since-Wert aktualisiert wurden, was ihn ideal für Polling-Clients macht, die inkrementelle Aktualisierungen ohne erneutes Abrufen des vollständigen Snapshots wünschen.

GET /api/v1/odds/delta

AuthentifizierungPermalink for this section

Erfordert API key. Verfügbar für alle Tarife.

Übernehmen Sie since von der letzten Seite eines Delta-Fensters — der Seite, auf der pagination.has_more false ist. Auf dieser Seite meldet meta.server_time den Wasserstand des Servers; verwenden Sie ihn als since Ihrer nächsten Anfrage. Auf jeder früheren Seite (has_more: true) verharrt meta.server_time bewusst auf dem von Ihnen gesendeten since, damit Sie keine noch nicht abgerufenen Zeilen überspringen können — verstehen Sie ihn dort als „weiterblättern”, nicht als neuen Wasserstand.

Query-ParameterPermalink for this section

ParameterTypStandardBeschreibung
sincestringerforderlichISO 8601-Zeitstempel. Gibt nur Quoten zurück, die nach diesem Zeitpunkt aktualisiert wurden (z. B. 2026-02-11T12:00:00Z)
sportsbookstringalleKommagetrennte Sportsbook-IDs (z. B. draftkings,fanduel)
sportstringalleFilter nach Sportart (z. B. basketball, football)
leaguestringalleFilter nach Liga (z. B. nba, nfl)
marketstringalleFilter nach Markttyp (z. B. moneyline, spread, total). Unterstützt Kategorie-Aliase – siehe Quoten: Markt-Kategorie-Aliase.
event_idstring-Filter nach Event-ID
is_livebooleanfalseGibt nur Live-/In-Play-Events zurück
sortstring-Sortierfeld mit optionalem --Präfix für absteigende Sortierung (z. B. -odds_american, odds_probability)
fieldsstringalleKommagetrennte Feldnamen, die einbezogen werden sollen (z. B. id,sportsbook,odds_american)
min_oddsnumber-Filter für minimale amerikanische Quoten (z. B. -110)
max_oddsnumber-Filter für maximale amerikanische Quoten (z. B. +200)
statestring—US-Bundesstaatencode nur für das Deep-Link-Ziel; filtert keine Quoten und liefert keine bundesstaatsspezifischen Preise. Akzeptiert die 50 US-Bundesstaatencodes sowie dc; nicht unterstützte, nicht leere Codes (einschließlich on) liefern 400 invalid_filter. Wenn gesetzt, enthalten deep_link-URLs ?state=XX; fehlende oder leere Werte erzeugen kein ?state=, und die Weiterleitung wendet dann ihren eigenen Standardwert pa an. Betrifft nur Anbieter mit bundesstaatsabhängigen URLs (BetMGM, Caesars, BetRivers).
limitinteger50Maximale Ergebnisse pro Seite (max. 500)
offsetinteger0Paginierungs-Offset. Muss ≤ 500 sein. Solange has_more true ist, fordern Sie die nächste Seite mit offset = next_offset der Antwort an und lassen since unverändert. Übernehmen Sie since nur von der letzten Seite (has_more: false).

Der since-Parameter ist erforderlich. Wird er weggelassen, wird ein 400 validation_error-Fehler zurückgegeben.

since hat ein 10-minütiges Aufbewahrungsfenster für Entfernungen. Quoten-Entfernungen, die älter als 10 Minuten sind, werden aus dem Speicher entfernt. Wenn Sie einen since-Wert senden, der älter ist, berücksichtigt das data-Array weiterhin Ihren Zeitstempel, aber die removed-Liste kann nur Quoten enthalten, die innerhalb der letzten 10 Minuten entfernt wurden – und since_clamped: true wird in der Antwort gesetzt. Erhöhen Sie since in der im Abschnitt Polling-Muster unten genannten Frequenz, um dies zu vermeiden.

BeispielanfragenPermalink for this section

# Alle Quotenänderungen der letzten 30 Sekunden abrufen 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"

AntwortPermalink for this section

Erfolg (200)Permalink for this section

{ "data": [ { "id": "199954867251468", "sportsbook": "draftkings", "event_id": "nba_celtics_lakers_2026-02-08_b3", "sport": "basketball", "league": "nba", "home_team": "Los Angeles Lakers", "away_team": "Boston Celtics", "market_type": "moneyline", "selection": "Boston Celtics", "selection_type": "away", "odds_american": -150, "odds_decimal": 1.667, "odds_probability": 0.60, "line": null, "event_start_time": "2026-02-08T19:00:00Z", "timestamp": "2026-02-08T12:00:15.125Z", "is_live": false, "is_main_line": true } ], "removed": [ { "id": "102044417046441", "sportsbook": "pinnacle", "removed_at": "2026-02-08T12:00:07Z", "event_start": "2026-02-08T12:00:00Z", "was_live": false, "boundary": true } ], "pagination": { "limit": 50, "offset": 0, "count": 1, "total": 1, "has_more": false, "next_offset": null }, "updated_at": "2026-02-08T12:00:20Z", "meta": { "server_time": "2026-02-08T12:00:20Z" } }

Antwort-HeaderPermalink for this section

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

FehlerantwortenPermalink for this section

400 Fehlender 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 zu groß

{ "error": { "code": "offset_too_large", "message": "offset must be <= 500; page with `next_offset` until `has_more` is false, then advance `since` to the response's top-level `updated_at` (mirrored as `meta.server_time`; a response field, not a row field) — it holds at your current `since` while `has_more` is true; keep paging while `next_offset` is non-null even if `overflow` is true (that only means `total` is capped); when `next_offset` is null while `has_more` or `overflow` is true, re-bootstrap from paged `/odds` (`cursor=`) and resume delta with a fresh `since`", "max_offset": 500 } }

401 Unauthorized

Ohne Schlüssel wird missing_api_key zurückgegeben; ein ungültiger Schlüssel ergibt invalid_api_key.

{ "error": { "code": "missing_api_key", "message": "API key required. Pass via X-API-Key header, api_key query parameter, or Bearer token.", "docs": "https://docs.sharpapi.io/en/authentication" } }

Delta-Antwort-SchemaPermalink for this section

Das data-Array enthält dieselben Quotenobjekte wie der /odds-Endpoint. Es werden nur Quoten einbezogen, die nach dem since-Zeitstempel aktualisiert wurden.

Das removed-ArrayPermalink for this section

Das removed-Array auf oberster Ebene benennt jede Quotenzeile, die seit Ihrem since-Zeitstempel das Board verlassen hat — Märkte, die ein Buchmacher heruntergenommen hat (Aussetzung, ein durch eine Linienbewegung zurückgezogener Handicap-/Total-Schwellenwert, abgerechnetes Event). Löschen Sie diese ids aus Ihrem lokalen Zustand; dies ist das explizite Schlusssignal, Sie müssen also nie selbst Snapshots vergleichen. Nur vorhanden, wenn mindestens eine Entfernung Ihren Filtern entsprach. Siehe Markt-Lebenszyklus für die vollständige Übersicht der Schluss-/Aussetzungssignale.

FeldTypBeschreibung
removed[].idstringDie Quoten-ID, die nicht mehr auf dem Board ist
removed[].sportsbookstringDer Buchmacher, der sie entfernt hat
removed[].removed_atstringISO-8601-Zeitstempel, wann SharpAPI die Entfernung beobachtet hat
removed[].event_startstringOptional. Geplante Startzeit des Events, wie vom Buchmacher zum Zeitpunkt der Entfernung gemeldet. Vorhanden, wenn der Buchmacher eine gültige Startzeit geliefert hat.
removed[].was_livebooleanOptional. Ob der entfernte Markt zum Zeitpunkt der Entfernung ein Live-Markt war. false = Vor-Event/Prematch; true = Live/In-Play.
removed[].boundarybooleanOptional. Vorhanden und true nur wenn was_live false ist und der Buchmacher aktuell Live-Zeilen für dieses Event veröffentlicht. Hilfsmittel zur Filterung, das anzeigt, dass die Entfernung wahrscheinlich mit dem Wechsel des Buchmachers vom Vor-Event- zum Live-Board zusammenfällt — kein Ursachencode und kein deterministischer Übergangsdetektor. Ein Vor-Event-Markt, der Stunden nach dem Live-Übergang entfernt wird, kann ebenfalls boundary: true erhalten (veralteter Prematch-Markt). Fehlt, wenn was_live true ist, das Event noch nicht live ist oder der Buchmacher keine Live-Daten liefert. SSE/WS-Entfernungsereignisse sind unverändert und tragen diese Felder nicht.

Die Delta-Antwort enthält zusätzliche Felder:

FeldTypBeschreibung
meta.server_timestringISO 8601-Wasserstand, gespiegelt als updated_at auf oberster Ebene. Verharrt auf Ihrem gesendeten since, solange has_more true ist; erst auf der letzten Seite (has_more: false) meldet er den Wasserstand des Servers. Übernehmen Sie since nur von der letzten Seite
meta.books_changedarrayListe der Sportsbook-IDs, die in diesem Delta Aktualisierungen aufwiesen
pagination.totalintegerExakte Anzahl der passenden Änderungen auf der letzten Seite. Solange has_more true ist, ist es eine obere Schranke, begrenzt auf 10000 — verwenden Sie es nicht für Fortschritt oder Größenabschätzung, bevor die Traversierung abgeschlossen ist
pagination.next_cursornullAuf /odds/delta immer explizit null — dieser Endpunkt paginiert mit next_offset + since, nie mit Cursorn. Explizit ausgegeben, damit „kein Cursor hier” von einem fehlenden Feld unterscheidbar ist
overflowbooleanOptional. Vorhanden und true, wenn total für diese Seite keine exakte Anzahl ist — der Roh-Kandidaten-Tail überschritt die 10000er-Grenze, oder (Free-Tarif) der begrenzte Scan des Servers stoppte, bevor er das ganze Fenster abgedeckt hat. data-Zeilen sind nicht betroffen: Blättern Sie weiter, solange next_offset nicht null ist; total und overflow korrigieren sich auf der Seite, die das Fenster leert. Setzen Sie neu auf, wenn next_offset null ist, während has_more oder overflow true ist

Truncation- und Clamping-FlagsPermalink for this section

Zwei optionale boolesche Flags auf oberster Ebene erscheinen nur, wenn der Server eine Sicherheitsbegrenzung auf die Antwort anwenden musste. Korrekt arbeitende Clients, die in der empfohlenen Frequenz pollen, sehen diese nie.

FeldTypBeschreibung
removed_truncatedbooleanVorhanden und true, wenn das removed-Array das serverseitige Limit von 1000 Einträgen erreicht hat. Es gibt weitere entfernte Quoten, die der Server nicht einbezogen hat. Bedeutet in der Regel, dass Ihr since-Wert zu alt oder Ihre Filter zu breit angelegt sind – verkleinern Sie das Zeitfenster oder die Filtermenge und führen Sie ein erneutes Polling durch.
since_clampedbooleanVorhanden und true, wenn since älter als das 10-minütige Aufbewahrungsfenster für Entfernungen des Servers war. Das data-Array berücksichtigt weiterhin Ihren ursprünglichen since-Wert, aber removed ist auf die letzten 10 Minuten an Entfernungen beschränkt. Übernehmen Sie since bei jedem Durchlauf vom meta.server_time der letzten Seite, um dies zu vermeiden.

Polling-MusterPermalink for this section

Das empfohlene Polling-Muster arbeitet jedes Fenster vollständig ab und verkettet since dann von der letzten Seite:

  1. Stellen Sie eine erste Anfrage mit since auf einen aktuellen Zeitstempel
  2. Wenden Sie data als Upserts und removed als Löschungen an
  3. Solange pagination.has_more true und pagination.next_offset nicht null ist, fordern Sie die nächste Seite mit offset = next_offset an und lassen since unverändert
  4. Lesen Sie auf der letzten Seite (has_more: false) meta.server_time und verwenden Sie ihn als since Ihrer nächsten Anfrage — außer overflow ist auf dieser Seite noch true (begrenzter Scan des Free-Tarifs): dann setzen Sie stattdessen neu auf (siehe unten)
  5. Wiederholen Sie dies in Ihrem gewünschten Intervall (z. B. alle 5 Sekunden)

Damit wird Folgendes sichergestellt:

  • Keine Lücken – server_time ist die Serveruhr und rückt erst vor, wenn Sie jede Zeile des Fensters erhalten haben; Sie verpassen also weder durch Uhrenabweichungen noch durch einen Teilabruf Aktualisierungen
  • Keine Duplikate – jedes Delta-Fenster überschneidet sich nicht
  • Minimaler Payload – nur geänderte Quoten werden zurückgegeben

since von einer Seite mit has_more: true zu übernehmen kann keine Daten überspringen — meta.server_time entspricht dort Ihrem aktuellen since — aber Ihre Schleife kommt damit nicht voran: die nächste Anfrage liest dasselbe Fenster erneut. Arbeiten Sie das Fenster immer bis zur letzten Seite ab, bevor Sie since übernehmen.

Wenn ein Fenster nicht abgearbeitet werden kannPermalink for this section

offset ist auf 500 begrenzt. Ein Fenster mit mehr passenden Änderungen, als das Offset-Paging erreichen kann, endet daher mit next_offset: null, während has_more noch true ist. Auf dem Free-Tarif kann der begrenzte Scan des Servers außerdem overflow: true auf der letzten Seite selbst stehen lassen (has_more: false) — Zeilen jenseits des Scan-Budgets sind unter keinem Offset erreichbar, und dort since zu übernehmen würde sie überspringen. Beide Zustände sind dasselbe Signal — setzen Sie neu auf, wann immer next_offset null ist, während has_more oder overflow true ist:

  1. Laden Sie eine vollständige Baseline von /odds mit cursor=-Paginierung
  2. Setzen Sie das Delta-Polling mit since auf den updated_at-Wert der ersten Baseline-Seite fort — spätere Seiten werden später gelesen; der Wert der letzten Seite würde Änderungen überspringen, die während des Crawls auf früheren Seiten eintrafen

Beim Polling in der empfohlenen Frequenz mit limit=500 bleiben die Fenster klein genug, dass dieser Pfad selten nötig ist.

Wenn sich seit Ihrem since-Zeitstempel keine Quoten geändert haben, hat die Antwort ein leeres data-Array und count: 0. Dies ist normal und in ruhigen Zeiten zu erwarten.

Verwandte EndpointsPermalink for this section

  • Quoten-Snapshot – Den vollständigen aktuellen Quoten-Snapshot abrufen
  • SSE-Stream – Push-Aktualisierungen in Echtzeit über Server-Sent Events
  • WebSocket-Stream – Push-Aktualisierungen in Echtzeit über WebSocket
Last updated on