OddsHub – Anbindung

Technische Dokumentation für angebundene Plattformen · Stand dieser Seite: 2026-08-26

Schnellstart

OddsHub liefert fertig gerechnete Quoten über eine REST-API in einem einheitlichen Format. Alles ist JSON, alle Zeitangaben sind UTC im ISO-Format.

Basis-Adresse: https://staging.atlasoddshub.com

# 1. Erreichbarkeit prüfen (ohne Schlüssel)
curl https://staging.atlasoddshub.com/v1/health

# 2. Welche Sportarten liegen an?
curl -H "Authorization: Bearer IHR_SCHLUESSEL" https://staging.atlasoddshub.com/v1/sports

# 3. Kompletter Feed mit fertigen Quoten
curl -H "Authorization: Bearer IHR_SCHLUESSEL" https://staging.atlasoddshub.com/v1/feed

# 4. Nur Live-Spiele einer Sportart
curl -H "Authorization: Bearer IHR_SCHLUESSEL" "https://staging.atlasoddshub.com/v1/feed?sport=soccer&status=live"
In aller Regel genügt ein einziger Endpunkt: /v1/feed. Er liefert Spiele, Spielstände und alle Quoten in einem Zug – fertig gerechnet und direkt einsetzbar, ohne Nacharbeit auf Ihrer Seite.

Zugang & Schlüssel

Jeder Kunde erhält einen eigenen Schlüssel (Format ohk_…). Er wird genau einmal im Klartext ausgegeben; danach liegt bei uns nur noch ein Hash. Geht er verloren, stellen wir einen neuen aus.

Übergabe

Bevorzugt im Kopf der Anfrage:

Authorization: Bearer ohk_xxxxxxxxxxxxxxxxxxxxxxxx

Alternativ – etwa für schnelle Tests im Browser:

X-API-Key: ohk_xxxxxxxxxxxxxxxxxxxxxxxx
https://staging.atlasoddshub.com/v1/feed?apiKey=ohk_xxxxxxxxxxxxxxxxxxxxxxxx
Den Schlüssel niemals in eine Anwendung geben, die beim Endkunden läuft (Web-Seite, App). Er gehört auf Ihren Server; von dort holen Sie die Daten und geben sie an Ihre Oberfläche weiter. Ein Schlüssel im Browser ist für jeden Besucher lesbar.

Rechte

feedLesender Zugriff auf Quoten und Spiele. Das ist der normale Kundenschlüssel.
adminInterne Verwaltung. Wird an Kunden nicht vergeben.

Mehrere Schlüssel je Kunde sind üblich: einer für die Testumgebung, einer für den Wirkbetrieb. So lässt sich ein einzelner Zugang sperren, ohne den Betrieb zu stören.

Endpunkte

EndpunktZweck
GET /v1/healthErreichbarkeit. Ohne Schlüssel abrufbar, ideal für die Überwachung.
GET /v1/sportsSportarten mit Anzahl der bepreisten Spiele und davon live.
GET /v1/eventsSpielliste ohne Quoten – schlank, für Übersichten und Abgleiche.
GET /v1/events/{id}Ein einzelnes Spiel mit allen Märkten und Quoten.
GET /v1/feedHauptabruf: alle Spiele samt fertigen Quoten. Blättert über offset/limit.
GET /v1/feed/deltaLaufender Betrieb: nur die Änderungen seit Ihrem letzten Stand (?since=).

Parameter von /v1/feed und /v1/events

ParameterBeispielBedeutung
sportsoccerNur eine Sportart. Schlüssel siehe /v1/sports.
statuslivelive oder prematch. Ohne Angabe: beides.
leagueBundesligaNur eine Liga (nur /v1/events).
marketsh2h,totalsNur diese Marktarten ausgeben (nur /v1/feed).
limit200Spiele je Seite. Feed bis 1000, Eventliste bis 500.
offset500Nur /v1/feed: nächste Seite. Weiterblättern, solange hasMore true ist.
since10423Nur /v1/feed/delta: Ihr letzter seq-Stand.
all1Nur /v1/events: auch Spiele ohne aktuelle Quoten anzeigen.

Datenformat

