Place Bet API
- Betgate Cluster Integration
- Domain
-
Markets description
AmericanFootball AnyOther AustralianFootball Badminton Bandy Baseball Basketball Bowls BeachFootball BeachVolleyball Biathlon Boxing Chess Cricket Curling Darts Entertainment ESport FieldHockey Floorball Football Futsal Golf Handball HorceRacing IceHockey Kabaddi MMA MotorSport Olympics Politics Rugby Snooker Squash TableTennis Tennis UFC Volleyball Waterpolo
- Risk Management
- Client Console
-
Bet Settlement Rules
American Football Australian Football Badminton Bandy Baseball Basketball Beach Football Beach Volleyball Biathlon Boxing Chess Cricket Curling Cycling Darts E-sport Field Hockey Floorball Football Formula 1, Nascar, MotoGP Futsal Handball Horse Racing Ice Hockey Kabaddi MMA Rugby Snooker Squash Table Tennis Tennis UFC Volleyball Water Polo Virtual Sports Other sports
Table of Contents
Overview
Place Bet API allow clients to send bets and validate their actuality (check markets/selections statuses, actual prices) to prevent place bets on non actual data and build risk management reports which will protect provider and clients from abusing.
Glossary
Provider - B1 who provide data feed and place bet api for risk management
Client - Operator 3rd-party system who consume data feed and allow users to place bets on markets
Brand - One of the WL or bands of client
Player - Unique user from client side who place bets on markets
Security
Provider provides credentials (client id and client secret) for client with which client should login by token endpoint and get JWT token for accessing Place Bet API. Token has ttl 1 hour, so every 1 hour client should do new login and refresh JWT token.
JWT token should passed as HTTP Header Authorization
API
Environments
Stage:
Prod:
Token login
Method: HTTPS POST
URI: /api/v1/token
Credentials should be passed in URL. Example: https://clientId:clientSecret@stage-trading-bet-api.betgate.dev/api/v1/token
Response Example:
200 - Login is successfull and system created JWT token for client
{
"token": "Bearer jwtsecuretoken"
}401/403 - Credentials are wrong
Place bet
Method: HTTP POST
URI: /api/v1/sport/v1/bet
Headers:
| Name | Type | Description | Example |
| Authorization | String | Secure JWT token from /token endpoint |
Bearer dchfvndjnfvfvf |
| X-Player-Id | String | Unique user identified from client side | 13429493 |
| X-Operator-Id | String | Operator Id which will be provided by provider to client | SUPER_BET |
| X-Brand | String | Brand or Whitelable name | super-bet247.com |
| X-Player-Currency | String | User Currency | EUR |
Body request:
{
"items": [
{
"eventId": "105600",
"odds": 1.9,
"sourceOutcomes": [
{
"selection": "[2,[],[0],1,3,[]]",
"odds": 1.9
}
]
}
],
"amount": 100,
"betType": "Ordinar",
"oddsChangePolicy": "Any",
"marketChangePolicy": "None",
"systemSize": 80,
"transactionId": "432e627b-f8d1-45ef-9ae9-03632956548b"
}| Name | Type | Description | Example |
| items | array | Selected outcomes for bet | |
| items[0].eventId | string | Event Id from B1 Data feed | 105600 |
| items[0].odds | Decimal | Odds on which user placed bet | 1.9 |
| items[0].sourceOutcomes | array | Outcomes that are included. Info about selection and price on which user placed bet | |
| items[0].sourceOutcomes[0].selection | string | Selection from B1 Data feed on which user placed bet | [2,[],[0],1,3,[]] |
| items[0].sourceOutcomes[0].odds | Decimal | Odds on which user placed bet | 1.9 |
| amount | Decimal | User bet amount | 100 |
| betType | Enum(Ordinar) | Type bet. Possible values:["Ordinar", "Express"]. | Ordinar |
| oddsChangePolicy | Enum(Any) | Odds change policy. Currently support only Any | Any |
| marketChangePolicy | Enum(None) | Market Change Policy. Currently support only None | None |
| systemSize | Decimal | For B2B, part which send to provider | 20 |
| transactionId | string | Unique identifier of bet from client side | 1234ff45 |
Bet type
Ordinar - a wager on a specific outcome of a single event. The winnings are calculated by multiplying the bet amount by the odds of the outcome.
Express - a wager on multiple independent events. An express bet wins only when all of its component outcomes are successful; if even one outcome is unsuccessful, the express bet is lost. The winnings are calculated by multiplying the bet amount by the odds for all the outcomes included in the express bet."
Responses:
200 - OK, bet is accepted by provider
{
"betId": "432e627b-f8d1-45ef-9ae9-03632956548b",
"betOdd": 15,
"betDate": "2026-02-15T11:15:40.252615Z",
"possiblePayout": 1500,
"items": [
{
"acceptedOdd": 15,
"sourceOutcomeSelectionKeys": [
"[2,[],[0],1,0,[]]"
]
}
],
"specialBetTypes": []
}400 - Bad Request
{
"message": "Bet odds were changed. ",
"errors": {
"common": {
"actualOdds": 15.00,
"betOdds": 20
}
}
}
{
"message": "Selection is not found. ",
"errors": {
"common": {}
}
}
403/401 - Access denied
Express Bets
POST /api/v1/sport/v1/bet · betType: "Express".
Headers are the same as for Ordinar.
Request
An Express carries one stake over 2 to 20 legs, one leg per event. eventId must be unique across items, and each item holds exactly one selection.
{
"items": [
{
"eventId": "105600",
"odds": 1.9,
"sourceOutcomes": [
{ "selection": "[2,[],[0],1,3,[]]", "odds": 1.9 }
]
},
{
"eventId": "105601",
"odds": 2.1,
"sourceOutcomes": [
{ "selection": "[2,[],[0],1,1,[]]", "odds": 2.1 }
]
},
{
"eventId": "105602",
"odds": 1.5,
"sourceOutcomes": [
{ "selection": "[5,[2.5],[0],1,4,[]]", "odds": 1.5 }
]
}
],
"amount": 100,
"betType": "Express",
"oddsChangePolicy": "AcceptBetterOdds",
"marketChangePolicy": "None",
"systemSize": 100,
"transactionId": "432e627b-f8d1-45ef-9ae9-03632956548b"
}| Name | Type | Description | Example |
| items | array | Legs of the betslip, one entry per event. 2 to 20 entries | |
| items[].eventId | string | Event Id. Must be unique across all items | 105600 |
| items[].odds | number | Leg price, greater than zero. Equals sourceOutcomes[0].odds | 1.9 |
| items[].sourceOutcomes | array | Exactly one element per item | |
| items[].sourceOutcomes[].selection | string | Selection key | [2,[],[0],1,3,[]] |
| items[].sourceOutcomes[].odds | number | Same price as items[].odds | 1.9 |
| amount | number | Total stake for the whole betslip. There is no per-leg stake | 100 |
| betType | string | Express for a multiple, Ordinar for a single. Case-insensitive | Express |
| oddsChangePolicy | string | KeepOdds or AcceptBetterOdds only. Any other value, including null, is rejected with an empty 400 body | AcceptBetterOdds |
| marketChangePolicy | string | Accepted, not used | None |
| systemSize | number | Accepted, not used | 100 |
| transactionId | string | Idempotency key, returned back as betId. A repeat creates no second bet | 432e627b-f8d1-45ef-9ae9-03632956548b |
Response 200
betOdd is the exact product of the accepted leg prices and possiblePayout is exactly amount * betOdd. Neither is rounded, so three prices with two decimals can return up to six decimals.
{
"betId": "432e627b-f8d1-45ef-9ae9-03632956548b",
"betOdd": 5.985,
"betDate": "2026-09-29T08:43:58.488Z",
"possiblePayout": 598.5,
"items": [
{ "acceptedOdd": 1.9, "sourceOutcomeSelectionKeys": ["[2,[],[0],1,3,[]]"] },
{ "acceptedOdd": 2.1, "sourceOutcomeSelectionKeys": ["[2,[],[0],1,1,[]]"] },
{ "acceptedOdd": 1.5, "sourceOutcomeSelectionKeys": ["[5,[2.5],[0],1,4,[]]"] }
],
"specialBetTypes": []
}| Name | Type | Description | Example |
| betId | string | Echoes the transactionId that was sent | 432e627b-f8d1-45ef-9ae9-03632956548b |
| betOdd | number | Product of all acceptedOdd values | 5.985 |
| betDate | string | Acceptance time, ISO 8601 UTC | 2026-09-29T08:43:58.488Z |
| possiblePayout | number | amount multiplied by betOdd | 598.5 |
| items | array | One entry per leg, in the same order as the request | |
| items[].acceptedOdd | number | Accepted price of that leg | 1.9 |
| items[].sourceOutcomeSelectionKeys | array | One element, the selection accepted for that leg | [2,[],[0],1,3,[]] |
| specialBetTypes | array | Always empty |
Responce 400
Messages new to Express. Every message value ends with a trailing space.
| Message | Cause | errors.common carries |
| Express bet requires at least 2 items. | Fewer than two items | expectedBetItemsCount, actualBetItemsCount |
| Express bet allows at most 20 items. | More items than the leg limit | expectedBetItemsCount, actualBetItemsCount |
| Duplicate event in bet items. | The same eventId on two items | nothing |
| Bet odds are invalid. | A price is zero or negative | betOdds |
| Bet odds exceed the maximum. | The product of the leg prices is above the limit | betOdds |
{
"message": "Express bet requires at least 2 items. ",
"errors": {
"common": {
"expectedBetItemsCount": 2,
"actualBetItemsCount": 1
}
}
}The Ordinar messages are unchanged and also apply: Selection is not found., Market is SUSPENDED., Selection is SUSPENDED., Bet odds were changed.. On an Express they describe the first leg that failed, not the whole betslip, and validation stops there.