Portal
Sign In Console

Spin Strategy Endpoint

Spin uses the same holdem pipeline with game_mode_code: "spin". It routes to a dedicated ONNX model (obs 703) for short-stacked Spin & Go format. Unlike AoF (which uses a precomputed CFR table), Spin uses standard ONNX inference with the full action space.

Endpoint

Endpoint: POST /lookup

The Spin mode uses the same endpoint as the standard holdem API. The request is routed to the Spin handler by setting game_mode_code: "spin" 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 raise + SB fold

curl --location '<your-base-url>/lookup' \
--header 'Content-Type: application/json' \
--header 'Authorization: <your-api-key>' \
--data '{
    "request_id": "1",
    "hand": {
      "gameuuid": "spin_demo_3p",
      "game_type": "nlhe",
      "game_mode_code": "spin",
      "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": "raise",
            "amount": 200
          },
          {
            "action": "fold"
          }
        ],
        "pot_sizings": false,
        "big_blind_sizings": false
      },
      "big_blind": 100,
      "ante": 0,
      "dealer_seat": 0,
      "sb_seat": 1,
      "bb_seat": 2,
      "roomid": "spin_demo_room",
      "straddle_seat": -1,
      "post_seats": [],
      "small_blind": 50
    },
    "hints": [],
    "services": [
      "RL"
    ],
    "mode": "bot"
  }'

Response

Spin returns the same rich StrategyResponse format as cash games (request, solution_information, strategy.actions[], etc.), with the full action space available (fold, call, raise, allin).

Example response:

{
    "flags": [],
    "request": {
        "hand": {
            "actions": {
                "big_blind_sizings": false,
                "entries": [
                    {
                        "action": "raise",
                        "amount": 200
                    },
                    {
                        "action": "fold"
                    }
                ],
                "pot_sizings": false
            },
            "ante": 0,
            "bb_seat": 2,
            "big_blind": 100,
            "dealer_seat": 0,
            "game_mode_code": "spin",
            "game_type": "nlhe",
            "gameuuid": "spin_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": "spin_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:r200f:2c6c|AcKd|As7h:800|800|800:50|100|200",
        "situation_key": {
            "action_pot_seq": {
                "big_blind_size": 100.0,
                "big_blind_sizings": false,
                "entries": [
                    {
                        "action": "raise",
                        "action_time": null,
                        "amount": 200,
                        "player_position": null,
                        "pot_ratio": 0.4,
                        "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": "r:f",
            "bb_depth": 50.0,
            "decision_action_pot_seq": {
                "big_blind_size": 100.0,
                "big_blind_sizings": false,
                "entries": [
                    {
                        "action": "raise",
                        "action_time": null,
                        "amount": 200,
                        "player_position": null,
                        "pot_ratio": 0.4,
                        "seat_no": 0
                    }
                ],
                "pot_sizings": true
            },
            "decision_action_pot_seq_search": "r",
            "flop": "na",
            "game_type": "cash__nlhe__8max_ante",
            "players_bin": "3",
            "street": "preflop"
        },
        "source": "rlserv:moe_703_spin",
        "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": "raise",
                            "amount": 200
                        },
                        {
                            "action": "fold"
                        },
                        {
                            "action": "fold",
                            "amount": null,
                            "seat_no": 2
                        }
                    ]
                },
                "hand_ev": 0.0,
                "hand_strategy": 1.919277333213722e-6
            },
            {
                "action": {
                    "action": "call",
                    "action_time": null,
                    "amount": null,
                    "player_position": null,
                    "pot_size": null,
                    "seat_no": 2
                },
                "action_name": "c",
                "action_seq": {
                    "entries": [
                        {
                            "action": "raise",
                            "amount": 200
                        },
                        {
                            "action": "fold"
                        },
                        {
                            "action": "call",
                            "amount": 100,
                            "seat_no": 2
                        }
                    ]
                },
                "hand_ev": 1.991218328475952,
                "hand_strategy": 0.00004059413539827697
            },
            {
                "action": {
                    "action": "allin",
                    "action_time": null,
                    "amount": 800,
                    "player_position": null,
                    "pot_size": 1.3333333333333333,
                    "seat_no": 2
                },
                "action_name": "allin133",
                "action_seq": {
                    "entries": [
                        {
                            "action": "raise",
                            "amount": 200
                        },
                        {
                            "action": "fold"
                        },
                        {
                            "action": "allin",
                            "amount": 800,
                            "seat_no": 2
                        }
                    ]
                },
                "hand_ev": 4.3570637702941895,
                "hand_strategy": 0.8099976758053241
            },
            {
                "action": {
                    "action": "raise",
                    "action_time": null,
                    "amount": 400,
                    "player_position": null,
                    "pot_size": 0.4444444477558136,
                    "seat_no": 2
                },
                "action_name": "r44",
                "action_seq": {
                    "entries": [
                        {
                            "action": "raise",
                            "amount": 200
                        },
                        {
                            "action": "fold"
                        },
                        {
                            "action": "raise",
                            "amount": 397,
                            "seat_no": 2
                        }
                    ]
                },
                "hand_ev": 4.298931121826172,
                "hand_strategy": 0.00026887861829060823
            },
            {
                "action": {
                    "action": "raise",
                    "action_time": null,
                    "amount": 700,
                    "player_position": null,
                    "pot_size": 1.1111111640930176,
                    "seat_no": 2
                },
                "action_name": "r111",
                "action_seq": {
                    "entries": [
                        {
                            "action": "raise",
                            "amount": 200
                        },
                        {
                            "action": "fold"
                        },
                        {
                            "action": "raise",
                            "amount": 704,
                            "seat_no": 2
                        }
                    ]
                },
                "hand_ev": 4.3570637702941895,
                "hand_strategy": 0.18969093216365365
            }
        ],
        "decision_action_seq": {
            "big_blind_sizings": false,
            "entries": [
                {
                    "action": "raise",
                    "amount": 200
                },
                {
                    "action": "fold"
                }
            ],
            "pot_sizings": false
        },
        "suggested_action": {
            "action": "allin",
            "action_time": null,
            "amount": 800,
            "player_position": null,
            "pot_size": 1.3333333333333333,
            "seat_no": 2
        }
    },
    "strategy_profile": null,
    "warnings": []
}

Key Fields

  • game_mode_code: "spin" — routes to the Spin handler (same holdem pipeline)
  • source: "rlserv:moe_703_spin" — uses the dedicated Spin ONNX model
  • Players listed in acting order (BTN → SB → BB)
  • Hero = player with hole_cards
  • actions.entries = actions taken before the hero's turn