Extended bet details
By default a perform-transaction request identifies a bet only by context.betId. When extended bet details are enabled, the request also carries a context.extras.bet object describing more info about the bet — its type and total odds, and for every item the event, the market and the outcome the player picked, together with their results.
Enabling extras
context.extras is disabled by default and enabled per brand. Ask your GR8 Tech AM/PM to switch it on for your brand.
Nothing changes in your endpoint contract when it is enabled: extras is an additional optional field inside context, and context is already declared with additionalProperties: true. Wallets that ignore unknown context fields keep working unchanged.
When extras are sent
When enabled, extras is added to bet-related transactions — the ones that already carry context.betId.
The object is the same shape throughout the bet lifecycle, with two things that depend on the stage:
| Field | Behaviour |
|---|---|
bet.acceptTime | Sent only on settle-related transactions. |
bet.result, sourceOutcomes[].result | Unknown while the bet is still open; the settled result once the bet has been settled. |
Transactions are not performed during placing open bets.
Example
{
"id": "8b41f0c2-5d7a-4f19-9c3e-2a6d84b1e770_1740486677645468_1",
"currency": "EUR",
"platform": "sport",
"type": "deposit",
"createdAt": "2025-02-25T12:31:17Z",
"initiatedAt": "2025-02-25T12:31:17Z",
"context": {
"channel": "DESKTOP_AIR_PM",
"product": "sportsbook",
"reason": "settle",
"betId": "8b41f0c2-5d7a-4f19-9c3e-2a6d84b1e770",
"betAmount": 2,
"extras": {
"bet": {
"betType": "Express",
"betOdd": 5.8,
"acceptTime": "2025-02-25T12:31:15Z",
"result": "Win",
"items": [
{
"itemIndex": 0,
"eventStage": "Prematch",
"acceptedOdd": 2.9,
"event": {
"id": "12770432",
"eventName": "Bologna - AC Milan",
"sportTypeKey": "F",
"sportName": "Football",
"categoryId": "417acc9050e04117aff67d43981ed5b2",
"categoryName": "Italy",
"tournamentId": "6d80f3f3fa35431b80d50f516e4ce075",
"tournamentName": "Serie A",
"startTime": "2025-02-25T19:45:00Z",
"competitorType": "Team",
"competitors": [
{ "id": "339901", "competitorName": "Bologna" },
{ "id": "339919", "competitorName": "AC Milan" }
]
},
"sourceOutcomes": [
{
"sourceOutcomeIndex": 0,
"selectionKey": "[2,[],[0],1,0,[]]",
"acceptedOdd": 2.9,
"result": "Win",
"marketName": "Full-time result",
"outcomeName": "Bologna"
}
]
},
{
"itemIndex": 1,
"eventStage": "Live",
"acceptedOdd": 2.0,
"event": {
"id": "12793846",
"eventName": "Inter - Juventus",
"sportTypeKey": "F",
"sportName": "Football",
"categoryId": "417acc9050e04117aff67d43981ed5b2",
"categoryName": "Italy",
"tournamentId": "6d80f3f3fa35431b80d50f516e4ce075",
"tournamentName": "Serie A",
"startTime": "2025-02-25T17:00:00Z",
"competitorType": "Team",
"competitors": [
{ "id": "348084", "competitorName": "Inter" },
{ "id": "351979", "competitorName": "Juventus" }
]
},
"sourceOutcomes": [
{
"sourceOutcomeIndex": 0,
"selectionKey": "[2,[],[0],1,0,[]]",
"acceptedOdd": 2.0,
"result": "Win",
"marketName": "Full-time result",
"outcomeName": "Inter"
}
]
}
]
}
}
},
"amountBreakdown": {
"cash": "11.6",
"locked": "0",
"bonus": "0",
"retract": "0",
"tax": {
"cash": "0",
"locked": "0",
"bonus": "0",
"retract": "0"
}
}
}Everything outside context.extras is the ordinary transaction envelope — see perform-transaction for those fields, and Transaction Examples for the other transaction types.
Field reference
extras.bet
| Field | Type | Required | Description |
|---|---|---|---|
betType | string | Yes | Ordinar (single), Express (accumulator) or System |
betOdd | number | Yes | Total odds of the bet — for an express, the product of all item odds |
items | array | Yes | The bet’s items — one per event the player picked. See bet.items[] |
result | string | Yes | Result of the bet as a whole. See Results |
acceptTime | string | No | Bet acceptance time, ISO 8601 in UTC. Sent only on settle-related transactions |
bet.items[]
One entry per event in the bet. An Ordinar bet has exactly one item; Express and System bets have several.
An item normally holds a single outcome. If its sourceOutcomes array holds more than one, the item is a bet builder — several outcomes from the same event combined into one selection.
| Field | Type | Required | Description |
|---|---|---|---|
itemIndex | integer | Yes | Zero-based position of the item within the bet |
eventStage | string | Yes | Prematch or Live — the stage at which the item was accepted |
acceptedOdd | number | Yes | Odds accepted for this item |
event | object | Yes | The event the item is placed on. See items[].event |
sourceOutcomes | array | Yes | Outcomes picked within the item — more than one means a bet builder. See items[].sourceOutcomes[] |
items[].event
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Event identifier |
eventName | string | Yes | Event name, e.g. Bologna - AC Milan |
sportTypeKey | string | Yes | Short sport code — F, TT, H, … |
sportName | string | Yes | Sport name, e.g. Football |
categoryId | string | Yes | Category (country or region) identifier |
categoryName | string | Yes | Category name, e.g. Italy |
tournamentId | string | Yes | Tournament identifier |
tournamentName | string | Yes | Tournament name, e.g. Serie A |
startTime | string | Yes | Event start time, ISO 8601 in UTC |
competitorType | string | Yes | Kind of competitor, e.g. Team |
competitors | array | Yes | Objects with id and competitorName, both required |
items[].sourceOutcomes[]
| Field | Type | Required | Description |
|---|---|---|---|
sourceOutcomeIndex | integer | Yes | Zero-based position of the outcome within the item |
selectionKey | string | Yes | Opaque outcome identifier used for bet acceptance. Treat it as a string — do not parse it |
acceptedOdd | number | Yes | Odds accepted for this outcome |
result | string | Yes | Result of this outcome. See Results |
marketName | string | Yes | Market name, e.g. Full-time result |
outcomeName | string | Yes | Outcome name, e.g. Bologna |
Bet builder
A bet builder combines several outcomes from one event into a single selection, priced as one. In extras it appears as an item whose sourceOutcomes array has more than one entry:
{
"itemIndex": 0,
"eventStage": "Prematch",
"acceptedOdd": 5.24,
"sourceOutcomes": [
{
"sourceOutcomeIndex": 0,
"selectionKey": "[2,[],[0],1,0,[]]",
"acceptedOdd": 1.73,
"result": "Win",
"marketName": "Full-time result",
"outcomeName": "Bologna"
},
{
"sourceOutcomeIndex": 1,
"selectionKey": "[5,[1.5],[0],1,4,[]]",
"acceptedOdd": 2.03,
"result": "Win",
"marketName": "Total goals",
"outcomeName": "Over (1.5)"
},
{
"sourceOutcomeIndex": 2,
"selectionKey": "[8,[],[0],1,0,[]]",
"acceptedOdd": 1.65,
"result": "Lose",
"marketName": "Both teams to score",
"outcomeName": "Yes"
}
]
}Two things to keep in mind:
betTypedoes not tell you. A bet builder is a property of an item, not of the bet, so anOrdinarbet with a single item can still be a bet builder.sourceOutcomes.length > 1is the only reliable check.- The item’s
acceptedOddis not the product of its outcome odds. Bet builder outcomes are correlated and priced together, so the combined odds are calculated rather than multiplied — 5.24 above, where multiplying would give 5.79.
Results
bet.result is the result of the bet as a whole; sourceOutcomes[].result is the result of a single outcome inside it.
| Value | Meaning |
|---|---|
Unknown | Not settled yet |
Win | Won |
Lose | Lost |
Return | Voided — the stake is returned in full |
Return025 | Asian markets, half loss — half the stake is voided, half loses |
Return075 | Asian markets, half win — half the stake is voided, half wins |
TechnicalReturn | Technically voided — the stake is returned in full, as for Return |
Cashout | The bet was cashed out before its outcomes were settled. Applies to the bet as a whole |
DeadHeat | Dead heat — a place was shared between several competitors and the odds are reduced accordingly. Single bets only |
JSON Schema
context.extras JSON Schema
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"description": "The extras object inside the context of a perform-transaction request",
"properties": {
"bet": {
"type": "object",
"required": ["betType", "betOdd", "items", "result"],
"properties": {
"betType": {
"type": "string",
"enum": ["Ordinar", "Express", "System"]
},
"betOdd": {
"type": "number"
},
"acceptTime": {
"type": "string",
"format": "date-time",
"description": "Bet acceptance time. An ISO 8601 timestamp in UTC, e.g. 2025-02-25T12:31:15Z (this field is present only for settle-related transactions)"
},
"items": {
"type": "array",
"items": {
"type": "object",
"required": ["itemIndex", "eventStage", "acceptedOdd", "event", "sourceOutcomes"],
"properties": {
"itemIndex": {
"type": "integer"
},
"eventStage": {
"type": "string",
"enum": ["Prematch", "Live"]
},
"acceptedOdd": {
"type": "number"
},
"event": {
"type": "object",
"required": [
"id",
"eventName",
"sportTypeKey",
"sportName",
"categoryId",
"categoryName",
"tournamentId",
"tournamentName",
"startTime",
"competitorType",
"competitors"
],
"properties": {
"id": {
"type": "string"
},
"eventName": {
"type": "string"
},
"sportTypeKey": {
"type": "string",
"description": "The short 'sportName' ('F', 'TT', 'H'...)"
},
"sportName": {
"type": "string"
},
"categoryId": {
"type": "string"
},
"categoryName": {
"type": "string"
},
"tournamentId": {
"type": "string"
},
"tournamentName": {
"type": "string"
},
"startTime": {
"type": "string",
"format": "date-time",
"description": "An ISO 8601 timestamp in UTC, e.g. 2025-02-25T12:31:17Z"
},
"competitorType": {
"type": "string"
},
"competitors": {
"type": "array",
"items": {
"type": "object",
"required": ["id", "competitorName"],
"properties": {
"id": {
"type": "string"
},
"competitorName": {
"type": "string"
}
}
}
}
}
},
"sourceOutcomes": {
"type": "array",
"items": {
"type": "object",
"required": [
"sourceOutcomeIndex",
"selectionKey",
"acceptedOdd",
"result",
"marketName",
"outcomeName"
],
"properties": {
"sourceOutcomeIndex": {
"type": "integer"
},
"selectionKey": {
"type": "string"
},
"acceptedOdd": {
"type": "number"
},
"result": {
"type": "string"
},
"marketName": {
"type": "string"
},
"outcomeName": {
"type": "string"
}
}
}
}
}
}
},
"result": {
"type": "string",
"enum": [
"Unknown",
"Win",
"Lose",
"Return",
"Return025",
"Return075",
"TechnicalReturn",
"Cashout",
"DeadHeat"
]
}
}
}
}
}Related Documentation
- Perform Transaction - Main transaction endpoint documentation
- Transaction Examples - Request/response examples for all transaction types
- Transaction Types Reference - Complete type and reason mapping
- Requests Flow - How transactions follow each other through a bet’s lifecycle