Tipwin Data API

Tipwin API for German Pre-Match, Live & Settled Results Data

Access Tipwin's German sportsbook through one API — the Bundesliga, 2nd Bundesliga, 3rd Liga and DFB Pokal alongside the Premier League, La Liga, Serie A, Ligue 1 and the Champions, Europa and Conference League, the NFL, NBA, Euroleague and EuroCup, the NHL, DEL and the European ice hockey leagues, handball, tennis and more, across 10 sports. Every market carries a canonical type, every selection a decimal price, nearly every event a Betradar match ID, and every settled match the outcome of each selection. REST and WebSocket, one API key.

What a Tipwin API Response Looks Like

GET /api/tipwin-de/soccer/events/BFMGBZA2iKELIhIs0GTEw0
{
  "data": {
    "eventId": "BFMGBZA2iKELIhIs0GTEw0",
    "away": "Bayern Munich",
    "country": "Germany",
    "home": "FC Augsburg",
    "league": "Bundesliga",
    "live": false,
    "markets": [
      {
        "canonicalMarket": "MATCH_RESULT",
        "rawName": "3-Way",
        "period": "FULL_TIME",
        "isActive": true,
        "selections": [
          {
            "canonicalOutcome": "HOME",
            "rawName": "1",
            "odds": 10,
            "isActive": true,
            "selectionId": "6IPZvcqzmQH9Zyqnm4QuJD",
            "rawOdds": "10"
          },
          {
            "canonicalOutcome": "AWAY",
            "rawName": "2",
            "odds": 1.2,
            "isActive": true,
            "selectionId": "b5w37IFC04MHdBJ70HhXF1",
            "rawOdds": "1.2"
          },
          {
            "canonicalOutcome": "DRAW",
            "rawName": "X",
            "odds": 8,
            "isActive": true,
            "selectionId": "aLrPvudRTqE1xxJ70HhXF1",
            "rawOdds": "8"
          }
        ],
        "marketId": "FEjFRYvVBKAtNhJ70HhXE0",
        "moreInfo": {
          "abrv": "3way"
        }
      },
      {
        "canonicalMarket": "OVER_UNDER",
        "rawName": "Over/Under (2.5)",
        "period": "FULL_TIME",
        "isActive": true,
        "selections": [
          {
            "canonicalOutcome": "OVER",
            "rawName": "+",
            "odds": 1.15,
            "isActive": true,
            "selectionId": "3aAQSjFPFKYS7xJ70HkNy0",
            "rawOdds": "1.15",
            "line": 2.5
          },
          {
            "canonicalOutcome": "UNDER",
            "rawName": "-",
            "odds": 5.25,
            "isActive": true,
            "selectionId": "xxE2Ba2xZKAq2BJ70HkNy0",
            "rawOdds": "5.25",
            "line": 2.5
          }
        ],
        "marketId": "LbiJRRgl6qkQCRJ70HkNy0",
        "line": 2.5,
        "moreInfo": {
          "abrv": "over-under",
          "specifier": {
            "total": "2.5"
          }
        }
      },
      {
        "canonicalMarket": "EUROPEAN_HANDICAP",
        "rawName": "Handicap (1:0)",
        "period": "FULL_TIME",
        "isActive": true,
        "selections": [
          {
            "canonicalOutcome": "AWAY",
            "rawName": "2",
            "odds": 1.45,
            "isActive": true,
            "selectionId": "U5z0y5ynU4YpH5QOu2Dozm",
            "rawOdds": "1.45",
            "line": 1
          },
          {
            "canonicalOutcome": "DRAW",
            "rawName": "X",
            "odds": 4.95,
            "isActive": true,
            "selectionId": "1s4GRE3Ai46fBhJ70HkNy0",
            "rawOdds": "4.95",
            "line": 1
          },
          {
            "canonicalOutcome": "HOME",
            "rawName": "1",
            "odds": 4.1,
            "isActive": true,
            "selectionId": "ih9B27NxH4U8KxJ70HkNy0",
            "rawOdds": "4.1",
            "line": 1
          }
        ],
        "marketId": "K5OZaa1d4qEVkRJ70HkNy0",
        "line": 1,
        "moreInfo": {
          "abrv": "handicap-hcp",
          "specifier": {
            "hcp": "1:0"
          }
        }
      },
      {
        "canonicalMarket": "BOTH_TEAMS_TO_SCORE",
        "rawName": "Both teams to score?",
        "period": "FULL_TIME",
        "isActive": true,
        "selections": [
          {
            "canonicalOutcome": "YES",
            "rawName": "Y",
            "odds": 1.4,
            "isActive": true,
            "selectionId": "Od24giiilakg0RJ70HkNy0",
            "rawOdds": "1.4"
          },
          {
            "canonicalOutcome": "NO",
            "rawName": "N",
            "odds": 2.65,
            "isActive": true,
            "selectionId": "2uehxUuJZqkFzDfZW8tBz0",
            "rawOdds": "2.65"
          }
        ],
        "marketId": "iVWkxsjDP42zhbfZW8tBz0",
        "moreInfo": {
          "abrv": "will-both-teams-score"
        }
      },
      {
        "canonicalMarket": "FIRST_GOALSCORER",
        "rawName": "1st Goalscorer",
        "period": "FULL_TIME",
        "isActive": true,
        "selections": [
          {
            "canonicalOutcome": "OTHER",
            "rawName": "Kimmich, Joshua",
            "odds": 22,
            "isActive": true,
            "selectionId": "6xsP4mmdyAR8yIqqG5n5gD",
            "rawOdds": "22"
          },
          {
            "canonicalOutcome": "OTHER",
            "rawName": "Laimer, Konrad",
            "odds": 22,
            "isActive": true,
            "selectionId": "0S2E4iiG3qsfahJH0N4Mi2",
            "rawOdds": "22"
          },
          {
            "canonicalOutcome": "OTHER",
            "rawName": "Rieder, Fabian",
            "odds": 19.75,
            "isActive": true,
            "selectionId": "yCSdVguXSYD6UrfeWBYBL5",
            "rawOdds": "19.75"
          }
        ],
        "marketId": "nMhrbfIdSKIcuBJH0N4Mb2",
        "moreInfo": {
          "abrv": "goalnr-goalscorer-with-no-goal",
          "specifier": {
            "goalnr": "1",
            "type": "prematch"
          }
        }
      }
    ],
    "moreInfo": {
      "tournamentId": "8Q3a6XcAq4ocXwqu0GyXq2",
      "categoryId": "57rJTRCZuK2yZLJsW8zM38",
      "betradarId": "72513228",
      "feed": "1",
      "totalOfferCount": 93,
      "dailyId": 10
    },
    "slug": "/de/sports/full/event/BFMGBZA2iKELIhIs0GTEw0",
    "sport": "soccer",
    "startTime": "2026-10-10T13:30:00.000Z"
  }
}

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

