Multi-Table Tournaments (MTTs)
The Strategy API supports Multi-Table Tournament (MTT) games. Given the tournament context, the API provides detailed information about the current game state and suggests a strategy for the next action to be taken.
This documentation complements the general API documentation. For further details on topics such as authentication, permissions, or access, please refer to the access API documentation: Holdem API Summary. For doubts about the game itself and request and response fields not covered in this documentation, please refer to the main API documentation: No limit texas hold'em Game API Reference.
Request
MTT requests use the same request.hand structure as regular requests.
However, all tournament-specific information is included in an optional field called mtt within the request, as shown below:
{
"request_id": "1",
"hand": {...},
"mtt": {...}
}MTT structure
The mtt field must contain all relevant tournament details. It is essential that the data in the hand field aligns with the tournament information.
For more specifics, refer to the MTT Validation section. Below is the mtt structure, along with a description of each field:
"mtt":{
"prize_pool":10000.0,
"total_registered_players":16,
"current_level":1,
"players":[<MttPlayer-object>],
"payout_structure":[<PositionPayout-object>],
"blind_structure":[<MttBlind-object>]
}MTT fields
All fields are required.
| Field | Type | Description |
|---|---|---|
prize_pool | float | The total sum of prizes for all rewarded positions in the tournament |
total_registered_players | integer | Total number of players, including active and eliminated players. (Active players are those with a positive chip stack, while eliminated players are represented by entries with a stack value of zero) |
current_level | integer | Represents the current blind level of the tournament, used along with the blind_structure field |
players | MttPlayer-object | A list of all active players in the tournament, including those across all tables. |
payout_structure | PositionPayout-object | A list of prizes by rank position in the tournament. |
blind_structure | MttBlind-object | A list that details the progressive blind structures at each game level. |
MttPlayer-object
MttPlayer object represents an active player in the tournament. The information needs to be accurate at the time the current hand has started. For each active player the necessary information is: a non-zero stack value and a position in the tournament called rank. This information is constantly changing, so please make sure to update the information accordingly. Active players are those with a positive chip stack, while eliminated players are represented by entries with a stack value of zero.
Please note that there can be a difference between the value in the field mtt.total_registered_players and the number of players in the field mtt.players.
This happens because the registered players field accounts for eliminated players as well (zero stack value), while the players field only accounts for active players.
All players in request.hand.players must be included in the mtt.players field, with their stack value matching.
"players":[
{"stack":13235, "rank":1},
{"stack":11500, "rank":2},
(...)
]| Field | Type | Description |
|---|---|---|
stack | integer | The current stack of the player |
rank | integer | The rank of the player in the tournament |
PositionPayout-object
It details the prizes by rank position in the tournament.
This information is usually fixed for simple tournaments with a single payout structure.
The sum of all rewarded positions in the payout structure must equal the mtt.prize_pool value for simple tournaments.
"payout_structure":[
{"position":1, "prize_value":5000.0},
{"position":2, "prize_value":2500.0},
{"position":3, "prize_value":0.0},
(...)
]| Field | Type | Description |
|---|---|---|
position | integer | The rank position of the prize |
prize_value | float | The value of the prize for the position, expressed in the same currency as the mtt.prize_pool value |
MttBlind-object
Multiple tournaments can have progressive blinds, and this structure handles them.
Each MttBlind object represents a blind level in the tournament.
The list can contain multiple objects, representing different blind levels, and the API will know which is the current blind level by the field mtt.current_level.
If the tournament has a single blind structure, the list will contain only one object, but even so, it needs to match the mtt.current_level field.
Please note that the order in which the objects appear in the list does not affect the API level selection; the level selection is based on the mtt.current_level field.
The current_level listed in the blind structure must contain the same ante, big blind and small blind values as the request.hand blinds and antes fields.
"blind_structure":[
{"level":1, "ante":50, "big_blind":100, "small_blind":50},
{"level":2, "ante":100, "big_blind":200, "small_blind":100},
{"level":3, "ante":500, "big_blind":500, "small_blind":250},
(...)
]| Field | Type | Description |
|---|---|---|
level | integer | The level of the blind, used along with the mtt.current_level field to know which blind level is currently active |
ante | integer | The ante value |
big_blind | integer | The big blind |
small_blind | integer | The small blind |
Response Format
The response uses the standard API format represented in the main documentation: No limit texas hold'em Game API Reference.
Validation
The MTT format relies on the existing hand validations and introduces a specific set of additional validations:
- There must be at least two players.
- There must be at least one MttBlind object.
- At least one MttBlind object must be fully filled.
- The current level must correspond to an existing blind level.
- The payout structure must have no more positions than the total number of registered players.
- The sum of all rewarded positions in the payout structure must equal the total prize pool.
- The
request.handdata must match therequest.mttdata.- The blinds and antes in the hand must match the corresponding values in the current blind level from the MTT information. This means that the
request.hand.big_blind,request.hand.small_blindandrequest.hand.antemust match theante,small_blindandbig_blindvalues in the current MttBlind object. - The MTT information must include all players from the hand, with matching stacks. This means that all players in
request.hand.playersmust be included in therequest.mtt.playersfield, with their stack value matching.
- The blinds and antes in the hand must match the corresponding values in the current blind level from the MTT information. This means that the
Ante sizing
The API supports ante values of different sizes. However, the underlying model is trained to perform best when the ante is around 33 percent of the big blind value. We strongly recommend keeping the ante well below 50 percent of the big blind value, as higher values may lead to suboptimal results.
Example
Request
In the example below, we can see a request for an MTT game. The following MTT validations are checked:
- Blinds:
- There is a single MttBlind object, and it matches the current level.
- This single level contains the same ante, big blind and small blind values as the
request.hand.
- Players:
- All players in
request.hand.playersare listed inrequest.mtt.playerswith their matching stacks and properly ranked. - Note that players with the same stack can be ranked sequentially.
- All players in
- Payout Structure:
- The sum of all rewarded positions in the payout structure equals the
request.mtt.prize_poolvalue.
- The sum of all rewarded positions in the payout structure equals the
{
"request_id":"1",
"hand":{
"gameuuid":"hand-example-086",
"game_type":"nlhe",
"game_mode_code":"normal",
"actions":{
"entries":[
{"action":"fold"},
{"action":"fold"},
{"action":"fold"},
{"action":"raise", "amount":532},
{"action":"raise", "amount":1892},
{"action":"raise", "amount":9950},
{"action":"fold"}
]
},
"players":[
{"uid":"34574158", "seat_no":0, "stack":8360},
{"uid":"34574162", "seat_no":1, "stack":13235, "hole_cards":"AsAd"},
{"uid":"34574161", "seat_no":2, "stack":9235},
{"uid":"34574159", "seat_no":3, "stack":10235},
{"uid":"34574160", "seat_no":4, "stack":7235},
{"uid":"34574164", "seat_no":5, "stack":10235},
{"uid":"34574169", "seat_no":6, "stack":11000},
{"uid":"34574163", "seat_no":7, "stack":11500}
],
"big_blind":100,
"ante":33,
"dealer_seat":7,
"sb_seat":0,
"bb_seat":1,
"straddle_seat":-1
},
"mtt":{
"prize_pool":10000.0,
"total_registered_players":16,
"current_level":1,
"players":[
{"stack":13235, "rank":1},
{"stack":11500, "rank":2},
{"stack":11250, "rank":3},
{"stack":11000, "rank":4},
{"stack":10500, "rank":5},
{"stack":10235, "rank":6},
{"stack":10235, "rank":7},
{"stack":9235, "rank":8},
{"stack":9000, "rank":9},
{"stack":8360, "rank":10},
{"stack":7235, "rank":11},
{"stack":7000, "rank":12},
{"stack":6500, "rank":13}
],
"payout_structure":[
{"position":1, "prize_value":5000.0},
{"position":2, "prize_value":2500.0},
{"position":3, "prize_value":1000.0},
{"position":4, "prize_value":500.0},
{"position":5, "prize_value":300.0},
{"position":6, "prize_value":200.0},
{"position":7, "prize_value":200.0},
{"position":8, "prize_value":200.0},
{"position":9, "prize_value":100.0},
{"position":10, "prize_value":0.0}
],
"blind_structure":[
{"level":1, "ante":33, "big_blind":100, "small_blind":50}
]
}
}Response
The API response for the request above provides a strategy with an all-in action with a 99 percent probability.
{
"request": {...},
"solution_information": {...},
"strategy": {
"actions": [
{
"action": {
"action": "fold"
},
"action_name": "f",
"hand_strategy": 1.98740577362752e-8,
"hand_ev": 0.0
},
{
"action": {
"action": "call"
},
"action_name": "c",
"hand_strategy": 0.0018942567141925848,
"hand_ev": 0.0,
},
{
"action": {
"action": "allin",
"amount": 13202,
"pot_size": 0.1436522661012457,
},
"action_name": "allin14",
"hand_strategy": 0.9981057234117496,
"hand_ev": 0.0
}
],
"suggested_action": {
"action": "allin",
"amount": 13202,
"pot_size": 0.14204794941600070.1436522661012457
}
}
}