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

reoffer

Goal: Two-step reoffer flow.

1

Submit the initial ticket

Use customer_reoffer_rejected with TicketRef.newReofferTicketRefBuilder().

The ticket is rejected with -430 Reoffer required, with a reoffer suggestion for a cash stake of 1000 EUR in automatic mode.

2

Submit the reoffer ticket

Use customer_reoffer_accepted with the same reoffer reference shape.

The ticket is accepted.

How to build the request (Java SDK)

1

Create a UF decimal single

Use sr:match:15050881 with a cash stake.

2

Set the reoffer reference

Always set context.ref with type reoffer:

TicketRef.newReofferTicketRefBuilder().setTicketId(...).setTicketSignature(...)

3

Select the customer ID

Choose the customer ID for step 1 or step 2.

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;
import com.sportradar.mbs.sdk.entities.ref.TicketRef;

TicketRef reofferRef = TicketRef.newReofferTicketRefBuilder()
    .setTicketId("prior-ticket-id")
    .setTicketSignature("prior-signature")
    .build();

// Step 1
TicketRequest step1 = TicketRequest.newBuilder()
    .setTicketId("tid-reoffer-rej")
    .setContext(TicketContext.newBuilder()
        .setLimitId(123L)
        .setChannel(Channel.newMobileChannelBuilder()
            .setLang("en")
            .setIp("127.0.0.1")
            .setDeviceId("deviceId123")
            .build())
        .setEndCustomer(EndCustomer.newBuilder().setId("customer_reoffer_rejected").build())
        .setRef(reofferRef)
        .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 -430; suggestion type reoffer, mode automatic, cash 1000 EUR

// Step 2 — same ref shape, accepted customer
TicketRequest step2 = TicketRequest.newBuilder()
    .setTicketId("tid-reoffer-acc")
    .setContext(TicketContext.newBuilder()
        .setLimitId(123L)
        .setChannel(Channel.newMobileChannelBuilder()
            .setLang("en")
            .setIp("127.0.0.1")
            .setDeviceId("deviceId123")
            .build())
        .setEndCustomer(EndCustomer.newBuilder().setId("customer_reoffer_accepted").build())
        .setRef(reofferRef)
        .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("1000")).setCurrency("EUR").build())
        .build())
    .build();
TicketResponse r2 = mbsSdk.getTicketProtocol().sendTicket(step2);
// ACCEPTED

Wire JSON — Step 1

Step 2 is identical except endCustomer.id = "customer_reoffer_accepted", ticketId = "tid-reoffer-acc", and typically stake "1000".

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.endCustomer.id

customer_reoffer_rejected / customer_reoffer_accepted

Mandatory (sandbox)

string

No (routing)

content.context.ref.type

"reoffer"

Mandatory (sandbox)

string

No (routing)

content.context.ref.ticketId

prior ticket id

Mandatory when ref present

string

Yes (demo)

content.context.ref.ticketSignature

prior signature

Mandatory when ref present

string

Yes (demo)

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

Step 1

Java getter
Expected value

getStatus()

AcceptanceStatus.REJECTED

getCode()

-430

getMessage()

"Reoffer required"

Suggestion

type reoffer, mode "automatic", cash "1000" EUR

Step 2

Java getter
Expected value

getStatus()

AcceptanceStatus.ACCEPTED

getCode()

0

getMessage()

"accepted" (sandbox)

Common mistakes

Mistake
Result

Missing ref.type reoffer

Does not match reoffer routes

Using rejected customer on step 2

Still rejected -430

Omitting ref entirely

Fallback / wrong scenario

See also: Error responses in the parent manual.

Was this helpful?