Reference
API reference
Results of every roulette table and crash game in your plan as JSON, over HTTPS. Base URL: https://api.gamedata365.com. Five endpoints, all GET.
Your key
Send your key in the X-API-Key header on every call (Authorization: Bearer works too). It is in your account under API, with a request ready to paste. No key yet? Build a plan, or get a free key for up to 3 games.
curl
curl -H "X-API-Key: YOUR_KEY" \
"https://api.gamedata365.com/v1/live"JavaScript (Node 18+, browser)
fetch("https://api.gamedata365.com/v1/live", {
headers: { "X-API-Key": "YOUR_KEY" },
})
.then((r) => r.json())
.then(console.log);Python (requests)
import requests
r = requests.get(
"https://api.gamedata365.com/v1/live",
headers={"X-API-Key": "YOUR_KEY"},
)
print(r.json())Subscribed through RapidAPI? Send X-RapidAPI-Key through the RapidAPI gateway instead. Everything else on this page is the same.
Requests and history
One call, one request
Every successful call counts as one request,
/v1/metaincluded. Refused calls (any error below) are not counted./v1/metashows how many you have used.When the count starts again
A paid plan runs 30 days from the payment and does not renew by itself; renew or change it in your account. The free key starts again on the 1st of each month.
How far back
History reaches the newest spins of each game in your plan, as many as your plan says (
history_spinsin every history response). The newest rounds are there within seconds.How much per call
One history page holds up to 1,000 rounds, and never more than your plan's history. Ask with
limit; a larger number is lowered, not refused.
GET /v1/live
The newest round, per table.
The newest round of every roulette table in your plan, in one call. Add ?table= with a table_id for one table. Each table has a latest block: round_id, number, color, parity, dozen, column, half, timestamp (UTC), backfilled. A new round_id means a new round.
api.gamedata365.com/v1/live{
"status": "ok",
"provider": "custom",
"tables_count": 1,
"server_time": "2026-10-26T15:51:30Z",
"tables": [
{
"table_id": "lightning_roulette",
"table_name": "Lightning Roulette",
"provider": "evolution",
"latest": {
"round_id": "1793029849685535",
"number": 23,
"color": "red",
"parity": "odd",
"dozen": 2,
"column": 2,
"half": "high",
"timestamp": "2026-10-26T15:50:49Z",
"backfilled": false
}
}
]
}Zero comes as color "green" with parity, dozen, column and half all null: they do not exist on zero.
GET /v1/history
Past rounds, newest first.
Params: table (required), limit (rounds per page), cursor (the previous page's next_cursor), from (optional, ISO time: only rounds at or after it).
api.gamedata365.com/v1/history?table=lightning_roulette&limit=2{
"status": "ok",
"table_id": "lightning_roulette",
"limit": 2,
"count": 2,
"next_cursor": "eyJ0cyI6ICIyMDI2LTEwLTI2IDE1OjUz…",
"rounds": [
{ "type": "round", "round_id": "1793030043142588", "number": 3, "color": "red",
"parity": "odd", "dozen": 1, "column": 3, "half": "low",
"timestamp": "2026-10-26T15:54:03Z", "backfilled": false },
{ "type": "gap", "from": "2026-10-26T15:52:20Z", "to": "2026-10-26T15:53:16Z",
"estimated_missing": 1, "recovered": false, "closure": false },
{ "type": "round", "round_id": "1793029996403575", "number": 0, "color": "green",
"parity": null, "dozen": null, "column": null, "half": null,
"timestamp": "2026-10-26T15:52:20Z", "backfilled": false }
],
"history_spins": 500
}count counts rounds, not array entries: gap markers do not count.
Gaps are marked, never hidden
If we missed rounds, the place shows as a
{"type": "gap"}object with its time span, instead of being silently closed. You always know where the record has a hole.Recovered rounds are flagged
Rounds recovered after the fact carry
backfilled: true, so you can tell live captures from later reconciliation.Paging stops at your plan's history
Walk back with
next_cursor. At the edge of your plan's history it comes backnull. Asking for older rounds withfromreturns402 window_exceeded.
GET /v1/crash/live
The newest round, per crash game.
The newest round of every crash game in your plan. multiplier is where the round crashed. stale: true means the game has not produced a round lately (age_seconds says how long ago).
api.gamedata365.com/v1/crash/live{
"status": "ok",
"games_count": 1,
"server_time": "2026-10-26T15:51:30Z",
"games": [
{
"game_id": "lucky_jet",
"game_name": "Lucky Jet",
"provider": "1win_games",
"stale": false,
"age_seconds": 70.2,
"latest": {
"round_id": "luckyjet-1793029820-7070",
"multiplier": 1.67,
"timestamp": "2026-10-26T15:50:20Z"
}
}
]
}GET /v1/crash/history
A crash game's past rounds, newest first.
Params: game (a game_id; may be left out when your plan has one crash game), limit, cursor. Paging works as in /v1/history.
api.gamedata365.com/v1/crash/history?game=lucky_jet&limit=2{
"status": "ok",
"game_id": "lucky_jet",
"limit": 2,
"count": 2,
"next_cursor": "eyJ0cyI6ICIyMDI2LTEwLTI2IDE1OjUw…",
"rounds": [
{ "round_id": "luckyjet-1793029820-7070", "multiplier": 1.67, "timestamp": "2026-10-26T15:50:20Z" },
{ "round_id": "luckyjet-1793029804-7069", "multiplier": 33.45, "timestamp": "2026-10-26T15:50:04Z" }
],
"history_spins": 500
}GET /v1/meta
Your plan, your usage, your tables.
Your plan's requests and history, when it ends, how many requests you have used this period, and each of your tables with how many days of history we hold.
api.gamedata365.com/v1/meta{
"status": "ok",
"plan": {
"name": "CUSTOM",
"requests_per_month": 10000,
"history_spins": 500,
"ends_at": "2026-11-25T15:51:30Z"
},
"usage": { "requests": 1284, "period": "p:2026-10-26T15:51:30.049Z" },
"tables": [
{ "table_id": "lightning_roulette", "table_name": "Lightning Roulette",
"provider": "evolution", "history_days": 98 }
]
}Errors
Every refusal says why and what to do.
An error comes as {"status": "error", "error": …, "message": …}. The message names the fix, with a link to your account where one helps. Refused calls are not counted.
invalid_keyNo key, or not one we know. Send the whole key in X-API-Key; copy it again from your account if in doubt.key_replacedYou made a new key, and this call still sends the old one. Copy the new key from your account into your app: the message says when the key was replaced.table_not_entitled · game_not_entitledThat table or game is not in your plan. The message lists the ones that are. Add games in your account.history_not_includedYour plan is live results only. Add spin history in your account.plan_endedYour plan's 30 days are over. Renew in your account: the same key starts working again.window_exceededYou asked for rounds older than your plan's history. Ask for newer ones, or take more history in your account.quota_exceededThis period's requests are used up. Renew or change the plan in your account (the response carries the link in renew).data_staleOur feed has not had a fresh round for a while. We never serve an old number as current; try again in a minute.Plans
Pick your games and see the price.
Choose the games, the requests a month and how much history. Plans from $5 a month, paid in USDT, or a free key for up to 3 games.