curl --request POST \
--url https://hedgeem-server.qeetoto.com/api/games/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"numberOfGames": 10,
"numberOfHands": 3,
"targetRtp": 0.97
}
'import requests
url = "https://hedgeem-server.qeetoto.com/api/games/bulk"
payload = {
"numberOfGames": 10,
"numberOfHands": 3,
"targetRtp": 0.97
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({numberOfGames: 10, numberOfHands: 3, targetRtp: 0.97})
};
fetch('https://hedgeem-server.qeetoto.com/api/games/bulk', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://hedgeem-server.qeetoto.com/api/games/bulk",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'numberOfGames' => 10,
'numberOfHands' => 3,
'targetRtp' => 0.97
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://hedgeem-server.qeetoto.com/api/games/bulk"
payload := strings.NewReader("{\n \"numberOfGames\": 10,\n \"numberOfHands\": 3,\n \"targetRtp\": 0.97\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://hedgeem-server.qeetoto.com/api/games/bulk")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"numberOfGames\": 10,\n \"numberOfHands\": 3,\n \"targetRtp\": 0.97\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://hedgeem-server.qeetoto.com/api/games/bulk")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"numberOfGames\": 10,\n \"numberOfHands\": 3,\n \"targetRtp\": 0.97\n}"
response = http.request(request)
puts response.read_body{
"numberOfGames": 1,
"numberOfHands": 3,
"targetRtp": 0.97,
"generatedAt": "2026-03-24T12:00:00.000Z",
"games": [
{
"gameId": "BULK-0001",
"numberOfHands": 3,
"numberOfBettingStages": 3,
"hands": [
"AcKd",
"QsJs",
"8h7c"
],
"bc1": "Ah",
"bc2": "3s",
"bc3": "9d",
"bc4": "2c",
"bc5": "Kh",
"handStageInfoList": [
{
"handIndex": 0,
"bettingStage": 0,
"percentWin": 62.4,
"percentDraw": 2.1,
"percentWinOrDraw": 64.5,
"oddsActual": 1.55,
"oddsMargin": 1.5,
"oddsRounded": 1.5,
"actualRtp": 0.968,
"roundingRake": 0,
"statusIsWinner": false,
"statusCantLose": false,
"statusIsFavourite": true,
"statusBestRtp": false,
"bestFiveCards": null,
"handDescShort": null,
"handDescLong": null
}
]
}
]
}{
"error": "betAmount must be a positive number."
}{
"error": "Missing or invalid Authorization header."
}Generate bulk game data
Generates N complete pre-calculated game states — each containing all 4 stages (HOLE, FLOP, TURN, RIVER) with odds already computed for every hand.
This is the REST replacement for the legacy C# SOAP method
f_get_bulk_gamestate_list (hedgeem_asp_webservice). The JS client’s static
coreData[] and three_handed_game_data[] arrays in coredata.js were
originally generated by that SOAP endpoint — this endpoint replaces it.
Pipeline per game (mirrors HedgeEmTable.f_shuffle_deal_and_calculate_odds):
- Shuffle deck and deal hole cards + board cards
- Calculate pre-flop odds (Monte Carlo)
- Calculate flop odds (Monte Carlo)
- Calculate turn odds (Monte Carlo)
- Deterministic river evaluation
- Apply house margin chain to each stage
- Determine status flags (winner, favourite, cant-lose, best-rtp)
- Populate best-five-cards and hand descriptions (flop onwards)
Limits: numberOfGames is capped at 200 per request.
For 50 games of 3 hands the response is ~300 KB.
curl --request POST \
--url https://hedgeem-server.qeetoto.com/api/games/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"numberOfGames": 10,
"numberOfHands": 3,
"targetRtp": 0.97
}
'import requests
url = "https://hedgeem-server.qeetoto.com/api/games/bulk"
payload = {
"numberOfGames": 10,
"numberOfHands": 3,
"targetRtp": 0.97
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({numberOfGames: 10, numberOfHands: 3, targetRtp: 0.97})
};
fetch('https://hedgeem-server.qeetoto.com/api/games/bulk', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://hedgeem-server.qeetoto.com/api/games/bulk",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'numberOfGames' => 10,
'numberOfHands' => 3,
'targetRtp' => 0.97
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://hedgeem-server.qeetoto.com/api/games/bulk"
payload := strings.NewReader("{\n \"numberOfGames\": 10,\n \"numberOfHands\": 3,\n \"targetRtp\": 0.97\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://hedgeem-server.qeetoto.com/api/games/bulk")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"numberOfGames\": 10,\n \"numberOfHands\": 3,\n \"targetRtp\": 0.97\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://hedgeem-server.qeetoto.com/api/games/bulk")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"numberOfGames\": 10,\n \"numberOfHands\": 3,\n \"targetRtp\": 0.97\n}"
response = http.request(request)
puts response.read_body{
"numberOfGames": 1,
"numberOfHands": 3,
"targetRtp": 0.97,
"generatedAt": "2026-03-24T12:00:00.000Z",
"games": [
{
"gameId": "BULK-0001",
"numberOfHands": 3,
"numberOfBettingStages": 3,
"hands": [
"AcKd",
"QsJs",
"8h7c"
],
"bc1": "Ah",
"bc2": "3s",
"bc3": "9d",
"bc4": "2c",
"bc5": "Kh",
"handStageInfoList": [
{
"handIndex": 0,
"bettingStage": 0,
"percentWin": 62.4,
"percentDraw": 2.1,
"percentWinOrDraw": 64.5,
"oddsActual": 1.55,
"oddsMargin": 1.5,
"oddsRounded": 1.5,
"actualRtp": 0.968,
"roundingRake": 0,
"statusIsWinner": false,
"statusCantLose": false,
"statusIsFavourite": true,
"statusBestRtp": false,
"bestFiveCards": null,
"handDescShort": null,
"handDescLong": null
}
]
}
]
}{
"error": "betAmount must be a positive number."
}{
"error": "Missing or invalid Authorization header."
}Authorizations
Supabase Auth JWT. Obtain via Supabase Auth sign-in.
Body
How many games to generate (1–200, default 50)
1 <= x <= 20010
Hands per game — 3 or 4 (default 3)
3, 4 3
House RTP target — must be > 0 and < 1 exclusive (default 0.97)
0 < x < 10.97
Response
Pre-calculated game states
Pre-calculated game states, one per requested game
Show child attributes
Show child attributes
Actual count of games returned
10
Hands per game (echoed from request)
3
RTP used for house margin calculations (echoed from request)
0.97
ISO 8601 timestamp of when this batch was generated
"2026-03-24T12:00:00.000Z"