How do I query GTO node EVs with an API?
After a real-time solver spot is complete and its tree is queryable, request the EV arrays for one node, optionally filtered to one hand.
POST /v1/gto/evs with a solve handle from /v1/gto/solver and a node_id from /v1/gto/solver/tree. The response's actions array defines the order of each hand's EV array in evs.Quick facts
| Endpoint | POST /v1/gto/evs |
|---|---|
| Prerequisite | A completed solve and a queryable solver tree; poll /v1/gto/solver/tree first. |
| Required input | solve and node_id; hand optionally filters to one hand. |
| Response | actions and per-hand evs arrays. Each EV array aligns by index with actions. |
| Quota | The public OpenAPI description marks this read as free after the originating /v1/gto/solver solve. |
| Access | Use the same authenticated API surface and solver handle ownership rules as the completed solve. |
When to use this
Use node EVs in offline training, coaching, hand-review, study, or research tools after a solver result is available. They are useful when an explanation UI needs to compare the available actions at one completed node without scheduling another solve.
When not to use this
Do not call this endpoint before the solver tree is queryable, and do not treat an EV array as a live action recommendation, performance guarantee, or a definition of EV beyond the public response contract.
Minimal API request
Replace the redacted handle with the handle returned by your own solver request. Use a node identifier from the corresponding solver tree. The optional hand field limits the response to that hand.
curl -s https://pokerai.bet/v1/gto/evs \
-H "Authorization: Bearer $POKERAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"solve":"eyJ0Ijoic2x2X3h4eXoi...(handle from /v1/gto/solver)","node_id":"root","hand":"2c2d"}'
Response interpretation
{"node_id": "root", "task_id": "slv_srp_…", "player": 1, "round": "FLOP", "actions": ["CHECK", "BET 4.000000", "BET 97.000000"], "evs": {"2c2d": [-0.826359, -0.792223, -1.643411], "2c2h": […], …}}
In the public docs-code response shape, actions is [CHECK, BET 4.000000, BET 97.000000]. For evs["2c2d"], the first number aligns with CHECK, the second with BET 4.000000, and the third with BET 97.000000.
Keep both arrays together in an explanation UI. The API contract describes these values as per-hand, per-action EVs in bb; it does not select an action or promise a result.
Quota and readiness
This endpoint is documented as free because the originating /v1/gto/solver request is the charged solve. If the solve has not converged, the 200 response can be { spot_status: computing }; continue polling the solver tree until it is queryable rather than assuming EV data is ready.
Errors
| HTTP | Meaning | What to do |
|---|---|---|
| 400 | Invalid request data. | Check solve, node_id, and optional hand against the public schema. |
| 401 | Authentication is missing or invalid. | Send a valid API key and keep it out of browser code and logs. |
| 403 | The solve handle is invalid or not yours. | Use the authenticated handle from your own solver request. |
| 410 | The solve expired (TTL). | Schedule the spot again with /v1/gto/solver. |
Training and review only
Related resources
- Developer docs — authentication, solver lifecycle, quotas, SDKs, and API concepts
- Interactive API reference — the current node-EVs operation schema
- OpenAPI specification — the machine-readable English contract
- Python SDK — the official Python package
- TypeScript / JavaScript SDK — the official npm client
- Official MCP server — the documented MCP package for agent workflows
- Poker hand review API guide — place solver analysis in a post-session workflow
- llms.txt — the concise LLM entry point for Pokerai API