Skip to Content
GrundkonzepteMarkt-Lebenszyklus

Markt-Lebenszyklus: Aussetzungen und Entfernungen

Märkte verschwinden ständig vom Board — ein Buchmacher setzt nach einem Tor aus, zieht eine Handicap- oder Total-Linie zurück, wenn sich die Hauptlinie bewegt, oder rechnet das Event ab. SharpAPI signalisiert jeden dieser Übergänge explizit auf jeder Konsumoberfläche. Sie müssen nie daraus schließen, dass ein Markt geschlossen wurde, indem Sie warten, bis sein Preis veraltet aussieht.

Diese Seite ist die Übersicht: welches Signal wann ausgelöst wird, auf welcher Oberfläche, und wie Sie Ihren lokalen Zustand sauber halten.

Die zwei Arten, wie ein Markt das Board verlässtPermalink for this section

Sportwettenanbieter nehmen Märkte auf zwei unterschiedliche Arten vom Board, und SharpAPI spiegelt beide originalgetreu wider:

ModusWas der Buchmacher tutWas SharpAPI sendet
EntfernungDer Buchmacher nimmt den Markt vollständig herunter (dominanter Modus — z. B. Pinnacle zieht eine Handicap-/Total-Sprosse zurück, DK/FD setzen während eines Punktezugs aus, ein Event wird abgerechnet)Die id der Zeile erscheint in removed[] bei /odds/delta und in einem odds:removed-Event auf dem SSE-Stream und WebSocket. Die Zeile fehlt im nächsten /odds-Snapshot.
Aussetzung an Ort und StelleDer Buchmacher lässt den Markt gelistet, markiert ihn aber als geschlossen — der Preis ist eingefroren und nicht wettbarDie Zeile bleibt vorhanden mit is_active: false. Der Übergang wird als odds:update mit is_active: false gepusht, plus ein dediziertes odds:locked-Event auf dem Stream.

SharpAPI erfindet nie eine Zeile, die ein Buchmacher nicht veröffentlicht hat. Ein entfernter Markt wird durch ein explizites Entfernungs-Event mit seiner id signalisiert — nicht durch eine synthetische “geschlossen”-Preiszeile. Quoten-ids sind deterministisch — ein stabiler Hash aus Buchmacher, Event, Markt, Linie und Auswahl — sodass ein zurückkehrender Markt unter der gleichen id wieder eintrifft, und Löschen-bei-Entfernung plus Upsert-bei-Update hält Ihren Zustand exakt synchron mit dem Board.

Signal-Matrix nach OberflächePermalink for this section

OberflächeEntfernungssignalAussetzungssignal
GET /odds (Snapshot-Polling)Zeile fehlt in der nächsten Antwortis_active: false auf der Zeile
GET /odds/deltaremoved[]{id, sportsbook, removed_at}-Objekteis_active: false auf Zeilen in data[]
SSE /streamodds:removed{ids: [...], count, book}odds:update mit is_active: false, plus odds:locked
WebSocketodds:removed-Eventodds:update mit is_active: false, plus odds:locked

Wenn Sie nur /odds pollen, wird die Entfernung durch Abwesenheit kommuniziert: Vergleichen Sie jeden Snapshot mit dem vorherigen und entfernen Sie Zeilen, deren ids nicht mehr erscheinen. Das funktioniert, aber Sie müssen den Diff selbst berechnen — für explizite Entfernungsmeldungen nutzen Sie /odds/delta (dessen removed[]-Array jede seit Ihrem letzten Poll entfernte id benennt) oder den Stream (Push, gar kein Polling).

Der Delta-Endpunkt hält Entfernungen 10 Minuten vor. Pollen Sie in der empfohlenen Kadenz (verketten Sie since aus meta.server_time), und Sie verpassen keine einzige; siehe Quoten-Delta zu den Sicherheits-Flags removed_truncated und since_clamped.

Threshold-Leitern: Handicaps und TotalsPermalink for this section

