/api/v1/ranges/nl/v2freeDiscovery — covered stack depths and positions plus manifest metadata. Free, no key. Call this first.
The GTO preflop ranges behind our sims, as a clean HTTP API — no-limit hold’em and pot-limit Omaha (6- & 9-max), every stack depth, every position, every action line. JSON, CORS-open, read-only. Start free; paid plans from $100/month.
Copy your key, track requests and data, and change plans from API.
Open API →Starter, Pro and Enterprise use the same endpoints and the same MCP server. REST and MCP calls share one meter; the first allowance reached wins, and nothing is billed as overage.
| Plan | Price | Includes | Use |
|---|---|---|---|
| No key | Free | Discovery endpoints; on MCP, the tool list and every 6-max NL cash preflop tool, 200 tool calls a day per IP | Personal |
| Starter | Free key, no card | Every game and postflop, 100 requests or 50 MB lifetime, 10/sec | Personal only |
| Pro | $100/month | Every game and postflop, 250,000 requests or 5 GB a month, 10/sec | Personal only |
| Enterprise | $250/month | Every game and postflop, 5,000,000 requests or 100 GB a month, 50/sec (higher rate limit) | Commercial use allowed |
| Studio | $199/month | Poker Study AI on pokerstudy.ai | Personal |
| Custom | Contact us | Redistribution, bulk export, training-data licences and SLAs | Custom licence |
Building a product, an app, or an agent for a company? That is commercial use: choose Enterprise, or contact us for redistribution.
Personal use: Starter, Pro and Studio. Commercial use (in a product, app or business): Enterprise. Training or fine-tuning AI/ML models on the data, redistribution or resale: not included in any self-serve plan; requires a Custom licence, contact us.
Send your key as a Bearer header. Discovery endpoints are free and need no key; everything else does. A free trial key (100 requests, no card) is enough to try every example on this page.
curl "https://pokerdata.io/api/v1/ranges/nl/v2/range?stack=100&spot=UTG_60%25_HJ_Call" \ -H "Authorization: Bearer pdk_YOUR_KEY"
Unauthenticated calls get a JSON 401 pointing back here. Responses are privately cacheable; the underlying solves are effectively immutable.
Ranges are keyed by an action path: a chain of POSITION_ACTION pairs describing the preflop line. A path ending in an action (Fold / Call / AI / a raise size like 60%) names a single range; a path ending in a position names a whole decision. Encode % in raise sizes as %25. Weights are on the 169-grid (AA, AKs, AKo…), each in [0, 1]; v2 responses carry per-hand EV in small blinds.
/api/v1/ranges/nl/v2freeDiscovery — covered stack depths and positions plus manifest metadata. Free, no key. Call this first.
/api/v1/ranges/nl/v2/rangeThe range for one spot. `spot` is an action path ending in the action whose range you want. Add `hand` for that class's frequency and EV.
stackrequired— Stack depth in bb, e.g. 100spotrequired— Action path ending in an action, e.g. UTG_60%_HJ_Call (encode % as %25)handoptional— 169-grid class, e.g. AKs/api/v1/ranges/nl/v2/nodeThe whole decision at a node — every available action with its range. `history` ends in the position about to act. Add `hand` for its mixed strategy.
stackrequired— Stack depth in bbhistoryrequired— Action path ending in a position, e.g. UTG_60%_HJhandoptional— 169-grid class — returns action → freq/api/v1/ranges/nl/v2/spotsEvery valid decision node for a stack depth, tagged by depth (1 = RFI, 2 = vs open, 3 = 3-bet pots, …). Build a spot picker without 404 probing.
stackrequired— Stack depth in bbcombos is the weighted concrete-combo count (pair 6, suited 4, offsuit 12)./api/v1/ranges/nl, /nl/range, /nl/node, /nl/spots) serve the same trees without EV data.400 malformed path, 404 spot not in the dataset.Chip-EV MTT ladder with a 1bb big-blind ante posted from the named stack (SB 0.5, BB 1). Same 169-grid as cash NLHE; seats are UTG, UTG1, LJ, HJ, CO, BTN, SB, BB. Raises use Open / 3B depth tags (plus Limp and AI). Each raise's sizeBb is the raise-to in big blinds. At 40bb the pack lists the open as 2.2x; the node decodes code 40034 to 2.19bb, and the SB open is 2.8x.
/api/v1/ranges/nlmtt8freeDiscovery — stacks (10–300bb) and the 8-max ring. Free, no key.
/api/v1/ranges/nlmtt8/configfreeTable config for one stack: seats, ante-inclusive stacks, blinds, open sizes, and EV units. Free, no key. 40bb open is listed 2.2x; the node decodes it to 2.19bb. SB is 2.8x.
stackrequired— Stack depth in bb, e.g. 40/api/v1/ranges/nlmtt8/rangeThe range for one spot. Add `hand` for that class's frequency.
stackrequired— Stack depth in bb, e.g. 300spotrequired— Action path ending in an action, e.g. UTG_Openhandoptional— 169-grid class, e.g. AKs/api/v1/ranges/nlmtt8/nodeThe whole decision at a node. `history` ends in the actor. Each raise includes sizeBb. `full=1` writes all 169 hands with explicit 0.
stackrequired— Stack depth in bbhistoryrequired— Action path ending in a position, e.g. UTGhandoptional— 169-grid class — returns action → freqfulloptional— Pass 1 for every 169-hand weight, including explicit 0/api/v1/ranges/nlmtt8/spotsEvery valid decision node for a stack depth, tagged by depth.
stackrequired— Stack depth in bb/ranges.md.Same action-path grammar, but raises are labelled by betting depth: Open, 3B, 4B, … Hands use suit-grouping notation over the 16,432 PLO starting hands: AAKK, (2A)AA, (KA)(KA) — encode ( ) as %28 %29.
/api/v1/ranges/plofreeDiscovery — stacks and positions for 6-max PLO. Free, no key.
/api/v1/ranges/plo/rangeThe range for one spot. Add `hand` for its frequency, `minFreq` to trim low-weight hands (PLO ranges are large).
stackrequired— Stack depth in bbspotrequired— Action path ending in an action, e.g. UTG_Open_HJ_3Bhandoptional— Suit-grouping hand stringminFreqoptional— Drop hands at or below this weight (default 0)/api/v1/ranges/plo/nodeThe whole decision at a node. Add `hand` for its mixed strategy, `minFreq` to trim.
stackrequired— Stack depth in bbhistoryrequired— Action path ending in a positionhandoptional— Suit-grouping hand stringminFreqoptional— Trim per-action ranges/api/v1/ranges/plo/spotsEvery valid decision node for a stack depth, tagged by depth.
stackrequired— Stack depth in bb/api/v1/ranges/plo for the live list.Open-40100) — always read exact action tokens from /node or /spots.The full-ring sibling — identical grammar and hand notation, nine seats: UTG, UTG1, UTG2, LJ, HJ, CO, BTN, SB, BB.
/api/v1/ranges/plo9freeDiscovery — stacks (60, 100bb) and positions. Free, no key.
/api/v1/ranges/plo9/rangeThe range for one spot.
stackrequired— 60 or 100spotrequired— Action path ending in an actionhandoptional— Suit-grouping hand stringminFreqoptional— Trim low-weight hands/api/v1/ranges/plo9/nodeThe whole decision at a node.
stackrequired— 60 or 100historyrequired— Action path ending in a positionhandoptional— Suit-grouping hand stringminFreqoptional— Trim per-action ranges/api/v1/ranges/plo9/spotsEvery valid decision node for a stack depth.
stackrequired— 60 or 100UTG_Fold_UTG1_Fold_…_BTN_Open) — pass minFreq to keep responses small.Full postflop solver strategy, board by board: heads-up pots from the solved preflop lines (BTN opens BB calls, 3-bet pots, …), walked node by node. Boards use the spaced form (3h 3d 2s); a node's childSegments are the legal next steps — actions like Bet 5.5 or runouts like deal:7c — which you append to path to walk deeper.
/api/v1/postflop/catalogfreeDiscovery — every pack with its preflop line, positions, stack, pot, and solved boards. Free, no key. Call this first.
/api/v1/postflop/nodeOne solver node: the acting player's strategy for every hand class, legal next segments, board, reach, and the reach-weighted action split.
packrequired— Pack id from the catalog, e.g. nlhe-srp-btn-vs-bb-100bbboardrequired— Board in spaced form, e.g. "3h 3d 2s" (URL-encode the spaces)pathoptional— JSON array of segments from the root, e.g. ["Check","Bet 5.5"]. Omit for the root node.The same data is exposed as a Model Context Protocol server — point an MCP client (Claude, Cursor, or any agent framework) at it and the ranges become tool calls. Stateless Streamable HTTP. A pdk_key still works. Claude signs in with OAuth instead of a pasted key; that token uses the same plan and usage meter as the account's API key. Without a credential, the tool list, list_games, list_postflop_packs, the tree docs, and every 6-max NL cash preflop tool (game: "nl", all stacks) still answer, up to 200 tool calls a day per IP.
POST https://pokerdata.io/api/mcp Authorization: Bearer pdk_YOUR_KEY
Tools: list_games, get_config, get_range, get_node, list_spots (preflop, including nl9, plo5, and plo6hu when published), list_datasets, get_tree_docs, get_range_metadata, get_exploitability, list_postflop_packs, get_postflop_node, get_postflop_range (postflop), explain_combo, get_board_report, compare_strategies, hand and session tools (free with any key, and they never use up your allowance), and a solver queue. Hand files go to /upload (get_upload_link). Coaching tools return context, solve quality when published, and explicit unsupported coverage instead of substituting cash data for tournament or ICM questions.
Want the raw solver exports instead? The sims library sells full game bundles for offline study.