Winamax ES Data API

Winamax ES API for Spanish Pre-Match, Live & Results Data

Access Winamax's Spanish sportsbook through one API — LaLiga and the Segunda División alongside the Premier League, Bundesliga, Serie A, Ligue 1, the Champions League and the Nations League, the NBA, Euroliga, NHL, KHL, NFL, ATP and WTA draws, Counter-Strike and Valorant, across 20 sports. The board is Spanish end to end, every market carries a canonical type and a Sportradar-style market ID, every selection a decimal price, and every live event per-period scores. REST and WebSocket, one API key.

What a Winamax ES API Response Looks Like

GET /api/winamax-es/soccer/leagues/LaLiga/events?limit=3
{
  "total": 20,
  "events": [
    {
      "eventId": "72478606",
      "away": "Atlético Madrid",
      "country": "España",
      "home": "Alavés",
      "league": "LaLiga ",
      "live": false,
      "markets": [
        {
          "canonicalMarket": "MATCH_RESULT",
          "rawName": "Resultado",
          "period": "FULL_TIME",
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "HOME",
              "rawName": "Alavés",
              "odds": 3.65,
              "isActive": true,
              "selectionId": "2172407800"
            },
            {
              "canonicalOutcome": "DRAW",
              "rawName": "Empate",
              "odds": 3.6,
              "isActive": true,
              "selectionId": "2172407801"
            },
            {
              "canonicalOutcome": "AWAY",
              "rawName": "Atl. Madrid",
              "odds": 1.86,
              "isActive": true,
              "selectionId": "2172407802"
            }
          ],
          "marketId": "1|type=prematch"
        },
        {
          "canonicalMarket": "OVER_UNDER",
          "rawName": "Número total de goles",
          "period": "FULL_TIME",
          "line": 2.5,
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "OVER",
              "rawName": "Más de 2,5",
              "odds": 1.86,
              "isActive": true,
              "selectionId": "2172462707",
              "line": 2.5
            },
            {
              "canonicalOutcome": "UNDER",
              "rawName": "Menos de 2,5",
              "odds": 1.92,
              "isActive": true,
              "selectionId": "2172462708",
              "line": 2.5
            }
          ],
          "marketId": "18|total=2.5"
        }
      ],
      "moreInfo": {
        "site": "/apuestas-deportivas/match/72478606",
        "tournamentId": 36,
        "srTournamentId": "sr:tournament:8",
        "round": "J8"
      },
      "slug": "/apuestas-deportivas/match/72478606",
      "sport": "soccer",
      "startTime": "2026-10-10T14:15:00.000Z"
    },
    {
      "eventId": "72478608",
      "away": "Osasuna",
      "country": "España",
      "home": "Real Betis",
      "league": "LaLiga ",
      "live": false,
      "markets": [
        {
          "canonicalMarket": "MATCH_RESULT",
          "rawName": "Resultado",
          "period": "FULL_TIME",
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "HOME",
              "rawName": "Real Betis",
              "odds": 1.64,
              "isActive": true,
              "selectionId": "2172407888"
            },
            {
              "canonicalOutcome": "DRAW",
              "rawName": "Empate",
              "odds": 4,
              "isActive": true,
              "selectionId": "2172407889"
            },
            {
              "canonicalOutcome": "AWAY",
              "rawName": "Osasuna",
              "odds": 4.4,
              "isActive": true,
              "selectionId": "2172407890"
            }
          ],
          "marketId": "1|type=prematch"
        },
        {
          "canonicalMarket": "OVER_UNDER",
          "rawName": "Número total de goles",
          "period": "FULL_TIME",
          "line": 2.5,
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "OVER",
              "rawName": "Más de 2,5",
              "odds": 1.74,
              "isActive": true,
              "selectionId": "2172446216",
              "line": 2.5
            },
            {
              "canonicalOutcome": "UNDER",
              "rawName": "Menos de 2,5",
              "odds": 2.05,
              "isActive": true,
              "selectionId": "2172446217",
              "line": 2.5
            }
          ],
          "marketId": "18|total=2.5"
        }
      ],
      "moreInfo": {
        "site": "/apuestas-deportivas/match/72478608",
        "tournamentId": 36,
        "srTournamentId": "sr:tournament:8",
        "round": "J8"
      },
      "slug": "/apuestas-deportivas/match/72478608",
      "sport": "soccer",
      "startTime": "2026-10-11T16:30:00.000Z"
    },
    {
      "eventId": "72478610",
      "away": "Celta Vigo",
      "country": "España",
      "home": "Elche",
      "league": "LaLiga ",
      "live": false,
      "markets": [
        {
          "canonicalMarket": "MATCH_RESULT",
          "rawName": "Resultado",
          "period": "FULL_TIME",
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "HOME",
              "rawName": "Elche",
              "odds": 2.7,
              "isActive": true,
              "selectionId": "2172407067"
            },
            {
              "canonicalOutcome": "DRAW",
              "rawName": "Empate",
              "odds": 3.25,
              "isActive": true,
              "selectionId": "2172407068"
            },
            {
              "canonicalOutcome": "AWAY",
              "rawName": "Celta Vigo",
              "odds": 2.45,
              "isActive": true,
              "selectionId": "2172407069"
            }
          ],
          "marketId": "1|type=prematch"
        },
        {
          "canonicalMarket": "OVER_UNDER",
          "rawName": "Número total de goles",
          "period": "FULL_TIME",
          "line": 2.5,
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "OVER",
              "rawName": "Más de 2,5",
              "odds": 2.05,
              "isActive": true,
              "selectionId": "2172463151",
              "line": 2.5
            },
            {
              "canonicalOutcome": "UNDER",
              "rawName": "Menos de 2,5",
              "odds": 1.76,
              "isActive": true,
              "selectionId": "2172463152",
              "line": 2.5
            }
          ],
          "marketId": "18|total=2.5"
        }
      ],
      "moreInfo": {
        "site": "/apuestas-deportivas/match/72478610",
        "tournamentId": 36,
        "srTournamentId": "sr:tournament:8",
        "round": "J8"
      },
      "slug": "/apuestas-deportivas/match/72478610",
      "sport": "soccer",
      "startTime": "2026-10-11T12:00:00.000Z"
    }
  ]
}

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

