← All guides
On this page
Guide GTO strategy · 01/06 Solver apps 11 min Advanced

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.

Updated Maintained by Pokerai API

Direct answer: call 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

EndpointPOST /v1/gto/evs
PrerequisiteA completed solve and a queryable solver tree; poll /v1/gto/solver/tree first.
Required inputsolve and node_id; hand optionally filters to one hand.
Responseactions and per-hand evs arrays. Each EV array aligns by index with actions.
QuotaThe public OpenAPI description marks this read as free after the originating /v1/gto/solver solve.
AccessUse 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

HTTPMeaningWhat to do
400Invalid request data.Check solve, node_id, and optional hand against the public schema.
401Authentication is missing or invalid.Send a valid API key and keep it out of browser code and logs.
403The solve handle is invalid or not yours.Use the authenticated handle from your own solver request.
410The solve expired (TTL).Schedule the spot again with /v1/gto/solver.

Training and review only

Use Pokerai API for training, coaching, hand review, study, and research. Real-time assistance at real-money tables is prohibited. Keep EV comparisons out of live-table automation and do not turn them into an in-hand action prompt.

Related resources