{"openapi":"3.0.3","info":{"title":"API de pokerai.bet (estrategia GTO + motor de póquer)","version":"1.0","description":"API de estrategia GTO para preflop / flop / turn / river. Devuelve la frecuencia mixta de cada acción (sin acción recomendada — eliges según la frecuencia). Preflop y flop aprovechan una biblioteca de soluciones GTO preresueltas, disponibles al instante (milisegundos). El endpoint del solver calcula en tiempo real (flop ~70s, turn/river más rápido). Las entradas de cartas/board usan una cadena sin separadores (\"2c2h2s\", \"AdKd\"); el board se devuelve como un array ([\"2c\",\"2h\",\"2s\"]). Las cadenas de rango se separan por comas `hand:weight` (notación de clase AA/AKs/AKo; weight 0..1, predeterminado 1).\n\n⚠ Nota: el botón \"Solicitud de prueba\" de abajo envía una solicitud real con tu clave y consume tu cuota mensual real. ¿Eres nuevo aquí? Lee primero la guía: https://pokerai.bet/docs\n"},"servers":[{"url":"https://pokerai.bet"}],"security":[{"BearerApiKey":[]},{"XApiKey":[]}],"tags":[{"name":"Consulta","description":"Soluciones GTO pre-resueltas, servidas al instante (milisegundos) — preflop + todo el árbol de decisiones del flop. Cada una consume 1 cuota pre-resuelta."},{"name":"Solucionador","description":"Solver en tiempo real (flop ~70s, turn/river más rápidos). programar -> árbol -> nodo."},{"name":"Rango","description":"Actualiza los rangos a lo largo de una línea de acciones (conversión de rango / rango proyectado en el flop)."}],"paths":{"/v1/gto/preflop":{"post":{"tags":["Consulta"],"operationId":"preflopStrategy","summary":"Estrategia preflop (preresuelta)","description":"Consume 1 cuota preresuelta. La situación (RFI/Limp/Raise/3-Bet/4-Bet/5-Bet) se deriva de las acciones.","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":"Rango preflop completo para una situación (presuelto)","description":"El rango preflop completo de 13×13 para una posición + línea de acciones en una llamada — 169 tipos de manos →\nfrecuencias de foldear/igualar/subir. Sin `hole_cards` (la situación procede de positions +\npreflop_actions). Consume 1 cuota preresuelta (una llamada, no 169). Para una cuadrícula de rangos.\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; qué conjunto de tablas preflop 6max usar (igual que /v1/gto/preflop). Omítalo para usar el predeterminado."},"positions":{"type":"object","properties":{"hero":{"type":"string","example":"BTN"}}},"preflop_actions":{"type":"array","items":{"type":"object"},"description":"secuencia completa de acciones desde SB/BB, igual que /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 mano (AA / AKs / AKo) -> {fold, call, raise}; 169 entradas, cada una con una suma de ~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":"Lista las versiones instaladas de la estrategia preflop (gratis)","description":"Los valores de preflop_version seleccionables para /v1/gto/preflop y /v1/gto/preflop/range, con una etiqueta legible para cada uno y cuál es el predeterminado (se usa cuando se omite preflop_version). Gratis (sin cuota). Use esto en lugar de codificar la lista de forma fija: las nuevas versiones aparecen aquí automáticamente.\n","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"versions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"pase esto como preflop_version"},"label":{"type":"string"},"default":{"type":"boolean","description":"presente y true en la versión predeterminada"}}}},"default":{"type":"string","description":"el id utilizado cuando se omite preflop_version"}}},"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":"Árbol de decisiones de flop (preresuelto)","description":"Consume 1 cuota preresuelta. Devuelve los rangos iniciales + todos los nodos de decisión (cada uno con un token para /v1/gto/flop/node).","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlopTreeRequest"},"examples":{"SRP":{"summary":"Bote con una subida — posiciones: hero, raiser, caller","value":{"board":"2c2h2s","pot_type":"SRP","positions":{"hero":"UTG","raiser":"UTG","caller":"BTN"}}},"3BET":{"summary":"Bote 3-bet — posiciones: hero, raiser (abridor), three_bettor","value":{"board":"2c2h2s","pot_type":"3BET","positions":{"hero":"CO","raiser":"CO","three_bettor":"BTN"}}},"4BET":{"summary":"Bote de 4-bet — posiciones: hero, raiser (abridor que hizo 4-bet), three_bettor (jugador que hizo 3-bet y pagó)","value":{"board":"2c2h2s","pot_type":"4BET","positions":{"hero":"CO","raiser":"CO","three_bettor":"BTN"}}},"LIMP":{"summary":"Bote con limp — posiciones: hero, limper (hero o limper debe 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":"Estrategia de nodo de flop (pre-resuelta) — un nodo del árbol de decisiones","description":"Estrategia por nodo para el árbol de decisiones del flop (gratis, restringida por token). Pase un token `node` acuñado por POST /v1/gto/flop/tree. Con hole_cards → la estrategia mixta de esa mano en el nodo; omita hole_cards → la estrategia del nodo para todo el rango.\n\nAsí obtiene CADA decisión de flop del héroe: héroe en posición, héroe enfrentando una apuesta o una acción posterior: obtenga el árbol, elija un nodo donde is_hero sea true (p. ej., root/CHECK/BET_13 = el héroe enfrenta una apuesta tras pasar → fold/call/raise) y pase aquí su token. El nodo raíz (root) es la primera decisión del héroe (check/bet OOP).\n\nEl árbol de flop es de una sola calle; para decisiones de turn/river use la línea del solver (/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":"Programar una resolución en tiempo real (flop/turn/river)","description":"la longitud del board establece la calle (3=flop, 4=turn, 5=river). Consume 1 cuota de resolución en una activación nueva; una resolución en caché devuelve status=queryable sin el campo solve_quota (sin cargo); todos los hosts del solver ocupados devuelven 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":"cuota de resolución superada o todos los hosts del solver ocupados (status=busy)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/gto/solver/tree":{"post":{"tags":["Solucionador"],"operationId":"solverTree","summary":"Consulta el árbol de resolución + el estado del nodo (gratis)","description":"Consulte hasta que spot_status = queryable. Para avanzar una resolución de varias calles hasta el runout repartido, pase\nlas cartas repartidas: `turn_card` (p. ej., una resolución de flop → un turn específico) y/o `river_card`.\nUn spot de river procedente de una resolución de *flop* necesita TANTO `turn_card` como `river_card` para ser único;\nuna resolución de turn solo necesita `river_card`. Omita ambos para obtener la propia calle de la resolución.\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 una resolución de flop, la carta de turn repartida (p. ej., \"Td\") — devuelve los nodos bajo ese turn."},"river_card":{"type":"string","description":"opcional; la carta de river repartida (p. ej., \"Qh\"). Desde una resolución de flop, combínela con 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":"Estrategia de nodo de una resolución (gratis)","description":"nodo del héroe → estrategia del héroe; nodo del villano (u omite hole_cards) → estrategia de rango completo.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["node"],"properties":{"node":{"type":"string","description":"token de nodo 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 = resolución reclamada por el sistema/reemplazada, reprogramar; error = strategy_error por nodo del solver (con mensaje); computing = aún resolviendo."},"message":{"type":"string","description":"presente cuando node_status = error"}}}]}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"503":{"$ref":"#/components/responses/UpstreamUnavailable"}}}},"/v1/gto/solver/release":{"post":{"tags":["Solucionador"],"operationId":"solverRelease","summary":"Libera antes de tiempo el puerto del pool de una resolución (gratis, opcional)","description":"Indica que has terminado de consultar esta resolución para que su puerto del solver vuelva inmediatamente al pool\nen vez de permanecer hasta que venza el TTL de la caché (lo que puede provocar un 429-busy en la siguiente solicitud cuando el pool es pequeño).\nOpcional — omitirlo simplemente recurre al TTL. Llámalo solo DESPUÉS de tu última\n/v1/gto/solver/tree y /v1/gto/solver/node para esta resolución: una vez liberado, el puerto puede\nreutilizarse y las consultas posteriores con este identificador devuelven node_status = expired. Idempotente; no\nreinicia el 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 si se descartó una reserva activa de un puerto; false si la resolución ya había expirado (sin operación)"}}},"example":{"released":true}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/v1/gto/range":{"post":{"tags":["Rango"],"operationId":"rangeConvert","summary":"Conversión de rangos — actualizar rangos a lo largo de una línea de acción","description":"Proxy ligero al /api/range del solver. Usted reúne todas las entradas, incluidos solver_results (el árbol de decisiones). Consume 1 cuota pre-resuelta. Los rangos de salida alimentan la solución de la siguiente calle.\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":["Rango"],"operationId":"projectedRange","summary":"Rango proyectado — actualización del rango del flop a lo largo de una línea de acción (cuota preresuelta)","description":"Proyecta los rangos del flop hacia adelante a lo largo de una línea de acción para el board / pot_type / positions indicados. Consume 1 cuota pre-resuelta. Devuelve la misma salida de actualización de rango 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":["Rango"],"operationId":"queryEvs","summary":"EVs de nodo — valores esperados por mano y por acción de una solución completada (gratis)","description":"Valores esperados por mano y por acción en un nodo de una resolución completada. Proporcione el identificador de la resolución (de /v1/gto/solver) + un node_id (de /v1/gto/solver/tree); los filtros de mano opcionales lo limitan a una mano. Gratis (ya se cobró a través de /v1/gto/solver). Primero, consulte /v1/gto/solver/tree hasta que spot_status = queryable.\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 del nodo; o { spot_status: computing } si aún no ha convergido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvsResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"description":"identificador de resolución no válido o que no le pertenece"},"410":{"description":"la resolución ha caducado (TTL); vuelva a programarla mediante /v1/gto/solver"}}}},"/v1/gto/turn/projected-range":{"post":{"tags":["Rango"],"operationId":"turnProjectedRange","summary":"Rango proyectado — actualización del rango de turn→river a lo largo de una línea de acción de turn (gratis)","description":"El equivalente de cuarta calle→quinta calle de /v1/gto/flop/projected-range, para una resolución de cuarta calle en tiempo real. Reduce los rangos de entrada de la cuarta calle (los rangos con los que se programó la resolución, leídos de la propia configuración de la resolución) a lo largo de una línea de acciones de cuarta calle — incluido el CALL/CHECK que cierra la calle — hasta los rangos de entrada de la quinta calle. Gratis (la resolución ya se cobró a través de /v1/gto/solver), como /v1/gto/solver/tree. Devuelve la misma salida de actualización de rango que /v1/gto/range. Primero, consulte /v1/gto/solver/tree hasta que spot_status = queryable.\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":"rangos de entrada al river reducidos; o { spot_status: computing } si la resolución aún no ha convergido (siga 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":"la resolución expiró (TTL) — reprograme mediante /v1/gto/solver","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"$ref":"#/components/responses/Upstream"}}}},"/health":{"get":{"summary":"Estado de salud","operationId":"health_health_get","responses":{"200":{"description":"Respuesta satisfactoria","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Health Get"}}}}}}},"/v1/pokerkit/texture":{"post":{"tags":["Semántica"],"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":"Respuesta satisfactoria","content":{"application/json":{"schema":{}}}},"422":{"description":"Error de validación","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/nuts":{"post":{"tags":["Semántica"],"summary":"La mejor mano posible","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":"Respuesta satisfactoria","content":{"application/json":{"schema":{}}}},"422":{"description":"Error de validación","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/category-combos":{"post":{"tags":["Semántica"],"summary":"Combinaciones por categoría","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":"Respuesta satisfactoria","content":{"application/json":{"schema":{}}}},"422":{"description":"Error de validación","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/board-report":{"post":{"tags":["Semántica"],"summary":"Informe del 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":"Respuesta satisfactoria","content":{"application/json":{"schema":{}}}},"422":{"description":"Error de validación","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/hand-tier":{"post":{"tags":["Semántica"],"summary":"Nivel de mano","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":"Respuesta satisfactoria","content":{"application/json":{"schema":{}}}},"422":{"description":"Error de validación","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/draws":{"post":{"tags":["Semántica"],"summary":"Proyectos","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":"Respuesta satisfactoria","content":{"application/json":{"schema":{}}}},"422":{"description":"Error de validación","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/outs":{"post":{"tags":["Semántica"],"summary":"Cartas favorables","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":"Respuesta satisfactoria","content":{"application/json":{"schema":{}}}},"422":{"description":"Error de validación","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/blockers":{"post":{"tags":["Semántica"],"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":"Respuesta satisfactoria","content":{"application/json":{"schema":{}}}},"422":{"description":"Error de validación","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/hand-report":{"post":{"tags":["Semántica"],"summary":"Informe de la mano","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":"Respuesta satisfactoria","content":{"application/json":{"schema":{}}}},"422":{"description":"Error de validación","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/range/expand":{"post":{"tags":["Rangos"],"summary":"Expandir rango","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":"Respuesta satisfactoria","content":{"application/json":{"schema":{}}}},"422":{"description":"Error de validación","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/range/value":{"post":{"tags":["Rangos"],"summary":"Valor del rango","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":"Respuesta satisfactoria","content":{"application/json":{"schema":{}}}},"422":{"description":"Error de validación","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/range/nut-advantage":{"post":{"tags":["Rangos"],"summary":"Ventaja de nuts del rango","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":"Respuesta satisfactoria","content":{"application/json":{"schema":{}}}},"422":{"description":"Error de validación","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":"Respuesta satisfactoria","content":{"application/json":{"schema":{}}}},"422":{"description":"Error de validación","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/eval/hand":{"post":{"tags":["Núcleo"],"summary":"Evaluar mano","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":"Respuesta satisfactoria","content":{"application/json":{"schema":{}}}},"422":{"description":"Error de validación","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/eval/compare":{"post":{"tags":["Núcleo"],"summary":"Comparar evaluaciones","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":"Respuesta satisfactoria","content":{"application/json":{"schema":{}}}},"422":{"description":"Error de validación","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/equity":{"post":{"tags":["Núcleo"],"summary":"Equidad","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":"Respuesta satisfactoria","content":{"application/json":{"schema":{}}}},"422":{"description":"Error de validación","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/hand-strength":{"post":{"tags":["Núcleo"],"summary":"Fuerza de la mano","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":"Respuesta exitosa","content":{"application/json":{"schema":{}}}},"422":{"description":"Error de validación","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":"Respuesta exitosa","content":{"application/json":{"schema":{}}}},"422":{"description":"Error de validación","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/range/equity-advantage":{"post":{"tags":["Núcleo"],"summary":"Ventaja de equidad del rango","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":"Respuesta exitosa","content":{"application/json":{"schema":{}}}},"422":{"description":"Error de validación","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/notation/parse":{"post":{"tags":["Núcleo"],"summary":"Analizar notación","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":"Respuesta exitosa","content":{"application/json":{"schema":{}}}},"422":{"description":"Error de validación","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/games/state":{"post":{"tags":["Juegos"],"summary":"Estado de la partida","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":"Respuesta exitosa","content":{"application/json":{"schema":{}}}},"422":{"description":"Error de validación","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/games/step":{"post":{"tags":["Juegos"],"summary":"Paso de la partida","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":"Respuesta exitosa","content":{"application/json":{"schema":{}}}},"422":{"description":"Error de validación","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/notation/replay":{"post":{"tags":["Juegos"],"summary":"Reproducir notación","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":"Respuesta exitosa","content":{"application/json":{"schema":{}}}},"422":{"description":"Error de validación","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pokerkit/combined-openapi.json":{"get":{"tags":["Metadatos"],"summary":"OpenAPI combinado","description":"Especificación de GTO + especificación automática de este servicio combinadas en un documento (las rutas no se solapan;\nlos esquemas de pokerkit llevan prefijo solo cuando hay una colisión de nombre). Siempre refleja el código actual.","operationId":"combined_openapi_v1_pokerkit_combined_openapi_json_get","responses":{"200":{"description":"Respuesta correcta","content":{"application/json":{"schema":{}}}}}}},"/v1/pokerkit/meta":{"get":{"tags":["Metadatos"],"summary":"Metadatos","operationId":"meta_v1_pokerkit_meta_get","responses":{"200":{"description":"Respuesta correcta","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 no válida o campo faltante","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"clave de API ausente o no válida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NoSolution":{"description":"no hay datos GTO para esta situación/board","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"QuotaExceeded":{"description":"cuota mensual excedida (se restablece el día 1)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Upstream":{"description":"backend temporalmente no disponible, vuelve a intentarlo","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"UpstreamUnavailable":{"description":"no se puede acceder al solver después de los propios reintentos del servicio (error de transporte / 5xx) — reintentable; error: upstream_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Forbidden":{"description":"token no válido o no es tuyo","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":"dos cartas, sin separador, p. ej., \"AdKd\". Valor AKQJT98765432, palo c d h s.","pattern":"^[2-9TJQKA][cdhs][2-9TJQKA][cdhs]$","example":"AdKd"},"BoardInput":{"type":"string","description":"cartas comunitarias como una cadena sin separadores: 3=flop \"2c2h2s\", 4=turn, 5=river.","example":"2c2h2s"},"BoardOutput":{"type":"array","items":{"type":"string"},"description":"cartas comunitarias devueltas como un arreglo","example":["2c","2h","2s"]},"RangeString":{"type":"string","description":"mano:peso separados por comas. notación de clases AA/AKs/AKo (rango alto primero); peso 0..1, predeterminado 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":"probabilidad de 0..1"},"sizing_pot":{"type":"number","description":"tamaño relativo al bote, convención estándar de % del bote: un bet = bet ÷ bote; un raise = (raise − cantidad a pagar) ÷ bote después de call. p. ej., 0.5 / 0.8 / 1. solo bet/raise"},"amount_bb":{"type":"number","description":"importe absoluto de bet/raise en BB (para bet/raise)"},"allin":{"type":"boolean","description":"presente y true cuando la acción es 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; qué conjunto de tablas preflop 6max usar. Omita para el valor predeterminado de la plataforma (6max). Valor desconocido -> 400 unsupported_preflop_version."},"preflop_actions":{"type":"array","description":"Secuencia de acciones explícita y completa desde la ciega pequeña hasta el jugador inmediatamente anterior al héroe (el héroe NO está incluido; la posición del héroe es positions.hero). Debe comenzar con la ciega pequeña (0.5) y luego la ciega grande (1). amount es el incremento recién comprometido en esta acción en BB (no el total acumulado); pot = la suma de todos los valores de amount. El total resultante de un raise debe superar la apuesta actual y cumplir con el min-raise (= apuesta actual + tamaño del último raise), salvo allin:true; el total de un call debe igualar exactamente la apuesta actual, salvo allin:true. Los importes exactos solo hacen que pot/sizing_pot sea exacto — las frecuencias GTO se basan en la situación (RFI/3bet/4bet + posiciones) y no cambian con los tamaños de apuesta. Las infracciones devuelven 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 recién comprometido por esta acción en BB (obligatorio para acciones que no sean fold); omitido/0 para fold"},"allin":{"type":"boolean","description":"opcional; marca un all-in corto (raise/call por debajo del min-raise). cuando es true, se omite la comprobación del min-raise"}}}}}},"PreflopResponse":{"type":"object","properties":{"hole_cards":{"type":"string"},"situation":{"type":"string","enum":["RFI","Limp","Raise","3-Bet","4-Bet","5-Bet"],"description":"estado de la mesa al que se enfrenta hero: RFI (todos se retiraron hasta hero, situación de apertura) / Limp (hay un limper, sin subida) / Raise (1 subida) / 3-Bet / 4-Bet / 5-Bet"},"strategy":{"type":"array","items":{"$ref":"#/components/schemas/StrategyItem"}},"quota":{"$ref":"#/components/schemas/Quota"}}},"FlopPositions":{"type":"object","description":"las claves obligatorias dependen de pot_type — SRP: hero,raiser,caller; 3BET/4BET: hero,raiser,three_bettor (para 4BET, raiser = el abridor que hizo 4-bet, three_bettor = el jugador que hizo 3-bet y pagó; no hay clave four_bettor); LIMP: hero,limper. hero debe ser uno de los asientos indicados.","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 nodo de /v1/gto/flop/tree (el campo `token` de un nodo)"},"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; qué conjunto de datos de flop usar (uno resuelto por versión de preflop). Omítalo para el predeterminado (6max). Si la versión elegida no tiene datos para la situación, el servicio degrada correctamente a 6max. Valor desconocido -> 400 unsupported_flop_version. Independiente de preflop_version. Los tokens de nodo llevan esta versión, por lo que /v1/gto/flop/node permanece en el mismo conjunto de datos."}}},"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":"el nodo del héroe tiene `strategy`; el nodo del villano (o sin hole_cards) tiene `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 (p. ej., \"AhKh\") -> frecuencias alineadas con las acciones"},"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":"tamaños de apuesta de apertura opcionales por calle en % del bote; en el flop el valor predeterminado es 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":"tamaños de subida opcionales por calle en % del bote; las calles omitidas reutilizan bet_sizes/valores predeterminados","properties":{"flop":{"type":"array","items":{"type":"integer"}},"turn":{"type":"array","items":{"type":"integer"}},"river":{"type":"array","items":{"type":"integer"}}}},"donk_sizes":{"type":"object","description":"tamaños opcionales de apuestas donk OOP en % del pot; el turn predetermina 67 %, el river predetermina 100 %","properties":{"turn":{"type":"array","items":{"type":"integer"}},"river":{"type":"array","items":{"type":"integer"}}}},"raise_limit":{"type":"integer","minimum":1,"maximum":4,"description":"límite de subidas opcional para todo el árbol; el valor predeterminado es 3 para resoluciones de flop/turn y 4 para resoluciones solo de river"}}},"SolverScheduleResponse":{"type":"object","properties":{"status":{"type":"string","enum":["computing","queryable","busy"]},"solve":{"type":"string","description":"identificador para /tree y /node"},"solve_quota":{"allOf":[{"$ref":"#/components/schemas/Quota"}],"description":"presente solo cuando se activó una nueva resolución (con cargo)"}}},"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 = la resolución convergió, pero la ronda/runout consultada no tiene nodos de decisión en el árbol (terminal — deje de sondear)."},"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":"el árbol de decisiones (usted lo ensambla)"},"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":"bloqueo de cartas opcional: qué jugador es el Héroe. Combínelo con hero_hand."},"hero_hand":{"type":"string","example":"AsKs","description":"bloqueo de cartas opcional: elimina de los rangos cada combo que contenga una de las cartas de Hero (análisis de rango frente a mano). Se devuelve en la respuesta. Se aplica solo a /v1/gto/range, no a los envoltorios de rango proyectado."}}},"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":"combos OOP por fuerza de mano hecha: 'combo:rank,...' (menor rank = más fuerte), ordenados por rank ascendente. NO se garantiza que el orden de desempate entre ranks iguales sea estable entre endpoints/ejecuciones — no dependas de él."},"hand_ranks_ip":{"type":"string","description":"Análogo IP de hand_ranks_oop."},"hand_bottom_ranks_oop":{"type":"string","description":"La fracción más débil de hand_ranks_oop (candidatos a farol), de tamaño bluff_combos_ratio, mismo formato."},"hand_bottom_ranks_ip":{"type":"string","description":"Análogo 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":"bloqueo de cartas opcional; usar junto con hero_hand."},"hero_hand":{"type":"string","example":"AsKs","description":"bloqueo de cartas opcional: elimina del rango actualizado del villano cada combo que contenga una de las cartas de Hero (las salidas range_*_new_raw). También se garantiza que la propia mano de Hero esté presente en su propio rango. Se devuelve como eco."},"bluff_combos_ratio":{"type":"number","minimum":0,"maximum":1,"description":"opcional; fracción del rango tratada como faroles (parte inferior del rango). Omítalo para usar el valor predeterminado del servidor para cuarta/quinta calle. Se devuelve como eco."},"partner_hands":{"type":"array","items":{"type":"string"},"example":["Ac9c"],"description":"opcional; combinaciones de 4 caracteres cuyas cartas se eliminan del rango actualizado del villano (range_*_new_raw). Requiere hero_position. Solo entrada (no se devuelve). Solo flop/projected-range."},"flop_version":{"type":"string","enum":["6max","6max_RC_100bb_200NL","6max_RC_100bb_100NL","6max_RC_40bb"],"description":"opcional; qué conjunto de datos de flop (uno resuelto por versión de preflop). Omítalo para el predeterminado (6max). Si la versión elegida no tiene datos para la situación, el servicio usa 6max de forma controlada. Valor desconocido -> 400 unsupported_flop_version. Independiente de preflop_version."}}},"ProjectedRangeResponse":{"description":"Los mismos campos que RangeResponse, más pot_type devuelto desde la solicitud (17 campos en 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 (una resolución de turn)"},"node_id":{"type":"string","description":"una línea de acción de cuarta calle; puede terminar en el CALL/CHECK que cierra la calle. Formato de nodo del solver con espacios, p. ej., \"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":"bloqueo de cartas opcional; combinar con hero_hand."},"hero_hand":{"type":"string","example":"AsKs","description":"bloqueo de cartas opcional: elimina cada combo que contenga una de las cartas del Héroe del rango actualizado del villano."},"partner_hands":{"type":"array","items":{"type":"string"},"example":["Ac9c"],"description":"opcional; combos de 4 caracteres cuyas cartas se eliminan del rango actualizado del villano. Requiere hero_position. Solo de 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":"un nodo de /v1/gto/solver/tree (notación del solver, p. ej., \"root/CHECK/BET 6.000000\")"},"hand":{"type":"string","example":"AsKh","description":"opcional; filtra los EV de una mano (de lo contrario, todas las manos)"}}},"EvsResponse":{"type":"object","description":"EV por mano y por acción en el nodo; el arreglo de EV de cada mano se alinea con 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 -> arreglo de EV por acción (bb); un solo arreglo cuando se proporciona hand","example":{"2c2d":[-0.826359,-0.792223,-1.643411]}}}},"BoardRequest":{"properties":{"board":{"type":"string","title":"Board","description":"3/4/5 cartas del board, p. ej., 'AsKsQs'","examples":["AsKsQs"]},"hand_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tipo de mano","examples":["StandardHighHand"]},"dead":{"type":"string","title":"Muertas","description":"cartas muertas/eliminadas opcionales","default":""}},"type":"object","required":["board"],"title":"BoardRequest"},"CardsRequest":{"properties":{"cards":{"type":"string","title":"Cartas","description":"cartas que se deben 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":"Cantidad de muestras"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Semilla"},"hand_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tipo de mano"}},"type":"object","required":["hero","villain","board"],"title":"EquityAdvantageRequest"},"EquityRequest":{"properties":{"ranges":{"items":{"items":{"type":"string"},"type":"array"},"type":"array","title":"Rangos","description":"rangos por jugador (notación)","examples":[[["AA","KK"],["QQ","JJ"]]]},"board":{"type":"string","title":"Board","default":"","examples":["AhKhQh"]},"sample_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cantidad de muestras","description":"Muestras de Monte Carlo (limitadas); se aplica el valor predeterminado si no se establece"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Semilla","description":"semilla para muestreo reproducible"}},"type":"object","required":["ranges"],"title":"EquityRequest"},"EvalCompareRequest":{"properties":{"holdings":{"items":{"type":"string"},"type":"array","title":"Manos","description":"2+ manos para clasificar","examples":[["AcAd","KcKd","JhTh"]]},"board":{"type":"string","title":"Board","default":"","examples":["AhKhQh"]},"hand_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tipo de mano"}},"type":"object","required":["holdings"],"title":"EvalCompareRequest"},"EvalHandRequest":{"properties":{"hole":{"type":"string","title":"Cartas privadas","examples":["AcAd"]},"board":{"type":"string","title":"Board","default":"","examples":["AhKhQh"]},"hand_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tipo de mano"}},"type":"object","required":["hole"],"title":"EvalHandRequest"},"GameStateRequest":{"properties":{"variant":{"type":"string","title":"Variante","description":"código de variante, p. ej., NT (NL hold'em); consulte /meta","examples":["NT"]},"starting_stacks":{"items":{"type":"integer"},"type":"array","title":"Fichas iniciales","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":"Ciegas o straddles","examples":[[1,2]]},"bring_in":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Apuesta inicial"},"small_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Apuesta pequeña"},"big_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Apuesta grande"},"min_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Apuesta mínima","description":"obligatorio para sin límite/límite de bote, p. ej., 2"},"ante_trimming_status":{"type":"boolean","title":"Estado del recorte de ante","default":false},"automations":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Automatizaciones","description":"Nombres de automatización; omitir para los valores predeterminados de pokerkit"},"actions":{"items":{"type":"string"},"type":"array","title":"Acciones","examples":[["d dh p1 AhKh","d dh p2 QsQd","p2 cbr 6"]]},"viewer":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Espectador","description":"reservado (nivel de información oculta); v1 es de información completa"}},"type":"object","required":["variant","starting_stacks","antes"],"title":"GameStateRequest"},"GameStepRequest":{"properties":{"variant":{"type":"string","title":"Variante","description":"código de variante, p. ej., NT (NL hold'em); consulte /meta","examples":["NT"]},"starting_stacks":{"items":{"type":"integer"},"type":"array","title":"Fichas iniciales","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":"Ciegas o straddles","examples":[[1,2]]},"bring_in":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Apuesta inicial"},"small_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Apuesta pequeña"},"big_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Apuesta grande"},"min_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Apuesta mínima","description":"obligatorio para sin límite/límite de bote, p. ej., 2"},"ante_trimming_status":{"type":"boolean","title":"Estado del recorte de ante","default":false},"automations":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Automatizaciones","description":"Nombres de automatizaciones; omitir para los valores predeterminados de pokerkit"},"actions":{"items":{"type":"string"},"type":"array","title":"Acciones","examples":[["d dh p1 AhKh","d dh p2 QsQd","p2 cbr 6"]]},"viewer":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Espectador","description":"reservado (nivel de información oculta); v1 es de información completa"},"next_action":{"type":"string","title":"Siguiente acción","description":"la acción de jugador/reparto que se debe aplicar","examples":["p1 cc"]},"expected_action_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cantidad esperada de acciones","description":"token de concurrencia optimista = len(actions) que estás extendiendo; 409 si no coincide"}},"type":"object","required":["variant","starting_stacks","antes","next_action"],"title":"GameStepRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detalle"}},"type":"object","title":"HTTPValidationError"},"HandRequest":{"properties":{"hole":{"type":"string","title":"Cartas privadas","description":"2 cartas privadas, p. ej., 'JhTh'","examples":["JhTh"]},"board":{"type":"string","title":"Board","examples":["AsKsQs"]},"hand_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tipo de mano"},"dead":{"type":"string","title":"Muertas","default":""}},"type":"object","required":["hole","board"],"title":"HandRequest"},"HandStrengthRequest":{"properties":{"hole_range":{"items":{"type":"string"},"type":"array","title":"Rango de cartas privadas","description":"rango/mano del héroe (notación)","examples":[["AhKh"]]},"board":{"type":"string","title":"Board","default":"","examples":["AhKhQh"]},"player_count":{"type":"integer","minimum":2.0,"title":"Número de jugadores","default":2},"sample_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cantidad de muestras"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Semilla"}},"type":"object","required":["hole_range"],"title":"HandStrengthRequest"},"IcmRequest":{"properties":{"payouts":{"items":{"type":"number"},"type":"array","title":"Pagos","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":"una cadena de historial de manos .phh de pokerkit"}},"type":"object","required":["text"],"title":"NotationParseRequest"},"NutAdvantageRequest":{"properties":{"hero":{"items":{"type":"string"},"type":"array","title":"Hero","description":"rango del héroe (notación)","examples":[["AA","KK","AKs"]]},"villain":{"items":{"type":"string"},"type":"array","title":"Villain","description":"rango del villano (notación)","examples":[["QQ","JJ","AQs"]]},"board":{"type":"string","title":"Board","examples":["AsKsQs"]},"hand_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tipo de mano"}},"type":"object","required":["hero","villain","board"],"title":"NutAdvantageRequest"},"RangeExpandRequest":{"properties":{"notation":{"items":{"type":"string"},"type":"array","title":"Notación","description":"tokens de notación de rango","examples":[["AA","KQs","QQ+"]]}},"type":"object","required":["notation"],"title":"RangeExpandRequest"},"ReplayRequest":{"properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Texto","description":"una cadena .phh; O proporcione los campos config+actions a continuación"},"variant":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variante"},"starting_stacks":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Fichas iniciales"},"antes":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Antes"},"blinds_or_straddles":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Ciegas o straddles"},"bring_in":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Apuesta inicial obligatoria (bring-in)"},"small_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Apuesta pequeña"},"big_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Apuesta grande"},"min_bet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Apuesta mínima"},"ante_trimming_status":{"type":"boolean","title":"Estado del recorte de antes","default":false},"automations":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Automatizaciones"},"actions":{"items":{"type":"string"},"type":"array","title":"Acciones"},"index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Índice","description":"devuelve solo la instantánea en este índice de paso"}},"type":"object","title":"ReplayRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Ubicación"},"msg":{"type":"string","title":"Mensaje"},"type":{"type":"string","title":"Tipo de error"},"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":"Agresividad","default":"SINGLE_BET","examples":["NO_BET","SINGLE_BET","RAISED"]},"floor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mínimo","description":"mínimo de categoría opcional, p. ej., 'TWO_PAIR' (anula el mínimo predeterminado derivado de aggression)"},"hand_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tipo de mano"},"dead":{"type":"string","title":"Muertas","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"}}