single_accepted
Goal: Place a single-bet, single-selection prematch ticket and receive an accepted reply.
How to build the request (Java SDK)
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() == 0Wire 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):
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
Expected response
On the Java client, assert against TicketResponse:
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
productIdand odds). Useresponse.getBetDetails()in Java.Assert on
getStatus(),getCode(), andgetTicketId().The
[sandbox=…]fragment on the selection detail message is a sandbox routing trace; production MTS will not use that format.
Common mistakes
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?