Bwin Germany Data API

Bwin DE API for Pre-Match, Live & Results Data

Access pre-match and live odds from bwin Germany, the GGL-licensed German arm of Entain's bwin brand, across 8 sports — Soccer, Ice Hockey, Basketball, Tennis, Handball, American Football, Baseball and Volleyball. Every market carries a canonical type, every selection a canonical outcome and a decimal price, in-play events ship a running score, clock and statistics, and the results archive keeps 30 days of finished matches. REST and WebSocket, one API key.

What a Bwin DE API Response Looks Like

GET /api/bwin-de/soccer/events?page=1&limit=5
{
  "total": 719,
  "page": 1,
  "limit": 5,
  "totalPages": 144,
  "hasNextPage": true,
  "hasPrevPage": false,
  "events": [
    {
      "sport": "soccer",
      "country": "Germany",
      "league": "Bundesliga",
      "eventId": "2:7855748",
      "home": "Bayern Munich",
      "away": "Union Berlin",
      "live": false,
      "startTime": "2026-09-18T18:30:00.000Z",
      "slug": "/de/sports/events/fc-bayern-münchen-union-berlin-2:7855748",
      "markets": [
        {
          "canonicalMarket": "MATCH_RESULT",
          "rawName": "Match Result",
          "period": "FULL_TIME",
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "HOME",
              "rawName": "Bayern Munich",
              "odds": 1.09,
              "isActive": true,
              "selectionId": "203871982:0"
            },
            {
              "canonicalOutcome": "DRAW",
              "rawName": "X",
              "odds": 13,
              "isActive": true,
              "selectionId": "203871982:1"
            },
            {
              "canonicalOutcome": "AWAY",
              "rawName": "Union Berlin",
              "odds": 20,
              "isActive": true,
              "selectionId": "203871982:2"
            }
          ],
          "marketId": "203871982"
        },
        {
          "canonicalMarket": "OVER_UNDER",
          "rawName": "Total Goals",
          "period": "FULL_TIME",
          "line": 2.5,
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "OVER",
              "rawName": "Over 2,5",
              "odds": 1.15,
              "isActive": true,
              "selectionId": "204511860:0"
            },
            {
              "canonicalOutcome": "UNDER",
              "rawName": "Under 2,5",
              "odds": 5.5,
              "isActive": true,
              "selectionId": "204511860:1"
            }
          ],
          "marketId": "204511860"
        },
        {
          "canonicalMarket": "BOTH_TEAMS_TO_SCORE",
          "rawName": "Both Teams To Score",
          "period": "FULL_TIME",
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "YES",
              "rawName": "Yes",
              "odds": 1.82,
              "isActive": true,
              "selectionId": "203872014:0"
            },
            {
              "canonicalOutcome": "NO",
              "rawName": "No",
              "odds": 1.87,
              "isActive": true,
              "selectionId": "203872014:1"
            }
          ],
          "marketId": "203872014"
        },
        {
          "canonicalMarket": "DOUBLE_CHANCE",
          "rawName": "Double Chance",
          "period": "FULL_TIME",
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "HOME_DRAW",
              "rawName": "Bayern Munich or X",
              "odds": 1.02,
              "isActive": true,
              "selectionId": "203871987:0"
            },
            {
              "canonicalOutcome": "DRAW_AWAY",
              "rawName": "X or Union Berlin",
              "odds": 7.5,
              "isActive": true,
              "selectionId": "203871987:1"
            },
            {
              "canonicalOutcome": "HOME_AWAY",
              "rawName": "Bayern Munich or Union Berlin",
              "odds": 1.04,
              "isActive": true,
              "selectionId": "203871987:2"
            }
          ],
          "marketId": "203871987"
        }
      ]
    }
  ]
}

In-Play — Score, Match Clock & Statistics