GET /api/winamax-es/live-events?sport=tennis&limit=1
{
  "total": 16,
  "page": 1,
  "limit": 1,
  "totalPages": 16,
  "hasNextPage": true,
  "hasPrevPage": false,
  "sport": "tennis",
  "events": [
    {
      "eventId": "75088732",
      "away": "Marco Trungelliti",
      "country": "ATP",
      "home": "Martín Landaluce",
      "league": "Pekín, Previa",
      "markets": [
        {
          "canonicalMarket": "MATCH_RESULT",
          "rawName": "Ganador",
          "period": "FULL_TIME",
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "HOME",
              "rawName": "M. Landaluce",
              "odds": 1.98,
              "isActive": true,
              "selectionId": "2193449501"
            },
            {
              "canonicalOutcome": "AWAY",
              "rawName": "M. Trungelliti",
              "odds": 1.78,
              "isActive": true,
              "selectionId": "2193449502"
            }
          ],
          "marketId": "186|type=live"
        },
        {
          "canonicalMarket": "GAME_HANDICAP",
          "rawName": "Hándicap de juegos",
          "period": "FULL_TIME",
          "line": 5.5,
          "isActive": true,
          "selections": [
            {
              "canonicalOutcome": "HOME",
              "rawName": "M. Landaluce +5.5",
              "odds": 1.54,
              "isActive": true,
              "selectionId": "2193442268",
              "line": 5.5
            },
            {
              "canonicalOutcome": "AWAY",
              "rawName": "M. Trungelliti -5.5",
              "odds": 2.25,
              "isActive": true,
              "selectionId": "2193442269",
              "line": -5.5
            }
          ],
          "marketId": "187|hcp=5.5"
        }
      ],
      "matchClock": {
        "period": "3er set",
        "periodId": "10",
        "running": true
      },
      "moreInfo": {
        "site": "/apuestas-deportivas/match/75088732",
        "tournamentId": 176533,
        "srTournamentId": "sr:tournament:3025",
        "periodName": "3er set",
        "gameScore": "30:40"
      },
      "periodScores": {
        "home": [
          1,
          7,
          2
        ],
        "away": [
          6,
          6,
          2
        ],
        "labels": [
          "1",
          "2",
          "3"
        ]
      },
      "score": {
        "home": "1",
        "away": "1"
      },
      "settlement": {
        "source": "winamax",
        "state": "in_play",
        "final": false,
        "inPlay": true,
        "lastSeenAt": "2026-09-28T07:03:06.345Z"
      },
      "slug": "/apuestas-deportivas/match/75088732",
      "sport": "tennis",
      "startTime": "2026-09-28T04:55:00.000Z",
      "statistics": {
        "sets": {
          "home": [
            1,
            7,
            2
          ],
          "away": [
            6,
            6,
            2
          ],
          "homeServe": false
        }
      }
    }
  ]
}

