{"openapi":"3.0.3","info":{"title":"pokerai.bet API (estratégia GTO + motor de Poker)","version":"1.0","description":"API de estratégia GTO para pré-flop / flop / turn / river. Retorna a frequência mista de cada ação (nenhuma ação recomendada — você escolhe pela frequência). Pré-flop e flop usam uma biblioteca de soluções GTO pré-resolvidas, fornecidas instantaneamente (milissegundos). O endpoint do solver calcula em tempo real (flop ~70s, turn/river mais rápido). As entradas de cartas/board usam uma string sem separadores (\"2c2h2s\", \"AdKd\"); o board é retornado como um array ([\"2c\",\"2h\",\"2s\"]). As strings de Ranges são separadas por vírgulas `hand:weight` (notação de classe AA/AKs/AKo; peso 0..1, padrão 1).\n\n⚠ Observação: o botão \"Testar solicitação\" abaixo envia uma solicitação real com sua chave e consome sua cota mensal real. É novo por aqui? Leia primeiro o guia: https://pokerai.bet/docs\n"},"servers":[{"url":"https://pokerai.bet"}],"security":[{"BearerApiKey":[]},{"XApiKey":[]}],"tags":[{"name":"Consulta","description":"Soluções GTO pré-resolvidas, servidas instantaneamente (em milissegundos) — pré-flop + toda a árvore de decisões do flop. Cada uma consome 1 cota de pré-resolução."},{"name":"Solucionador","description":"Solucionador em tempo real (flop ~70s, turn/river mais rápidos). Enviar uma tarefa de resolução -> árvore -> nó."},{"name":"Range","description":"Atualize Ranges ao longo de uma linha de ação (conversão de range / range projetado do flop)."}],"paths":{"/v1/gto/preflop":{"post":{"tags":["Consulta"],"operationId":"preflopStrategy","summary":"Estratégia pré-flop (pré-resolvida)","description":"Consome 1 cota pré-resolvida. A situação (RFI/Limp/Raise/3-Bet/4-Bet/5-Bet) é derivada das ações.","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":["Consulta"],"operationId":"preflopRange","summary":"Range pré-flop completo para uma situação (pré-resolvida)","description":"O range pré-flop completo de 13×13 para uma posição + linha de ação em uma chamada — 169 tipos de mãos →\nfrequências de fold/call/raise. Sem `hole_cards` (a situação vem de positions +\npreflop_actions). Consome 1 cota pré-resolvida (uma chamada, não 169). Para uma grade de range.\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":"opcional; qual conjunto de gráficos pré-flop 6max usar (o mesmo que /v1/gto/preflop). Omita para o padrão."},"positions":{"type":"object","properties":{"hero":{"type":"string","example":"BTN"}}},"preflop_actions":{"type":"array","items":{"type":"object"},"description":"sequência completa de ações a partir de SB/BB, igual a /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":"tipo de mão (AA / AKs / AKo) -> {fold, call, raise}; 169 entradas, cada uma totalizando ~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":["Consulta"],"operationId":"preflopVersions","summary":"Liste as versões de estratégia pré-flop instaladas (gratuito)","description":"Os valores selecionáveis de preflop_version para /v1/gto/preflop e /v1/gto/preflop/range, com um rótulo legível para cada um e qual é o padrão (usado quando preflop_version é omitido). Grátis (sem cota). Use isto em vez de codificar a lista — novas versões aparecem aqui automaticamente.\n","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"versions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"passe isto como preflop_version"},"label":{"type":"string"},"default":{"type":"boolean","description":"presente e true na versão padrão"}}}},"default":{"type":"string","description":"o id usado quando preflop_version é omitido"}}},"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":["Consulta"],"operationId":"flopTree","summary":"Árvore de decisão do flop (pré-resolvida)","description":"Consome 1 cota pré-resolvida. Retorna os Ranges iniciais + todos os nós de decisão (cada um com um token para /v1/gto/flop/node).","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlopTreeRequest"},"examples":{"SRP":{"summary":"Pote com um único aumento — posições: hero, raiser, caller","value":{"board":"2c2h2s","pot_type":"SRP","positions":{"hero":"UTG","raiser":"UTG","caller":"BTN"}}},"3BET":{"summary":"Pote de 3-bet — posições: hero, raiser (abridor), three_bettor","value":{"board":"2c2h2s","pot_type":"3BET","positions":{"hero":"CO","raiser":"CO","three_bettor":"BTN"}}},"4BET":{"summary":"Pote 4-bet — posições: hero, raiser (abridor que deu 4-bet), three_bettor (3-bettor que pagou)","value":{"board":"2c2h2s","pot_type":"4BET","positions":{"hero":"CO","raiser":"CO","three_bettor":"BTN"}}},"LIMP":{"summary":"Pote com limp — posições: hero, limper (hero ou limper deve ser 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":["Consulta"],"operationId":"flopNode","summary":"Estratégia do nó do flop (pré-resolvida) — um nó da árvore de decisões","description":"Estratégia por nó para a árvore de decisão do flop (gratuita, protegida por token). Passe um token `node` gerado por POST /v1/gto/flop/tree. Com hole_cards → a estratégia mista dessa mão no nó; omita hole_cards → a estratégia de range completo do nó.\n\nÉ assim que você obtém TODAS as decisões de flop do hero — hero em posição, hero enfrentando uma aposta ou uma ação posterior: obtenha a árvore, escolha um nó em que is_hero seja true (por exemplo, root/CHECK/BET_13 = hero enfrenta uma aposta após dar check → fold/call/raise) e passe o token dele aqui. O nó raiz (root) é a primeira decisão do hero (OOP check/bet).\n\nA árvore de flop é de uma única rodada; para decisões de turn/river, use a linha do solucionador (/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":["Solucionador"],"operationId":"solverSchedule","summary":"Enviar uma tarefa de resolução em tempo real (flop/turn/river)","description":"o comprimento do board define a rodada (3=flop, 4=turn, 5=river). Consome 1 cota de resolução em um acionamento novo; uma resolução em cache retorna status=queryable sem o campo solve_quota (não cobrada); se todos os hosts do solver estiverem ocupados, retorna 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":"cota de resolução excedida ou todos os hosts do solucionador ocupados (status=busy)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/gto/solver/tree":{"post":{"tags":["Solucionador"],"operationId":"solverTree","summary":"Consulte repetidamente a árvore da resolução + status do nó (gratuito)","description":"Consulte até spot_status = queryable. Para avançar uma resolução multi-street até o runout distribuído, passe\nas cartas distribuídas: `turn_card` (por exemplo, uma resolução de flop → um turn específico) e/ou `river_card`.\nUma posição no river de uma resolução de *flop* precisa de AMBOS `turn_card` e `river_card` para ser única;\numa resolução de turn precisa somente de `river_card`. Omita ambos para obter a própria street da resolução.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["solve"],"properties":{"solve":{"type":"string","description":"identificador de /v1/gto/solver"},"turn_card":{"type":"string","description":"opcional; para uma resolução de flop, a carta de turn distribuída (por ex., \"Td\") — retorna nós sob esse turn."},"river_card":{"type":"string","description":"opcional; a carta de river distribuída (por exemplo, \"Qh\"). A partir de uma resolução de flop, combine com turn_card para desambiguar."}}},"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":["Solucionador"],"operationId":"solverNode","summary":"Estratégia de nó de uma resolução (grátis)","description":"nó do herói → estratégia do herói; nó do vilão (ou omita hole_cards) → estratégia do range inteiro.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["node"],"properties":{"node":{"type":"string","description":"token do nó de /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 = a resolução foi recolhida/substituída, reagende; error = strategy_error por nó do solver (com mensagem); computing = ainda resolvendo."},"message":{"type":"string","description":"presente quando node_status = error"}}}]}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"503":{"$ref":"#/components/responses/UpstreamUnavailable"}}}},"/v1/gto/solver/release":{"post":{"tags":["Solucionador"],"operationId":"solverRelease","summary":"Libere antecipadamente a porta do pool de uma resolução (gratuito, opcional)","description":"Informe que você terminou de consultar esta resolução para que sua porta do solver retorne imediatamente ao pool\nem vez de permanecer até o TTL do cache expirar (o que pode fazer com que a próxima solicitação receba uma resposta 429 de ocupado quando o pool é pequeno).\nOpcional — ignorá-lo apenas volta a usar o TTL. Chame-o somente DEPOIS da sua última\n/v1/gto/solver/tree e /v1/gto/solver/node para esta resolução: uma vez liberada, a porta pode ser\nreutilizada, e consultas adicionais com este identificador retornam node_status = expired. Idempotente; não\nreinicia o solver.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["solve"],"properties":{"solve":{"type":"string","description":"identificador de /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 se uma reivindicação de porta ativa foi removida; false se a resolução já havia expirado (sem operação)"}}},"example":{"released":true}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/v1/gto/range":{"post":{"tags":["Range"],"operationId":"rangeConvert","summary":"Conversão de Ranges — atualize as Ranges ao longo de uma linha de ações","description":"Proxy leve para o /api/range do solver. Você reúne todas as entradas, incluindo solver_results (a árvore de decisão). Consome 1 cota de pré-resolução. As Ranges de saída alimentam a resolução da próxima rodada.\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":["Range"],"operationId":"projectedRange","summary":"Range projetado — atualização de Ranges no flop ao longo de uma linha de ação (cota pré-resolvida)","description":"Projeta os Ranges do flop adiante ao longo de uma linha de ações para o board / pot_type / positions fornecidos. Consome 1 cota pré-resolvida. Retorna a mesma saída de atualização de Ranges que /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":["Range"],"operationId":"queryEvs","summary":"EVs do nó — valores esperados por mão e por ação de uma resolução concluída (gratuito)","description":"Valores esperados por mão e por ação em um nó de uma resolução concluída. Forneça o identificador da resolução (de /v1/gto/solver) + um node_id (de /v1/gto/solver/tree); filtros opcionais de mão para uma única mão. Gratuito (já cobrado via /v1/gto/solver). Consulte /v1/gto/solver/tree repetidamente até que seja queryable primeiro.\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":"EVs do nó; ou { spot_status: computing } se ainda não tiver convergido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvsResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"description":"identificador da resolução inválido ou não é seu"},"410":{"description":"resolução expirada (TTL); reagende via /v1/gto/solver"}}}},"/v1/gto/turn/projected-range":{"post":{"tags":["Range"],"operationId":"turnProjectedRange","summary":"Range projetado — atualização de Range do turn→river ao longo de uma linha de ação no turn (gratuito)","description":"O equivalente turn→river de /v1/gto/flop/projected-range, para uma resolução de turn em tempo real. Restringe as Ranges de entrada no turn (as Ranges com as quais a resolução foi agendada, lidas da própria config da resolução) ao longo de uma linha de ação no turn — incluindo o CALL/CHECK que encerra a rodada — às Ranges de entrada no river. Gratuita (a resolução já foi cobrada via /v1/gto/solver), como /v1/gto/solver/tree. Retorna a mesma saída de atualização de Ranges que /v1/gto/range. Consulte /v1/gto/solver/tree repetidamente até que spot_status = queryable primeiro.\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":"Ranges de entrada no river reduzidos; ou { spot_status: computing } se a resolução ainda não tiver convergido (continue consultando /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":"resolução expirada (TTL) — reagende via /v1/gto/solver","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"$ref":"#/components/responses/Upstream"}}}},"/health":{"get":{"summary":"Integridade","operationId":"health_health_get","responses":{"200":{"description":"Resposta bem-sucedida","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Health Get"}}}}}}},"/v1/pokerkit/texture":{"post":{"tags":["Semântico"],"summary":"Textura","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":"Resposta bem-sucedida","content":{"application/json":{"schema":{}}}},"422":{"description":"Erro de validação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/nuts":{"post":{"tags":["Semântico"],"summary":"Nuts","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":"Resposta bem-sucedida","content":{"application/json":{"schema":{}}}},"422":{"description":"Erro de validação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/category-combos":{"post":{"tags":["Semântico"],"summary":"Combinações por categoria","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":"Resposta bem-sucedida","content":{"application/json":{"schema":{}}}},"422":{"description":"Erro de validação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/board-report":{"post":{"tags":["Semântico"],"summary":"Relatório do board","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":"Resposta bem-sucedida","content":{"application/json":{"schema":{}}}},"422":{"description":"Erro de validação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/hand-tier":{"post":{"tags":["Semântico"],"summary":"Nível da mão","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":"Resposta bem-sucedida","content":{"application/json":{"schema":{}}}},"422":{"description":"Erro de validação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/draws":{"post":{"tags":["Semântico"],"summary":"Projetos","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":"Resposta bem-sucedida","content":{"application/json":{"schema":{}}}},"422":{"description":"Erro de validação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/outs":{"post":{"tags":["Semântico"],"summary":"Cartas de melhoria","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":"Resposta bem-sucedida","content":{"application/json":{"schema":{}}}},"422":{"description":"Erro de validação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/blockers":{"post":{"tags":["Semântico"],"summary":"Bloqueadores","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":"Resposta bem-sucedida","content":{"application/json":{"schema":{}}}},"422":{"description":"Erro de validação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/hand-report":{"post":{"tags":["Semântico"],"summary":"Relatório da Mão","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":"Resposta bem-sucedida","content":{"application/json":{"schema":{}}}},"422":{"description":"Erro de validação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/range/expand":{"post":{"tags":["Ranges"],"summary":"Expandir Range","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":"Resposta bem-sucedida","content":{"application/json":{"schema":{}}}},"422":{"description":"Erro de validação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/range/value":{"post":{"tags":["Ranges"],"summary":"Valor do Range","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":"Resposta bem-sucedida","content":{"application/json":{"schema":{}}}},"422":{"description":"Erro de validação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/range/nut-advantage":{"post":{"tags":["Ranges"],"summary":"Vantagem de Nuts do Range","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":"Resposta bem-sucedida","content":{"application/json":{"schema":{}}}},"422":{"description":"Erro de validação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/cards/normalize":{"post":{"tags":["Cartas"],"summary":"Normalizar Cartas","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":"Resposta bem-sucedida","content":{"application/json":{"schema":{}}}},"422":{"description":"Erro de validação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/eval/hand":{"post":{"tags":["Núcleo"],"summary":"Avaliar Mão","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":"Resposta bem-sucedida","content":{"application/json":{"schema":{}}}},"422":{"description":"Erro de validação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/eval/compare":{"post":{"tags":["Núcleo"],"summary":"Comparar Avaliações","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":"Resposta bem-sucedida","content":{"application/json":{"schema":{}}}},"422":{"description":"Erro de validação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/equity":{"post":{"tags":["Núcleo"],"summary":"Equidade","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":"Resposta bem-sucedida","content":{"application/json":{"schema":{}}}},"422":{"description":"Erro de validação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/hand-strength":{"post":{"tags":["Núcleo"],"summary":"Força da Mão","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":"Resposta bem-sucedida","content":{"application/json":{"schema":{}}}},"422":{"description":"Erro de validação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/icm":{"post":{"tags":["Núcleo"],"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":"Resposta bem-sucedida","content":{"application/json":{"schema":{}}}},"422":{"description":"Erro de validação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/range/equity-advantage":{"post":{"tags":["Núcleo"],"summary":"Vantagem de Equidade do Range","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":"Resposta bem-sucedida","content":{"application/json":{"schema":{}}}},"422":{"description":"Erro de validação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/notation/parse":{"post":{"tags":["Núcleo"],"summary":"Análise de Notação","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":"Resposta bem-sucedida","content":{"application/json":{"schema":{}}}},"422":{"description":"Erro de validação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/games/state":{"post":{"tags":["Jogos"],"summary":"Estado dos Jogos","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":"Resposta bem-sucedida","content":{"application/json":{"schema":{}}}},"422":{"description":"Erro de validação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/games/step":{"post":{"tags":["Jogos"],"summary":"Etapa dos Jogos","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":"Resposta bem-sucedida","content":{"application/json":{"schema":{}}}},"422":{"description":"Erro de validação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/notation/replay":{"post":{"tags":["Jogos"],"summary":"Reprodução de Notação","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":"Resposta bem-sucedida","content":{"application/json":{"schema":{}}}},"422":{"description":"Erro de validação","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/combined-openapi.json":{"get":{"tags":["Metadados"],"summary":"OpenAPI combinada","description":"Especificação GTO + a especificação automática deste serviço mescladas em um único documento (os paths não se sobrepõem;\nos schemas do pokerkit recebem prefixo somente em caso de colisão de nome). Sempre reflete o código atual.","operationId":"combined_openapi_v1_pokerkit_combined_openapi_json_get","responses":{"200":{"description":"Resposta bem-sucedida","content":{"application/json":{"schema":{}}}}}}},"/v1/pokerkit/meta":{"get":{"tags":["Metadados"],"summary":"Metadados","operationId":"meta_v1_pokerkit_meta_get","responses":{"200":{"description":"Resposta bem-sucedida","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":"entrada inválida ou campo ausente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"chave de API ausente ou inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NoSolution":{"description":"sem dados GTO para esta situação/board","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"QuotaExceeded":{"description":"cota mensal excedida (reinicia no dia 1º)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Upstream":{"description":"servidor temporariamente indisponível, tente novamente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"UpstreamUnavailable":{"description":"solucionador inacessível após as próprias tentativas do serviço (erro de transporte / 5xx) — pode ser tentado novamente; erro: upstream_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Forbidden":{"description":"token inválido ou não é seu","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":"duas cartas, sem separador, por exemplo, \"AdKd\". Valores AKQJT98765432, naipes c d h s.","pattern":"^[2-9TJQKA][cdhs][2-9TJQKA][cdhs]$","example":"AdKd"},"BoardInput":{"type":"string","description":"cartas comunitárias como uma string sem separadores: 3=flop \"2c2h2s\", 4=turn, 5=river.","example":"2c2h2s"},"BoardOutput":{"type":"array","items":{"type":"string"},"description":"cartas comunitárias retornadas como um array","example":["2c","2h","2s"]},"RangeString":{"type":"string","description":"hand:weight separados por vírgulas. notação de classe AA/AKs/AKo (rank mais alto primeiro); peso 0..1, padrão 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":"Probabilidade de 0..1"},"sizing_pot":{"type":"number","description":"dimensionamento relativo ao pote, convenção padrão de % do pote: uma bet = bet ÷ pot; um raise = (raise − amount-to-call) ÷ pot-after-call. ex.: 0.5 / 0.8 / 1. somente bet/raise"},"amount_bb":{"type":"number","description":"valor absoluto de aposta/aumento em BB (para aposta/aumento)"},"allin":{"type":"boolean","description":"presente e verdadeiro quando a ação é all-in"}},"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":"opcional; qual conjunto de tabelas pré-flop 6max usar. Omita para o padrão da plataforma (6max). Valor desconhecido -> 400 unsupported_preflop_version."},"preflop_actions":{"type":"array","description":"Sequência de ações explícita e completa, desde o small blind até o jogador imediatamente antes do hero (hero NÃO está incluído; a posição de hero é positions.hero). Deve começar com o small blind (0.5) e depois o big blind (1). amount é o incremento recém-comprometido por esta ação em BB (não o total acumulado); pot = soma de todos os amounts. O total resultante de um raise deve exceder a aposta atual e atender ao min-raise (= aposta atual + tamanho do último raise), a menos que allin:true; o total de um call deve corresponder exatamente à aposta atual, a menos que allin:true. Valores exatos apenas tornam pot/sizing_pot exatos — as frequências GTO são baseadas na situação (RFI/3bet/4bet + posições) e não mudam com os tamanhos das apostas. Violações retornam 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":"incremento recém-comprometido nesta ação em BB (obrigatório para ações que não são fold); omitido/0 para fold"},"allin":{"type":"boolean","description":"opcional; marque um all-in curto (aumento/pagamento abaixo do aumento mínimo). quando verdadeiro, a verificação de aumento mínimo é ignorada"}}}}}},"PreflopResponse":{"type":"object","properties":{"hole_cards":{"type":"string"},"situation":{"type":"string","enum":["RFI","Limp","Raise","3-Bet","4-Bet","5-Bet"],"description":"estado da mesa que o Hero enfrenta: RFI (todos deram fold até o Hero, oportunidade de abrir) / Limp (há um limper, sem raise) / Raise (1 raise) / 3-Bet / 4-Bet / 5-Bet"},"strategy":{"type":"array","items":{"$ref":"#/components/schemas/StrategyItem"}},"quota":{"$ref":"#/components/schemas/Quota"}}},"FlopPositions":{"type":"object","description":"as chaves obrigatórias dependem de pot_type — SRP: hero,raiser,caller; 3BET/4BET: hero,raiser,three_bettor (para 4BET, raiser = quem abriu e aplicou o 4-bet, three_bettor = quem aplicou o 3-bet e pagou; sem chave four_bettor); LIMP: hero,limper. hero deve ser um dos assentos especificados.","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":"Token de nó de /v1/gto/flop/tree (o campo `token` de um nó)"},"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":"opcional; qual conjunto de dados do flop (um resolvido por versão pré-flop). Omita para o padrão (6max). Se a versão escolhida não tiver dados para a situação, o serviço recua graciosamente para 6max. Valor desconhecido -> 400 unsupported_flop_version. Independente de preflop_version. Os tokens de nó carregam esta versão, portanto /v1/gto/flop/node permanece no mesmo conjunto de dados."}}},"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":"o nó do Hero tem `strategy`; o nó do Vilão (ou sem hole_cards) tem `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":"combo (ex.: \"AhKh\") -> frequências alinhadas às ações"},"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":"tamanhos de aposta de abertura opcionais por street em % do pote; no flop o padrão é 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":"Tamanhos de aumento opcionais por street em % do pote; streets omitidas reutilizam bet_sizes/padrões","properties":{"flop":{"type":"array","items":{"type":"integer"}},"turn":{"type":"array","items":{"type":"integer"}},"river":{"type":"array","items":{"type":"integer"}}}},"donk_sizes":{"type":"object","description":"tamanhos opcionais de donk-lead OOP por street em % do pote; o turn tem como padrão 67%, o river 100%","properties":{"turn":{"type":"array","items":{"type":"integer"}},"river":{"type":"array","items":{"type":"integer"}}}},"raise_limit":{"type":"integer","minimum":1,"maximum":4,"description":"limite opcional de aumentos para toda a árvore; o padrão é 3 para resoluções de flop/turn e 4 para resoluções apenas de river"}}},"SolverScheduleResponse":{"type":"object","properties":{"status":{"type":"string","enum":["computing","queryable","busy"]},"solve":{"type":"string","description":"identificador para /tree e /node"},"solve_quota":{"allOf":[{"$ref":"#/components/schemas/Quota"}],"description":"presente somente quando uma nova resolução foi iniciada (cobrada)"}}},"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 = a resolução convergiu, mas a rodada/runout consultada não tem nós de decisão na árvore (terminal — pare de consultar)."},"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":"a árvore de decisão (você a monta)"},"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":"bloqueio de cartas opcional: qual jogador é o Hero. Combine com hero_hand."},"hero_hand":{"type":"string","example":"AsKs","description":"bloqueio opcional de cartas: remova cada combo que contenha uma das cartas do Hero das Ranges (análise range-vs-hand). Reproduzido na resposta. Aplica-se apenas a /v1/gto/range, não aos wrappers de 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":"combinações OOP por força da mão formada: 'combo:rank,...' (rank menor = mais forte), classificadas por rank crescente. A ordem de desempate para ranks iguais NÃO é garantidamente estável entre pontos de extremidade/execuções — não dependa dela."},"hand_ranks_ip":{"type":"string","description":"Equivalente IP de hand_ranks_oop."},"hand_bottom_ranks_oop":{"type":"string","description":"A fração mais fraca de bluff_combos_ratio de hand_ranks_oop (candidatos a blefe), mesmo formato."},"hand_bottom_ranks_ip":{"type":"string","description":"Equivalente IP de hand_bottom_ranks_oop."},"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":"bloqueio opcional de cartas; use junto com hero_hand."},"hero_hand":{"type":"string","example":"AsKs","description":"bloqueio de cartas opcional: remova todas as combinações que contenham uma das cartas do Herói do range atualizado do vilão (as saídas range_*_new_raw). A mão do próprio Herói também é garantida como presente no range do Herói. Repetida na resposta."},"bluff_combos_ratio":{"type":"number","minimum":0,"maximum":1,"description":"Opcional; fração do range tratada como bluffs (parte inferior do range). Omita para usar o padrão de turn/river do servidor. Repetida na resposta."},"partner_hands":{"type":"array","items":{"type":"string"},"example":["Ac9c"],"description":"opcional; combos de 4 caracteres cujas cartas são removidas do Range atualizado do vilão (range_*_new_raw). Requer hero_position. Somente entrada (não retornado). Apenas flop/projected-range."},"flop_version":{"type":"string","enum":["6max","6max_RC_100bb_200NL","6max_RC_100bb_100NL","6max_RC_40bb"],"description":"opcional; qual conjunto de dados de flop (um resolvido por versão de preflop). Omita para o padrão (6max). Se a versão escolhida não tiver dados para a situação, o serviço recua normalmente para 6max. Valor desconhecido -> 400 unsupported_flop_version. Independente de preflop_version."}}},"ProjectedRangeResponse":{"description":"Os mesmos campos de RangeResponse, além de pot_type reproduzido da solicitação (17 campos no total).","allOf":[{"$ref":"#/components/schemas/RangeResponse"},{"type":"object","properties":{"pot_type":{"type":"string"}}}]},"TurnProjectedRangeRequest":{"type":"object","required":["solve","node_id"],"properties":{"solve":{"type":"string","description":"identificador de /v1/gto/solver (uma resolução de turn)"},"node_id":{"type":"string","description":"Uma linha de ação de turn; pode terminar no CALL/CHECK que encerra a street. Formato de nó do solver com espaços, por exemplo, \"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":"bloqueio de cartas opcional; combine com hero_hand."},"hero_hand":{"type":"string","example":"AsKs","description":"bloqueio de cartas opcional: remova cada combo que contenha uma das cartas do Hero do range atualizado do Vilão."},"partner_hands":{"type":"array","items":{"type":"string"},"example":["Ac9c"],"description":"opcional; combos de 4 caracteres cujas cartas são removidas do range atualizado do vilão. Requer hero_position. Somente entrada."}}},"EvsRequest":{"type":"object","required":["solve","node_id"],"properties":{"solve":{"type":"string","description":"identificador de /v1/gto/solver"},"node_id":{"type":"string","example":"root","description":"Um nó de /v1/gto/solver/tree (notação do solver, por exemplo, \"root/CHECK/BET 6.000000\")"},"hand":{"type":"string","example":"AsKh","description":"opcional; filtre os EVs de uma mão (caso contrário, todas as mãos)"}}},"EvsResponse":{"type":"object","description":"EVs por mão e por ação no nó; o array de EV de cada mão se alinha às ações.","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 -> array de EV por ação (bb); um único array quando hand é fornecido","example":{"2c2d":[-0.826359,-0.792223,-1.643411]}}}},"BoardRequest":{"properties":{"board":{"type":"string","title":"Board","description":"3/4/5 cartas do board, por exemplo, 'AsKsQs'","examples":["AsKsQs"]},"hand_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tipo de mão","examples":["StandardHighHand"]},"dead":{"type":"string","title":"Cartas mortas","description":"cartas mortas/removidas opcionais","default":""}},"type":"object","required":["board"],"title":"BoardRequest"},"CardsRequest":{"properties":{"cards":{"type":"string","title":"Cartas","description":"cartas a normalizar/validar","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":"Board","examples":["AsKsQs"]},"sample_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Número de amostras"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Semente"},"hand_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tipo de mão"}},"type":"object","required":["hero","villain","board"],"title":"EquityAdvantageRequest"},"EquityRequest":{"properties":{"ranges":{"items":{"items":{"type":"string"},"type":"array"},"type":"array","title":"Ranges","description":"Ranges por jogador (notação)","examples":[[["AA","KK"],["QQ","JJ"]]]},"board":{"type":"string","title":"Board","default":"","examples":["AhKhQh"]},"sample_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Número de amostras","description":"Amostras de Monte Carlo (limitadas); o padrão se aplica se não definido"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Semente","description":"semente para amostragem reproduzível"}},"type":"object","required":["ranges"],"title":"EquityRequest"},"EvalCompareRequest":{"properties":{"holdings":{"items":{"type":"string"},"type":"array","title":"Mãos","description":"2+ mãos para classificar","examples":[["AcAd","KcKd","JhTh"]]},"board":{"type":"string","title":"Board","default":"","examples":["AhKhQh"]},"hand_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tipo de mão"}},"type":"object","required":["holdings"],"title":"EvalCompareRequest"},"EvalHandRequest":{"properties":{"hole":{"type":"string","title":"Cartas fechadas","examples":["AcAd"]},"board":{"type":"string","title":"Board","default":"","examples":["AhKhQh"]},"hand_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tipo de mão"}},"type":"object","required":["hole"],"title":"EvalHandRequest"},"GameStateRequest":{"properties":{"variant":{"type":"string","title":"Variante","description":"código da variante, por exemplo, NT (NL hold'em); consulte /meta","examples":["NT"]},"starting_stacks":{"items":{"type":"integer"},"type":"array","title":"Fichas iniciais","examples":[[200,200]]},"antes":{"items":{"type":"integer"},"type":"array","title":"Antes","examples":[[0,0]]},"blinds_or_straddles":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Blinds ou straddles","examples":[[1,2]]},"bring_in":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Aposta de entrada"},"small_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Aposta pequena"},"big_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Aposta grande"},"min_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Aposta mínima","description":"obrigatório para no-limit/pot-limit, por exemplo, 2"},"ante_trimming_status":{"type":"boolean","title":"Status do ajuste de ante","default":false},"automations":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Automações","description":"Nomes das automações; omita para os padrões do pokerkit"},"actions":{"items":{"type":"string"},"type":"array","title":"Ações","examples":[["d dh p1 AhKh","d dh p2 QsQd","p2 cbr 6"]]},"viewer":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Visualizador","description":"reservado (nível de informações ocultas); v1 é de informações completas"}},"type":"object","required":["variant","starting_stacks","antes"],"title":"GameStateRequest"},"GameStepRequest":{"properties":{"variant":{"type":"string","title":"Variante","description":"código da variante, p.ex. NT (NL hold'em); consulte /meta","examples":["NT"]},"starting_stacks":{"items":{"type":"integer"},"type":"array","title":"Fichas iniciais","examples":[[200,200]]},"antes":{"items":{"type":"integer"},"type":"array","title":"Antes","examples":[[0,0]]},"blinds_or_straddles":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Blinds ou Straddles","examples":[[1,2]]},"bring_in":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Aposta inicial obrigatória (bring-in)"},"small_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Aposta pequena"},"big_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Aposta grande"},"min_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Aposta mínima","description":"obrigatório para no-limit/pot-limit, por exemplo, 2"},"ante_trimming_status":{"type":"boolean","title":"Status de ajuste do ante","default":false},"automations":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Automações","description":"Nomes das automações; omita para usar os padrões do pokerkit"},"actions":{"items":{"type":"string"},"type":"array","title":"Ações","examples":[["d dh p1 AhKh","d dh p2 QsQd","p2 cbr 6"]]},"viewer":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Visualizador","description":"reservado (nível de informações ocultas); v1 é de informações completas"},"next_action":{"type":"string","title":"Próxima ação","description":"a ação de jogador/distribuição a ser aplicada","examples":["p1 cc"]},"expected_action_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Contagem esperada de ações","description":"token de concorrência otimista = len(actions) que você está estendendo; 409 em caso de incompatibilidade"}},"type":"object","required":["variant","starting_stacks","antes","next_action"],"title":"GameStepRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detalhe"}},"type":"object","title":"HTTPValidationError"},"HandRequest":{"properties":{"hole":{"type":"string","title":"Cartas fechadas","description":"2 cartas fechadas, por exemplo, 'JhTh'","examples":["JhTh"]},"board":{"type":"string","title":"Board","examples":["AsKsQs"]},"hand_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tipo de mão"},"dead":{"type":"string","title":"Mortas","default":""}},"type":"object","required":["hole","board"],"title":"HandRequest"},"HandStrengthRequest":{"properties":{"hole_range":{"items":{"type":"string"},"type":"array","title":"Range de cartas fechadas","description":"range/mão do herói (notação)","examples":[["AhKh"]]},"board":{"type":"string","title":"Board","default":"","examples":["AhKhQh"]},"player_count":{"type":"integer","minimum":2.0,"title":"Número de jogadores","default":2},"sample_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quantidade de amostras"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Semente"}},"type":"object","required":["hole_range"],"title":"HandStrengthRequest"},"IcmRequest":{"properties":{"payouts":{"items":{"type":"number"},"type":"array","title":"Pagamentos","examples":[[50,30,20]]},"chips":{"items":{"type":"number"},"type":"array","title":"Fichas","examples":[[5000,3000,2000]]}},"type":"object","required":["payouts","chips"],"title":"IcmRequest"},"NotationParseRequest":{"properties":{"text":{"type":"string","title":"Texto","description":"uma string de histórico de mãos .phh do pokerkit"}},"type":"object","required":["text"],"title":"NotationParseRequest"},"NutAdvantageRequest":{"properties":{"hero":{"items":{"type":"string"},"type":"array","title":"Hero","description":"range do herói (notação)","examples":[["AA","KK","AKs"]]},"villain":{"items":{"type":"string"},"type":"array","title":"Villain","description":"range do vilão (notação)","examples":[["QQ","JJ","AQs"]]},"board":{"type":"string","title":"Board","examples":["AsKsQs"]},"hand_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tipo de mão"}},"type":"object","required":["hero","villain","board"],"title":"NutAdvantageRequest"},"RangeExpandRequest":{"properties":{"notation":{"items":{"type":"string"},"type":"array","title":"Notação","description":"tokens de notação de range","examples":[["AA","KQs","QQ+"]]}},"type":"object","required":["notation"],"title":"RangeExpandRequest"},"ReplayRequest":{"properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Texto","description":"uma string .phh; OU forneça os campos config+actions abaixo"},"variant":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variante"},"starting_stacks":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Fichas iniciais"},"antes":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Antes"},"blinds_or_straddles":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Cegas ou straddles"},"bring_in":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Aposta obrigatória inicial"},"small_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Aposta pequena"},"big_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Aposta grande"},"min_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Aposta mínima"},"ante_trimming_status":{"type":"boolean","title":"Status de corte de ante","default":false},"automations":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Automações"},"actions":{"items":{"type":"string"},"type":"array","title":"Ações"},"index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Índice","description":"retornar apenas o instantâneo neste índice de etapa"}},"type":"object","title":"ReplayRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Localização"},"msg":{"type":"string","title":"Mensagem"},"type":{"type":"string","title":"Tipo de erro"},"input":{"title":"Entrada"},"ctx":{"type":"object","title":"Contexto"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"ValueRangeRequest":{"properties":{"board":{"type":"string","title":"Board","examples":["AsKsQs"]},"aggression":{"type":"string","title":"Agressividade","default":"SINGLE_BET","examples":["NO_BET","SINGLE_BET","RAISED"]},"floor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Limite inferior","description":"piso de categoria opcional, por exemplo, 'TWO_PAIR' (substitui o padrão de agressividade)"},"hand_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tipo de mão"},"dead":{"type":"string","title":"Mortas","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"}}