GET /api/bwin-de/live-events?sport=soccer&limit=1
{
  "total": 25,
  "page": 1,
  "limit": 1,
  "sport": "soccer",
  "events": [
    {
      "sport": "soccer",
      "country": "Spain",
      "league": "LaLiga",
      "eventId": "2:7859171",
      "home": "Rayo Vallecano",
      "away": "Espanyol Barcelona",
      "startTime": "2026-09-15T17:00:00.000Z",
      "score": {
        "home": "2",
        "away": "1",
        "info": "2H"
      },
      "matchClock": {
        "minute": 70,
        "second": 26,
        "period": "2H",
        "periodId": "3",
        "running": true
      },
      "statistics": {
        "football": {
          "home": {
            "corners": 2,
            "yellowCards": 3,
            "redCards": 0
          },
          "away": {
            "corners": 4,
            "yellowCards": 1,
            "redCards": 0
          },
          "penalties": {
            "home": 0,
            "away": 0
          }
        }
      },
      "slug": "/de/sports/events/rayo-vallecano-espanyol-barcelona-2:7859171",
      "markets": [
        {
          "canonicalMarket": "MATCH_RESULT",
          "rawName": "2nd Half Result",
          "period": "SECOND_HALF",
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "HOME",
              "rawName": "Rayo Vallecano",
              "odds": 14.5,
              "isActive": true,
              "selectionId": "204172037:0"
            },
            {
              "canonicalOutcome": "DRAW",
              "rawName": "X",
              "odds": 4.4,
              "isActive": true,
              "selectionId": "204172037:1"
            },
            {
              "canonicalOutcome": "AWAY",
              "rawName": "Espanyol",
              "odds": 1.22,
              "isActive": true,
              "selectionId": "204172037:2"
            }
          ],
          "marketId": "204172037"
        },
        {
          "canonicalMarket": "OVER_UNDER",
          "rawName": "Total Goals",
          "period": "FULL_TIME",
          "line": 3.5,
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "OVER",
              "rawName": "Over 3,5",
              "odds": 1.68,
              "isActive": true,
              "selectionId": "204459443:0"
            },
            {
              "canonicalOutcome": "UNDER",
              "rawName": "Under 3,5",
              "odds": 2.05,
              "isActive": true,
              "selectionId": "204459443:1"
            }
          ],
          "marketId": "204459443"
        }
      ]
    }
  ]
}

Results — 30 Days of Finished Matches

GET /api/bwin-de/results?sport=soccer&limit=20
{
  "total": 54,
  "page": 1,
  "limit": 20,
  "totalPages": 3,
  "hasNextPage": true,
  "hasPrevPage": false,
  "results": [
    {
      "sport": "soccer",
      "country": "Australia",
      "league": "Australia Cup",
      "eventId": "2:7864041",
      "home": "South Melbourne FC",
      "away": "Queensland Lions FC",
      "startTime": "2026-09-15T09:30:00.000Z",
      "score": {
        "home": "3",
        "away": "1",
        "info": "Finished"
      },
      "matchClock": {
        "minute": 90,
        "second": 0,
        "period": "Finished",
        "periodId": "ENDED",
        "running": false
      },
      "statistics": {
        "football": {
          "home": {
            "corners": 12,
            "yellowCards": 0,
            "redCards": 0
          },
          "away": {
            "corners": 3,
            "yellowCards": 1,
            "redCards": 0
          },
          "penalties": {
            "home": 0,
            "away": 0
          }
        }
      },
      "slug": "/de/sports/events/south-melbourne-queensland-lions-fc-2:7864041",
      "moreInfo": {
        "ended": true
      }
    }
  ]
}

Why Use PulseScore for Bwin DE Data

A German Book With an English Board

bwin Germany publishes its market and selection names in English — Match Result, Double Chance, Total Goals, Both Teams To Score, Halftime and Fulltime — so there is nothing to translate, and every market still carries a canonicalMarket with every selection a canonicalOutcome beside it. Twenty-eight canonical market types on soccer alone, eleven on ice hockey, so a MATCH_RESULT / HOME selection lines up with every other book PulseScore serves. Only the slug and the German-language decimal comma inside a selection label (Over 2,5) give the market away — and the numeric line field on the market spares you parsing it.

Per-Event Market IDs, Not Shared Templates