Results — 30 Days of In-Play History

GET /api/winamax-es/results?sport=tennis&limit=20
{
  "total": 16,
  "page": 1,
  "limit": 20,
  "totalPages": 1,
  "hasNextPage": false,
  "hasPrevPage": false,
  "results": [
    {
      "eventId": "75088970",
      "away": "Jaime Faria",
      "country": "ATP",
      "home": "Shintaro Mochizuki",
      "league": "Tokio, Previa",
      "matchClock": {
        "period": "1er set",
        "periodId": "8",
        "running": true
      },
      "moreInfo": {
        "site": "/apuestas-deportivas/match/75088970",
        "tournamentId": 176525,
        "srTournamentId": "sr:tournament:3031",
        "periodName": "1er set",
        "gameScore": "0:0"
      },
      "periodScores": {
        "home": [
          0
        ],
        "away": [
          1
        ],
        "labels": [
          "1"
        ]
      },
      "score": {
        "home": "0",
        "away": "0"
      },
      "settlement": {
        "source": "winamax",
        "state": "in_play",
        "final": false,
        "inPlay": true,
        "lastSeenAt": "2026-09-28T07:03:07.992Z"
      },
      "slug": "/apuestas-deportivas/match/75088970",
      "sport": "tennis",
      "startTime": "2026-09-28T06:50:00.000Z",
      "statistics": {
        "sets": {
          "home": [
            0
          ],
          "away": [
            1
          ],
          "homeServe": true
        }
      }
    },
    {
      "eventId": "75089414",
      "away": "Koki Matsuda",
      "country": "Challenger",
      "home": "Keisuke Saitoh",
      "league": "CH100 Jingshan, Previa",
      "matchClock": {
        "period": "1er set",
        "periodId": "8",
        "running": true
      },
      "moreInfo": {
        "site": "/apuestas-deportivas/match/75089414",
        "tournamentId": 192456,
        "srTournamentId": "sr:tournament:47347",
        "periodName": "1er set",
        "gameScore": "0:0"
      },
      "periodScores": {
        "home": [
          5
        ],
        "away": [
          2
        ],
        "labels": [
          "1"
        ]
      },
      "score": {
        "home": "0",
        "away": "0"
      },
      "settlement": {
        "source": "winamax",
        "state": "in_play",
        "final": false,
        "inPlay": true,
        "lastSeenAt": "2026-09-28T07:03:09.885Z"
      },
      "slug": "/apuestas-deportivas/match/75089414",
      "sport": "tennis",
      "startTime": "2026-09-28T06:30:00.000Z",
      "statistics": {
        "sets": {
          "home": [
            5
          ],
          "away": [
            2
          ],
          "homeServe": false
        }
      }
    },
    {
      "eventId": "75039882",
      "away": "Stefan Menichella",
      "country": "UTR Masculino",
      "home": "Seiya Nakanishi",
      "league": "Saitama",
      "matchClock": {
        "period": "1er set",
        "periodId": "8",
        "running": true
      },
      "moreInfo": {
        "site": "/apuestas-deportivas/match/75039882",
        "tournamentId": 176655,
        "srTournamentId": "sr:tournament:53392",
        "periodName": "1er set",
        "gameScore": "40:30"
      },
      "periodScores": {
        "home": [
          4
        ],
        "away": [
          1
        ],
        "labels": [
          "1"
        ]
      },
      "score": {
        "home": "0",
        "away": "0"
      },
      "settlement": {
        "source": "winamax",
        "state": "in_play",
        "final": false,
        "inPlay": true,
        "lastSeenAt": "2026-09-28T07:03:01.388Z"
      },
      "slug": "/apuestas-deportivas/match/75039882",
      "sport": "tennis",
      "startTime": "2026-09-28T06:25:00.000Z",
      "statistics": {
        "sets": {
          "home": [
            4
          ],
          "away": [
            1
          ],
          "homeServe": false
        }
      }
    }
  ]
}

