odds_format_accepted
Goal: Place a single UF prematch ticket with non-decimal odds and receive an accepted reply.
Sandbox module name: odds_format_accepted. Customer: customer. Same UF single as single_accepted, but odds are fractional / moneyline / hong-kong / indonesian / malay.
Wire odds.type
Routing facet
Example
Java builder
fractional
fractional
3/1
Odds.newFractionalOddsBuilder().setNumerator / setDenominator
moneyline
american
200
Odds.newMoneylineOddsBuilder().setValue
hong-kong
hong_kong
1.5
Odds.newHongKongOddsBuilder().setValue
indonesian
indonesian
1.5
Odds.newIndonesianOddsBuilder().setValue
malay
malay
0.8
Odds.newMalayOddsBuilder().setValue
How to build the request (Java SDK)
Java example
Fractional shown in full. Swap the odds builder for the other formats.
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;
import java.math.BigInteger;
TicketRequest request = TicketRequest.newBuilder()
.setTicketId("tid-frac-acc")
.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.newFractionalOddsBuilder()
.setNumerator(BigInteger.valueOf(3))
.setDenominator(BigInteger.valueOf(1))
.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
// Other formats (same ticket shell):
// Odds.newMoneylineOddsBuilder().setValue(new BigDecimal("200")).build();
// Odds.newHongKongOddsBuilder().setValue(new BigDecimal("1.5")).build();
// Odds.newIndonesianOddsBuilder().setValue(new BigDecimal("1.5")).build();
// Odds.newMalayOddsBuilder().setValue(new BigDecimal("0.8")).build();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):
Other odds objects
Format
Wire odds
Moneyline
{ "type": "moneyline", "value": "200" }
Hong Kong
{ "type": "hong-kong", "value": "1.5" }
Indonesian
{ "type": "indonesian", "value": "1.5" }
Malay
{ "type": "malay", "value": "0.8" }
Field reference
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-frac-acc"
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
"fractional" (or moneyline / hong-kong / indonesian / malay)
Mandatory
string
No (routing via odds_format facet)
content.bets[].selections[].odds.numerator / denominator
"3" / "1"
Mandatory (fractional)
string
No (echoed)
content.bets[].selections[].odds.value
per format table
Mandatory (non-fractional)
string
No (echoed)
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-frac-acc" (echo)
getBetDetails()
Present; selection detail includes oddsType + sandbox trace
Wire JSON (content type "ticket-reply"; fields live under content, not content.ticket):
Common mistakes
Decimal odds with this customer
Routes to single_accepted
Wrong EndCustomer.setId
Different scenario or fallback rejection
Wrong eventId
Route mismatch / fallback
Confusing wire type moneyline with facet american
Facet is american; wire type remains moneyline
See also: Error responses in the parent manual.
Was this helpful?