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

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)

1

Configure the ticket context

Use the same TicketContext as single_accepted:

  • limitId: 123

  • Mobile channel

  • EndCustomer id: customer

2

Add one UF selection

Create exactly one Bet with one UF selection:

  • productId: "3"

  • eventId: sr:match:15050881

3

Attach non-decimal odds

Use the builder matching the selected format in the table above.

Decimal odds route to single_accepted instead.

4

Add a cash stake and send the ticket

Send the request with:

mbsSdk.getTicketProtocol().sendTicket(request)

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

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

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

On the Java client, assert against TicketResponse:

Java getter
Expected value

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):

For moneyline / hong-kong / indonesian / malay, the selection detail message uses the routing facet (american, hong_kong, …) while wire odds.type stays moneyline / hong-kong / …

Assert on getStatus(), getCode(), and getTicketId().

The [sandbox=…] / [oddsType=…] fragments are sandbox routing traces; production MTS will not use that format.

Common mistakes

Mistake
Result

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?