Why Use PulseScore for Winamax ES Data

A Spanish Board, Canonically Mapped

Market names come through exactly as winamax.es prints them — Resultado, Doble oportunidad, Número total de goles, Hándicap asiático, Resultado exacto, Ambos equipos marcan, Mitad/final, Goleador — with Spanish country names and the comma decimals of the selections (Más de 2,5). Every market also carries a canonicalMarket and every selection a canonicalOutcome, so a MATCH_RESULT / HOME price lines up with the same market on Winamax France, Winamax Germany or any other book on PulseScore without translating a word.

Sportradar IDs — and One eventId Across Three Winamax Books

Each event carries moreInfo.srTournamentId (sr:tournament:8 for LaLiga) next to Winamax's own tournament ID and the round, and every marketId is written in Sportradar form — 1|type=prematch for the 1X2, 18|total=2.5 for a totals line, 66|hcp=-1 for a first-half handicap. The eventId is shared with the French and German Winamax books: every soccer fixture on both was on the Spanish board under the same ID, so the three price the same match side by side without a name-matching step.

Full Boards Weeks Ahead, 1,000+ Markets on Marquee Fixtures

Winamax ES prices its fixture list weeks out: club boards run 97 to 109 markets (the Premier League, LaLiga, Bundesliga, Serie A and Ligue 1 at 109 at peak), and marquee fixtures add a player board — shots, shots on target, tackles, assists, cards, fouls and goalkeeper saves per player — that took the Nations League matches past 1,000 markets. Corners, cards, goalscorers and Winamax's combination markets are all mapped to canonical types.

20 Sports Including Esports and Cricket

The widest of the Winamax books: soccer, tennis, basketball, ice hockey, American football, baseball, handball, volleyball, both rugby codes, darts, snooker, table tennis, boxing, MMA, cricket, futsal, field hockey, water polo and esports — Counter-Strike boards past 100 markets with per-map rounds lines, Valorant, Dota 2, League of Legends, Rainbow Six and the eSoccer leagues.

Per-Period Scores on Every Live Sport

Live documents carry periodScores with home and away arrays and matching labels on every sport — goals per half, points per set or quarter, maps on esports, the current frame on snooker — plus a score, a match clock with the Spanish period label and a numeric periodId, statistics.sets with the serve on tennis and table tennis, the current game score on tennis, and a settlement block. In-play tennis boards average 52 markets and peak past 90.

REST Plus WebSocket Streaming

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

Frequently Asked Questions

What data does the Winamax ES API provide?

PulseScore provides pre-match and live odds from Winamax Spain (winamax.es), the DGOJ-licensed Spanish edition of Winamax, across 20 sports, with a 30-day results archive. Events carry normalized market data with canonical market types and outcomes, decimal odds, the league and country, Sportradar tournament and market IDs, and the winamax.es match-page slug.

