Interwetten Data API

Interwetten API for German Pre-Match, Live & Results Data

Access Interwetten's German sportsbook through one API — the Bundesliga, 2. Liga, 3. Liga and DFB-Pokal alongside the Premier League, LaLiga, Serie A, Ligue 1, the Champions League and the Nations League, the NFL, NBA, BBL and Euroleague, the NHL, DEL and the European ice hockey leagues, handball, tennis and more, across 12 sports. The board comes through in German exactly as interwetten.de prints it, every market carries a canonical type, every selection a decimal price and the printed odds string, and every event a Betradar match ID. REST and WebSocket, one API key.

What an Interwetten API Response Looks Like

GET /api/interwetten-de/soccer/leagues/Deutschland%20Bundesliga/events
{
  "total": 18,
  "events": [
    {
      "eventId": "18873432",
      "away": "Leverkusen",
      "country": "Deutschland",
      "home": "Mainz 05",
      "league": "Deutschland Bundesliga",
      "live": false,
      "markets": [
        {
          "canonicalMarket": "MATCH_RESULT",
          "rawName": "Spiel",
          "period": "FULL_TIME",
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "HOME",
              "rawName": "Mainz 05",
              "odds": 2.9,
              "rawOdds": "2.90",
              "isActive": true,
              "selectionId": "1340800548"
            },
            {
              "canonicalOutcome": "DRAW",
              "rawName": "X",
              "odds": 3.85,
              "rawOdds": "3.85",
              "isActive": true,
              "selectionId": "1340800547"
            },
            {
              "canonicalOutcome": "AWAY",
              "rawName": "Leverkusen",
              "odds": 2.25,
              "rawOdds": "2.25",
              "isActive": true,
              "selectionId": "1340800546"
            }
          ],
          "marketId": "480905340",
          "moreInfo": {
            "groupKey": "U7",
            "betAssistName": "3Way"
          }
        },
        {
          "canonicalMarket": "DOUBLE_CHANCE",
          "rawName": "Doppelte Chance",
          "period": "FULL_TIME",
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "HOME_DRAW",
              "rawName": "1X",
              "odds": 1.65,
              "rawOdds": "1.65",
              "isActive": true,
              "selectionId": "1340800545"
            },
            {
              "canonicalOutcome": "HOME_AWAY",
              "rawName": "12",
              "odds": 1.25,
              "rawOdds": "1.25",
              "isActive": true,
              "selectionId": "1340800544"
            },
            {
              "canonicalOutcome": "DRAW_AWAY",
              "rawName": "X2",
              "odds": 1.4,
              "rawOdds": "1.40",
              "isActive": true,
              "selectionId": "1340800543"
            }
          ],
          "marketId": "480905341",
          "moreInfo": {
            "groupKey": "U55",
            "betAssistName": "doubleChance"
          }
        },
        {
          "canonicalMarket": "OVER_UNDER",
          "rawName": "Wie viele Tore fallen im Spiel",
          "period": "FULL_TIME",
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "OVER",
              "rawName": "Über 2.5",
              "odds": 1.43,
              "rawOdds": "1.43",
              "isActive": true,
              "selectionId": "1340805888",
              "line": 2.5
            },
            {
              "canonicalOutcome": "UNDER",
              "rawName": "Unter 2.5",
              "odds": 2.75,
              "rawOdds": "2.75",
              "isActive": true,
              "selectionId": "1340805887",
              "line": 2.5
            }
          ],
          "marketId": "480906879",
          "line": 2.5,
          "moreInfo": {
            "groupKey": "U8",
            "betAssistName": "totalOverUnder"
          }
        },
        {
          "canonicalMarket": "ASIAN_HANDICAP",
          "rawName": "Asian Handicap",
          "period": "FULL_TIME",
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "HOME",
              "rawName": "Mainz 05 (+0)",
              "odds": 2.15,
              "rawOdds": "2.15",
              "isActive": true,
              "selectionId": "1340805898",
              "line": 0
            },
            {
              "canonicalOutcome": "AWAY",
              "rawName": "Leverkusen (-0)",
              "odds": 1.65,
              "rawOdds": "1.65",
              "isActive": true,
              "selectionId": "1340805897",
              "line": 0
            }
          ],
          "marketId": "480906874",
          "line": 0,
          "moreInfo": {
            "groupKey": "U50"
          }
        },
        {
          "canonicalMarket": "BOTH_TEAMS_TO_SCORE",
          "rawName": "Erzielen beide Teams ein Tor?",
          "period": "FULL_TIME",
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "YES",
              "rawName": "Ja",
              "odds": 1.4,
              "rawOdds": "1.40",
              "isActive": true,
              "selectionId": "1340805866"
            },
            {
              "canonicalOutcome": "NO",
              "rawName": "Nein",
              "odds": 2.8,
              "rawOdds": "2.80",
              "isActive": true,
              "selectionId": "1340805865"
            }
          ],
          "marketId": "480906890",
          "moreInfo": {
            "groupKey": "U109",
            "betAssistName": "bothTeamsToScore"
          }
        },
        {
          "canonicalMarket": "HALF_TIME_FULL_TIME",
          "rawName": "Halbzeit/Endstand",
          "period": "FULL_TIME",
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "OTHER",
              "rawName": "H/H",
              "odds": 4.2,
              "rawOdds": "4.20",
              "isActive": true,
              "selectionId": "1340805786"
            },
            {
              "canonicalOutcome": "OTHER",
              "rawName": "X/H",
              "odds": 7,
              "rawOdds": "7.00",
              "isActive": true,
              "selectionId": "1340805785"
            },
            {
              "canonicalOutcome": "OTHER",
              "rawName": "G/H",
              "odds": 28,
              "rawOdds": "28.00",
              "isActive": true,
              "selectionId": "1340805784"
            }
          ],
          "marketId": "480906899",
          "moreInfo": {
            "groupKey": "U11"
          }
        }
      ],
      "moreInfo": {
        "leagueId": "1019",
        "iwSportId": 10,
        "betradarId": "72513230",
        "feed": "UOF",
        "marketCount": 95
      },
      "slug": "/de/sportwetten/e/18873432/mainz-05-leverkusen",
      "sport": "soccer",
      "startTime": "2026-10-10T13:30:00.000Z"
    }
  ]
}

