For the complete documentation index, see llms.txt. This page is also available as Markdown.

accumulator_prematch

Goal: Place a ticket whose top-level selection is an accumulator and receive an accepted reply.

Sandbox module name: accumulator_prematch_accepted.

How to build the request (Java SDK)

1

Set the ticket context

Use the same TicketContext requirements as single_accepted (limitId, channel), but set the EndCustomer ID to customer_accumulator.

2

Add one bet and one top-level selection

Add exactly one Bet with exactly one top-level selection.

3

Build an accumulator selection

Build the selection with Selection.newAccumulatorSelectionBuilder() (JSON type "accumulator").

4

Add nested UF legs

Nest two or more UF legs via .setSelections(...) (Ticket 3.0 minItems: 2; the example uses three).

5

Build each UF leg

Build each leg with Selection.newUfSelectionBuilder() and decimal odds.

Set the first nested leg eventId to sr:match:15050881. Further legs may use other match IDs.

6

Attach a stake and send the ticket

Attach a cash stake and send with sendTicket.

Java example

import com.sportradar.mbs.sdk.entities.channel.Channel;
import com.sportradar.mbs.sdk.entities.common.AcceptanceStatus;
import com.sportradar.mbs.sdk.entities.common.Bet;
import com.sportradar.mbs.sdk.entities.common.EndCustomer;
import com.sportradar.mbs.sdk.entities.common.TicketContext;
import com.sportradar.mbs.sdk.entities.odds.Odds;
import com.sportradar.mbs.sdk.entities.request.TicketRequest;
import com.sportradar.mbs.sdk.entities.response.TicketResponse;
import com.sportradar.mbs.sdk.entities.selection.Selection;
import com.sportradar.mbs.sdk.entities.selection.UfSelection;
import com.sportradar.mbs.sdk.entities.stake.Stake;
import java.math.BigDecimal;

UfSelection leg1 = Selection.newUfSelectionBuilder()
    .setProductId("3")
    .setEventId("sr:match:15050881")
    .setMarketId("m1")
    .setOutcomeId("o1")
    .setOdds(Odds.newDecimalOddsBuilder().setValue(new BigDecimal("1.38")).build())
    .build();
UfSelection leg2 = Selection.newUfSelectionBuilder()
    .setProductId("3")
    .setEventId("sr:match:22222222")
    .setMarketId("m1")
    .setOutcomeId("o1")
    .setOdds(Odds.newDecimalOddsBuilder().setValue(new BigDecimal("1.38")).build())
    .build();
UfSelection leg3 = Selection.newUfSelectionBuilder()
    .setProductId("3")
    .setEventId("sr:match:33333333")
    .setMarketId("m1")
    .setOutcomeId("o1")
    .setOdds(Odds.newDecimalOddsBuilder().setValue(new BigDecimal("1.38")).build())
    .build();

TicketRequest request = TicketRequest.newBuilder()
    .setTicketId("tid-acca")
    .setContext(TicketContext.newBuilder()
        .setLimitId(123L)
        .setChannel(Channel.newMobileChannelBuilder()
            .setLang("en")
            .setIp("127.0.0.1")
            .setDeviceId("deviceId123")
            .build())
        .setEndCustomer(EndCustomer.newBuilder()
            .setId("customer_accumulator")
            .build())
        .build())
    .setBets(Bet.newBuilder()
        .setBetId("bet-1")
        .setSelections(Selection.newAccumulatorSelectionBuilder()
            .setSelections(leg1, leg2, leg3)
            .build())
        .setStake(Stake.newCashStakeBuilder()
            .setAmount(new BigDecimal("10"))
            .setCurrency("EUR")
            .build())
        .build())
    .build();

TicketResponse response = mbsSdk.getTicketProtocol().sendTicket(request);
// expect: response.getStatus() == AcceptanceStatus.ACCEPTED, getCode() == 0

Wire JSON (what the SDK sends)

