Strategy Grid
While /lookup answers "what should this player do with their hand", /strategy_grid answers the same question for every possible starting hand at once: one request returns the full grid — the 169 starting-hand classes (13×13 pairs / suited / offsuit) with their strategies, EVs, and presentation menus, down to the individual combos.
Examples on this page use a No Limit Hold'em cash game.
Endpoint
Endpoint: POST /strategy_grid
curl --location '<glue-URL>/strategy_grid' \
--header 'Content-Type: application/json' \
--header 'Authorization: <Auth-TOKEN>' \
--data '{ ... }'The actual <glue-URL> for your environment (dev / stg / prod) and the <Auth-TOKEN> are provided separately — the same ones you use for /lookup. As with /lookup, engine soft failures can be reported inside an HTTP 200 body via the error / error_code response fields.
Request
The request body is the same as for /lookup: request_id, the hand object, and request_profile. Two things change in practice:
- No
hole_cards. The grid computes every starting hand, so no player carries hole cards. - The grid is computed for the player whose turn it is at the end of
actions.entries(returned ascurrentPlayerin the response).
request_profile works exactly as on /lookup — the same single field applies the same predefined configuration, with the same override rules, and its effects carry over to the grid: probabilities are thresholded, results are deterministic, every action carries its ev_rank label, and each hand gets the reduced presentation menu. See B2C Features for the full parameter walkthrough.
The same 8-handed spot used on the B2C Features page (straddle on seat 2, 50-chip ante, preflop, seat 3 to act):
curl --location '<glue-URL>/strategy_grid' \
--header 'Content-Type: application/json' \
--header 'Authorization: <Auth-TOKEN>' \
--data '{
"request_id": "grid-demo",
"hand": {
"gameuuid": "3b-0.5_8p_game",
"game_type": "nlhe",
"game_mode_code": "normal",
"players": [
{ "seat_no": 0, "stack": 46720 },
{ "seat_no": 1, "stack": 32580 },
{ "seat_no": 2, "stack": 27000 },
{ "seat_no": 3, "stack": 40368 },
{ "seat_no": 4, "stack": 105250 },
{ "seat_no": 5, "stack": 9700 },
{ "seat_no": 6, "stack": 35440 },
{ "seat_no": 7, "stack": 13550 }
],
"big_blind": 100,
"ante": 50,
"dealer_seat": 7,
"sb_seat": 0,
"bb_seat": 1,
"straddle_seat": 2,
"actions": { "entries": [] }
},
"request_profile": "<client_profile>"
}'Response
{
"hands": [ <Hand-class> × 169 ],
"actionLabels": [ <Action-label> ],
"currentPlayer": <acting-seat>,
"numCombos": 1326,
"numBoardCards": 0,
"overallReach": 1.0,
"supportScore": <0-to-1>
}| Field | Meaning |
|---|---|
hands | One entry per starting-hand class (169 for Hold'em) — see below. |
actionLabels | The action menu of the spot, shared by all hands — see below. |
currentPlayer | The seat the grid was computed for. |
numCombos | Number of concrete combos covered (1326 preflop). |
numBoardCards | Board cards dealt so far at the requested spot. |
overallReach | How much of the acting player's full range reaches this spot (1.0 preflop). |
supportScore | Model confidence that it covers this spot, 0 to 1. |
The response also carries diagnostic members not listed here.
Action labels
actionLabels describes the spot's action menu once, so the per-hand data can stay compact. Each entry:
{
"name": "raise 5.0 BB",
"amount": 500,
"amountBb": 5.0,
"potRatio": 0.3157894736842105,
"strategy": 0.10491631517209216
}| Field | Meaning |
|---|---|
name | Human-readable action label ("fold", "call 2.0 BB", "raise 5.0 BB", "all-in 403.2 BB"). |
amount | The action's chip amount (null for fold). |
amountBb | The same amount in big blinds. |
potRatio | Bet size as a ratio of the pot (null for fold/call). |
strategy | How often the whole range takes this action at the spot. |
In the example spot, the range-level strategy reads: fold 76.9%, call 0.02%, raise to 5 bb 10.5%, raise to 7 bb 12.6% — the acting player opens about a quarter of all hands.
Hand classes
Each hands[] entry describes one starting-hand class:
{
"handName": "TT",
"reach": 1.0,
"ev": 5.747151374816894,
"actions": [
{ "actionName": "raise5.0", "probability": 0.5339687181136681, "ev": 5.747151374816895 },
{ "actionName": "raise7.0", "probability": 0.466031281886332, "ev": 5.747151374816895 }
],
"reduced_actions": [
{ "actionName": "fold", "probability": 0.0, "ev": 0.0,
"ev_rank": "EVR_2", "reduced_action_sizing": 0.0 },
{ "actionName": "call", "probability": 0.0, "ev": 4.7471513748168945,
"ev_rank": "EVR_3", "reduced_action_sizing": 1.0 },
{ "actionName": "raise5.0", "probability": 0.5274196517442273, "ev": 5.7471513748168945,
"ev_rank": "EVR_4", "reduced_action_sizing": 2.5 },
{ ... }
],
"combos": [
{
"combo": "TcTd",
"reach": 1.0,
"actions": [
{
"actionName": "fold",
"probability": 0.0,
"ev": 0.0,
"ev_rank": "EVR_2"
},
{
"actionName": "raise5.0",
"probability": 0.533968718113668,
"ev": 5.7471513748168945,
"ev_rank": "EVR_4"
},
{ ... }
],
"reduced_actions": [ ... ]
},
{ ... }
],
"supportScore": 1.0
}| Field | Meaning |
|---|---|
handName | The hand class: "TT", "AKs", "72o", ... |
reach | How often this hand reaches the requested spot (1.0 preflop; below 1.0 postflop, when part of it was folded or raised earlier). |
ev | The class EV in big blinds under its strategy. |
actions | The actions this class actually plays — only entries above the probability threshold, with their probability and EV. |
reduced_actions | The same presentation menu /lookup returns, computed per hand class: the selected tier's entries with ev_rank labels and the reduced_action_sizing display size — preflop a multiplier of the bet being raised over (this spot has a 2 bb straddle, hence 2.5 for the raise to 5 bb), postflop a percentage of the pot. See Reading the Response. Use this for anything shown to players. |
combos | Per-combo breakdown: each concrete combo ("TcTd") with its own reach, full action list (every menu entry with probability, EV, and ev_rank), and its own reduced_actions. |
supportScore | Model confidence for this hand class. |
The ev_rank labels follow the same scale as on /lookup — see Reading the Response on the B2C Features page.
Reading the example: TT opens 100% of the time, mixing a raise to 5 bb (53.4%) and a raise to 7 bb (46.6%), both labeled EVR_4 and worth +5.75 bb — while a class like 72o returns a single entry, fold at 100%. The compact class-level actions list carries just what the hand plays; the reduced_actions and combos carry the full detail when you need it.
Notes
- All B2C features apply per hand —
strategy_min_thresholdtrims the class-levelactions,reduced_actions_tiershapes each hand's presentation menu,show_labelsprovides theev_ranklabels — andrequest_profilefollows the same silent-no-match rule as on/lookup: a misspelled profile name applies no defaults and raises no error. - The grid response can be large (169 classes × combos). Request it per decision point, not per player action batch.