In-Play — Score, Match Clock, Per-Period Scores & Cards

GET /api/interwetten-de/live-events?sport=soccer&limit=1
{
  "total": 9,
  "page": 1,
  "limit": 1,
  "totalPages": 9,
  "hasNextPage": true,
  "hasPrevPage": false,
  "sport": "soccer",
  "events": [
    {
      "eventId": "18813568",
      "away": "Tokushima Vortis",
      "home": "Albirex Niigata",
      "league": "Japan J-2-League",
      "markets": [
        {
          "canonicalMarket": "MATCH_RESULT",
          "rawName": "Spiel",
          "period": "FULL_TIME",
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "HOME",
              "rawName": "Albirex Niigata",
              "odds": 1.4,
              "rawOdds": "1.40",
              "isActive": true,
              "selectionId": "1349687920"
            },
            {
              "canonicalOutcome": "DRAW",
              "rawName": "X",
              "odds": 3.6,
              "rawOdds": "3.60",
              "isActive": true,
              "selectionId": "1349687919"
            },
            {
              "canonicalOutcome": "AWAY",
              "rawName": "Tokushima Vortis",
              "odds": 10,
              "rawOdds": "10.00",
              "isActive": true,
              "selectionId": "1349687918"
            }
          ],
          "marketId": "484087463",
          "moreInfo": {
            "groupKey": "U7",
            "betAssistName": "3Way"
          }
        },
        {
          "canonicalMarket": "OVER_UNDER",
          "rawName": "Wie viele Tore fallen im Spiel",
          "period": "FULL_TIME",
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "OVER",
              "rawName": "Über 4.5",
              "odds": 2.95,
              "rawOdds": "2.95",
              "isActive": true,
              "selectionId": "1355418310",
              "line": 4.5
            },
            {
              "canonicalOutcome": "UNDER",
              "rawName": "Unter 4.5",
              "odds": 1.35,
              "rawOdds": "1.35",
              "isActive": true,
              "selectionId": "1355418309",
              "line": 4.5
            }
          ],
          "marketId": "486262782",
          "line": 4.5,
          "moreInfo": {
            "groupKey": "U8",
            "betAssistName": "totalOverUnder"
          }
        },
        {
          "canonicalMarket": "ASIAN_HANDICAP",
          "rawName": "Asian Handicap",
          "period": "FULL_TIME",
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "HOME",
              "rawName": "Albirex Niigata (-0.5)",
              "odds": 1.4,
              "rawOdds": "1.40",
              "isActive": true,
              "selectionId": "1349702336",
              "line": -0.5
            },
            {
              "canonicalOutcome": "AWAY",
              "rawName": "Tokushima Vortis (+0.5)",
              "odds": 2.75,
              "rawOdds": "2.75",
              "isActive": true,
              "selectionId": "1349702335",
              "line": 0.5
            }
          ],
          "marketId": "484093249",
          "line": -0.5,
          "moreInfo": {
            "groupKey": "U50"
          }
        }
      ],
      "matchClock": {
        "period": "2. Halbzeit",
        "periodId": "7",
        "minute": 57,
        "running": true
      },
      "moreInfo": {
        "leagueId": "405394",
        "iwSportId": 10,
        "betradarId": "72151198",
        "feed": "UOF",
        "marketCount": 18,
        "status": "2. Halbzeit"
      },
      "score": {
        "home": "2",
        "away": "1"
      },
      "settlement": {
        "source": "interwetten",
        "state": "in_play",
        "final": false,
        "inPlay": true
      },
      "slug": "/de/sportwetten/live/event/18813568",
      "sport": "soccer",
      "startTime": "2026-10-03T05:00:00.000Z",
      "periodScores": {
        "home": [
          2,
          0
        ],
        "away": [
          1,
          0
        ],
        "labels": [
          "Half 1",
          "Half 2"
        ]
      },
      "statistics": {
        "football": {
          "home": {
            "yellowCards": 0,
            "redCards": 0,
            "corners": 2
          },
          "away": {
            "yellowCards": 0,
            "redCards": 0,
            "corners": 2
          }
        }
      }
    }
  ]
}