Handicap- (Spread-) und Total-Märkte sind Leitern — eine Menge von Sprossen auf verschiedenen Linien (-2.5, -3, -3.5, …; O/U 2.25, 2.5, 2.75, …). Wenn sich die Hauptlinie bewegt, ziehen Buchmacher — insbesondere Pinnacle — Sprossen an den alten Schwellenwerten zurück und veröffentlichen neue. Jede Sprosse ist eine eigene Quotenzeile mit eigener id, daher:

  • Eine zurückgezogene Sprosse (der verschwindende Threshold-Markt) löst odds:removed aus / erscheint in removed[], genau wie jede andere Entfernung.
  • Die neue Sprosse trifft als frische Zeile via odds:update ein (oder im nächsten Snapshot/Delta), mit den Flags is_main_line / is_alternate_line, die Ihnen sagen, wo sie in der Leiter sitzt.
  • Eine zurückkehrende Sprosse (häufig im Live-Spiel — Buchmacher zentrieren Leitern ständig neu) trifft unter der gleichen deterministischen id wieder ein.

Die Leiterrotation ist während des Live-Spiels intensiv: alternative Sprossen kommen und gehen viele Male pro Spiel. Behandeln Sie eine Entfernung als “gerade jetzt nicht auf dem Board”, nicht als endgültige Schließung — nur die Event-Abrechnung ist final.

total 2.5 (id …_total_over_2.5) ── Linie bewegt sich auf 3 ──▶ odds:removed [..._total_over_2.5] odds:update [..._total_over_3] (neue Sprosse)

Empfohlenes Client-MusterPermalink for this section

Indizieren Sie Ihren lokalen Zustand nach Quoten-id und wenden Sie drei Regeln in Event-Reihenfolge an:

  1. odds:update (oder eine Zeile in data[]) → Zeile upserten.
  2. odds:removed (oder eine id in removed[]) → Zeile löschen.
  3. is_active: false → Zeile behalten, aber als nicht wettbar markieren (ausgrauen); eine Wiedereröffnung trifft als normales odds:update mit is_active: true und einem frischen Preis ein.
# Delta-polling loop: explicit removals, no client-side diffing since = initial_timestamp while True: r = get(f"/api/v1/odds/delta?since={since}&sportsbook=pinnacle").json() for row in r["data"]: local_state[row["id"]] = row # upsert (covers is_active flips) for gone in r.get("removed", []): local_state.pop(gone["id"], None) # delete — the close signal since = r["meta"]["server_time"] sleep(5)
// SSE: push-based, the same three rules es.addEventListener('odds:update', (e) => { for (const row of JSON.parse(e.data).odds) localState.set(row.id, row); }); es.addEventListener('odds:removed', (e) => { for (const id of JSON.parse(e.data).ids) localState.delete(id); });

Eingefrorene Preise und Schutz vor veralteten PreisenPermalink for this section

Zwei Flags auf Zeilenebene schützen Sie davor, auf einen Preis zu reagieren, den der Buchmacher nicht mehr anbietet:

FeldBedeutung
is_activefalse = der Markt ist ausgesetzt/geschlossen, der Preis ist auf seinem letzten Wert eingefroren. Ausgrauen; nicht wetten, nicht in EV-Berechnungen einspeisen. Fehlend bedeutet true.
is_stale_pregame_pricetrue auf einer Live-Zeile, die noch einen Pre-Game-Preis trägt, der sich seit Anpfiff nicht bewegt hat — filtern Sie mit ?is_stale_pregame_price=false, wenn Sie nur in-play neu bepreiste Quoten wollen.

SharpAPIs eigene EV- und Arbitrage-Engines schließen is_active: false-Legs aus, sodass die Opportunity-Endpunkte nie eine Edge gegen einen eingefrorenen, nicht wettbaren Preis ausweisen.

Pinnacle entfernt ausgesetzte Märkte überwiegend (→ odds:removed) und markiert eine kleinere Teilmenge als an Ort und Stelle geschlossen (→ is_active: false / odds:locked). US-Retail-Buchmacher wie DraftKings und FanDuel ziehen Märkte während Punktezügen vollständig zurück — Sie sehen Entfernungen, keine is_active-Wechsel. Behandeln Sie beide Modi, und Sie sind für jeden Buchmacher abgedeckt.

Verwandte ThemenPermalink for this section

  • Quoten-Deltaremoved[]-Referenz, Aufbewahrungsfenster, Polling-Muster
  • SSE-Streamodds:removed, odds:locked, is_active auf odds:update
  • WebSocket — dieselben Events über WS
  • Live vs. Pre-Match — Aussetzungsverhalten der Buchmacher im Live-Spiel
Last updated on