Antwort von GET /v1/feed (gekürzt):

{
  "generatedAt": "2026-08-09T01:42:38.000Z",
  "customer": { "name": "MegaBet Ltd.",
                "settings": { "marginPrematch": 1.07, "marginLive": 1.12, "…": "…" } },
  "count": 42,
  "events": [
    {
      "id": 3312,
      "sport":  { "key": "soccer", "name": "Fußball" },
      "league": "Bundesliga",
      "home":   "Borussia Mönchengladbach",
      "away":   "VfL Wolfsburg",
      "wappenHeim": "borussia-monchengladbach.svg",
      "wappenGast": "vfl-wolfsburg.svg",
      "wappenLiga": "bundesliga-germany.svg",
      "startsAt": "2026-08-09T01:02:43.000Z",
      "status": "live",
      "score":  { "home": 2, "away": 1, "minute": 47, "period": "2H" },
      "halftime": { "home": 1, "away": 1 },
      "cards":  { "yellow": { "home": 2, "away": 3 }, "red": { "home": 0, "away": 1 }, "yellowRed": { "home": 1, "away": 0 } },
      "corners": { "home": 4, "away": 2 },
      "lastUpdate": "2026-08-09 01:42:38",
      "markets": [
        {
          "key": "h2h", "name": "Siegwette", "line": null, "descriptor": null,
          "outcomes": [
            { "name": "1", "odds": 1.42 },
            { "name": "X", "odds": 4.10 },
            { "name": "2", "odds": 7.20 }
          ]
        },
        {
          "key": "totals", "name": "Über/Unter", "line": 2.5, "descriptor": null,
          "outcomes": [
            { "name": "Über",  "odds": 1.75 },
            { "name": "Unter", "odds": 2.05 }
          ]
        }
      ]
    }
  ]
}

Felder eines Spiels

