alt_stake
Goal: Two-step alt-stake flow for customer_alt_stake on sr:match:15050881.
Step 2: Submit with an alt-stake reference
Rebuild the ticket using the same customer and event. A new ticketId is fine.
Set TicketContext.setRef(TicketRef.newAltStakeTicketRefBuilder()...) using the prior ticket ID and signature. The sandbox accepts any non-empty demo values.
Expect an accepted response.
How to build the request (Java SDK)
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 com.sportradar.mbs.sdk.entities.ref.TicketRef;
// --- Step 1: no ref ---
TicketRequest step1 = TicketRequest.newBuilder()
.setTicketId("tid-alt-stake-1")
.setContext(TicketContext.newBuilder()
.setLimitId(123L)
.setChannel(Channel.newMobileChannelBuilder()
.setLang("en")
.setIp("127.0.0.1")
.setDeviceId("deviceId123")
.build())
.setEndCustomer(EndCustomer.newBuilder().setId("customer_alt_stake").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 r1 = mbsSdk.getTicketProtocol().sendTicket(step1);
// REJECTED, code -713; betDetails[0].getSuggestion() is alt-stake cash 950 EUR
// --- Step 2: alt-stake ref ---
TicketRequest step2 = TicketRequest.newBuilder()
.setTicketId("tid-alt-stake-2")
.setContext(TicketContext.newBuilder()
.setLimitId(123L)
.setChannel(Channel.newMobileChannelBuilder()
.setLang("en")
.setIp("127.0.0.1")
.setDeviceId("deviceId123")
.build())
.setEndCustomer(EndCustomer.newBuilder().setId("customer_alt_stake").build())
.setRef(TicketRef.newAltStakeTicketRefBuilder()
.setTicketId("tid-alt-stake-1")
.setTicketSignature("sandbox-signature")
.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("950")).setCurrency("EUR").build())
.build())
.build();
TicketResponse r2 = mbsSdk.getTicketProtocol().sendTicket(step2);
// ACCEPTED, code 0Wire JSON — Step 1 (no ref)
Wire JSON — Step 2 (alt-stake ref)
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
step ids above
Mandatory
string
No (echoed)
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_alt_stake"
Mandatory (sandbox)
string
No (routing)
content.context.ref
omitted (step 1) / alt-stake object (step 2)
Optional / Mandatory (step 2)
object
No (routing)
content.context.ref.type
"alt-stake" (step 2)
Mandatory when ref present
string
No (routing)
content.bets[].selections[].type
"uf"
Mandatory
string
No (routing)
content.bets[].selections[].eventId
"sr:match:15050881"
Mandatory
string
No (routing)
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
getStatus()
AcceptanceStatus.REJECTED
getCode()
-713
getMessage()
"Liability limit exceeded"
Suggestion
type alt-stake, cash stake amount "950", currency "EUR"
getStatus()
AcceptanceStatus.ACCEPTED
getCode()
0
getMessage()
"accepted" (sandbox)
Common mistakes
Step 2 without ref.type alt-stake
Stays on step-1 reject path
Wrong customer
Route mismatch
Expecting -703 instead of -713
Alt-stake step 1 uses -713
See also: Error responses in the parent manual.
Was this helpful?