GET /api/tipwin-de/live-events?sport=soccer&limit=1
{
  "total": 5,
  "page": 1,
  "limit": 1,
  "totalPages": 5,
  "hasNextPage": true,
  "hasPrevPage": false,
  "sport": "soccer",
  "events": [
    {
      "eventId": "3GbTgyd5koD37jfX05NJ15",
      "away": "Gibraltar U21",
      "country": "U21 EURO 2027",
      "home": "Azerbaijan U21",
      "league": "Group 2, Qualification",
      "markets": [
        {
          "canonicalMarket": "MATCH_RESULT",
          "rawName": "3-Way",
          "period": "FULL_TIME",
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "HOME",
              "rawName": "1",
              "odds": 1.01,
              "isActive": true,
              "selectionId": "PCMYg2kzj2LRGTfjW90Zn4",
              "rawOdds": "1.01"
            },
            {
              "canonicalOutcome": "DRAW",
              "rawName": "X",
              "odds": 9.75,
              "isActive": true,
              "selectionId": "VOFFOlz9GY14KjfjW90Zn4",
              "rawOdds": "9.75"
            },
            {
              "canonicalOutcome": "AWAY",
              "rawName": "2",
              "odds": 50,
              "isActive": true,
              "selectionId": "looAzz3Yo1ChGYqsm4WHuC",
              "rawOdds": "50"
            }
          ],
          "marketId": "kfwe7JzmqgLJwyqsm4WHu7",
          "moreInfo": {
            "abrv": "3way"
          }
        },
        {
          "canonicalMarket": "OVER_UNDER",
          "rawName": "Over/Under (2.5)",
          "period": "FULL_TIME",
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "OVER",
              "rawName": "+",
              "odds": 1.3,
              "isActive": true,
              "selectionId": "DTOoEHzofYD10jfjW90Zn4",
              "rawOdds": "1.3",
              "line": 2.5
            },
            {
              "canonicalOutcome": "UNDER",
              "rawName": "-",
              "odds": 3.05,
              "isActive": true,
              "selectionId": "uLCuMIFWgKsNbBJR0I17Z0",
              "rawOdds": "3.05",
              "line": 2.5
            }
          ],
          "marketId": "Jn81wACDhqIUyDfjW90Zm7",
          "line": 2.5,
          "moreInfo": {
            "abrv": "over-under",
            "specifier": {
              "total": "2.5"
            }
          }
        },
        {
          "canonicalMarket": "BOTH_TEAMS_TO_SCORE",
          "rawName": "Both teams to score?",
          "period": "FULL_TIME",
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "NO",
              "rawName": "N",
              "odds": 1.3,
              "isActive": true,
              "selectionId": "WdqNIWukIaIyxTfjW90Zn4",
              "rawOdds": "1.3"
            },
            {
              "canonicalOutcome": "YES",
              "rawName": "Y",
              "odds": 3.05,
              "isActive": true,
              "selectionId": "MBlpGTAldaYnahJR0I17Z0",
              "rawOdds": "3.05"
            }
          ],
          "marketId": "fbqe08OUOKUyorfjW90Zm7",
          "moreInfo": {
            "abrv": "will-both-teams-score"
          }
        }
      ],
      "matchClock": {
        "period": "22'",
        "periodId": "1ST_HALF",
        "running": true,
        "minute": 22
      },
      "moreInfo": {
        "tournamentId": "fp2yC2qDE2DUWjcYW7bto7",
        "categoryId": "yUN9qy4PyeaINdPTW2CzzH1",
        "betradarId": "58208463",
        "feed": "1",
        "totalOfferCount": 39,
        "dailyId": 666,
        "status": "1st-half",
        "displayTime": "22'"
      },
      "periodScores": {
        "home": [
          1
        ],
        "away": [
          0
        ],
        "labels": [
          "1"
        ]
      },
      "score": {
        "home": "1",
        "away": "0"
      },
      "settlement": {
        "source": "tipwin",
        "state": "in_play",
        "final": false,
        "inPlay": true
      },
      "slug": "/de/live/matches/3GbTgyd5koD37jfX05NJ15",
      "sport": "soccer",
      "startTime": "2026-10-06T13:45:00.000Z",
      "statistics": {
        "football": {
          "home": {
            "yellowCards": 0,
            "redCards": 0,
            "corners": 2
          },
          "away": {
            "yellowCards": 0,
            "redCards": 0,
            "corners": 0
          }
        }
      }
    }
  ]
}

