AoF (All-in-or-Fold) Strategy Endpoint
AoF adds push/fold pre-flop strategy to the holdem pipeline using CFR-solved equilibrium tables for 2–4 player games at 8bb stacks. No ONNX models — responses are near-instant from a pre-computed table.
Important: Only 8BB stacks are currently supported. Requests with other stack sizes will return an error.
Endpoint
Endpoint: POST /lookup
The AoF mode uses the same endpoint as the standard holdem API. The request is routed to the AoF handler by setting game_mode_code: "aof" in the hand object.
For detailed information about request and response fields, please refer to No Limit Holdem API documentation page.
Example: 3-Player, BB facing BTN push + SB fold
curl --location '<your-base-url>/lookup' \
--header 'Content-Type: application/json' \
--header 'Authorization: <your-api-key>' \
--data '{
"request_id": "1",
"hand": {
"gameuuid": "aof_demo_3p",
"game_type": "nlhe",
"game_mode_code": "aof",
"players": [
{
"seat_no": 0,
"stack": 800,
"uid": "btn_player",
"win_amount": 0,
"rake_amount": 0
},
{
"seat_no": 1,
"stack": 800,
"uid": "sb_player",
"win_amount": 0,
"rake_amount": 0
},
{
"seat_no": 2,
"stack": 800,
"uid": "bb_player",
"hole_cards": "AcKd",
"win_amount": 0,
"rake_amount": 0
}
],
"actions": {
"entries": [
{
"action": "allin",
"amount": 800
},
{
"action": "fold"
}
],
"pot_sizings": false,
"big_blind_sizings": false
},
"big_blind": 100,
"ante": 0,
"dealer_seat": 0,
"sb_seat": 1,
"bb_seat": 2,
"roomid": "aof_demo_room",
"straddle_seat": -1,
"post_seats": [],
"small_blind": 50
},
"hints": [],
"services": [
"RL"
],
"mode": "bot"
}'Response
AoF returns the same rich StrategyResponse format as cash games (request, solution_information, strategy.actions[], etc.). The CFR table lookup is used instead of ONNX inference, but the response is formatted identically to holdem cash.
Only two actions will appear in the response: fold and allin.
Example response:
{
"flags": [],
"request": {
"hand": {
"actions": {
"big_blind_sizings": false,
"entries": [
{
"action": "allin",
"amount": 800
},
{
"action": "fold"
}
],
"pot_sizings": false
},
"ante": 0,
"bb_seat": 2,
"big_blind": 100,
"dealer_seat": 0,
"game_mode_code": "aof",
"game_type": "nlhe",
"gameuuid": "aof_demo_3p",
"players": [
{
"rake_amount": 0,
"seat_no": 0,
"stack": 800,
"uid": "btn_player",
"win_amount": 0
},
{
"rake_amount": 0,
"seat_no": 1,
"stack": 800,
"uid": "sb_player",
"win_amount": 0
},
{
"hole_cards": "AcKd",
"rake_amount": 0,
"seat_no": 2,
"stack": 800,
"uid": "bb_player",
"win_amount": 0
}
],
"post_seats": [],
"roomid": "aof_demo_room",
"sb_seat": 1,
"small_blind": 50,
"straddle_seat": -1
},
"hints": [],
"mode": "bot",
"request_id": "1",
"services": [
"RL"
]
},
"solution_information": {
"bet_profile_config": {
"bet_profile": "no_profile_applied",
"bet_profile_config_id": -1,
"bet_size_mapping_result": "no_profile_applied",
"betsize_threshold": 0.75,
"called_pot": -1,
"is_open_raise": false,
"pot": -1
},
"build_date": "Feb 12 2026 04:57:49",
"coach_config": {
"status": "not_requested"
},
"obs_string": "[blinds=2|bb=100|ante=0|format=normal]r0p1 STATE:0:r800f:7c7d|AcKd|2d2h:800|800|800:50|100|800",
"situation_key": {
"action_pot_seq": {
"big_blind_size": 100.0,
"big_blind_sizings": false,
"entries": [
{
"action": "allin",
"action_time": null,
"amount": 800,
"player_position": null,
"pot_ratio": 2.8,
"seat_no": 0
},
{
"action": "fold",
"action_time": null,
"amount": null,
"player_position": null,
"pot_ratio": null,
"seat_no": 1
}
],
"pot_sizings": true
},
"action_pot_seq_search": "allin:f",
"bb_depth": 50.0,
"decision_action_pot_seq": {
"big_blind_size": 100.0,
"big_blind_sizings": false,
"entries": [
{
"action": "allin",
"action_time": null,
"amount": 800,
"player_position": null,
"pot_ratio": 2.8,
"seat_no": 0
}
],
"pot_sizings": true
},
"decision_action_pot_seq_search": "allin",
"flop": "na",
"game_type": "cash__nlhe__8max_ante",
"players_bin": "3",
"street": "preflop"
},
"source": "rlserv:aof_cfr_table",
"strategy_profile_config": {
"game_format": "no_profile_applied",
"matched_profile_name": "no_profile_applied",
"strategy_after_adjust": "no_profile_applied",
"strategy_before_adjust": "no_profile_applied"
},
"version": "2.0.0"
},
"strategy": {
"actions": [
{
"action": {
"action": "fold",
"action_time": null,
"amount": null,
"player_position": null,
"pot_size": null,
"seat_no": 2
},
"action_name": "f",
"action_seq": {
"entries": [
{
"action": "allin",
"amount": 800
},
{
"action": "fold"
},
{
"action": "fold",
"amount": null,
"seat_no": 2
}
]
},
"hand_ev": 0.0,
"hand_strategy": 0.0
},
{
"action": {
"action": "allin",
"action_time": null,
"amount": 800,
"player_position": null,
"pot_size": 0.0,
"seat_no": 2
},
"action_name": "allin",
"action_seq": {
"entries": [
{
"action": "allin",
"amount": 800
},
{
"action": "fold"
},
{
"action": "allin",
"amount": 800,
"seat_no": 2
}
]
},
"hand_ev": 0.0,
"hand_strategy": 1.0
}
],
"decision_action_seq": {
"big_blind_sizings": false,
"entries": [
{
"action": "allin",
"amount": 800
},
{
"action": "fold"
}
],
"pot_sizings": false
},
"suggested_action": {
"action": "allin",
"action_time": null,
"amount": 800,
"player_position": null,
"pot_size": 0.0,
"seat_no": 2
}
},
"strategy_profile": null,
"warnings": []
}Key Fields
game_mode_code: "aof"— routes to the AoF handler (same holdem pipeline)- Players listed in acting order (BTN → SB → BB)
- Hero = player with
hole_cards actions.entries= actions taken before the hero's turn ("allin"= push,"fold"= fold)