{"openapi":"3.0.3","info":{"title":"pokerai.bet API (GTO 전략 + 포커 엔진)","version":"1.0","description":"프리플랍 / 플롭 / 턴 / 리버용 GTO 전략 API입니다. 각 액션의 혼합 빈도를 반환합니다(권장 액션 없음 — 빈도에 따라 선택합니다). 프리플랍과 플롭은 사전 풀이된 GTO 풀이 라이브러리를 사용하며 즉시(밀리초 단위) 제공됩니다. 솔버 엔드포인트는 실시간으로 계산합니다(플롭 약 70초, 턴/리버는 더 빠름). 카드/보드 입력은 구분자 없는 문자열(\"2c2h2s\", \"AdKd\")을 사용하며, board는 배열([\"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":"포지션 + 액션 라인에 대한 전체 13×13 프리플랍 레인지를 한 번의 호출로 제공합니다 — 169개 핸드 유형 →\n폴드/콜/레이즈 빈도. `hole_cards` 없음(스팟은 positions +\npreflop_actions에서 가져옵니다). 사전 풀이된 할당량 1을 차감합니다(169번이 아닌 한 번의 호출). 레인지 그리드용입니다.\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":"선택 사항; 사용할 6맥스 프리플랍 차트 세트 (/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":"플롭 노드 전략(사전 풀이된) — 의사결정 트리 노드 하나","description":"플롭 결정 트리의 노드별 전략 (무료, 토큰 필요). POST /v1/gto/flop/tree에서 발급된 `node` 토큰을 전달하세요. hole_cards를 포함하면 → 해당 핸드의 노드 혼합 전략이 반환되고, hole_cards를 생략하면 → 노드의 전체 레인지 전략이 반환됩니다.\n\n이렇게 하면 모든 히어로 플롭 결정을 얻을 수 있습니다 — 인 포지션인 히어로, 베트에 맞서는 히어로 또는 이후 액션의 경우: 트리를 가져와 is_hero가 true인 노드(예: root/CHECK/BET_13 = 체크 후 히어로가 베트에 맞섬 → 폴드/콜/레이즈)를 선택한 다음, 해당 토큰을 여기로 전달하세요. 루트 노드(root)는 히어로의 첫 번째 결정입니다(OOP 체크/베트).\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":"board 길이가 스트리트를 정합니다(3=플롭, 4=턴, 5=리버). 새로 트리거된 경우 풀이 할당량 1을 소모합니다. 캐시됨 상태의 풀이는 solve_quota 필드 없이 status=queryable을 반환합니다(과금되지 않음). 모든 솔버 호스트가 사용 중이면 status=busy와 함께 429를 반환합니다.\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(메시지 포함); 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":"완료된 풀이의 한 노드에서 핸드별, 액션별 기대값입니다. 풀이 핸들(/v1/gto/solver에서 가져옴)과 node_id(/v1/gto/solver/tree에서 가져옴)를 제공하세요. 선택적 핸드 필터는 하나의 핸드로 제한합니다. 무료입니다(/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에서 읽음)를 스트리트를 마감하는 콜/체크를 포함한 턴 액션 라인을 따라서만 리버 진입 레인지로 좁힙니다. /v1/gto/solver/tree와 마찬가지로 무료입니다(풀이 비용은 이미 /v1/gto/solver를 통해 청구됨). /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 사양과 이 서비스의 자동 사양을 하나의 문서로 병합합니다(경로는 서로 겹치지 않으며,\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":"두 장의 카드이며 구분자가 없습니다. 예: \"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 (높은 랭크 우선); 가중치는 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 + 포지션)이고 베팅 크기에 따라 변하지 않습니다. 위반 시 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 (히어로까지 폴드되어 오픈 가능한 상황) / Limp (림퍼가 있고 레이즈 없음) / Raise (레이즈 1회) / 3-Bet / 4-Bet / 5-Bet"},"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":"선택 사항; 사용할 플롭 데이터셋(프리플랍 버전당 하나가 풀이됨)입니다. 기본값(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":"선택적 카드 블로킹: 히어로의 카드 중 하나를 포함하는 모든 콤보를 레인지에서 제거합니다(레인지 대 핸드 분석). 응답에 그대로 반환됩니다. /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,...' (낮은 랭크 = 더 강함), 랭크 오름차순 정렬. 같은 랭크의 동률 순서는 엔드포인트/실행 간 안정적으로 보장되지 않으므로 이에 의존하지 마세요."},"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이 필요합니다. 입력 전용(에코되지 않음)입니다. 플롭/projected-range에만 해당합니다."},"flop_version":{"type":"string","enum":["6max","6max_RC_100bb_200NL","6max_RC_100bb_100NL","6max_RC_40bb"],"description":"선택 사항; 사용할 플롭 데이터세트(프리플랍 버전당 하나가 풀이됨)입니다. 기본값(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":"선택 사항; 한 핸드의 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(노리밋 홀덤)); /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 (노리밋 홀덤)); /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":"낙관적 동시성 토큰 = 확장하려는 actions의 길이인 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"}}