Results — 30 Days of In-Play History

GET /api/interwetten-de/results?sport=ice-hockey&league=Deutschland%20DEL&limit=2
{
  "total": 6,
  "page": 1,
  "limit": 2,
  "totalPages": 3,
  "hasNextPage": true,
  "hasPrevPage": false,
  "results": [
    {
      "eventId": "18868918",
      "away": "EHC Red Bull München",
      "home": "Kölner Haie",
      "league": "Deutschland DEL",
      "matchClock": {
        "period": "Endergebnis",
        "periodId": "ENDED",
        "minute": 60,
        "running": false
      },
      "moreInfo": {
        "leagueId": "40627",
        "iwSportId": 40,
        "betradarId": "72483944",
        "feed": "UOF",
        "status": "Endergebnis",
        "ended": true
      },
      "periodScores": {
        "home": [
          1,
          0,
          1
        ],
        "away": [
          2,
          2,
          0
        ],
        "labels": [
          "P 1",
          "P 2",
          "P 3"
        ]
      },
      "score": {
        "home": "2",
        "away": "4"
      },
      "settlement": {
        "source": "interwetten",
        "state": "final",
        "final": true,
        "inPlay": false,
        "reason": "status",
        "finalAt": "2026-10-02T19:48:57.910Z",
        "lastSeenAt": "2026-10-02T19:48:53.114Z"
      },
      "slug": "/de/sportwetten/live/event/18868918",
      "sport": "ice_hockey",
      "startTime": "2026-10-02T17:30:00.000Z"
    },
    {
      "eventId": "18868919",
      "away": "Schwenninger Wild Wings",
      "home": "Nürnberg Ice Tigers",
      "league": "Deutschland DEL",
      "matchClock": {
        "period": "Endergebnis",
        "periodId": "ENDED",
        "minute": 59,
        "running": false
      },
      "moreInfo": {
        "leagueId": "40627",
        "iwSportId": 40,
        "betradarId": "72483946",
        "feed": "UOF",
        "status": "Endergebnis",
        "ended": true
      },
      "periodScores": {
        "home": [
          2,
          1,
          2
        ],
        "away": [
          0,
          0,
          0
        ],
        "labels": [
          "P 1",
          "P 2",
          "P 3"
        ]
      },
      "score": {
        "home": "5",
        "away": "0"
      },
      "settlement": {
        "source": "interwetten",
        "state": "final",
        "final": true,
        "inPlay": false,
        "reason": "status",
        "finalAt": "2026-10-02T19:46:15.878Z",
        "lastSeenAt": "2026-10-02T19:46:03.130Z"
      },
      "slug": "/de/sportwetten/live/event/18868919",
      "sport": "ice_hockey",
      "startTime": "2026-10-02T17:30:00.000Z"
    }
  ]
}

