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

promo_stake

Goal: Place promo tickets as customer_promo using bonus or free (freebet facet) stake types; both are accepted.

Stake

Java builder

Wire stake[].type

Routing facet

Bonus

Stake.newBonusStakeBuilder()

"bonus"

bonus

Freebet

Stake.newFreeStakeBuilder()

"free"

freebet

How to build the request (Java SDK)

1

Set the end customer and selection

Use EndCustomer customer_promo and a UF decimal selection on sr:match:15050881.

2

Use a promo stake

Use Stake.newBonusStakeBuilder() or Stake.newFreeStakeBuilder()—not cash.

3

Send the ticket

Call sendTicket; both stake paths are accepted.

Java example — bonus

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 bonusReq = TicketRequest.newBuilder()
    .setTicketId("tid-promo-bonus")
    .setContext(TicketContext.newBuilder()
        .setLimitId(123L)
        .setChannel(Channel.newMobileChannelBuilder()
            .setLang("en")
            .setIp("127.0.0.1")
            .setDeviceId("deviceId123")
            .build())
        .setEndCustomer(EndCustomer.newBuilder().setId("customer_promo").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.newBonusStakeBuilder()
            .setAmount(new BigDecimal("10"))
            .setCurrency("EUR")
            .build())
        .build())
    .build();
TicketResponse bonusResp = mbsSdk.getTicketProtocol().sendTicket(bonusReq);
// ACCEPTED

// Freebet: Stake.newFreeStakeBuilder().setAmount(...).setCurrency("EUR").build();
// wire type "free" (routing facet freebet)

Wire JSON — bonus

Freebet wire stake: { "type": "free", "amount": "10", "currency": "EUR" }.

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.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_promo"

Mandatory (sandbox)

string

No (routing)

content.bets[].selections[].type

"uf"

Mandatory

string

No (routing)

content.bets[].stake[].type

"bonus" or "free"

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

Java getter
Expected value

getStatus()

AcceptanceStatus.ACCEPTED

getCode()

0

getMessage()

"accepted" (sandbox)

Bonus reply selection message includes stake=bonus; freebet includes stake=freebet.

Common mistakes

Mistake
Result

Cash stake with customer_promo

Does not match promo_stake routes

Confusing wire "free" with facet freebet

Facet is freebet; wire type is free

See also: Error responses in the parent manual.

Was this helpful?