idFeste Kennung bei OddsHub. Bleibt über die gesamte Laufzeit des Spiels gleich – der richtige Schlüssel für Ihre Zuordnung.
statusprematch (noch nicht angepfiffen) · live (läuft) · beendete Spiele erscheinen nicht mehr im Feed.
startsAtAnstoß, UTC (ISO 8601).
scoreNur bei live: Spielstand, Minute und Abschnitt (1H, HT, 2H, ET; bei Satzsportarten S1S5 für den laufenden Satz, live = läuft ohne Abschnittsangabe). Dazu, sofern der Anbieter sie liefert: spielzeit (gespielte Zeit „mm:ss"), uhrSteht (true = Spieluhr angehalten), restzeit und restzeitAbschnitt (Countdown-Sportarten). null heißt „nicht gemeldet".
superturnierÜbergeordneter Wettbewerb der Liga (z. B. der Gesamtwettbewerb über seinen Qualifikationsrunden), sofern gemeldet; sonst null.
halftime, cardsHalbzeitstand und Kartenstand, sofern verfügbar. null heißt „unbekannt", nicht „keine" – auch bei den Einzelwerten im Block. cards.yellowRed (Gelb-Rot) ist nicht in red enthalten; wer Platzverweise anzeigt, rechnet red + yellowRed.
cornersEckenstand, sofern verfügbar; gleiche Regel: null heißt „unbekannt".
wappenHeim, wappenGast, wappenLigaDateiname des Vereins- bzw. Ligawappens (z. B. agf-aarhus.svg) – stabil auch dann, wenn der Feed denselben Verein zeitweise anders schreibt. Die Bilddateien liefert Ihre Plattform selbst aus; der Feed nennt nur den Dateinamen. null heißt: kein eindeutiges Wappen im Bestand – zeigen Sie dann bitte Ihren eigenen Platzhalter (z. B. Initialen), niemals ein geratenes Wappen. Die Felder stehen auch im finished-Block.
lastUpdateLetzte Änderung an diesem Spiel bei OddsHub.

Felder eines Marktes

keyMarktart aus dem Katalog unten – der stabile Schlüssel für Ihre Verarbeitung.
nameDeutscher Anzeigename. Für die Logik bitte immer key verwenden, nicht den Namen.
lineLinie des Marktes, z. B. 2.5 bei Über/Unter oder -1 beim Handicap. null, wenn der Markt keine führt.
descriptorBezugsobjekt, z. B. der Spielername bei Spielerwetten. Sonst null.
outcomes[].nameBezeichnung der Auswahl, z. B. 1/X/2 oder Über/Unter. Der stabile Schlüssel der Auswahl – bitte immer diesen abrechnen, nie den Anzeigetext.
outcomes[].labelAnzeigetext, wenn name für sich nicht lesbar ist – bei den Torschützenmärkten der Spielername. Das Feld fehlt, wo die Auswahl für sich spricht.
outcomes[].oddsDie fertige Quote – inklusive Ihrer im Portal eingestellten Marge.

Wie die Quote entsteht

Sie erhalten je Auswahl eine fertige Quote. Darin steckt bereits alles: unsere Bepreisung und die Marge, die Sie selbst im Kundenportal festlegen – getrennt für Vorab- und Livewetten. Weitere Umrechnungen sind auf Ihrer Seite nicht nötig.

Welche Marge beim jeweiligen Abruf angewendet wurde, steht in jeder Antwort unter customer.settings.

Marktkatalog

Jede Marktart hat einen festen Schlüssel – daran richten Sie Ihre Verarbeitung aus. „Vollständig" heißt: die Auswahlen decken alle Ausgänge überschneidungsfrei ab; nur dort wirkt eine Marge als Overround über den gesamten Markt.

SchlüsselMarktVollständiglinedescriptor
h2hSiegwetteja
totalsÜber/UnterjaTor-/Punktelinie
spreadsHandicapjaHandicap-Wert (Sicht Heim)
bttsBeide Teams treffenja
double_chanceDoppelte Chancenein
correct_scoreGenaues Ergebnisnein
h2h_2wSieger (2-Weg)ja
odd_evenGerade/Ungeradeja
totals_homeÜber/Unter HeimmannschaftjaTor-/Punktelinie
totals_awayÜber/Unter GastmannschaftjaTor-/Punktelinie
totals_pÜber/Unter AbschnittjaTor-/PunktelinieAbschnittsnummer
h2h_restRestspielzeit-SiegerjaSpielstand zum Marktbeginn („Stand 1:0")
btts_h1Beide treffen 1. Halbzeitja
btts_h2Beide treffen 2. Halbzeitja
totals_h2Über/Unter 2. HalbzeitjaTorlinie 2. Halbzeit
totals_home_h1Über/Unter Heimmannschaft 1. HalbzeitjaTor-/Punktelinie
totals_away_h1Über/Unter Gastmannschaft 1. HalbzeitjaTor-/Punktelinie
spreads_h1Handicap 1. HalbzeitjaHandicap-Wert (Sicht Heim)
spreads_h2Handicap 2. HalbzeitjaHandicap-Wert (Sicht Heim)
odd_even_h1Gerade/Ungerade 1. Halbzeitja
odd_even_h2Gerade/Ungerade 2. Halbzeitja
draw_no_bet_h1Unentschieden – Einsatz zurück 1. Halbzeitnein
draw_no_bet_h2Unentschieden – Einsatz zurück 2. Halbzeitnein
correct_score_h2Genaues Ergebnis 2. Halbzeitnein
h2h_pSiegwette AbschnittjaAbschnittsnummer
h2h_2w_pSieger Abschnitt (2-Weg)jaAbschnittsnummer
spreads_pHandicap AbschnittjaHandicap-Wert (Sicht Heim)Abschnittsnummer
odd_even_pGerade/Ungerade AbschnittjaAbschnittsnummer
draw_no_bet_pUnentschieden – Einsatz zurück AbschnittneinAbschnittsnummer
totals_home_pÜber/Unter Heimmannschaft AbschnittjaTor-/PunktelinieAbschnittsnummer
totals_away_pÜber/Unter Gastmannschaft AbschnittjaTor-/PunktelinieAbschnittsnummer
spreads_setsSatz-HandicapjaSatz-Handicap (Sicht Heim)
corners_totalÜber/Unter EckenjaEckenlinie
corners_total_3wEckbälle (Über/Genau/Unter)jaEckenzahl
totals_runsÜber/Unter RunsjaRun-Linie
totals_runs_homeÜber/Unter Runs HeimmannschaftjaRun-Linie
totals_runs_awayÜber/Unter Runs GastmannschaftjaRun-Linie
overtime_yesnoGibt es eine Verlängerung?ja
extra_innings_yesnoGibt es Extra Innings?ja
go_the_distanceGeht der Kampf über die volle Distanz?ja
clean_sheet_homeHeimmannschaft ohne Gegentorja
clean_sheet_awayGastmannschaft ohne Gegentorja
score_both_halves_homeHeimmannschaft trifft in beiden Halbzeitenja
score_both_halves_awayGastmannschaft trifft in beiden Halbzeitenja
cards_totalÜber/Unter KartenjaKartenlinie
cards_h2hMeiste Kartenja
cards_total_h1Über/Unter Karten 1. HalbzeitjaKartenlinie
red_cardRote Karte im Spielja
player_cardSpieler sieht KartejaSpielername
player_propTorschützeneinSpielername
h2h_htSiegwette 1. Halbzeitja
h2h_2hSiegwette 2. Halbzeitja
double_chance_htDoppelte Chance 1. Halbzeitnein
double_chance_2hDoppelte Chance 2. Halbzeitnein
ht_ftHalbzeit/Endstandja
correct_score_htGenaues Ergebnis 1. Halbzeitnein
totals_htÜber/Unter 1. HalbzeitjaTorlinie 1. Halbzeit
spreads_htHandicap 1. HalbzeitjaHandicap-Wert 1. Halbzeit (Sicht Heim)
dnbUnentschieden – Einsatz zurückja
eur_handicapEuropäisches HandicapjaHandicap-Wert (Sicht Heim, ganze Zahl)
naechstes_torNächstes TorjaNummer des Tores
letztes_torLetztes Torja
winning_marginSiegabstandja
satz_siegerSatzsiegerjaSatznummer
gesamt_saetzeAnzahl Sätzeja
spiele_gesamtSpiele/Punkte gesamtjaSpiel-/Punktelinie
spiele_im_satzSpiele/Punkte im SatzjaSpiel-/PunktelinieSatznummer („Satz 2")
spiele_hcpSpiele-/Punkte-HandicapjaHandicap-Wert (Sicht Heim)Satznummer („Satz 2"), leer = ganzes Match
odd_even_spieleSpiele gerade/ungeradeja
naechstes_tor_htNächstes Tor 1. HalbzeitjaNummer des Tores in der 1. Halbzeit
satz_ergebnisSatzergebnisnein
satz_genauGenaues SatzergebnisneinSatznummer („Satz 2")
race_zu_spielenWer erreicht X Spiele zuerstneinZiel-SpielezahlSatznummer („Satz 2")
totals_viertelÜber/Unter VierteljaPunktelinieViertelnummer („Viertel 2")
torschuetze_nN-ter TorschützeneinNummer des Tores (1 = erster Torschütze)
torschuetze_letzterLetzter Torschützenein
torschuetze_beliebigTorschütze irgendwannnein
frame_siegerFrame-SiegerjaFramenummer
race_zu_eckenWer erreicht X Ecken zuerstjaZiel-Eckenzahl
corners_total_3w_htEcken 1. Halbzeit (Über/Genau/Unter)jaEckenzahl 1. Halbzeit
ohne_satzverlustSieg ohne Satzverlustja
ohne_satzverlust_heimHeim gewinnt ohne Satzverlustja
ohne_satzverlust_gastGast gewinnt ohne Satzverlustja
race_zu_punktenWer erreicht X Punkte zuerstneinZiel-PunktezahlSatznummer („Satz 2")
spiele_spielerAnzahl Spiele eines SpielersjaSpielelinie„Heim" oder „Gast"
tiebreaks_gesamtAnzahl Tie BreaksjaTie-Break-Linie
doppel_ergebnis_satzDoppeltes Ergebnis (1. Satz / Match)ja
satzstand_nach_spielenSatzstand nach N SpielenneinSatz und Spielezahl („Satz 2 nach 4 Spielen")
fuehrung_nach_spielenIn Führung nach N SpielenjaSpielezahlSatznummer („Satz 2")
satz_genau_beliebigGenaues Satzergebnis (beliebiger Spieler)neinSatznummer („Satz 2")
satz_genau_gruppeGenaues Satzergebnis (Gruppe)neinSatznummer („Satz 2")
sieg_und_toreSieg & TorejaTorlinie
meiste_180erMeiste 180erja
eur_handicap_htEuropäisches Handicap 1. HalbzeitjaHandicap-Wert (Sicht Heim, ganze Linie)
h2h_rest_htRest der 1. HalbzeitjaSpielstand zum Marktbeginn („Stand 1:0")
tore_genau_heimTore Heimmannschaft (genau)ja
tore_genau_gastTore Gastmannschaft (genau)ja
sieg_und_bttsSieg und beide treffenja
spielentscheidungWomit wird das Spiel entschieden?ja
naechste_rundeWer kommt in die nächste Runde?ja
sieg_in_verlaengerungSieg in der Verlängerung?ja
sieg_nach_elfmeterSieg nach Elfmeterschießen?ja
scores_2h_homeHeimmannschaft trifft in 2. Halbzeitja
scores_2h_awayGastmannschaft trifft in 2. Halbzeitja
satzgewinn_heimHeim gewinnt einen Satzja
satzgewinn_gastGast gewinnt einen Satzja
exakte_toreAnzahl Tore (genau)jaStaffelung („bis 5+")
torbereichTorbereichjaStaffelung („bis 7+")
odd_even_homeTore Heimmannschaft gerade/ungeradeja
odd_even_awayTore Gastmannschaft gerade/ungeradeja
wer_trifftWelche Mannschaft trifftja
odd_even_im_satzPunkte im Satz gerade/ungeradejaSatznummer („Satz 2")
dc_und_toreDoppelte Chance & ToreneinTorlinie
multi_toreMulti-Torenein
ht_ft_und_toreHalbzeit/Endstand & TorejaTorlinie (ganzes Spiel)
ht_ft_und_tore_h1Halbzeit/Endstand & Tore 1. HalbzeitjaTorlinie (1. Halbzeit)
ht_ft_und_tore_genauHalbzeit/Endstand & Toranzahlja
torschuetze_otTorschütze (inkl. Verlängerung)nein
outrightLangzeitwettenein

Live-Daten

Live-Spiele erkennen Sie an status: "live". Sie führen zusätzlich score mit Spielstand, Minute und Spielabschnitt; im Fußball kommen Halbzeitstand und Karten dazu, sofern sie vorliegen.

Nehmen Sie eine Quote nie ungeprüft an, wenn zwischen Abruf und Annahme der Wette Zeit vergeht. Bei Live-Spielen sind wenige Sekunden viel. Üblich ist, unmittelbar vor der Annahme erneut abzugleichen.

Abruftakt

Die Quoten werden alle 60 Sekunden neu berechnet. Ein Abruf häufiger als dieser Takt bringt keine neuen Daten.

Erstbefüllungeinmalig /v1/feed, dabei über offset blättern, bis hasMore false ist
Laufender Betrieballe 1–5 Sekunden /v1/feed/delta?since=<letzte seq>
Sicherheitsnetzalle 5–15 Minuten ein voller Abruf zum Abgleich

Der Delta-Abruf im Detail

Jede Antwort nennt einen Zählerstand seq. Schicken Sie ihn beim nächsten Mal als ?since= mit, und Sie bekommen ausschließlich, was sich seither geändert hat: changes enthält die betroffenen Spiele in genau demselben Format wie /v1/feed, removed die Spiele, die es nicht mehr gibt (Wettstopp, Spielende, Quelle ausgefallen). Ein Spiel aus removed gehört sofort aus dem Angebot.

Steht in der Antwort hasMore: true, war Ihr Rückstand größer als eine Antwort fassen soll: Sie haben ein Stück bekommen, und das mitgelieferte seq reicht nur bis zum Ende dieses Stücks. Holen Sie dann sofort mit genau diesem seq weiter, bis hasMore false ist – erst danach sind Sie auf dem aktuellen Stand. Setzen Sie Ihren Zeiger niemals auf seqEnde (das ist nur die Anzeige, wohin es insgesamt geht) – sonst überspringen Sie den Rest still.

quelleLebendig: false heißt: Wir bekommen gerade keine frischen Daten. Behandeln Sie Live-Quoten dann als veraltet und nehmen Sie keine Live-Wetten mehr an. Antwortet der Dienst mit resync: true, liegt Ihr Stand hinter unserem Änderungsjournal (eine Stunde) – dann einmal voll abrufen und mit dem neuen seq weitermachen.

Eine Quote, die 30 Minuten lang nicht erneuert wurde, verfällt; ein Spiel ohne jede gültige Quote wird nach 45 Minuten aus dem Angebot genommen. Bauen Sie Ihre Seite also so, dass ein verschwundenes Spiel ein normaler Vorgang ist.

Fehler & Grenzen

CodeBedeutungWas zu tun ist
200In Ordnung
401Schlüssel fehlt, ist falsch oder gesperrtSchlüssel prüfen; im Kopf Authorization: Bearer … senden
403Zugang gesperrt oder Recht fehltBei uns melden – meist ist der Kundenzugang stillgelegt
404Spiel nicht gefundenKennung veraltet; das Spiel ist beendet oder wurde entfernt
429Zu viele AnfragenTakt drosseln, kurz warten und erneut versuchen

Jeder Schlüssel hat eine Grenze pro Minute (Standard 120). Die Antwort nennt im Fehlerfall die geltende Grenze. Brauchen Sie mehr, heben wir sie für Ihren Zugang an.

{ "error": "Zu viele Anfragen (Grenze: 120/Minute)" }

Fehler kommen immer als JSON mit einem Feld error.

Kundenportal – Ihren Bezug selbst einstellen

Unter https://staging.atlasoddshub.com/portal melden Sie sich mit Ihrem API-Schlüssel an und bestimmen selbst, was Ihr Feed enthält. Änderungen wirken sofort auf den nächsten Abruf – ohne Rückfrage bei uns.

WettartenVorabwetten und Livewetten einzeln beziehen oder abschalten.
MargeEigener Aufschlag – getrennt für Vorab und Live. 1.07 = 7 % Overround; leer = Quoten unverändert.
MarktartenJede Marktart einzeln an- und abschalten, wieder getrennt für Vorab und Live.
Sportarten & LigenAbgewählte Sportarten und Ligen erscheinen gar nicht erst im Feed.
Einzelne SpieleEinzelne Begegnungen gezielt sperren.
AbrufeEigener Verbrauch der letzten 30 Tage.

Dieselben Einstellungen sind auch über die API erreichbar, wenn Sie sie aus Ihrem eigenen Backoffice heraus steuern wollen:

GET  https://staging.atlasoddshub.com/v1/portal/settings     # aktuelle Einstellungen
PUT  https://staging.atlasoddshub.com/v1/portal/settings     # ändern (nur die gesendeten Felder)
GET  https://staging.atlasoddshub.com/v1/portal/catalog      # wählbare Märkte, Sportarten, Ligen
GET  https://staging.atlasoddshub.com/v1/portal/events       # Spiele mit Schalter-Zustand
GET  https://staging.atlasoddshub.com/v1/portal/usage        # eigene Abrufe

# Beispiel: Live mit 8 % Marge, ohne Torschützen-Wetten
curl -X PUT https://staging.atlasoddshub.com/v1/portal/settings \
  -H "Authorization: Bearer IHR_SCHLUESSEL" -H "Content-Type: application/json" \
  -d '{"marginLive":1.08,"disabledMarketsLive":["player_prop"]}'

Jeder Abruf von /v1/feed gibt unter customer.settings zurück, welche Vorgaben dabei angewendet wurden – so bleibt jede Quote nachvollziehbar.

Weitergabe der Daten

Die an Sie gelieferten Quoten sind für die Weitergabe an Ihre Endkunden freigegeben.

Die bezogenen Quoten dürfen Sie in Ihrem eigenen Angebot verwenden. Ein Weiterverkauf als eigener Datendienst ist nicht Teil des Zugangs – dafür braucht es eine gesonderte Vereinbarung.