Results — Every Selection Settled WON or LOST

GET /api/tipwin-de/results?sport=soccer&final=true&limit=1
{
  "total": 340,
  "page": 1,
  "limit": 1,
  "totalPages": 340,
  "hasNextPage": true,
  "hasPrevPage": false,
  "results": [
    {
      "eventId": "Aw2FS8qFJ4ErOBJL0MPcp2",
      "away": "Dalian Yingbo B",
      "country": "China",
      "home": "Guangdong Mingtu",
      "league": "China League 2, Relegation Round, Gr. A",
      "matchClock": {
        "period": "FT",
        "periodId": "ENDED",
        "running": false
      },
      "moreInfo": {
        "tournamentId": "xUarADr4tK6ZrhDK0BSsd3",
        "categoryId": "zlGq2fmJL2B3aTJt06LpQ7",
        "feed": "3",
        "feedEventId": "20344786",
        "totalOfferCount": 0,
        "dailyId": 58,
        "status": "ended",
        "displayTime": "FT",
        "ended": true,
        "country": "China",
        "matchStatus": "ended",
        "statusName": "ENDED"
      },
      "periodScores": {
        "home": [
          0,
          1
        ],
        "away": [
          0,
          1
        ],
        "text": [
          "1",
          "2"
        ]
      },
      "score": {
        "home": "1",
        "away": "1"
      },
      "settlement": {
        "source": "tipwin-results",
        "final": true,
        "inPlay": false,
        "settledSelections": 244,
        "totalSelections": 246,
        "settledMarkets": 66,
        "totalMarkets": 67,
        "scrapedAt": "2026-10-06T13:41:28.308Z"
      },
      "slug": "/de/live/matches/Aw2FS8qFJ4ErOBJL0MPcp2",
      "sport": "soccer",
      "startTime": "2026-10-06T11:30:00.000Z",
      "statistics": {
        "football": {
          "home": {
            "yellowCards": 1,
            "redCards": 0,
            "corners": 1
          },
          "away": {
            "yellowCards": 1,
            "redCards": 0,
            "corners": 1
          }
        }
      },
      "externalIds": {
        "betradar": "74455062"
      },
      "participants": {
        "home": [
          {
            "name": "Guangdong Mingtu",
            "teamId": "Nz40ixtFR2F9zoocG4RU0F"
          }
        ],
        "away": [
          {
            "name": "Dalian Yingbo B",
            "teamId": "zbOEKhvLKoVSILe7W6uu40"
          }
        ]
      },
      "settledOpportunities": [
        {
          "market": "CORRECT_SCORE",
          "period": "FULL_TIME",
          "outcome": "OTHER",
          "selection": "1:1",
          "result": "WON"
        },
        {
          "market": "BOTH_TEAMS_TO_SCORE",
          "period": "FULL_TIME",
          "outcome": "NO",
          "selection": "N",
          "result": "LOST"
        },
        {
          "market": "BOTH_TEAMS_TO_SCORE",
          "period": "FULL_TIME",
          "outcome": "YES",
          "selection": "Y",
          "result": "WON"
        },
        {
          "market": "MATCH_RESULT",
          "period": "FULL_TIME",
          "outcome": "HOME",
          "selection": "1",
          "result": "LOST"
        },
        {
          "market": "MATCH_RESULT",
          "period": "FULL_TIME",
          "outcome": "AWAY",
          "selection": "2",
          "result": "LOST"
        },
        {
          "market": "MATCH_RESULT",
          "period": "FULL_TIME",
          "outcome": "DRAW",
          "selection": "X",
          "result": "WON"
        },
        {
          "market": "OVER_UNDER",
          "period": "FULL_TIME",
          "line": 2.5,
          "outcome": "OVER",
          "selection": "+",
          "result": "LOST"
        },
        {
          "market": "OVER_UNDER",
          "period": "FULL_TIME",
          "line": 2.5,
          "outcome": "UNDER",
          "selection": "-",
          "result": "WON"
        }
      ]
    }
  ]
}