Field name
Value
Mandatory / Optional
Data type
Ignored by sandbox

operatorId

9985

Mandatory

integer

Yes

correlationId

"corr-1"

Mandatory

string

No (echoed in reply)

timestampUtc

1710000000000

Mandatory

integer

Yes

operation

"ticket-placement"

Mandatory

string

No

version

"3.0"

Mandatory

string

No (echoed in reply)

content

(object)

Mandatory

object

No

content.type

"ticket"

Mandatory

string

No

content.ticketId

"tid-acca"

Mandatory

string

No (echoed in reply)

content.context

(object)

Mandatory

object

No

content.context.limitId

123

Mandatory

integer

Yes

content.context.channel

(object)

Mandatory

object

Yes

content.context.channel.type

"mobile"

Mandatory

string

Yes

content.context.channel.lang

"en"

Mandatory

string

Yes

content.context.channel.ip

"127.0.0.1"

Optional

string

Yes

content.context.channel.deviceId

"deviceId123"

Optional

string

Yes

content.context.endCustomer

(object)

Mandatory (sandbox)

object

No

content.context.endCustomer.id

"customer_accumulator"

Mandatory (sandbox)

string

No (routing)

content.bets

(1 bet)

Mandatory

array of object

No

content.bets[].betId

"bet-1"

Optional

string

No (echoed in reply)

content.bets[].selections

(1 selection)

Mandatory

array of object

No

content.bets[].selections[].type

"accumulator"

Mandatory

string

No (routing)

content.bets[].selections[].selections

(3 UF legs)

Mandatory

array of object

No

content.bets[].selections[].selections[].type

"uf"

Mandatory

string

No (echoed in reply)

content.bets[].selections[].selections[].eventId

"sr:match:15050881", "sr:match:22222222", "sr:match:33333333"

Mandatory

string

No (first leg: routing; all echoed)

content.bets[].selections[].selections[].marketId

"m1"

Mandatory

string

No (echoed in reply)

content.bets[].selections[].selections[].outcomeId

"o1"

Mandatory

string

No (echoed in reply)

content.bets[].selections[].selections[].productId

"3"

Mandatory

string

No (echoed in reply)

content.bets[].selections[].selections[].odds

(object)

Mandatory

object

No

content.bets[].selections[].selections[].odds.type

"decimal"

Mandatory

string

No (routing via first leg)

content.bets[].selections[].selections[].odds.value

"1.38"

Mandatory

string

No (echoed in reply)

content.bets[].stake

(1 stake)

Mandatory

array of object

No

content.bets[].stake[].type

"cash"

Mandatory

string

No (routing)

content.bets[].stake[].amount

"10"

Mandatory

string

Yes

content.bets[].stake[].currency

"EUR"

Mandatory

string

Yes

endCustomer / endCustomer.id are optional in the Ticket 3.0 schema but mandatory for this sandbox scenario (routing). Nested UF legs under accumulator.selections require at least two items (minItems: 2). Ignored by sandbox means the field is not used for routing and not used when building the reply (schema-only for the WebSocket / Ticket 3.0 envelope).

Expected response

Java getter
Expected value

getStatus()

AcceptanceStatus.ACCEPTED

getCode()

0

getMessage()

"accepted" (sandbox)

getTicketId()

"tid-acca" (echo)

Selection in getBetDetails()

Accumulator with nested UF legs echoed

Wire JSON example:

Common mistakes

Mistake
Result

EndCustomer.setId("customer") instead of "customer_accumulator"

Will not hit this scenario

Top-level selection still newUfSelectionBuilder()

Routes as a regular single, not accumulator

Fewer than two legs in newAccumulatorSelectionBuilder().setSelections(...)

Invalid Ticket 3.0 selection (schema minItems: 2)

First nested leg not sr:match:15050881

Route mismatch / fallback

Multiple top-level selections on the bet

Schema validation error (not the -999 “no scenario” fallback)

See also: Error responses in the parent manual.

Was this helpful?