ComboBuilder ✨
Combine multiple selections into a single bet with correlated pricing
Overview
Authentication
Integration Workflow
Key Principle
JWT Bearer token issued by the authentication provider (Frontegg).
Include the token in the Authorization header as Bearer <token>.
Customer ID. Must match the tenantId claim in the JWT token.
Used for authorization — the customer must be registered for ComboBuilder access.
12345ComboBuilder request using ID-keyed source markets.
LSports sport ID
6046Possible values: LSports league/tournament ID. Required for Basketball to select the correct pricing model format.
Known values
| League | ID |
|---|---|
| NBA | 64 |
| WNBA | 761 |
| NCAA Basketball | 4045 |
| Euroleague | 33249 |
| MLB | 183 |
64LSports fixture ID. Each request must use a unique value so the engine treats it as an independent event. Reusing the same ID across requests can cause state caching issues on the engine side.
100001Optional external event reference ID.
Optional view/session reference ID.
Combined bet price successfully derived
Internal correlation ID for tracing.
a1b2c3d4-e5f6-7890-abcd-ef1234567890Combined margined decimal odds for all selections.
3.45Indices of selections that are required for the bet to be valid.
[0,1]Bad request — missing required fields or invalid format
Unauthorized — missing or invalid JWT Bearer token
Forbidden — the customer is not authorized for ComboBuilder.
Returned when the customerId header is missing/invalid or the customer
does not have ComboBuilder access.
Unprocessable Entity — pricing engine cannot process the request.
Error Types:
| errorCode | errorType | Description |
|---|---|---|
| 1001 | UnprocessableEntity | Missing source markets or state data to calculate the selection |
| 1002 | InvalidBetslip | The combination of selections on the betslip is invalid (e.g., mutually exclusive) |
| 1003 | UnwinnableBet | The combination of selections results in zero-win probability |
| 1004 | CalculationError | An error occurred while calculating the betslip |
Internal server error — unexpected error occurred
Not Implemented — selection type is not supported
Bad Gateway — failed to connect to pricing service
Service Unavailable — pricing service is temporarily unavailable
Gateway Timeout — pricing service request timed out
POST /v1/combobuilder HTTP/1.1
Host: combo-builder-gw.lsports.eu
Authorization: Bearer YOUR_SECRET_TOKEN
customerId: 1
Content-Type: application/json
Accept: */*
Content-Length: 632
{
"sportId": 6046,
"leagueId": 218,
"fixtureId": 10001,
"participants": [
{
"id": 1,
"name": "Liverpool",
"players": [
{
"id": 101,
"name": "Salah"
},
{
"id": 102,
"name": "Firmino"
}
]
},
{
"id": 2,
"name": "Chelsea",
"players": [
{
"id": 201,
"name": "Palmer"
},
{
"id": 202,
"name": "Jackson"
}
]
}
],
"selections": [
{
"marketId": 1,
"outcome": "1"
},
{
"marketId": 2,
"outcome": "O",
"line": 2.5
}
],
"markets": {
"1": {
"1": 2,
"2": 3.6,
"X": 3.4
},
"2": {
"1.5": {
"O": 1.3,
"U": 3.4
},
"2.5": {
"O": 1.9,
"U": 1.9
},
"3.5": {
"O": 3.6,
"U": 1.28
}
},
"3": {
"-1.5": {
"1": 3.4,
"2": 1.32
},
"-0.5": {
"1": 2,
"2": 1.8
},
"0.5": {
"1": 1.4,
"2": 2.9
}
},
"13": {
"0": {
"1": 2,
"2": 3.6,
"X": 3.4
},
"1": {
"1": 1.36,
"2": 6.5,
"X": 4.5
},
"-1": {
"1": 3.4,
"2": 2.1,
"X": 3.6
}
}
}
}{
"correlationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"price": 3.45,
"requiredSelections": [
0,
1
],
"selections": [
{
"bet": {
"marketId": 1,
"outcome": "1",
"line": null,
"playerId": null,
"period": null
},
"isRequired": true
}
]
}JWT Bearer token issued by the authentication provider (Frontegg).
Include the token in the Authorization header as Bearer <token>.
Customer ID. Must match the tenantId claim in the JWT token.
Used for authorization — the customer must be registered for ComboBuilder access.
12345LSports sport ID. Football (6046), Basketball (48242) and Baseball (154914) are supported.
6046Possible values: Optional filter — return data for a single market only.
1397List of supported markets with dependencies
Unauthorized — missing or invalid JWT Bearer token
Forbidden — the customer is not authorized for ComboBuilder.
Returned when the customerId header is missing/invalid or the customer
does not have ComboBuilder access.
POST /v1/markets HTTP/1.1
Host: combo-builder-gw.lsports.eu
Authorization: Bearer YOUR_SECRET_TOKEN
customerId: 1
Content-Type: application/json
Accept: */*
Content-Length: 16
{
"sportId": 6046
}{
"result": [
{
"sport": {
"id": 6046,
"name": "Football"
},
"market": {
"id": 1,
"name": "1X2"
},
"dependedMarketIds": [
{
"id": 13,
"name": "European Handicap"
},
{
"id": 2,
"name": "Under/Over"
},
{
"id": 3,
"name": "Asian Handicap"
}
]
},
{
"sport": {
"id": 6046,
"name": "Football"
},
"market": {
"id": 21,
"name": "Under/Over 1st Period"
},
"dependedMarketIds": [
{
"id": 13,
"name": "European Handicap"
},
{
"id": 1,
"name": "1X2"
},
{
"id": 3,
"name": "Asian Handicap"
},
{
"id": 41,
"name": "1st Period Winner"
},
{
"id": 2,
"name": "Under/Over"
}
]
},
{
"sport": {
"id": 6046,
"name": "Football"
},
"market": {
"id": 11,
"name": "Total Corners"
},
"dependedMarketIds": [
{
"id": 259,
"name": "Team With Most Corners"
}
]
},
{
"sport": {
"id": 6046,
"name": "Football"
},
"market": {
"id": 1397,
"name": "Under/Over Player Shots"
},
"dependedMarketIds": [
{
"id": 711,
"name": "Player To Score In Anytime"
}
]
},
{
"sport": {
"id": 6046,
"name": "Football"
},
"market": {
"id": 214,
"name": "Under/Over Cards"
},
"dependedMarketIds": null
},
{
"sport": {
"id": 48242,
"name": "Basketball"
},
"market": {
"id": 41,
"name": "1st Period Winner"
},
"dependedMarketIds": [
{
"id": 282,
"name": "1X2 Halftime"
}
]
},
{
"sport": {
"id": 48242,
"name": "Basketball"
},
"market": {
"id": 153,
"name": "Under/Over 1st Period - Home Team"
},
"dependedMarketIds": [
{
"id": 282,
"name": "1X2 Halftime"
}
]
},
{
"sport": {
"id": 48242,
"name": "Basketball"
},
"market": {
"id": 282,
"name": "1X2 Halftime"
},
"dependedMarketIds": null
},
{
"sport": {
"id": 48242,
"name": "Basketball"
},
"market": {
"id": 1,
"name": "1X2"
},
"dependedMarketIds": null
},
{
"sport": {
"id": 154914,
"name": "Baseball"
},
"market": {
"id": 1,
"name": "1X2"
},
"dependedMarketIds": [
{
"id": 2,
"name": "Under/Over"
},
{
"id": 17,
"name": "Both Teams to Score"
},
{
"id": 226,
"name": "12 Including Overtime"
}
]
},
{
"sport": {
"id": 154914,
"name": "Baseball"
},
"market": {
"id": 41,
"name": "First Inning Winner"
},
"dependedMarketIds": [
{
"id": 1,
"name": "1X2"
},
{
"id": 2,
"name": "Under/Over"
},
{
"id": 17,
"name": "Both Teams to Score"
},
{
"id": 21,
"name": "1st Period Over/Under"
},
{
"id": 64,
"name": "1st Inning - Handicap"
},
{
"id": 153,
"name": "1st Inning Home Total"
},
{
"id": 155,
"name": "1st Inning Away Total"
},
{
"id": 202,
"name": "1st Inning Winner (2-way)"
},
{
"id": 226,
"name": "12 Including Overtime"
},
{
"id": 1427,
"name": "1st Inning Over/Under"
}
]
},
{
"sport": {
"id": 154914,
"name": "Baseball"
},
"market": {
"id": 1637,
"name": "Under/Over Pitcher Strikeouts"
},
"dependedMarketIds": [
{
"id": 1,
"name": "1X2"
},
{
"id": 2,
"name": "Under/Over"
},
{
"id": 17,
"name": "Both Teams to Score"
},
{
"id": 226,
"name": "12 Including Overtime"
}
]
}
]
}Auto Endpoint — Simplified Integration
JWT Bearer token issued by the authentication provider (Frontegg).
Include the token in the Authorization header as Bearer <token>.
Customer ID. Must match the tenantId claim in the JWT token. Used for authorization.
12345Minimal request for the auto-filled combo price endpoint. Send fixtureId, inPlay and selections; the service resolves sport/league/location/participants and the source market odds (and scoreboard for in-play) from internal data by fixtureId. sportId/leagueId/locationId/participants are optional overrides. markets and scoreboard must not be sent.
LSports fixture ID to price. Must be a current fixture so the service can resolve it.
11001Whether the fixture is live. When true the service fetches the live scoreboard.
falseExample: falseOptional override. Resolved from the fixture when omitted.
6046Possible values: Optional override. Resolved from the fixture when omitted.
Optional override. Resolved from the fixture when omitted.
Optional external event reference ID.
Optional view/session reference ID.
Combined bet price successfully derived
Internal correlation ID for tracing.
a1b2c3d4-e5f6-7890-abcd-ef1234567890Combined margined decimal odds for all selections.
3.45Indices of selections that are required for the bet to be valid.
[0,1]Unauthorized — missing or invalid JWT Bearer token
Forbidden — the customer is not authorized for ComboBuilder.
Unprocessable Entity — invalid request, or the fixture's selected markets have no odds available.
| errorCode | errorType | Description |
|---|---|---|
| 2001 | ValidationError | Request validation failed (e.g. markets/scoreboard sent, or fixtureId/selections missing) |
| 2003 | CoverageGap | No odds are currently available for the fixture or the selected market(s) |
| 1001 | UnprocessableEntity | Required market data for the selected bets is not currently available for this fixture |
| 1002 | InvalidBetslip | The selected bets cannot be combined |
Service Unavailable — the fixture could not be resolved, live data is not available, or a temporary error occurred.
| errorCode | errorType | Description |
|---|---|---|
| 5004 | DataSourceUnavailable | Fixture could not be resolved (provide sportId), live data unavailable, or a transient error |
POST /v1/combobuilder/auto HTTP/1.1
Host: combo-builder-gw.lsports.eu
Authorization: Bearer YOUR_SECRET_TOKEN
customerId: 1
Content-Type: application/json
Accept: */*
Content-Length: 118
{
"fixtureId": 11001,
"inPlay": false,
"selections": [
{
"marketId": 1,
"outcome": "1"
},
{
"marketId": 2,
"outcome": "O",
"line": 2.5
}
]
}{
"correlationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"price": 3.45,
"requiredSelections": [
0,
1
],
"selections": [
{
"bet": {
"marketId": 1,
"outcome": "1",
"line": null,
"playerId": null,
"period": null
},
"isRequired": true
}
]
}Last updated
Was this helpful?