Why Use PulseScore for Tipwin Data

Settlement for Every Selection

Tipwin's results archive does not stop at the score. Once a match is settled, settledOpportunities lists every selection on the board with its canonical market, period, line and WON or LOST — about 310 entries a match and up to 1,004 — next to the settled and total market and selection counts. Filter finished matches with ?final=true and grade your own bets or models without re-deriving a single rule.

Betradar Match IDs on Nearly Every Event

Each prematch event on Tipwin's main feed carries moreInfo.betradarId — the Betradar (Sportradar) match ID, on 1,557 of 1,612 fixtures — next to Tipwin's own competition and category IDs, so the book joins any Sportradar-keyed feed without name matching. Live documents keep the prematch eventId, and settled results add externalIds.

Full Boards Up to Four Weeks Ahead

Tipwin prices the top flights and European cups at 85 to 93 markets — the Bundesliga 90 on average, the Premier League, La Liga and Serie A 89, the Champions and Europa League 87 — and almost every other league at a uniform 69 to 73, weeks before kick-off. The EuroCup runs up to 71 markets a game, the Euroleague up to 84 with player points, the NFL up to 63.

Canonical Markets, Stable IDs

Every market carries a canonicalMarket and every selection a canonicalOutcome, a decimal odds number and a numeric line on handicaps and totals, so a MATCH_RESULT / HOME price lines up with the same market on any other book on PulseScore. marketId and selectionId are unique across the whole board — every handicap or totals line is a market of its own — so either works as a diff key.

