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

single_live_async

Goal: Place a live UF single (productId "1") as customer_live_async_accepted and receive an immediate reply with code 202 / message PENDING. About ~3s later the sandbox logs an ACCEPTED ticket-reply JSON (no second SDK response).

How to build the request (Java SDK)

1

Use the same shell as single_accepted

Set the EndCustomer ID to customer_live_async_accepted.

2

Select the live UF event

Use productId "1", eventId sr:match:15050881, and decimal odds.

3

Send a cash stake ticket

Use a cash stake and call sendTicket.

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-live-async")
    .setContext(TicketContext.newBuilder()
        .setLimitId(123L)
        .setChannel(Channel.newMobileChannelBuilder()
            .setLang("en")
            .setIp("127.0.0.1")
            .setDeviceId("deviceId123")
            .build())
        .setEndCustomer(EndCustomer.newBuilder()
            .setId("customer_live_async_accepted")
            .build())
        .build())
    .setBets(Bet.newBuilder()
        .setBetId("bet-1")
        .setSelections(Selection.newUfSelectionBuilder()
            .setProductId("1")
            .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);
// AcceptanceStatus has no PENDING enum — assert getCode() == 202 and getMessage() equals "PENDING"

Wire JSON (what the SDK sends)

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.ticketId

"tid-live-async"

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_live_async_accepted"

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

"1"

Mandatory

string

No (live echo; not a routing facet)

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

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

getCode()

202

getMessage()

"PENDING"

getTicketId()

"tid-live-async" (echo)

getStatus()

No PENDING on AcceptanceStatus — do not assert ACCEPTED/REJECTED for the immediate reply

Wire JSON (Ticket 3.0 shape). Schema requires status; sandbox may omit a meaningful ACCEPTED/REJECTED mapping for this pending reply — prefer asserting code / message:

~3 seconds later the sandbox logs an ACCEPTED ticket-reply JSON. That is not delivered as a second sendTicket / gRPC response to the SDK client.

Common mistakes

Mistake
Result

productId still "3"

May not match live async expectations / echo

Wrong customer id

Different scenario or fallback

Asserting AcceptanceStatus.ACCEPTED on the immediate reply

Immediate reply is PENDING (code 202)

See also: Error responses in the parent manual.

Was this helpful?