How is Winamax ES different from the Winamax and Winamax DE APIs?

They are three separately priced books from the same operator. Winamax ES is the Spanish-licensed sportsbook with a Spanish-language board, Spanish country names and the widest sport list of the three — 20 sports including esports, cricket, snooker, table tennis, MMA, futsal, field hockey and water polo. Winamax (winamax.fr) is the French ANJ-licensed book and Winamax DE (winamax.de) the German GGL-licensed one. All three share the same document shape, Sportradar-style IDs and the same eventId for the same fixture, so the same client code reads any of them.

Which sports are covered?

Twenty: Soccer, Tennis, Basketball, Ice Hockey, American Football, Baseball, Handball, Volleyball, Rugby Union, Rugby League, Darts, Snooker, Table Tennis, Boxing, MMA, Cricket, Futsal, Field Hockey, Water Polo and Esports. 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 Winamax ES soccer boards?

Fixtures are priced weeks ahead with the full board — on the snapshot 764 of 788 fixtures averaged 101 markets, with the Premier League, LaLiga, Bundesliga, Serie A and Ligue 1 at 109 at peak. Marquee fixtures add a player-prop board (shots, shots on target, tackles, assists, cards, fouls, goalkeeper saves) that took the Nations League matches to 750 markets on average and 1,061 at peak. Fifty-five canonical market types are mapped, including corners, cards and goalscorers.

Are the market and selection IDs stable?

marketId is a Sportradar-style market type plus specifier, not a per-event key: 1|type=prematch is the 1X2 on every soccer fixture, 18|total=2.5 the 2.5 goals line on every fixture that has one; player props embed the eventId and player ID in the specifier. Key a market on eventId plus marketId — the same marketId never repeats inside one event. selectionId is globally unique (347,079 distinct across 347,079 soccer selections on the snapshot), so use it when you want one key that never collides.

Are the market names in Spanish?

Yes, exactly as winamax.es prints them: Resultado, Ganador, Doble oportunidad, Número total de goles, Resultado exacto, Goleador, Mitad/final, with Sí/No and Más de/Menos de selections and a comma decimal in selection labels (Más de 2,5). Country names are Spanish too (España, Inglaterra, Estados Unidos). Every market also carries a language-independent canonicalMarket and every selection a canonicalOutcome, and the numeric line sits on the market, so nothing needs parsing.

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

Read settlement.final client-side. Winamax ES's results collection has no settlement.final index, so unlike some books there is no ?final= query parameter here. The archive is a 30-day mirror of the live feed: rows are written from the first in-play sighting and updated in place. A match the live feed drops without a final turns state 'unresolved' with delisted true and keeps its last score, so treat in_play and unresolved rows as snapshots.

Is live in-play data available?

Yes — /api/winamax-es/live-events over HTTP and a WebSocket for streaming. Live documents carry the in-play board, a score with the numbers as strings, a match clock with the Spanish period label and a numeric periodId, per-period scores on every sport, statistics.sets, the current game score 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 Winamax ES WebSocket?

Open wss://api.pulsescore.net/api/winamax-es/ws/live?key=YOUR_KEY&sport=tennis. The sport parameter is kebab-case (table-tennis, ice-hockey, american-football, field-hockey) and all 20 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.

How do I join Winamax ES events to other bookmakers?

Join on the canonical fields. canonicalMarket, canonicalOutcome and period mean the same thing on every book PulseScore serves, so a soccer MATCH_RESULT / HOME price from Winamax ES lines up with the same market from Bet365, Betway or Winamax France. Match the fixture on home, away and startTime, or on moreInfo.srTournamentId if your other feeds carry Sportradar tournament IDs — and against the other Winamax books, simply on eventId, which is the same on the ES, FR and DE boards.

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 Winamax ES and every other bookmaker on the platform.

Start Using the Winamax ES API Today

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