{"openapi":"3.0.3","info":{"title":"pokerai.bet API（GTO戦略 + ポーカーエンジン）","version":"1.0","description":"プリフロップ / フロップ / ターン / リバー向けのGTO戦略API。各アクションのミックス頻度を返します（推奨アクションはありません。頻度に従って選択してください）。プリフロップとフロップでは、事前解析済みのGTO解析結果ライブラリを利用し、即時（ミリ秒単位）に提供します。ソルバーエンドポイントはリアルタイムで解析します（フロップは約70秒、ターン/リバーはより高速です）。カード/ボード入力には区切りなし文字列（\"2c2h2s\"、\"AdKd\"）を使用し、ボードは配列（[\"2c\",\"2h\",\"2s\"]）として返されます。レンジ文字列はカンマ区切りの `hand:weight` です（クラス表記 AA/AKs/AKo、weight は 0..1、デフォルトは 1）。\n\n⚠ 注意: 下の\"テストリクエスト\"ボタンは、あなたのキーで実際のリクエストを送信し、実際の月間クォータを消費します。初めてですか？ まずガイドをお読みください: https://pokerai.bet/docs\n"},"servers":[{"url":"https://pokerai.bet"}],"security":[{"BearerApiKey":[]},{"XApiKey":[]}],"tags":[{"name":"検索","description":"事前解析済みのGTO解析結果を即時（ミリ秒）で提供 — プリフロップ + フロップの完全な意思決定ツリー。各回1件の事前解析済みクォータを消費します。"},{"name":"ソルバー","description":"リアルタイムソルバー（フロップは約70秒、ターン/リバーはより高速）。スケジュール -> ツリー -> ノード。"},{"name":"レンジ","description":"アクションラインに沿ってレンジを更新（レンジ変換 / フロップ投影レンジ）。"}],"paths":{"/v1/gto/preflop":{"post":{"tags":["検索"],"operationId":"preflopStrategy","summary":"プリフロップ戦略（事前解析済み）","description":"事前解析済みクォータを1消費します。状況（RFI/リンプ/レイズ/3ベット/4ベット/5ベット）はアクションから導出されます。","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflopRequest"},"example":{"hole_cards":"AhKh","positions":{"hero":"MP"},"preflop_version":"6max","preflop_actions":[{"position":"SB","action":"small blind","amount":0.5},{"position":"BB","action":"big blind","amount":1},{"position":"UTG","action":"raise","amount":3}]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflopResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/QuotaExceeded"}}}},"/v1/gto/preflop/range":{"post":{"tags":["検索"],"operationId":"preflopRange","summary":"特定スポットのプリフロップ全レンジ（事前解析済み）","description":"1 回の呼び出しで、ポジション + アクションラインに対する完全な 13×13 プリフロップレンジ（169 ハンドタイプ →\nフォールド/コール/レイズ頻度）を取得します。`hole_cards` は不要です（スポットは positions +\npreflop_actions から決まります）。事前解析済みクォータを 1 消費します（169 回ではなく 1 回の呼び出し）。レンジグリッド用。\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["table_size","positions","preflop_actions"],"properties":{"table_size":{"type":"string","example":"6max"},"preflop_version":{"type":"string","enum":["6max","6max_RC_100bb_200NL","6max_RC_100bb_100NL","6max_RC_40bb"],"description":"任意。使用する6maxプリフロップチャートセット（/v1/gto/preflop と同じ）。省略時はデフォルトを使用します。"},"positions":{"type":"object","properties":{"hero":{"type":"string","example":"BTN"}}},"preflop_actions":{"type":"array","items":{"type":"object"},"description":"SB/BBからの完全なアクションシーケンス。/v1/gto/preflop と同じです"}}},"example":{"table_size":"6max","preflop_version":"6max","positions":{"hero":"BTN"},"preflop_actions":[{"position":"SB","action":"small blind","amount":0.5},{"position":"BB","action":"big blind","amount":1}]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"range":{"type":"object","description":"ハンドタイプ（AA / AKs / AKo） -> {fold, call, raise}。169エントリで、それぞれの合計は約1","additionalProperties":{"type":"object","properties":{"fold":{"type":"number"},"call":{"type":"number"},"raise":{"type":"number"}}}},"quota":{"type":"object","properties":{"used":{"type":"integer"},"limit":{"type":"integer"}}}}},"example":{"range":{"AA":{"fold":0,"call":0,"raise":1},"AKs":{"fold":0,"call":0,"raise":1},"72o":{"fold":1,"call":0,"raise":0}},"quota":{"used":7,"limit":100}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NoSolution"},"429":{"$ref":"#/components/responses/QuotaExceeded"}}}},"/v1/gto/preflop/versions":{"get":{"tags":["検索"],"operationId":"preflopVersions","summary":"インストール済みのプリフロップ戦略バージョンを一覧表示（無料）","description":"/v1/gto/preflop と /v1/gto/preflop/range で選択可能な preflop_version の値。各値の表示ラベルと、デフォルトの値（preflop_version を省略した際に使用）を含みます。無料（クォータなし）。リストをハードコードする代わりに使用してください。新しいバージョンはここに自動的に表示されます。\n","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"versions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"これを preflop_version として渡します"},"label":{"type":"string"},"default":{"type":"boolean","description":"デフォルトバージョンでは存在し、true になる"}}}},"default":{"type":"string","description":"preflop_version を省略した場合に使用される id"}}},"example":{"versions":[{"id":"6max","label":"6 max 100bb Deepsolver","default":true},{"id":"6max_RC_100bb_200NL","label":"6 max 100bb GG 200NL 3b/f 2.2x - 2.5x"},{"id":"6max_RC_100bb_100NL","label":"6 max 100bb GG 100NL 3b/f"},{"id":"6max_RC_40bb","label":"6 max 40bb GG 100NL"}],"default":"6max"}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/v1/gto/flop/tree":{"post":{"tags":["検索"],"operationId":"flopTree","summary":"フロップ意思決定ツリー（事前解析済み）","description":"事前解析済みクォータを1消費します。開始レンジとすべての意思決定ノードを返します（各ノードには /v1/gto/flop/node 用のトークンがあります）。","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlopTreeRequest"},"examples":{"SRP":{"summary":"シングルレイズポット — ポジション: hero、raiser、caller","value":{"board":"2c2h2s","pot_type":"SRP","positions":{"hero":"UTG","raiser":"UTG","caller":"BTN"}}},"3BET":{"summary":"3ベットポット — ポジション: hero、raiser（オープナー）、three_bettor","value":{"board":"2c2h2s","pot_type":"3BET","positions":{"hero":"CO","raiser":"CO","three_bettor":"BTN"}}},"4BET":{"summary":"4ベットポット — ポジション: hero、raiser（4ベットしたオープナー）、three_bettor（コールした3ベッター）","value":{"board":"2c2h2s","pot_type":"4BET","positions":{"hero":"CO","raiser":"CO","three_bettor":"BTN"}}},"LIMP":{"summary":"リンプされたポット — ポジション：hero、limper（hero または limper はBBである必要があります）","value":{"board":"2c2h2s","pot_type":"LIMP","positions":{"hero":"BB","limper":"BTN"}}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlopTreeResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NoSolution"},"429":{"$ref":"#/components/responses/QuotaExceeded"}}}},"/v1/gto/flop/node":{"post":{"tags":["検索"],"operationId":"flopNode","summary":"フロップノードの戦略（事前解析済み）— 1つの意思決定ツリーノード","description":"フロップ意思決定ツリーのノードごとの戦略（無料、トークン制限）。POST /v1/gto/flop/tree で発行された `node` トークンを渡します。hole_cards を指定すると、そのハンドのノードでのミックス戦略を返します。hole_cards を省略すると、ノードの全レンジ戦略を返します。\n\nこれにより、すべてのヒーローのフロップでの意思決定を取得できます — ヒーローがポジション有りの場合、ヒーローがベットに直面している場合、または後続アクションの場合です。ツリーを取得し、is_hero が true のノードを選択します（例: root/CHECK/BET_13 = チェック後にヒーローがベットに直面 → fold/call/raise）。そのトークンをここに渡します。ルートノード（root）はヒーローの最初の意思決定です（OOP の check/bet）。\n\nフロップツリーは単一ストリートです。ターン/リバーでの意思決定にはソルバーライン（/v1/gto/solver/*）を使用してください。\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlopNodeRequest"},"example":{"node":"eyJ...<token from /v1/gto/flop/tree>","hole_cards":"AdKd"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NodeStrategyResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NoSolution"}}}},"/v1/gto/solver":{"post":{"tags":["ソルバー"],"operationId":"solverSchedule","summary":"リアルタイム解析をスケジュール（フロップ/ターン/リバー）","description":"ボードの長さでストリートが決まります（3=フロップ、4=ターン、5=リバー）。新規トリガー時には解析クォータを1消費します。キャッシュされた解析では、solve_quota フィールドなしで status=queryable が返されます（課金されません）。すべてのソルバーホストがビジーの場合は、429 status=busy が返されます。\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolverScheduleRequest"},"example":{"board":"2c2h2s9d","oop_range":"AA,KK,QQ,AKs","ip_range":"JJ,TT,AQs,KQs","pot":20,"effective_stack":90,"hero":"OOP","bet_sizes":{"turn":[67],"river":[75]},"raise_sizes":{"turn":[80],"river":[125]},"donk_sizes":{"turn":[55],"river":[90]},"raise_limit":3}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolverScheduleResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"description":"解析クォータを超過したか、すべてのソルバーホストがビジーです（status=busy）","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/gto/solver/tree":{"post":{"tags":["ソルバー"],"operationId":"solverTree","summary":"解析ツリー + ノードステータスをポーリング（無料）","description":"spot_status = queryable になるまでポーリングします。複数ストリートの解析を配られたランアウトまで進めるには、\n配られたカードを渡します：`turn_card`（例：フロップの解析 → 特定のターン）、および/または `river_card`。\n*フロップ*の解析からのリバースポットを一意にするには、`turn_card` と `river_card` の両方が必要です。\nターンの解析には `river_card` だけが必要です。両方を省略すると、解析自身のストリートが取得されます。\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["solve"],"properties":{"solve":{"type":"string","description":"/v1/gto/solver からのハンドル"},"turn_card":{"type":"string","description":"任意。フロップの解析では、配られたターンカード（例: \"Td\"）— そのターン配下のノードを返します。"},"river_card":{"type":"string","description":"任意。配られたリバーカード（例: \"Qh\"）。フロップの解析結果では、turn_card と組み合わせて曖昧さを解消します。"}}},"example":{"solve":"eyJ0Ijoic2x2X3h4eXoi...(handle from /v1/gto/solver)","turn_card":"Td","river_card":"Qh"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolverTreeResponse"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"503":{"$ref":"#/components/responses/UpstreamUnavailable"}}}},"/v1/gto/solver/node":{"post":{"tags":["ソルバー"],"operationId":"solverNode","summary":"解析からのノード戦略（無料）","description":"ヒーローノード → ヒーロー戦略。相手ノード（または hole_cards を省略）→ レンジ全体の戦略。","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["node"],"properties":{"node":{"type":"string","description":"/v1/gto/solver/tree からのノードトークン"},"hole_cards":{"$ref":"#/components/schemas/HoleCards"}}},"example":{"node":"eyJ0Ijoic2x2X3h4eXoi...(token from /v1/gto/solver/tree)","hole_cards":"AhKh"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/NodeStrategyResponse"},{"type":"object","properties":{"node_status":{"type":"string","enum":["available","computing","queryable","expired","error"],"description":"expired = 解析が回収/置換されたため、再スケジュールしてください。error = ソルバーのノードごとの strategy_error（message 付き）。computing = 解析中です。"},"message":{"type":"string","description":"node_status = error の場合に存在します"}}}]}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"503":{"$ref":"#/components/responses/UpstreamUnavailable"}}}},"/v1/gto/solver/release":{"post":{"tags":["ソルバー"],"operationId":"solverRelease","summary":"解析のプールポートを早期に解放（無料、任意）","description":"この解析結果へのクエリが完了したことを示すと、そのソルバーポートはすぐにプールへ戻り、\nキャッシュ TTL が残ることはありません（プールが小さい場合、次のリクエストが 429-busy になる可能性があります）。\n任意 — スキップした場合は TTL にフォールバックします。この解析結果に対する最後の\n/v1/gto/solver/tree と /v1/gto/solver/node の後にのみ呼び出してください: 解放されるとポートは\n再利用される可能性があり、このハンドルでの以後のクエリは node_status = expired を返します。冪等であり、\nソルバーを再起動しません。\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["solve"],"properties":{"solve":{"type":"string","description":"/v1/gto/solver からのハンドル"}}},"example":{"solve":"eyJ0Ijoic2x2X3h4eXoi...(handle from /v1/gto/solver)"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"released":{"type":"boolean","description":"ライブポートの確保要求が解除された場合は true。解析がすでに期限切れの場合は false（処理なし）"}}},"example":{"released":true}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/v1/gto/range":{"post":{"tags":["レンジ"],"operationId":"rangeConvert","summary":"レンジ変換 — アクションラインに沿ってレンジを更新","description":"ソルバーの /api/range への軽量プロキシ。solver_results（意思決定ツリー）を含むすべての入力を組み立てます。事前解析済みクォータを1消費します。出力レンジは次のストリートの解析に渡されます。\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RangeRequest"},"example":{"range_oop":"AA,KK,QQ,JJ,AKs","range_ip":"TT,99,AQs,KQs,JTs","board":"2c2h2s","node_id":"root/CHECK/BET 8.000000","solver_results":{"node_type":"action_node","player":1,"strategy":{"actions":["CHECK","BET 8.000000"],"strategy":{"AsAh":[0.6,0.4]}},"childrens":{"CHECK":{"node_type":"action_node","player":0,"strategy":{"actions":["CHECK","BET 8.000000"],"strategy":{"KsKh":[0.5,0.5]}},"childrens":{"BET 8.000000":{"node_type":"action_node","player":1,"strategy":{"actions":["FOLD","CALL","RAISE 18.000000"],"strategy":{"QsQh":[0.2,0.5,0.3]}},"childrens":{}}}}}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RangeResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/QuotaExceeded"},"502":{"$ref":"#/components/responses/Upstream"}}}},"/v1/gto/flop/projected-range":{"post":{"tags":["レンジ"],"operationId":"projectedRange","summary":"投影レンジ — アクションラインに沿ったフロップのレンジ更新（事前解析済みクォータ）","description":"指定された board / pot_type / positions に対して、アクションラインに沿ってフロップのレンジを先へ投影します。事前解析済みクォータを1消費します。/v1/gto/range と同じレンジ更新出力を返します。\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectedRangeRequest"},"example":{"board":"2c2h2s","pot_type":"SRP","positions":{"hero":"UTG","raiser":"UTG","caller":"BTN"},"node_id":"root/BET_4","normalize":true,"bluff_discount_ratio":0.8,"bluff_combos_ratio":0.5,"hero_position":"oop","hero_hand":"AsKs","partner_hands":["Ac9c"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectedRangeResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NoSolution"},"429":{"$ref":"#/components/responses/QuotaExceeded"}}}},"/v1/gto/evs":{"post":{"tags":["レンジ"],"operationId":"queryEvs","summary":"ノード EV — 完了した解析のハンドごと、アクションごとの期待値（無料）","description":"完了した解析の1つのノードにおける、ハンド別・アクション別の期待値。解析ハンドル（/v1/gto/solver から取得）と node_id（/v1/gto/solver/tree から取得）を指定します。任意で hand を指定して1ハンドに絞り込みます。無料（すでに /v1/gto/solver 経由で課金済み）。まずクエリ可能になるまで /v1/gto/solver/tree をポーリングしてください。\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvsRequest"},"example":{"solve":"eyJ0Ijoic2x2X3h4eXoi...(handle from /v1/gto/solver)","node_id":"root"}}}},"responses":{"200":{"description":"ノードEV。まだ収束していない場合は { spot_status: computing }。","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvsResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"description":"解析ハンドルが無効、または自分のものではありません"},"410":{"description":"解析の有効期限切れ (TTL); /v1/gto/solver 経由で再スケジュール"}}}},"/v1/gto/turn/projected-range":{"post":{"tags":["レンジ"],"operationId":"turnProjectedRange","summary":"投影レンジ — ターンのアクションラインに沿ったターン→リバーのレンジ更新（無料）","description":"リアルタイムのターン解析における /v1/gto/flop/projected-range のターン→リバー版です。ターン開始時のレンジ（解析がスケジュールされた際のレンジで、解析自体の config から読み取ります）を、ストリートを終了する CALL/CHECK を含むターンのアクションラインに沿って、リバー開始時のレンジへ絞り込みます。無料（解析はすでに /v1/gto/solver 経由で課金済み）で、/v1/gto/solver/tree と同様です。/v1/gto/range と同じレンジ更新出力を返します。最初に spot_status = queryable となるまで /v1/gto/solver/tree をポーリングしてください。\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TurnProjectedRangeRequest"},"example":{"solve":"eyJ0Ijoic2x2X3h4eXoi...(handle from /v1/gto/solver)","node_id":"root/CHECK/BET 6.000000/CALL","normalize":true}}}},"responses":{"200":{"description":"絞り込まれたリバー開始時のレンジ。解析結果がまだ収束していない場合は { spot_status: computing }（/v1/gto/solver/tree を引き続きポーリングしてください）。","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/RangeResponse"},{"type":"object","properties":{"spot_status":{"type":"string","enum":["computing"]}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"410":{"description":"解析の有効期限切れ（TTL）— /v1/gto/solver 経由で再スケジュールしてください","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"$ref":"#/components/responses/Upstream"}}}},"/health":{"get":{"summary":"ヘルスチェック","operationId":"health_health_get","responses":{"200":{"description":"成功時のレスポンス","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Health Get"}}}}}}},"/v1/pokerkit/texture":{"post":{"tags":["セマンティック"],"summary":"テクスチャ","operationId":"texture_v1_pokerkit_texture_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardRequest"}}}},"responses":{"200":{"description":"成功時のレスポンス","content":{"application/json":{"schema":{}}}},"422":{"description":"バリデーションエラー","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/nuts":{"post":{"tags":["セマンティック"],"summary":"ナッツ","operationId":"nuts_v1_pokerkit_nuts_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardRequest"}}}},"responses":{"200":{"description":"成功時のレスポンス","content":{"application/json":{"schema":{}}}},"422":{"description":"バリデーションエラー","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/category-combos":{"post":{"tags":["セマンティック"],"summary":"カテゴリ別コンボ","operationId":"category_combos_v1_pokerkit_category_combos_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardRequest"}}}},"responses":{"200":{"description":"成功時のレスポンス","content":{"application/json":{"schema":{}}}},"422":{"description":"バリデーションエラー","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/board-report":{"post":{"tags":["セマンティック"],"summary":"ボードレポート","operationId":"board_report_v1_pokerkit_board_report_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardRequest"}}}},"responses":{"200":{"description":"成功時のレスポンス","content":{"application/json":{"schema":{}}}},"422":{"description":"バリデーションエラー","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/hand-tier":{"post":{"tags":["セマンティック"],"summary":"ハンドティア","operationId":"hand_tier_v1_pokerkit_hand_tier_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HandRequest"}}}},"responses":{"200":{"description":"成功時のレスポンス","content":{"application/json":{"schema":{}}}},"422":{"description":"バリデーションエラー","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/draws":{"post":{"tags":["セマンティック"],"summary":"ドロー","operationId":"draws_v1_pokerkit_draws_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HandRequest"}}}},"responses":{"200":{"description":"成功時のレスポンス","content":{"application/json":{"schema":{}}}},"422":{"description":"バリデーションエラー","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/outs":{"post":{"tags":["セマンティック"],"summary":"アウト","operationId":"outs_v1_pokerkit_outs_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HandRequest"}}}},"responses":{"200":{"description":"成功時のレスポンス","content":{"application/json":{"schema":{}}}},"422":{"description":"バリデーションエラー","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/blockers":{"post":{"tags":["セマンティック"],"summary":"ブロッカー","operationId":"blockers_v1_pokerkit_blockers_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HandRequest"}}}},"responses":{"200":{"description":"成功時のレスポンス","content":{"application/json":{"schema":{}}}},"422":{"description":"バリデーションエラー","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/hand-report":{"post":{"tags":["セマンティック"],"summary":"ハンドレポート","operationId":"hand_report_v1_pokerkit_hand_report_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HandRequest"}}}},"responses":{"200":{"description":"成功時のレスポンス","content":{"application/json":{"schema":{}}}},"422":{"description":"バリデーションエラー","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/range/expand":{"post":{"tags":["レンジ"],"summary":"レンジの展開","operationId":"range_expand_v1_pokerkit_range_expand_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RangeExpandRequest"}}}},"responses":{"200":{"description":"成功時のレスポンス","content":{"application/json":{"schema":{}}}},"422":{"description":"バリデーションエラー","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/range/value":{"post":{"tags":["レンジ"],"summary":"レンジの価値","operationId":"range_value_v1_pokerkit_range_value_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValueRangeRequest"}}}},"responses":{"200":{"description":"成功時のレスポンス","content":{"application/json":{"schema":{}}}},"422":{"description":"バリデーションエラー","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/range/nut-advantage":{"post":{"tags":["レンジ"],"summary":"レンジのナッツ優位性","operationId":"range_nut_advantage_v1_pokerkit_range_nut_advantage_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NutAdvantageRequest"}}}},"responses":{"200":{"description":"成功時のレスポンス","content":{"application/json":{"schema":{}}}},"422":{"description":"バリデーションエラー","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/cards/normalize":{"post":{"tags":["カード"],"summary":"カードの正規化","operationId":"cards_normalize_v1_pokerkit_cards_normalize_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CardsRequest"}}}},"responses":{"200":{"description":"成功時のレスポンス","content":{"application/json":{"schema":{}}}},"422":{"description":"バリデーションエラー","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/eval/hand":{"post":{"tags":["コア"],"summary":"ハンド評価","operationId":"eval_hand_v1_pokerkit_eval_hand_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvalHandRequest"}}}},"responses":{"200":{"description":"成功時のレスポンス","content":{"application/json":{"schema":{}}}},"422":{"description":"バリデーションエラー","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/eval/compare":{"post":{"tags":["コア"],"summary":"ハンド評価の比較","operationId":"eval_compare_v1_pokerkit_eval_compare_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvalCompareRequest"}}}},"responses":{"200":{"description":"成功時のレスポンス","content":{"application/json":{"schema":{}}}},"422":{"description":"バリデーションエラー","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/equity":{"post":{"tags":["コア"],"summary":"エクイティ","operationId":"equity_v1_pokerkit_equity_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EquityRequest"}}}},"responses":{"200":{"description":"成功時のレスポンス","content":{"application/json":{"schema":{}}}},"422":{"description":"バリデーションエラー","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/hand-strength":{"post":{"tags":["コア"],"summary":"ハンドの強さ","operationId":"hand_strength_v1_pokerkit_hand_strength_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HandStrengthRequest"}}}},"responses":{"200":{"description":"成功したレスポンス","content":{"application/json":{"schema":{}}}},"422":{"description":"検証エラー","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/icm":{"post":{"tags":["コア"],"summary":"ICM","operationId":"icm_v1_pokerkit_icm_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IcmRequest"}}}},"responses":{"200":{"description":"成功したレスポンス","content":{"application/json":{"schema":{}}}},"422":{"description":"検証エラー","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/range/equity-advantage":{"post":{"tags":["コア"],"summary":"レンジのエクイティ優位性","operationId":"range_equity_advantage_v1_pokerkit_range_equity_advantage_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EquityAdvantageRequest"}}}},"responses":{"200":{"description":"成功したレスポンス","content":{"application/json":{"schema":{}}}},"422":{"description":"検証エラー","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/notation/parse":{"post":{"tags":["コア"],"summary":"表記法の解析","operationId":"notation_parse_v1_pokerkit_notation_parse_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotationParseRequest"}}}},"responses":{"200":{"description":"成功したレスポンス","content":{"application/json":{"schema":{}}}},"422":{"description":"検証エラー","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/games/state":{"post":{"tags":["ゲーム"],"summary":"ゲームの状態","operationId":"games_state_v1_pokerkit_games_state_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameStateRequest"}}}},"responses":{"200":{"description":"成功したレスポンス","content":{"application/json":{"schema":{}}}},"422":{"description":"検証エラー","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/games/step":{"post":{"tags":["ゲーム"],"summary":"ゲームを進める","operationId":"games_step_v1_pokerkit_games_step_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameStepRequest"}}}},"responses":{"200":{"description":"成功したレスポンス","content":{"application/json":{"schema":{}}}},"422":{"description":"検証エラー","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/notation/replay":{"post":{"tags":["ゲーム"],"summary":"表記法のリプレイ","operationId":"notation_replay_v1_pokerkit_notation_replay_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","default":"","title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplayRequest"}}}},"responses":{"200":{"description":"成功したレスポンス","content":{"application/json":{"schema":{}}}},"422":{"description":"検証エラー","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/combined-openapi.json":{"get":{"tags":["メタ情報"],"summary":"統合 OpenAPI","description":"GTO仕様と本サービスの自動仕様を1つのドキュメントに統合しています（パスは重複しません。\npokerkitスキーマには名前が衝突した場合にのみプレフィックスが付きます）。常に現在のコードを反映します。","operationId":"combined_openapi_v1_pokerkit_combined_openapi_json_get","responses":{"200":{"description":"成功したレスポンス","content":{"application/json":{"schema":{}}}}}}},"/v1/pokerkit/meta":{"get":{"tags":["メタ情報"],"summary":"メタ情報","operationId":"meta_v1_pokerkit_meta_get","responses":{"200":{"description":"成功したレスポンス","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Meta V1 Pokerkit Meta Get"}}}}}}}},"components":{"securitySchemes":{"BearerApiKey":{"type":"http","scheme":"bearer","description":"Authorization: Bearer gto_..."},"XApiKey":{"type":"apiKey","in":"header","name":"X-API-Key"}},"responses":{"BadRequest":{"description":"無効な入力または必須フィールドの欠落","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"API キーが不足しているか無効です","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NoSolution":{"description":"このスポット/ボードにはGTOデータがありません","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"QuotaExceeded":{"description":"月間クォータを超過しました（毎月1日にリセットされます）","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Upstream":{"description":"バックエンドは一時的に利用できません。再試行してください。","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"UpstreamUnavailable":{"description":"サービス自身の再試行後もソルバーに到達できません（通信エラー / 5xx）— 再試行可能; エラー: upstream_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Forbidden":{"description":"トークンが無効であるか、あなたのものではありません","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string","example":"missing_api_key"},"message":{"type":"string"}}},"Position":{"type":"string","enum":["SB","BB","UTG","MP","CO","BTN"]},"HoleCards":{"type":"string","description":"2枚のカード、区切りなし。例: \"AdKd\"。ランク AKQJT98765432、スート c d h s。","pattern":"^[2-9TJQKA][cdhs][2-9TJQKA][cdhs]$","example":"AdKd"},"BoardInput":{"type":"string","description":"区切りなしの文字列としてのコミュニティカード: 3=フロップ \"2c2h2s\", 4=ターン, 5=リバー。","example":"2c2h2s"},"BoardOutput":{"type":"array","items":{"type":"string"},"description":"コミュニティカードを配列として返します","example":["2c","2h","2s"]},"RangeString":{"type":"string","description":"カンマ区切りのhand:weight。クラス表記はAA/AKs/AKo（ランクの高い方を先に記載）。weightは0..1、デフォルトは1。","example":"AA:1,KK,AKs:0.5,72o:0.1"},"Quota":{"type":"object","properties":{"used":{"type":"integer"},"limit":{"type":"integer"}}},"StrategyItem":{"type":"object","properties":{"action":{"type":"string","description":"check / call / fold / raise / bet"},"frequency":{"type":"number","format":"float","description":"0..1 の確率"},"sizing_pot":{"type":"number","description":"ポット比のサイズ設定。標準的なポットに対する%の慣例: ベット = ベット ÷ ポット、レイズ = （レイズ − コール額）÷ コール後のポット。例: 0.5 / 0.8 / 1。ベット/レイズのみ。"},"amount_bb":{"type":"number","description":"BB単位の絶対ベット/レイズ額（ベット/レイズの場合）"},"allin":{"type":"boolean","description":"アクションがオールインの場合に存在し、trueになる"}},"required":["action","frequency"]},"PreflopRequest":{"type":"object","required":["hole_cards","positions","preflop_actions"],"properties":{"hole_cards":{"$ref":"#/components/schemas/HoleCards"},"positions":{"type":"object","required":["hero"],"properties":{"hero":{"$ref":"#/components/schemas/Position"}}},"table_size":{"type":"string","default":"6max"},"preflop_version":{"type":"string","enum":["6max","6max_RC_100bb_200NL","6max_RC_100bb_100NL","6max_RC_40bb"],"description":"任意。使用する6maxプリフロップチャートセット。プラットフォームのデフォルト（6max）を使用するには省略します。不明な値 -> 400 unsupported_preflop_version。"},"preflop_actions":{"type":"array","description":"スモールブラインドからヒーロー直前のプレイヤーまでの、明示的で完全なアクション列（ヒーローは含まれません。ヒーローのポジションは positions.hero です）。スモールブラインド (0.5)、次にビッグブラインド (1) で開始する必要があります。amount は BB でこのアクションによって新たにコミットされた増分（累計ではありません）です。pot = すべての amount の合計です。allin:true でない限り、レイズ後の合計額は現在のベットを上回り、最小レイズ（= 現在のベット + 直前のレイズ額）を満たす必要があります。allin:true でない限り、コール後の合計額は現在のベットと完全に一致する必要があります。正確な額は pot/sizing_pot を正確にするだけであり、GTO 頻度は状況ベース（RFI/3bet/4bet + positions）で、ベットサイズによって変わりません。違反時は 400 invalid_actions を返します。\n","items":{"type":"object","required":["position","action"],"properties":{"position":{"$ref":"#/components/schemas/Position"},"action":{"type":"string","enum":["small blind","big blind","raise","call","fold"]},"amount":{"type":"number","description":"このアクションで新たにコミットしたBBの増分（フォールド以外のアクションでは必須）。フォールドでは省略/0。"},"allin":{"type":"boolean","description":"任意。ショートオールイン（最小レイズ未満のレイズ/コール）としてマークします。true の場合、最小レイズのチェックはスキップされます"}}}}}},"PreflopResponse":{"type":"object","properties":{"hole_cards":{"type":"string"},"situation":{"type":"string","enum":["RFI","Limp","Raise","3-Bet","4-Bet","5-Bet"],"description":"ヒーローが直面するテーブル状況: RFI（ヒーローまでフォールド、オープン可能な状況）/ リンプ（リンプしたプレイヤーがいて、レイズなし）/ レイズ（1回のレイズ）/ 3ベット / 4ベット / 5ベット"},"strategy":{"type":"array","items":{"$ref":"#/components/schemas/StrategyItem"}},"quota":{"$ref":"#/components/schemas/Quota"}}},"FlopPositions":{"type":"object","description":"必須キーは pot_type に依存します — SRP: hero,raiser,caller。3BET/4BET: hero,raiser,three_bettor（4BETでは、raiser = 4ベットしたオープナー、three_bettor = コールした3ベッター。four_bettor キーはありません）。LIMP: hero,limper。hero は指定されたシートのいずれかである必要があります。","properties":{"hero":{"$ref":"#/components/schemas/Position"},"raiser":{"$ref":"#/components/schemas/Position"},"caller":{"$ref":"#/components/schemas/Position"},"three_bettor":{"$ref":"#/components/schemas/Position"},"limper":{"$ref":"#/components/schemas/Position"}}},"FlopNodeRequest":{"type":"object","required":["node"],"properties":{"node":{"type":"string","description":"/v1/gto/flop/tree からのノードトークン（ノードの `token` フィールド）"},"hole_cards":{"$ref":"#/components/schemas/HoleCards"}}},"FlopTreeRequest":{"type":"object","required":["board","pot_type","positions"],"properties":{"board":{"$ref":"#/components/schemas/BoardInput"},"pot_type":{"type":"string","enum":["SRP","3BET","4BET","LIMP"]},"positions":{"$ref":"#/components/schemas/FlopPositions"},"flop_version":{"type":"string","enum":["6max","6max_RC_100bb_200NL","6max_RC_100bb_100NL","6max_RC_40bb"],"description":"任意。使用するフロップデータセット（プリフロップバージョンごとに1つ解析済み）。デフォルト（6max）を使用する場合は省略してください。選択したバージョンにそのスポットのデータがない場合、サービスは適切に6maxへフォールバックします。不明な値 -> 400 unsupported_flop_version。preflop_version とは独立しています。ノードトークンにはこのバージョンが含まれるため、/v1/gto/flop/node は同じデータセットを維持します。"}}},"FlopTreeResponse":{"type":"object","properties":{"board":{"$ref":"#/components/schemas/BoardOutput"},"pot_type":{"type":"string"},"pot":{"type":"number"},"effective_stack":{"type":"number"},"oop_range":{"$ref":"#/components/schemas/RangeString"},"ip_range":{"$ref":"#/components/schemas/RangeString"},"node_count":{"type":"integer"},"nodes":{"type":"array","items":{"type":"object","properties":{"node":{"type":"string","example":"root/CHECK/BET_8"},"is_hero":{"type":"boolean"},"token":{"type":"string"}}}},"quota":{"$ref":"#/components/schemas/Quota"}}},"NodeStrategyResponse":{"type":"object","description":"ヒーローのノードには `strategy` があり、相手のノード（または hole_cards がない場合）には `actions` + `range_strategy` があります。","properties":{"node":{"type":"string"},"is_hero":{"type":"boolean"},"hole_cards":{"type":"string"},"strategy":{"type":"array","items":{"$ref":"#/components/schemas/StrategyItem"}},"actions":{"type":"array","items":{"type":"object","properties":{"action":{"type":"string"},"amount_bb":{"type":"number"},"sizing_pot":{"type":"number"},"allin":{"type":"boolean"}}}},"range_strategy":{"type":"object","additionalProperties":{"type":"array","items":{"type":"number"}},"description":"コンボ（例: \"AhKh\"）-> actions に対応する頻度"},"range_hand_count":{"type":"integer"}}},"SolverScheduleRequest":{"type":"object","required":["board","oop_range","ip_range","pot","effective_stack","hero"],"properties":{"board":{"$ref":"#/components/schemas/BoardInput"},"oop_range":{"$ref":"#/components/schemas/RangeString"},"ip_range":{"$ref":"#/components/schemas/RangeString"},"pot":{"type":"number"},"effective_stack":{"type":"number"},"hero":{"type":"string","enum":["OOP","IP"]},"bet_sizes":{"type":"object","description":"任意のストリートごとのオープニングベットサイズ（ポット%）。フロップはデフォルトで50%です。","properties":{"flop":{"type":"array","items":{"type":"integer"}},"turn":{"type":"array","items":{"type":"integer"}},"river":{"type":"array","items":{"type":"integer"}}}},"raise_sizes":{"type":"object","description":"ポット % でのストリートごとの任意のレイズサイズ。省略したストリートでは bet_sizes/デフォルト値を再利用します","properties":{"flop":{"type":"array","items":{"type":"integer"}},"turn":{"type":"array","items":{"type":"integer"}},"river":{"type":"array","items":{"type":"integer"}}}},"donk_sizes":{"type":"object","description":"任意のOOPドンクリードサイズ（ポットに対する%）。ターンのデフォルトは67%、リバーのデフォルトは100%。","properties":{"turn":{"type":"array","items":{"type":"integer"}},"river":{"type":"array","items":{"type":"integer"}}}},"raise_limit":{"type":"integer","minimum":1,"maximum":4,"description":"任意のツリー全体のレイズ上限。フロップ/ターンの解析ではデフォルトで3、リバーのみの解析では4です"}}},"SolverScheduleResponse":{"type":"object","properties":{"status":{"type":"string","enum":["computing","queryable","busy"]},"solve":{"type":"string","description":"/tree および /node 用のハンドル"},"solve_quota":{"allOf":[{"$ref":"#/components/schemas/Quota"}],"description":"新しい解析がトリガーされた（課金済み）場合にのみ存在します。"}}},"SolverTreeResponse":{"type":"object","properties":{"street":{"type":"string","enum":["flop","turn","river"]},"pot":{"type":"number"},"effective_stack":{"type":"number"},"spot_status":{"type":"string","enum":["available","computing","queryable","expired","no_nodes"],"description":"no_nodes = 解析は収束しましたが、照会されたラウンド/ランアウトにはツリー内に意思決定ノードがありません（終端 — ポーリングを停止）。"},"node_count":{"type":"integer"},"nodes":{"type":"array","items":{"type":"object","properties":{"node":{"type":"string"},"is_hero":{"type":"boolean"},"status":{"type":"string"},"token":{"type":"string"}}}}}},"RangeRequest":{"type":"object","required":["range_oop","range_ip","solver_results","node_id"],"properties":{"range_oop":{"$ref":"#/components/schemas/RangeString"},"range_ip":{"$ref":"#/components/schemas/RangeString"},"solver_results":{"type":"object","description":"意思決定ツリー（組み立てるのはあなたです）"},"node_id":{"type":"string","example":"root/CHECK/BET 8.000000"},"board":{"$ref":"#/components/schemas/BoardInput"},"normalize":{"type":"boolean","default":true},"explain":{"type":"boolean","default":false},"track_hands":{"type":"array","items":{"type":"string"}},"bluff_discount_ratio":{"type":"number","minimum":0,"maximum":1},"hero_position":{"type":"string","enum":["oop","ip"],"description":"任意のカードブロッキング: どちらのプレイヤーがヒーローかを指定します。hero_hand と組み合わせて使用してください。"},"hero_hand":{"type":"string","example":"AsKs","description":"任意のカードブロッキング: ヒーローのカードのいずれか1枚を含むすべてのコンボをレンジから除外します（レンジ対ハンド分析）。レスポンスでそのまま返されます。/v1/gto/range にのみ適用され、projected-range ラッパーには適用されません。"}}},"RangeResponse":{"type":"object","properties":{"range_oop_new":{"$ref":"#/components/schemas/RangeString"},"range_ip_new":{"$ref":"#/components/schemas/RangeString"},"range_oop_new_raw":{"type":"string"},"range_ip_new_raw":{"type":"string"},"range_oop_new_raw_before_normalization":{"type":"string"},"range_ip_new_raw_before_normalization":{"type":"string"},"hand_ranks_oop":{"type":"string","description":"完成ハンドの強さ別のOOPコンボ: 'combo:rank,...'（rank が低いほど強い）。rank の昇順でソートされます。同順位の順序はエンドポイントや実行間で安定する保証がありません — これに依存しないでください。"},"hand_ranks_ip":{"type":"string","description":"hand_ranks_oop の IP 対応版。"},"hand_bottom_ranks_oop":{"type":"string","description":"hand_ranks_oop のうち最も弱い bluff_combos_ratio の割合（ブラフ候補）。形式は同じです。"},"hand_bottom_ranks_ip":{"type":"string","description":"hand_bottom_ranks_oop のIP版。"},"node_id":{"type":"string"},"board":{"$ref":"#/components/schemas/BoardOutput"},"path_length":{"type":"integer"},"bluff_discount_ratio":{"type":"number"},"bluff_combos_ratio":{"type":"number"},"quota":{"$ref":"#/components/schemas/Quota"}}},"ProjectedRangeRequest":{"type":"object","required":["board","pot_type","positions"],"properties":{"board":{"$ref":"#/components/schemas/BoardInput"},"pot_type":{"type":"string","enum":["SRP","3BET","4BET","LIMP"]},"positions":{"$ref":"#/components/schemas/FlopPositions"},"node_id":{"type":"string","default":"root","example":"root/BET_4"},"normalize":{"type":"boolean","default":true},"bluff_discount_ratio":{"type":"number","default":0.8,"minimum":0,"maximum":1},"hero_position":{"type":"string","enum":["oop","ip"],"description":"任意のカードブロッキング。hero_hand と組み合わせて使用します。"},"hero_hand":{"type":"string","example":"AsKs","description":"任意のカードブロッキング: 相手の更新済みレンジ（range_*_new_raw 出力）から、ヒーローのカードのいずれかを含むすべてのコンボを削除します。ヒーロー自身のハンドも、ヒーロー自身のレンジに含まれることが保証されます。エコーバックされます。"},"bluff_combos_ratio":{"type":"number","minimum":0,"maximum":1,"description":"任意。ブラフ（レンジ下部）として扱うレンジの割合。省略するとサーバーのターン/リバーのデフォルトを使用します。エコーバックされます。"},"partner_hands":{"type":"array","items":{"type":"string"},"example":["Ac9c"],"description":"任意。カードが相手の更新後レンジ（range_*_new_raw）から除外される4文字のコンボ。hero_position が必要です。入力専用（エコーされません）。flop/projected-range 専用。"},"flop_version":{"type":"string","enum":["6max","6max_RC_100bb_200NL","6max_RC_100bb_100NL","6max_RC_40bb"],"description":"任意。使用するフロップデータセット（プリフロップバージョンごとに1つ解析済み）を指定します。デフォルト（6max）を使用するには、このパラメータを省略してください。選択したバージョンにそのスポットのデータがない場合、サービスは適切に6maxへフォールバックします。不明な値 -> 400 unsupported_flop_version。preflop_version とは独立しています。"}}},"ProjectedRangeResponse":{"description":"RangeResponse と同じフィールドに加え、リクエストからそのまま返される pot_type を含みます（合計17フィールド）。","allOf":[{"$ref":"#/components/schemas/RangeResponse"},{"type":"object","properties":{"pot_type":{"type":"string"}}}]},"TurnProjectedRangeRequest":{"type":"object","required":["solve","node_id"],"properties":{"solve":{"type":"string","description":"/v1/gto/solver からのハンドル（ターン解析）"},"node_id":{"type":"string","description":"ターンのアクションライン。ストリートを閉じる CALL/CHECK で終わる場合があります。空白を含むソルバーノード形式。例: \"root/CHECK/BET 6.000000/CALL\"。"},"normalize":{"type":"boolean","default":true},"bluff_discount_ratio":{"type":"number","minimum":0,"maximum":1},"hero_position":{"type":"string","enum":["oop","ip"],"description":"任意のカードブロッキング。hero_hand と組み合わせて使用してください。"},"hero_hand":{"type":"string","example":"AsKs","description":"任意のカードブロッキング: 相手の更新済みレンジから、ヒーローのカードのいずれかを含むすべてのコンボを除外します。"},"partner_hands":{"type":"array","items":{"type":"string"},"example":["Ac9c"],"description":"任意。カードが相手の更新後レンジから除外される4文字のコンボ。hero_position が必要です。入力専用です。"}}},"EvsRequest":{"type":"object","required":["solve","node_id"],"properties":{"solve":{"type":"string","description":"/v1/gto/solver からのハンドル"},"node_id":{"type":"string","example":"root","description":"/v1/gto/solver/tree のノード（ソルバー表記。例: \"root/CHECK/BET 6.000000\"）"},"hand":{"type":"string","example":"AsKh","description":"任意。1つのハンドのEVに絞り込みます（指定しない場合はすべてのハンド）。"}}},"EvsResponse":{"type":"object","description":"ノードにおけるハンドごと・アクションごとのEV。各ハンドのEV配列は actions に対応します。","properties":{"node_id":{"type":"string"},"task_id":{"type":"string"},"player":{"type":"integer"},"round":{"type":"string","example":"FLOP"},"actions":{"type":"array","items":{"type":"string"},"example":["CHECK","BET 4.000000","BET 97.000000"]},"evs":{"type":"object","additionalProperties":{"type":"array","items":{"type":"number"}},"description":"hand -> アクションごとのEV配列（bb）。hand が指定された場合は単一の配列","example":{"2c2d":[-0.826359,-0.792223,-1.643411]}}}},"BoardRequest":{"properties":{"board":{"type":"string","title":"ボード","description":"3/4/5 枚のボードカード。例: 'AsKsQs'","examples":["AsKsQs"]},"hand_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"ハンドタイプ","examples":["StandardHighHand"]},"dead":{"type":"string","title":"デッド","description":"任意のデッド／除外カード","default":""}},"type":"object","required":["board"],"title":"BoardRequest"},"CardsRequest":{"properties":{"cards":{"type":"string","title":"カード","description":"正規化・検証するカード","examples":["AsKsQs"]}},"type":"object","required":["cards"],"title":"CardsRequest"},"EquityAdvantageRequest":{"properties":{"hero":{"items":{"type":"string"},"type":"array","title":"Hero","examples":[["AA","KK","AKs"]]},"villain":{"items":{"type":"string"},"type":"array","title":"Villain","examples":[["QQ","JJ","AQs"]]},"board":{"type":"string","title":"ボード","examples":["AsKsQs"]},"sample_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"サンプル数"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"シード"},"hand_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"ハンドタイプ"}},"type":"object","required":["hero","villain","board"],"title":"EquityAdvantageRequest"},"EquityRequest":{"properties":{"ranges":{"items":{"items":{"type":"string"},"type":"array"},"type":"array","title":"レンジ","description":"プレイヤーごとのレンジ（表記法）","examples":[[["AA","KK"],["QQ","JJ"]]]},"board":{"type":"string","title":"ボード","default":"","examples":["AhKhQh"]},"sample_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"サンプル数","description":"モンテカルロのサンプル数（上限あり）。未指定の場合はデフォルトが適用されます"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"シード","description":"再現可能なサンプリング用のシード"}},"type":"object","required":["ranges"],"title":"EquityRequest"},"EvalCompareRequest":{"properties":{"holdings":{"items":{"type":"string"},"type":"array","title":"保有ハンド","description":"ランク付けするホールディングを2件以上","examples":[["AcAd","KcKd","JhTh"]]},"board":{"type":"string","title":"ボード","default":"","examples":["AhKhQh"]},"hand_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"ハンドタイプ"}},"type":"object","required":["holdings"],"title":"EvalCompareRequest"},"EvalHandRequest":{"properties":{"hole":{"type":"string","title":"ホール","examples":["AcAd"]},"board":{"type":"string","title":"ボード","default":"","examples":["AhKhQh"]},"hand_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"ハンドタイプ"}},"type":"object","required":["hole"],"title":"EvalHandRequest"},"GameStateRequest":{"properties":{"variant":{"type":"string","title":"バリアント","description":"バリアントコード。例: NT（NL ホールデム）。/meta を参照","examples":["NT"]},"starting_stacks":{"items":{"type":"integer"},"type":"array","title":"開始時スタック","examples":[[200,200]]},"antes":{"items":{"type":"integer"},"type":"array","title":"アンティ","examples":[[0,0]]},"blinds_or_straddles":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"ブラインドまたはストラドル","examples":[[1,2]]},"bring_in":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"ブリングイン"},"small_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"スモールベット"},"big_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"ビッグベット"},"min_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"最小ベット","description":"ノーリミット／ポットリミットで必須。例: 2"},"ante_trimming_status":{"type":"boolean","title":"アンティのトリミング状態","default":false},"automations":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"自動処理","description":"自動処理名。省略した場合は pokerkit のデフォルトを使用します"},"actions":{"items":{"type":"string"},"type":"array","title":"アクション","examples":[["d dh p1 AhKh","d dh p2 QsQd","p2 cbr 6"]]},"viewer":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"閲覧者","description":"予約済み（非公開情報ティア）。v1 は完全情報です"}},"type":"object","required":["variant","starting_stacks","antes"],"title":"GameStateRequest"},"GameStepRequest":{"properties":{"variant":{"type":"string","title":"バリアント","description":"バリアントコード。例: NT（NL ホールデム）。/meta を参照","examples":["NT"]},"starting_stacks":{"items":{"type":"integer"},"type":"array","title":"開始時スタック","examples":[[200,200]]},"antes":{"items":{"type":"integer"},"type":"array","title":"アンティ","examples":[[0,0]]},"blinds_or_straddles":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"ブラインドまたはストラドル","examples":[[1,2]]},"bring_in":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"ブリングイン"},"small_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"スモールベット"},"big_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"ビッグベット"},"min_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"最小ベット","description":"ノーリミット/ポットリミットでは必須（例: 2）"},"ante_trimming_status":{"type":"boolean","title":"アンティトリミングステータス","default":false},"automations":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"自動処理","description":"オートメーション名。pokerkit のデフォルトを使用する場合は省略"},"actions":{"items":{"type":"string"},"type":"array","title":"アクション","examples":[["d dh p1 AhKh","d dh p2 QsQd","p2 cbr 6"]]},"viewer":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"閲覧者","description":"予約済み（非公開情報ティア）。v1 は完全情報です"},"next_action":{"type":"string","title":"次のアクション","description":"適用するプレイヤー／ディールのアクション","examples":["p1 cc"]},"expected_action_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"想定アクション数","description":"楽観的並行制御トークンには、拡張対象の len(actions) を指定します。不一致の場合は 409"}},"type":"object","required":["variant","starting_stacks","antes","next_action"],"title":"GameStepRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"詳細"}},"type":"object","title":"HTTPValidationError"},"HandRequest":{"properties":{"hole":{"type":"string","title":"ホール","description":"2枚のホールカード（例: 'JhTh'）","examples":["JhTh"]},"board":{"type":"string","title":"ボード","examples":["AsKsQs"]},"hand_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"ハンドタイプ"},"dead":{"type":"string","title":"デッド","default":""}},"type":"object","required":["hole","board"],"title":"HandRequest"},"HandStrengthRequest":{"properties":{"hole_range":{"items":{"type":"string"},"type":"array","title":"ホールカードのレンジ","description":"ヒーローのレンジ/ハンド（表記法）","examples":[["AhKh"]]},"board":{"type":"string","title":"ボード","default":"","examples":["AhKhQh"]},"player_count":{"type":"integer","minimum":2.0,"title":"プレイヤー数","default":2},"sample_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"サンプル数"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"シード"}},"type":"object","required":["hole_range"],"title":"HandStrengthRequest"},"IcmRequest":{"properties":{"payouts":{"items":{"type":"number"},"type":"array","title":"賞金配分","examples":[[50,30,20]]},"chips":{"items":{"type":"number"},"type":"array","title":"チップ","examples":[[5000,3000,2000]]}},"type":"object","required":["payouts","chips"],"title":"IcmRequest"},"NotationParseRequest":{"properties":{"text":{"type":"string","title":"テキスト","description":"pokerkit の .phh ハンド履歴文字列"}},"type":"object","required":["text"],"title":"NotationParseRequest"},"NutAdvantageRequest":{"properties":{"hero":{"items":{"type":"string"},"type":"array","title":"Hero","description":"ヒーローのレンジ（記法）","examples":[["AA","KK","AKs"]]},"villain":{"items":{"type":"string"},"type":"array","title":"Villain","description":"相手のレンジ（表記法）","examples":[["QQ","JJ","AQs"]]},"board":{"type":"string","title":"ボード","examples":["AsKsQs"]},"hand_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"ハンドタイプ"}},"type":"object","required":["hero","villain","board"],"title":"NutAdvantageRequest"},"RangeExpandRequest":{"properties":{"notation":{"items":{"type":"string"},"type":"array","title":"表記法","description":"レンジ表記法トークン","examples":[["AA","KQs","QQ+"]]}},"type":"object","required":["notation"],"title":"RangeExpandRequest"},"ReplayRequest":{"properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"テキスト","description":".phh文字列、または以下のconfig+actionsフィールドを指定してください"},"variant":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"バリアント"},"starting_stacks":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"開始時スタック"},"antes":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"アンティ"},"blinds_or_straddles":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"ブラインドまたはストラドル"},"bring_in":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"ブリングイン"},"small_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"スモールベット"},"big_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"ビッグベット"},"min_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"最小ベット"},"ante_trimming_status":{"type":"boolean","title":"アンティのトリミング状態","default":false},"automations":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"自動処理"},"actions":{"items":{"type":"string"},"type":"array","title":"アクション"},"index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"インデックス","description":"このステップインデックスのスナップショットのみを返します"}},"type":"object","title":"ReplayRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"場所"},"msg":{"type":"string","title":"メッセージ"},"type":{"type":"string","title":"エラーの種類"},"input":{"title":"入力"},"ctx":{"type":"object","title":"コンテキスト"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"ValueRangeRequest":{"properties":{"board":{"type":"string","title":"ボード","examples":["AsKsQs"]},"aggression":{"type":"string","title":"アグレッション","default":"SINGLE_BET","examples":["NO_BET","SINGLE_BET","RAISED"]},"floor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"下限","description":"任意のカテゴリ下限。例: 'TWO_PAIR'（aggression のデフォルトを上書き）"},"hand_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"ハンドタイプ"},"dead":{"type":"string","title":"デッド","default":""}},"type":"object","required":["board"],"title":"ValueRangeRequest"}}},"x-pokerai-public-provenance":{"sourceUrl":"https://pokerai.bet/v1/pokerkit/combined-openapi.json","generatedAt":"2026-07-22T12:05:56Z","snapshotVersion":"1.0"}}