Skip to main content

Odds360 Table Tennis

Odds360 table tennis is integrated in the same way as the table-tennis bookmaker pages in sportmicro-frontend:

  1. discover the match from the SportMicro table-tennis feed
  2. request bookmaker-specific Odds360 prices for the same match_id
  3. keep the match refreshed with update and override streams

Service URLs

SportMicro table tennis data: https://table-tennis.sportmicro.com/
Odds360 table tennis feed: https://odds360.sportmicro.com/

Two access patterns

  • Public Odds360 API: https://odds360.sportmicro.com/table-tennis
  • Dashboard and bookmaker flow used by sportmicro-frontend: /bookmaker/{bookmakerId}/table-tennis/...

Supported table tennis odd groups

  • set-time
  • full-time

Odd group mapping

  • set-time -> odds.setTime
  • full-time -> odds.fullTime

1. Discover the match in SportMicro

Use the table-tennis data endpoints to obtain the match_id and metadata:

  • https://table-tennis.sportmicro.com/matches-live
  • https://table-tennis.sportmicro.com/matches-by-date
  • https://table-tennis.sportmicro.com/matches
  • https://table-tennis.sportmicro.com/leagues
  • https://table-tennis.sportmicro.com/classes

Important fields:

  • id or match_id
  • league_id
  • league_name
  • home_team_name
  • away_team_name
  • start_time
  • status_type

2. Confirm that the bookmaker can access table tennis

GET /bookmaker/{bookmakerId}

The response contains the bookmaker sports list.

3. Load the table tennis match list with prices

GET /bookmaker/{bookmakerId}/table-tennis/matches?page=0
GET /bookmaker/{bookmakerId}/table-tennis/matches?page=0&status=live
GET /bookmaker/{bookmakerId}/table-tennis/matches?page=0&league=Open

Available query parameters:

  • page
  • league
  • homeTeam
  • awayTeam
  • status with live or upcoming

Backend behavior:

  • page size is 100
  • postponed and finished matches are excluded
  • only matches with totalOdds > 0 are returned

4. Load the full table tennis odds payload

GET /bookmaker/{bookmakerId}/table-tennis/{matchId}

Important response shape:

{
"matchId": 2450840,
"sport": "table-tennis",
"odds": {
"setTime": {},
"fullTime": {}
},
"override": []
}

The frontend also loads:

GET /bookmaker/{bookmakerId}/table-tennis/{matchId}/verify

5. Use the raw Odds360 REST service

GET https://odds360.sportmicro.com/table-tennis
GET https://odds360.sportmicro.com/table-tennis-history
GET https://odds360.sportmicro.com/table-tennis-classes
GET https://odds360.sportmicro.com/table-tennis-leagues

6. Subscribe to live updates

Updates

wss://odds360.sportmicro.com/live/{bookmaker_id}/table-tennis/{match_id}/updates
https://odds360.sportmicro.com/live/{bookmaker_id}/table-tennis/{match_id}/updates

Overrides

wss://odds360.sportmicro.com/live/{bookmaker_id}/table-tennis/{match_id}/overrides
https://odds360.sportmicro.com/live/{bookmaker_id}/table-tennis/{match_id}/overrides

Dashboard subscriptions:

GET /bookmaker/{bookmakerId}/table-tennis/{matchId}/updates
GET /bookmaker/{bookmakerId}/table-tennis/{matchId}/overrides

7. Optional manual overrides

PATCH /bookmaker/{bookmakerId}/table-tennis/{matchId}/{oddType}

Typical body:

{
"oddKey": "market_name#outcome_key",
"oddValue": 1.85,
"durationSeconds": 3600,
"suspended": false
}

WebSocket example

const ws = new WebSocket(
"wss://odds360.sportmicro.com/live/<bookmaker_id>/table-tennis/<match_id>/updates"
);
ws.addEventListener("message", (ev) => console.log(JSON.parse(ev.data)));

SSE example

const es = new EventSource(
"https://odds360.sportmicro.com/live/<bookmaker_id>/table-tennis/<match_id>/updates"
);
es.addEventListener("message", (ev) => console.log(JSON.parse(ev.data)));

Notes

  • match_id should come from the table-tennis SportMicro match feed.
  • bookmaker_id is the UUID assigned to your Odds360 bookmaker.
  • /bookmaker/... routes are the authenticated dashboard routes used by sportmicro-frontend.
  • https://odds360.sportmicro.com/... routes are the public Odds360 API routes.
  • The frontend only shows odd groups that are present and non-empty for the match.