In-Play Scores with Per-Period Detail

Live documents carry periodScores on every sport, a match clock with the display time and a machine periodId, cards and corners per side on soccer, sets, the serve and the current game points on tennis, and a settlement block. The live board keeps the prematch eventId, so the same ID follows a match from the first price to the settled result.

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 10 sports are subscribable on PRO, MAX and ULTRA plans, and one PulseScore API key works across Tipwin and every other bookmaker on the platform.

Frequently Asked Questions

What data does the Tipwin API provide?

PulseScore provides pre-match and live odds from Tipwin's German sportsbook (tipwin.de) across 10 sports, with a 30-day results archive that includes per-selection settlement. Events carry normalized market data with canonical market types and outcomes, decimal odds, the league and country, Tipwin's event, competition and category IDs, the Betradar match ID and the tipwin.de page slug.

Which sports are covered?

Ten: Soccer, Basketball, Ice Hockey, Handball, Tennis, American Football, Baseball, Rugby Union, Rugby League and Boxing. The results archive also holds volleyball and darts, which Tipwin settles but which have no prematch board here. 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 Tipwin soccer boards?

Depth is set by the competition, not the date. The top flights and European cups run 85 to 93 markets — the Bundesliga 90 on average and 93 at peak, the Premier League, La Liga and Serie A 89, the Champions and Europa League 87 — and almost every other league a uniform 69 to 73, priced up to four weeks ahead; none of the 1,155 fixtures sat at a one-market header. The next round of the big leagues and the Nations League adds the goalscorer board. Thirty-two canonical market types are mapped, from 1X2, handicaps and totals to correct score, half-time/full-time and clean sheets.

What language is the board in?

English, although tipwin.de is a German book: 3-Way, Double chance, Draw no bet, Over/Under (2.5), Handicap (1:0), Both teams to score?, Halftime/Fulltime, Correct score, 1st Goalscorer. Selections are printed as codes — 1, X and 2, + and - for over and under, Y and N, 1 or X, 1/X — so read canonicalOutcome rather than the raw label. Country and league names are English too, and league names carry no country prefix.

Why does one league name cover several countries?

Tipwin's league names carry no country prefix — Premier League exists in eight countries on the snapshot, Bundesliga in Germany and Austria, Championship, League One and League Two in England and Scotland, Extraliga in Czechia and Slovakia on ice hockey. Every event carries country, so filter on league and country together. The leagues list keeps one document per name, whose country changes with whichever competition Tipwin wrote last, and /leagues/:league/events matches the name partially and case-insensitively, so Bundesliga returns Germany's, Austria's and the 2nd Bundesliga together.

What is moreInfo.betradarId?

The Betradar (Sportradar) match ID of the fixture, present on every event from Tipwin's main feed — 1,557 of 1,612 prematch fixtures on the snapshot — so you can join Tipwin fixtures to any other Sportradar-keyed source without matching team names. The rest come from Tipwin's other feeds and carry moreInfo.feedEventId instead. moreInfo also carries Tipwin's competition ID (the league document's leagueId), its category ID and the number of markets it lists for the event.

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

Add ?final=true — it filters on settlement.final, which turns true once the settlement feed settles the match (or the live board shows the final whistle). Settled rows also carry settledOpportunities, every selection on the board with WON or LOST, and settledMarkets / totalMarkets so you can see how complete the settlement is. ?country= works too, but only rows the live feed touched carry a top-level country; the rest keep it in moreInfo.country.

Is live in-play data available?

Yes — /api/tipwin-de/live-events over HTTP and a WebSocket for streaming. Live documents keep the prematch eventId and carry the in-play board, a score with the numbers as strings (plus the current game points on tennis), a match clock with the display time and a machine 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.

How do I connect to the Tipwin WebSocket?

Open wss://api.pulsescore.net/api/tipwin-de/ws/live?key=YOUR_KEY&sport=soccer. The sport parameter is kebab-case (ice-hockey, american-football, rugby-union) and all 10 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 Tipwin and every other bookmaker on the platform.

Start Using the Tipwin API Today

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