Why Use PulseScore for Interwetten Data

A German Board, Canonically Mapped

Market names come through exactly as interwetten.de prints them — Spiel, Doppelte Chance, Wie viele Tore fallen im Spiel, Asian Handicap, Handicap 0:1, Erzielen beide Teams ein Tor?, Halbzeit/Endstand, Torschütze — with German country and league names (Deutschland Bundesliga, England Premier League). Every market also carries a canonicalMarket and every selection a canonicalOutcome, a decimal odds number and the two-decimal rawOdds string Interwetten displays, so a MATCH_RESULT / HOME price lines up with the same market on any other book on PulseScore without translating a word.

Betradar Match IDs on Every Event

Each prematch event carries moreInfo.betradarId — the Betradar (Sportradar) match ID — next to Interwetten's own event, league and sport IDs, so the book joins any Sportradar-keyed feed without name matching. marketId and selectionId are unique across the whole board, one market per handicap or totals line, and live rows say exactly how they map back to the prematch fixture.

Full Boards Weeks Ahead

Interwetten prices its top flights with the full board two to three weeks out — the Premier League, Bundesliga, LaLiga, Serie A and Ligue 1 at 92 to 95 markets, the Champions League at 92, the Nations League up to 180 with the goalscorer board — and the NFL at 158 to 179 markets a game with touchdown-scorer props. The NHL and the European ice hockey top flights run a uniform 47 to 51.

Bundesliga-First Coverage

A German book end to end: the Bundesliga, 2. Liga, 3. Liga, DFB-Pokal and Frauen-Bundesliga; the BBL, Pro A and Pro B in basketball; the handball Bundesliga and 2. Bundesliga; the DEL and DEL2 in ice hockey — plus the Austrian and Swiss leagues, 130 soccer competitions from 57 countries and 59 basketball leagues.

In-Play Scores with Per-Period Detail

Live documents carry periodScores on every sport, a match clock with the German period label and a numeric periodId, cards and corners per side on soccer, sets and the serve on tennis, the current game points, and a settlement block. A 30-day results archive mirrors everything the book took in play, with the final whistle marked once Interwetten shows Endergebnis.

REST Plus WebSocket Streaming

Poll the REST endpoints for pre-match boards, leagues and a 30-day results archive, or subscribe over WebSocket for in-play pushes roughly every second. All 12 sports are subscribable on PRO, MAX and ULTRA plans, and one PulseScore API key works across Interwetten and every other bookmaker on the platform.

Frequently Asked Questions

What data does the Interwetten API provide?

PulseScore provides pre-match and live odds from Interwetten's German sportsbook (interwetten.de) across 12 sports, with a 30-day results archive. Events carry normalized market data with canonical market types and outcomes, decimal odds plus the printed odds string, the league and country, Interwetten's event, league and sport IDs, the Betradar match ID and the interwetten.de event-page slug.

Which sports are covered?

Twelve: Soccer, Basketball, Ice Hockey, Handball, Tennis, American Football, Volleyball, Rugby Union, Rugby League, Baseball, Darts and Boxing. There is no racing on this book. The smaller sports carry a handful of fixtures at a time, so call /sport-availability for what is on right now rather than hard-coding the list.

How deep are the Interwetten soccer boards?

