{"name":"TechTools Slot Simulator API","version":"1.0","updated":"2026-10-17","engine_version":"1.0.0","summary":"Four space-themed video slots built the way modern online slots work: paylines with sticky-wild free spins, pays-anywhere tumbles with multipliers, up to 117,649 ways with cascades, and Hold and Win with jackpots. As in a real online casino the server draws every round; this API is the random number generator and the math of the browser game at https://techtools.cz/tools/slot-simulator/. Play money only: nothing can be bought, won or paid out.","base_url":"https://techtools.cz/slot-simulator-api","tool_url":"https://techtools.cz/tools/slot-simulator/","auth":"None. Public, no data stored, no session. The balance is kept by the caller (the page keeps it in the browser).","rate_limits":"spin: 240 requests a minute per IP address; simulate: 12 a minute per IP address. Over the limit the answer is 429 with code rate_limited and Retry-After: 60. games and docs are cacheable for 5 minutes.","conventions":{"input":"GET takes a query string; POST takes a JSON body (Content-Type: application/json) or form fields. Both give the same answer.","money":"Amounts are credits (play money) with at most 2 decimals. *_x fields are multiples of the total bet. The engine keeps every pay as an integer number of hundredths of the bet, so wins are exact.","rng":"Every round is a pure function of game, mode and seed. Without seed the server draws a fresh 64-bit one and returns it as round; send it back as seed to replay that exact round.","grid":"A grid is a list of reels (columns) left to right, each a list of cells top to bottom. A position is [reel, row], both from 0. On black-hole-ways the reels have different heights (2 to 7).","cells":"A cell is a symbol id from the game's symbols. A multiplier star is \"mult:\u003cvalue\u003e\" (\"mult:25\" multiplies by 25); a gravity coin is \"coin:\u003cx the bet\u003e\" or \"coin:mini|minor|major\" for a jackpot. In Hold and Win an empty position is null.","lang":"lang=cs returns names, taglines, mechanics and rules in Czech; anything else English. Errors carry message in the asked language and message_cs.","status":"200 with ok: true. 422 with ok: false and errors [{ param, code, message, message_cs }]. 404 for an unknown id on /games/:id. 400 for a malformed JSON body. 429 over the rate limit."},"games":[{"id":"nebula-nights","name":"Nebula Nights","type":"lines","buy_x":null},{"id":"supernova-tumble","name":"Supernova Tumble","type":"tumble","buy_x":100},{"id":"black-hole-ways","name":"Black Hole Ways","type":"ways","buy_x":100},{"id":"gravity-coins","name":"Gravity Coins","type":"hold","buy_x":60}],"bet_levels":[0.2,0.4,1,2,4,10,20,50,100],"default_bet":1,"endpoints":[{"method":"GET","path":"/games","params":{"lang":"en (default) or cs","detail":"1 adds rules, paytables and weights"},"returns":"{ ok, engine_version, lang, currency, bet_levels, default_bet, start_balance, count, games }","curl":"curl 'https://techtools.cz/slot-simulator-api/games?detail=1'"},{"method":"GET","path":"/games/:id","params":{"id":"nebula-nights | supernova-tumble | black-hole-ways | gravity-coins","lang":"en or cs"},"returns":"{ ok, engine_version, lang, ..., game } with the full paytable (pays in x the bet), rules, features and the symbol weights every cell is drawn from","curl":"curl 'https://techtools.cz/slot-simulator-api/games/supernova-tumble'"},{"method":"GET","path":"/spin","params":{"game":"required: nebula-nights | supernova-tumble | black-hole-ways | gravity-coins","bet":"one of bet_levels (default 1)","mode":"spin (default) or buy (buy the feature for buy_x times the bet)","seed":"optional, 1 to 16 hex digits: replays a round","lang":"language of error messages"},"returns":"the round: see spin_response","curl":"curl 'https://techtools.cz/slot-simulator-api/spin?game=nebula-nights\u0026bet=1\u0026seed=5eed'","example_response":{"ok":true,"engine_version":"1.0.0","game":"nebula-nights","round":"0000000000005eed","mode":"spin","bet":1.0,"cost":1.0,"win":0.6,"win_x":0.6,"capped":false,"feature":null,"spins":[{"phase":"base","steps":[{"grid":[["dia","tri","orb"],["orb","tri","hex"],["wild","astronaut","tri"],["dia","ufo","orb"],["hex","hex","orb"]],"wins":[{"type":"line","line":16,"symbol":"tri","count":3,"positions":[[0,1],[1,1],[2,0]],"win":0.3},{"type":"line","line":17,"symbol":"tri","count":3,"positions":[[0,1],[1,1],[2,2]],"win":0.3}],"win":0.6}],"win":0.6}],"note":"spins trimmed to the first one"}},{"method":"POST","path":"/spin","content_type":"application/json","body":{"game":"black-hole-ways","bet":2,"mode":"buy"},"returns":"the same document as GET /spin","curl":"curl -X POST -H 'Content-Type: application/json' -d '{\"game\":\"black-hole-ways\",\"bet\":2,\"mode\":\"buy\"}' https://techtools.cz/slot-simulator-api/spin"},{"method":"GET","path":"/simulate","params":{"game":"required","rounds":"1 to 10000 (default 1000)","mode":"spin or buy","seed":"optional: replays the run"},"returns":"see simulate_response; the run is played at 1 credit a round","curl":"curl 'https://techtools.cz/slot-simulator-api/simulate?game=gravity-coins\u0026rounds=10000'"},{"method":"POST","path":"/simulate","content_type":"application/json","body":{"game":"supernova-tumble","rounds":5000},"returns":"the same document as GET /simulate"},{"method":"GET","path":"/docs","returns":"this document","curl":"curl 'https://techtools.cz/slot-simulator-api/docs'"}],"spin_response":{"top_level":["ok","engine_version","game","round","mode","bet","cost","win","win_x","capped","feature","spins"],"round":"the seed of this round as 16 hex digits; seed=\u003cround\u003e replays it","cost":"what the round costs: the bet, or buy_x times the bet with mode=buy","win":"the total win of the round in credits (everything below added up, capped at max_win_x times the bet)","capped":"true when the round reached max_win_x; the feature stops there","feature":"null, or { type: free_spins | hold_and_win, ... , win }: awarded, played and retriggers for free spins (plus total_multiplier on supernova-tumble, multiplier on black-hole-ways); start_coins, coins, respins and grand for Hold and Win","spins":"the spins in the order they are played: phase base first, then free (index, of) or hold","spin":{"phase":"base | free | hold","steps":"base and free spins: [{ grid, wins, win, remove?, multiplier? }]. A paylines spin has one step. On tumble and ways games each step is the grid before a tumble or cascade; remove lists the positions that disappear, the survivors of each reel fall to the bottom and new cells fill the top, giving the next step's grid. The last step has no wins.","wins":"{ type: line | anywhere | ways, symbol, positions, win } plus line and count (line), count (anywhere), reels and ways (ways)","win":"the win of this spin in credits after multipliers","scatter":"{ count, positions, win, awarded } when supernovas pay or award free spins","stars":"supernova-tumble: { positions, sum, applied } for the multiplier stars on the settled grid","sticky":"nebula-nights free spins: every sticky wild after this spin; new_sticky are the ones that just landed","heights":"black-hole-ways: the height of each reel; ways is their product","multiplier":"black-hole-ways free spins: multiplier_start and multiplier after the spin; each step carries its own","coins":"gravity-coins base spin: { count, positions, triggered }","hold":"gravity-coins Hold and Win respins: { grid, new, respins_left, coins }; the last one carries the win","feature_win":"free spins: what the feature has paid so far"}},"simulate_response":{"top_level":["ok","engine_version","game","mode","seed","rounds","cost_x","rtp","hit_rate","feature_rate","feature_every","average_feature_win_x","max_win_x","max_win_rounds","buckets","net_path_x","published"],"rtp":"return to player in percent: everything won divided by everything staked, over these rounds","hit_rate":"percent of rounds that won anything","feature_every":"on average one feature per this many rounds (null when none started)","buckets":"how the round wins spread, in multiples of cost_x","net_path_x":"the running net result (won minus staked, in multiples of the bet) at about 100 evenly spaced rounds","published":"the long-run numbers measured offline over millions of rounds, for comparison"},"error_codes":[{"code":"unknown_game","endpoints":["/spin","/simulate","/games/:id"],"param":"game","when":"game is not one of the ids listed by /games (a 404 on /games/:id)","message":"No game with this id. See /games for the list."},{"code":"bad_bet","endpoints":["/spin"],"param":"bet","when":"bet is not one of bet_levels (a decimal comma is accepted)","message":"The bet must be one of the bet levels listed under /games."},{"code":"bad_mode","endpoints":["/spin","/simulate"],"param":"mode","when":"mode is neither spin nor buy","message":"mode must be spin or buy."},{"code":"buy_not_available","endpoints":["/spin","/simulate"],"param":"mode","when":"mode=buy on a game without a buy feature (buy_x is null)","message":"This game has no buy feature."},{"code":"bad_seed","endpoints":["/spin","/simulate"],"param":"seed","when":"seed is not 1 to 16 hexadecimal digits","message":"seed must be 1 to 16 hexadecimal digits."},{"code":"bad_rounds","endpoints":["/simulate"],"param":"rounds","when":"rounds is not a whole number from 1 to 10000","message":"rounds must be a whole number from 1 to 10000."}]}