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

single_accepted

Goal: Place a single-bet, single-selection prematch ticket and receive an accepted reply.

How to build the request (Java SDK)

1

Build TicketRequest

Build TicketRequest with a unique ticketId.

2

Configure TicketContext

Set limitId, a Channel (e.g. mobile), and EndCustomer with id customer.

3

Add one bet and selection

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

Build that selection with Selection.newUfSelectionBuilder() (JSON type "uf").

4

Set UF selection fields

Set UF fields: productId "3", eventId sr:match:15050881, plus marketId / outcomeId.

5

Attach odds and stake

Attach decimal odds: Odds.newDecimalOddsBuilder().setValue(...).

Attach cash stake: Stake.newCashStakeBuilder() with amount and currency.

6

Send the ticket

Send with mbsSdk.getTicketProtocol().sendTicket(request).

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.stake.Stake;
import java.math.BigDecimal;

TicketRequest request = TicketRequest.newBuilder()
    .setTicketId("tid-1")
    .setContext(TicketContext.newBuilder()
        .setLimitId(123L)
        .setChannel(Channel.newMobileChannelBuilder()
            .setLang("en")
            .setIp("127.0.0.1")
            .setDeviceId("deviceId123")
            .build())
        .setEndCustomer(EndCustomer.newBuilder()
            .setId("customer")
            .build())
        .build())
    .setBets(Bet.newBuilder()
        .setBetId("bet-1")
        .setSelections(Selection.newUfSelectionBuilder()
            .setProductId("3")
            .setEventId("sr:match:15050881")
            .setMarketId("m1")
            .setOutcomeId("o1")
            .setOdds(Odds.newDecimalOddsBuilder()
                .setValue(new BigDecimal("2.0"))
                .build())
            .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)

The SDK produces a Ticket 3.0 envelope around the ticket content. Example JSON (envelope ids may differ because the SDK generates correlationId / timestampUtc):

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-1"

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"

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

"uf"

Mandatory

string

No (routing)

content.bets[].selections[].eventId

"sr:match:15050881"

Mandatory

string

No (routing)

content.bets[].selections[].marketId

"m1"

Mandatory

string

No (echoed in reply)

content.bets[].selections[].outcomeId

"o1"

Mandatory

string

No (echoed in reply)

content.bets[].selections[].productId

"3"

Mandatory

string

No (echoed in reply)

content.bets[].selections[].odds

(object)

Mandatory

object

No

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

"decimal"

Mandatory

string

No (routing)

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

"2.0"

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). 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

On the Java client, assert against TicketResponse:

Java getter
Expected value

getStatus()

AcceptanceStatus.ACCEPTED

getCode()

0

getMessage()

"accepted" (sandbox)

getTicketId()

"tid-1" (echo)

getBetDetails()

Present; selection detail echoes the UF selection

Wire JSON (content type "ticket-reply"; fields live under content, not content.ticket):

Notes

  • The selection in the reply is echoed from your request (including productId and odds). Use response.getBetDetails() in Java.

  • Assert on getStatus(), getCode(), and getTicketId().

  • The [sandbox=…] fragment on the selection detail message is a sandbox routing trace; production MTS will not use that format.

Common mistakes

Mistake
Result

Wrong EndCustomer.setId (not "customer")

Different scenario or fallback rejection

Wrong eventId

Does not match single_accepted

Non-decimal odds (e.g. fractional builder) with this customer

May hit an odds-format accepted/rejected scenario instead

More than one bet or top-level selection

Schema validation (RESP_ERROR_REPLY / message about single-bet only) — not the -999 fallback

Missing channel / limitId on TicketContext

Invalid Ticket 3.0 request (schema)

See also: Error responses in the parent manual.

Was this helpful?