fallback
Goal: Show what happens when no sandbox route matches — a successful protocol round-trip with a rejected reply, code -999, message No matching sandbox scenario found.
Sandbox module name: fallback (fallback_scenario).
When this fires
Any supported operation whose facet tuple does not match a ROUTING_TABLE row (after wildcard / trailing-None relaxation) lands here. That includes:
sendTicket
ticket-reply
sendCancel
cancel-reply
sendCashoutInform / sendCashout
cashout-inform-reply / cashout-reply
sendMaxStake
max-stake-reply
sendTicketInform
ticket-inform-reply
sendExtSettlement
ext-settlement-reply
Handle with if on the typed response (getCode() == -999), not try/catch. Transport / schema failures are different — see parent Error responses.
Example: wrong placement customer + event
A ticket that looks like single_accepted but uses an unknown customer and/or wrong event does not match any placement row.
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-unknown")
.setContext(TicketContext.newBuilder()
.setLimitId(123L)
.setChannel(Channel.newMobileChannelBuilder()
.setLang("en")
.setIp("127.0.0.1")
.setDeviceId("deviceId123")
.build())
.setEndCustomer(EndCustomer.newBuilder()
.setId("customer_does_not_exist")
.build())
.build())
.setBets(Bet.newBuilder()
.setBetId("bet-1")
.setSelections(Selection.newUfSelectionBuilder()
.setProductId("3")
.setEventId("sr:match:99999999")
.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: REJECTED, getCode() == -999,
// getMessage() == "No matching sandbox scenario found"Wire JSON (request)
content.context.endCustomer.id
"customer_does_not_exist"
Present
string
No (routing — no match)
content.bets[].selections[].eventId
"sr:match:99999999"
Present
string
No (routing — no match)
Other ticket fields
as in single_accepted
as usual
—
as usual
Expected response (placement)
getStatus()
AcceptanceStatus.REJECTED
getCode()
-999
getMessage()
"No matching sandbox scenario found"
getTicketId()
"tid-unknown" (echo)
Same fallback on other operations
Examples that also yield -999 / No matching sandbox scenario found on the matching reply type:
sendCancel
Non-magic ticketId and punter not in customer_cancel_*
sendCashoutInform
Non-magic ticketId and punter not in customer_cashout_*
sendMaxStake
Nested event not sr:match:15050881
sendTicketInform
customer_inform but betValidations[0].code ≠ 3
sendExtSettlement
meta.punter.id ≠ customer_external
Common mistakes
Treating -999 as ServerErrorResponseException
Wrong — it is a rejected content reply on a successful round-trip
Confusing multi-bet schema error-reply with fallback
Multi-bet without a special customer can be error-reply / exception; unmatched routes are -999
Wrong customer or wrong event on placement
Either alone can fail the facet match
See also: Error responses in the parent manual.
Was this helpful?