The top flights are priced with the full board two to three weeks ahead: the Premier League, Bundesliga, LaLiga, Serie A and Ligue 1 average 92 to 94 markets (95 at peak), the Champions, Europa and Conference League 89 to 92, and the Nations League 122 on average and 180 at peak with the goalscorer board. Lower divisions carry less, and only a handful of fixtures — mostly a DFB-Pokal round a month out — sit at the one-market 1X2 header. Thirty-two canonical market types are mapped, from 1X2, handicaps and totals to correct score, half-time/full-time and goalscorers.

Are the market names in German?

Yes, exactly as interwetten.de prints them: Spiel, Doppelte Chance, Wie viele Tore fallen im Spiel, Resultat, Halbzeit/Endstand, Torschütze, with X for the draw, Ja/Nein, Über 2.5 / Unter 2.5 (a decimal point, not a comma) and H/X/G for home, draw and away in half-time/full-time. Country and league names are German too (Deutschland Bundesliga, Spanien LaLiga). Every market also carries a language-independent canonicalMarket and every selection a canonicalOutcome, and the numeric line sits on the market and its selections, so nothing needs parsing.

What is moreInfo.betradarId?

The Betradar (Sportradar) match ID of the fixture, present on every prematch event (1,450 of 1,450 on the snapshot), so you can join Interwetten fixtures to any other Sportradar-keyed source without matching team names. moreInfo also carries Interwetten's league ID (the same value as the league document's leagueId), its sport ID and the number of markets it lists for the event.

Are the market and selection IDs stable?

marketId is Interwetten's own market ID and is unique across the whole board — every handicap or totals line is a market of its own — and selectionId is unique per selection, so either works as a diff key. When Interwetten lists two markets that map to the same canonical type, period and line, the second is kept with canonicalMarket OTHER, moreInfo.duplicateOf naming the first one's marketId and moreInfo.demotedFrom the type it would have had, so a canonical identity never appears twice in one event.

Why does a live event sometimes have a different eventId?

Interwetten runs two in-play feeds and moreInfo.feed says which one carries the match. UOF rows keep the prematch eventId and carry the Betradar match ID. BG rows get a new live eventId and point back to the prematch fixture with moreInfo.prematchId. The results archive keeps whichever ID the live document had.

How do I get only finished matches from the results endpoint?

Read settlement.final client-side — Interwetten's results collection has no settlement.final index, so there is no ?final= query parameter here, and no country field either. A match turns state 'final' with final true once Interwetten shows Endergebnis. A match the live feed drops without a final turns state 'unresolved' with delisted true and keeps its last score; so far that has been every match carried on the BG feed, so treat those rows as snapshots.

Is live in-play data available?

Yes — /api/interwetten-de/live-events over HTTP and a WebSocket for streaming. Live documents carry the in-play board, a score with the numbers as strings (plus the current game points on tennis), a match clock with the German period label and a numeric periodId, per-period scores on every sport, cards and corners on soccer, sets and the serve on tennis, and a settlement block. Live retention is 120 seconds, so documents that stop being refreshed drop out, and a suspended market keeps its last odds with isActive false.

How do I connect to the Interwetten WebSocket?

Open wss://api.pulsescore.net/api/interwetten-de/ws/live?key=YOUR_KEY&sport=soccer. The sport parameter is kebab-case (ice-hockey, american-football, rugby-union) and all 12 sports are valid. The server sends a connected frame with your plan and the valid sport list, then pushes live events roughly every second. WebSocket access requires PRO, MAX or ULTRA.

How often is the data updated?

Live events are pushed roughly every second over WebSocket and expire 120 seconds after their last refresh over HTTP. Pre-match boards and leagues carry a one-hour freshness window, and results are retained for 30 days. Every document carries createdAt and updatedAt timestamps so you can measure freshness yourself.

Can I use this data commercially?

Yes. PulseScore plans cover commercial use — odds comparison sites, trading models, in-play dashboards and internal tooling. Rate limits and WebSocket connection counts scale with the plan, and one API key works across Interwetten and every other bookmaker on the platform.

Start Using the Interwetten API Today

Free tier available. No credit card required. Get your API key in 30 seconds.