Every market instance has its own marketId — 55,515 distinct IDs across 55,515 soccer markets on the board — and each selection is keyed marketId:index (204991931:0 is the OVER leg of that fixture's Over/Under 2.5). Prices diff cleanly against a stored snapshot without composing a key from names and lines, and there is no template collision to work around.

Deep Soccer, Ice Hockey and NFL Boards

Soccer runs 718 fixtures across 87 competitions and 54 countries, averaging 77 markets and peaking at 102 — including the goalscorer board, where first, last, anytime, two-or-more and hat-trick markets name every player. NFL games carry the deepest per-fixture board on the book at 155 markets on average and 204 at their peak, and ice hockey averages 24 with per-period totals and both regular-time and overtime-inclusive result markets.

Leagues That Bring a Fixture With Them

Each league document carries bwin's numeric leagueId, the country and one sample fixture with its complete market board, so a single /leagues call gives you both the competition list and a worked example of what its prices look like. League names repeat across countries — Premier League exists in England, Israel, Egypt, Wales and Mongolia — so country is part of the identity, and /leagues/:league/events matches partially and case-insensitively when you want them all at once.

Live Events With Score, Clock and Statistics

In-play documents carry a running score with the current period label, a match clock (minute and second on soccer and handball, period and period code on the rest), and statistics — corners, cards and penalties on soccer, per-set points and who is serving on tennis and volleyball. Suspended boards arrive as an empty markets array rather than disappearing, so you can tell 'suspended' from 'gone'.

REST Plus WebSocket Streaming

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

Frequently Asked Questions

What data does the Bwin DE API provide?

PulseScore provides pre-match and live odds from bwin Germany (sports.bwin.de), the GGL-licensed German arm of Entain's bwin brand, across 8 sports, plus a 30-day results archive. Each event includes normalized market data with canonical market types and outcomes, decimal odds, per-event market and selection IDs, the league and country, and the bwin match-page slug.

How is this different from the Bwin API already on PulseScore?

They are two separate feeds from the same brand. /api/bwin is the international board — 15 sports including cricket, darts, snooker, futsal and table tennis, with no results archive. /api/bwin-de is the German GGL-licensed board — 8 sports, a different market set, German match-page slugs and a 30-day results archive. Prices, market depth and event IDs differ between them, so pick the one whose regulated market you care about, or take both and compare.

Which sports are covered?

Eight: Soccer, Ice Hockey, Basketball, Tennis, Handball, American Football, Baseball and Volleyball. Each exposes /leagues, /leagues/:league/events, /events and /events/:eventId, and all eight are subscribable on the WebSocket. There is no esports, darts, snooker, cricket, MMA or golf collection on this board — call /sport-availability for what is live right now rather than hard-coding the list.

Are the market and selection IDs stable?

They are per-event, not per-template: each market instance has its own marketId and each selection is keyed marketId:index. Two fixtures never share a marketId, so eventId plus marketId identifies a market uniquely and marketId alone is enough within a single event. Key your snapshots on it and diffing prices becomes a straight join.

Do country and league names match other bookmakers?

They are bwin's own values. Countries are English names, with continental shelves for cross-border competitions — Europe for the UEFA cups and the EuroLeague, World for the tennis tours, EHF Champions League and EuroVolley, North America for the NFL, MLB, NBA and NHL, South America for Copa Libertadores and Sudamericana. League names carry no country prefix and repeat across countries, so read country alongside league. Call a sport's /leagues or /results/countries for the exact strings the filters expect.

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

Filter on matchClock.period === 'Finished' (periodId 'ENDED', and moreInfo.ended true on the same rows). bwin Germany publishes no settlement block, so unlike some other books there is no ?final=true parameter here: the archive mirrors the live feed, which means a row can be a mid-match snapshot that is still being updated, and rows the book pulled before confirming a score are flagged moreInfo.delisted and moreInfo.finalScoreUnconfirmed. You can still filter by sport, league, country and team.

Is live in-play data available?

Yes. The live endpoints return in-play events with the current market board, a running score, a match clock and statistics — corners, cards and penalties on soccer, per-set points and server on tennis and volleyball. Soccer, ice hockey, tennis, basketball, handball and volleyball are what the German board runs live; call /live-events/sports to see what is on right now. Live access requires a STARTER plan or above, and WebSocket streaming requires PRO or above.

How do I connect to the Bwin DE WebSocket?

Connect to wss://api.pulsescore.net/api/bwin-de/ws/live?key=YOUR_KEY&sport=soccer. The sport parameter is required and takes kebab-case keys (ice-hockey, american-football). The server sends a connected frame with the list of valid sports, then pushes a snapshot of that sport's live events roughly every second. PRO allows 1 concurrent connection, MAX 3 and ULTRA 6.

How often is the data updated?

Pre-match boards and leagues are refreshed on a rolling scrape and expire an hour after their last update; live events carry a two-minute retention window and are pushed over WebSocket about once a second; results are kept for 30 days. Every document carries createdAt and updatedAt so you can measure freshness yourself.

How do I join Bwin DE events to other bookmakers?

bwin Germany publishes no third-party cross-reference IDs, so join on canonical market types plus team names and start times: canonicalMarket and canonicalOutcome are shared vocabulary across every bookmaker on PulseScore, and startTime is a UTC timestamp, so a MATCH_RESULT / HOME price lines up directly. Note that event IDs on this book come in two shapes — 2:7855748 on soccer, handball and volleyball, plain numeric IDs like 19921435 on the rest — and are opaque strings either way.

Start Using the Bwin DE API Today

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