Free bet365 Table Tennis odds API
Every bet365 table tennis market, pre-match and in-play, as JSON over REST and WebSocket. No key, no sign-up.
Overview
MoviOdds serves only bet365's table tennis prices. You get every market bet365 lists for a match, from the same GET /odds endpoint and WebSocket used for every sport. Setka Cup, Czech Liga Pro, TT Elite Series, TT Cup and WTT events.
Leagues
Every league bet365 lists, including:
- Setka Cup
- Czech Liga Pro
- TT Elite Series
- WTT China Smash Women
- WTT China Smash
- TT Cup
- Setka Cup Women
- WTT China Smash MD
Markets
- To Win Match
- Game handicap
- Total points
- Per-game winner and totals
The match Game grid (Line, Total, To Win) is group 920000 before the match; each game has its own grid (1st Game is 920096). Every price carries its group_id and group_name; grid markets also carry the team in side and the market in line. Race to, Lead After and Odd/Even cells carry their target in line instead, like "5" or "Game 2".
Quickstart
curl --compressed "https://moviodds.com/odds?sport=table_tennis" curl --compressed "https://moviodds.com/odds?sport=table_tennis&in_play=1"
import requests
data = requests.get("https://moviodds.com/odds", params={"sport": "table_tennis"}, timeout=30).json()
for match in data["matches"]:
print(match["league"], "|", match["home"], "v", match["away"], "|", len(match["quotes"]), "prices")
Sample response
A real /odds?sport=table_tennis match, trimmed to a few prices:
{
"matches": [
{
"id": "202290048",
"sport": "table_tennis",
"home": "Adam Kosacky",
"away": "Michal Brozek",
"league": "TT Cup",
"kickoff_utc": "2026-10-03T18:55:00Z",
"in_play": false,
"market_count": 2,
"quotes": [
{
"fixture_id": "202290048",
"group_id": "920000",
"group_name": "Game",
"side": "Adam Kosacky",
"line": "To Win",
"odds_dec": 1.8,
"odds_frac": "4/5",
"sel_id": "133521074"
},
{
"fixture_id": "202290048",
"group_id": "920000",
"group_name": "Game",
"side": "Michal Brozek",
"line": "To Win",
"odds_dec": 1.9090909090909092,
"odds_frac": "10/11",
"sel_id": "133521076"
},
…
]
}
]
}
Live prices
In-play table tennis prices are pushed over the WebSocket within about a second of bet365 changing them. Connect to wss://moviodds.com/ws and send {"op":"subscribe"} to receive every price change (WebSocket guide). See the API docs for loading the board and applying updates, and every sport for the other 23.
FAQ
Is the bet365 Table Tennis odds API free?
Yes. GET /odds needs no sign-up and no key. Limits are 300 requests per minute and 25 WebSocket connections per IP.
Are these really bet365 odds?
Yes, exclusively bet365's own prices, pre-match and in-play. MoviOdds is an independent project and is not affiliated with bet365.
Do you have live table tennis odds?
Yes. Live matches carry in_play: true. In-play table tennis prices are pushed over the WebSocket within about a second of bet365 changing them.
Which markets are included?
Every market bet365 prices for a match. Each price carries its group_id and group_name so you can filter.
Do you have historical odds, closing lines and results?
Yes. /history?fi=<match> returns every recorded price move, /closing?fi=<match> each selection's closing line (its last price before kickoff), and /results finished matches with their final score. See historical odds, closing lines and the API docs.