The Bet Share module is a centralized hub for sharing and discovering bets within Virtual Stadium. It allows users to view all shared bets, contribute new ones, and revisit their previously shared bets. This feature enhances community engagement and provides social betting experiences.
The Bet Share module enables:
This module requires adapter integration to function properly and provide betting data.
The bet-share picker loads the user's placed tickets via the adapter tickets endpoint. The same contract powers Central Hub share-betslip screens. The widget auto-detects the delivery mode from the first response:
callback with the full tickets array; everything renders immediately.callback with the first batch (pageSize, hasMore); the widget fires onAction ticketsFetchMore when it needs the next page. Central Hub uses the same adapter contract.See Adapter integration and Ticket pagination below.
The Bet Share feature requires adapter integration to function properly. See the appropriate adapter type based on your integration needs:
To enable the copy bet functionality in the shared bets, you must first integrate and configure the Copy Bet feature. For detailed implementation instructions, see the Copy Bet Feature Documentation.
The copy bet button is not visible to the user who originally shared the bet, preventing self-copying and maintaining fair betting practices.
When your adapter signals paginated mode (pageSize or hasMore on the first tickets callback), the widget fires onAction with type ticketsFetchMore when it needs the next page. You load the next page from your backend and call the stored callback from the initial tickets() call with { newTickets, ... } — the widget does not invoke tickets() again and never calls callback itself.
For adapter implementation details and copy-pasteable examples, see:
Non-paginated integrations (full list in one callback) do not require ticketsFetchMore handling. See Track A.
The Bet Share module triggers various actions that can be handled through the onAction callback function for analytics, pagination, and user behavior monitoring.
Triggered when a user opens the bet share list interface.
type string required
Action type: "BetslipShareListOpen".
data object required
Action data containing channel information.
data.channelId string required
Unique identifier of the chat channel.
Triggered when a user closes the bet share list interface.
type string required
Action type: "BetslipShareListClose".
data object required
Action data with scope information.
data.channelId string required
Unique identifier of the chat channel.
data.scope string required
Scope identifier: "chat:betshare:list".
Triggered when a user clicks the back button within the bet share interface.
type string required
Action type: "BetslipShareListBack".
data object required
Action data containing channel information.
data.channelId string required
Unique identifier of the chat channel.
Triggered when a user attempts to open bet share but the feature is disabled.
type string required
Action type: "BetslipShareListDisabled".
data object required
Action data containing channel information.
data.channelId string required
Unique identifier of the chat channel.
Triggered when the bet-share picker needs the next page of tickets. Only fired when your adapter returned pageSize or hasMore: true on the initial tickets callback (paginated mode).
type string required
Action type: "ticketsFetchMore".
data object optional
data.cursor string optional
Opaque cursor from the previous TicketResponseV2 nextCursor field. Pass it to your backend to fetch the next batch, then call the stored callback with { newTickets, hasMore?, nextCursor? }.
Handling Bet Share Actions:
// Configure onAction callback to handle bet share events
SIR('addWidget', '#virtual-stadium-container', 'virtualStadium', {
shareNewBetButtonPosition 'top' | 'bottom' optional
Controls position of the "Share New Bet" button. Default is 'top'.
Share New Bet Button Position Configuration:
// Configure the position of the share new bet button
SIR('addWidget', '#virtual-stadium-container', 'virtualStadium', {
jwt: 'your-jwt-token',
channelId: 'your-channel-id',
shareNewBetButtonPosition: 'bottom' // or 'top'
});| Step | Who | Action |
|---|---|---|
| 1 | Widget | Calls adapter tickets(args, callback) |
| 2 | Your adapter | Returns first page: { tickets, pageSize, hasMore, nextCursor } |
| 3 | Widget | Renders first batch |
| 4 | Widget | Needs the next page; fires onAction({ type: 'ticketsFetchMore', data: { cursor } }) |
| 5 | Embed page | Calls your backend; invokes the stored callback with { newTickets, hasMore, nextCursor } (not a new tickets() call) |
| 6 | Widget | Appends tickets; repeats steps 4–5 until hasMore: false |