TrackerSino Data API — riferimento
JSON su HTTPS. Autenticazione tramite API key. Stessa forma di risposta per ogni gioco. Esempi cURL / JavaScript / Python per ogni endpoint.
Per iniziare
Ogni richiesta va a https://api.trackersino.com. L'autenticazione è un singolo header HTTP (Authorization: Bearer <tua-chiave>). Le risposte sono application/json. Tutti i timestamp sono UTC ISO 8601. I valori Decimal (moltiplicatori, payout) sono restituiti come stringhe JSON per preservare la precisione.
curl -H "Authorization: Bearer YOUR_KEY" \ https://api.trackersino.com/v1-beta/games
La prima chiamata di solito restituisce il catalogo di ogni gioco che tracciamo, con last-observed-at e rounds-total. Da lì, chiama /v1-beta/games/{slug}/rounds per lo storico o sottoscrivi /v1-beta/stream per push live.
Giochi e slug
Lo {slug} in ogni path è l'identificatore di un gioco — è il campo `id` restituito da /v1-beta/games e non cambia mai. Ovunque vedi {slug} qui sotto, sostituisci uno dei valori della prima colonna.
Per lo stream WebSocket selezioni più giochi insieme con una lista separata da virgole: ?games=stake-crash,crazytime,lightningstorm. La variabile query `games` accetta qualsiasi slug di questa tabella.
| slug (id) | gioco | provider | kind |
|---|---|---|---|
| stake-crash | Crash | Stake | crash |
| duel-crash | Crash | Duel | crash |
| shuffle-crash | Crash | Shuffle | crash |
| crash | Crash | Roobet | crash |
| stake-slide | Slide | Stake | crash |
| slide | Slide | Roobet | wheel |
| crazytime | Crazy Time | Evolution | wheel-show |
| crazytimea | Crazy Time A | Evolution | wheel-show |
| monopolylive | Monopoly Live | Evolution | wheel-show |
| monopolybigballer | MONOPOLY Big Baller | Evolution | wheel-show |
| dreamcatcher | Dream Catcher | Evolution | wheel-show |
| lightningstorm | Lightning Storm | Evolution | wheel-show |
| icefishing | Ice Fishing | Evolution | wheel-show |
| lightningdice | Lightning Dice | Evolution | dice-show |
| lightningroulette | Lightning Roulette | Evolution | roulette-show |
Il campo `kind` indica quali dati extra aspettarti nel payload raw di ogni round: crash / wheel (Slide) → solo multiplier; wheel-show (Crazy Time, Monopoly Live, Lightning Storm, Dream Catcher, Ice Fishing, Big Baller) → segment + sector + dettagli bonus; dice-show (Lightning Dice) → facce dei dadi + moltiplicatori lightning; roulette-show (Lightning Roulette) → numero vincente + moltiplicatori lucky-number.
Questa tabella è uno snapshot — chiama GET /v1-beta/games in qualsiasi momento per la lista autorevole e sempre aggiornata con i contatori live rounds_total e last_finalized_multiplier.
Autenticazione
Ogni cliente riceve una o più API key in onboarding via Telegram. Le chiavi sono scoped per ambiente (sandbox / produzione) e ruotabili su richiesta. Hai perso una chiave? Scrivici su Telegram — la revochiamo e ne emettiamo una nuova.
Chiave errata / mancante → 401. Chiave valida ma tier insufficiente per l'endpoint → 403. Rate limit superato → 429 con Retry-After.
GET /v1-beta/games HTTP/1.1 Host: api.trackersino.com Authorization: Bearer ts_live_abcd1234efgh5678 Accept: application/json
Endpoint REST
Tutti gli endpoint restituiscono JSON. Dove c'è paginazione, usa ?limit e ?since (timestamp ISO) — niente cursori opachi; puoi riprendere su `finalized_at`.
/v1-beta/gamesCatalogo. Restituisce ogni gioco tracciato: id, name, provider, kind (crash / slide / wheel-show / dice-show / roulette-show), enabled, rounds_total, last_observed_at, last_finalized_index, last_finalized_multiplier.
/v1-beta/games/{slug}/rounds?limit=N&window=5m&since=ISO&only_finalized=trueStorico round, più recenti per primi. Filtra per solo finalizzati, per timestamp assoluto (since=ISO) o per finestra relativa — window=5m|15m|30m|1h|3h|6h|12h|24h|72h|7d|30d, oppure since_minutes=N per un conteggio esatto in minuti. Ogni riga porta round_index, round_id, multiplier, random_number, state, finalized_at e payload raw completo.
/v1-beta/games/{slug}/rounds/latestIl singolo round più recente. only_finalized=true (default) ritorna l'ultimo round finalizzato; only_finalized=false ritorna la riga più nuova in assoluto, che può essere ancora in corso. Stessa forma di una riga /rounds incluso il payload raw completo.
/v1-beta/games/{slug}/summaryPanoramica in un colpo solo — tutto quello che mostra l'header gioco di trackersino in una sola chiamata: identità (name/provider/kind), rounds_total, l'ultimo round completo, conteggi rolling (last_5m / last_15m / last_1h / last_24h), forma dei moltiplicatori 24h (mean / median / p95 / max) e la tabella delay principale (round dall'ultimo ≥2x / 10x / 50x / 100x).
/v1-beta/games/{slug}/spins?limit=N&window=24hEndpoint comodo per wheel-show — ogni riga porta segment, sector e multiplier_text già decodificati. Usalo per UI Crazy Time / Lightning Storm / Monopoly Live senza parsare raw da solo.
/v1-beta/games/{slug}/round/{round_id}Dettaglio singolo round. Stessa forma delle righe di /rounds ma con payload bonus completo (griglia Cash Hunt, drop Pachinko, arms Crazy Time, batterie / reels / offers di Lightning Storm).
/v1-beta/games/{slug}/stats/biggest-wins?window=24h&limit=10Top payout in una finestra. Ordinato per total_amount × multiplier se disponibile, altrimenti solo multiplier. Ritorna round_id, multiplier, finalized_at, segment, total_amount, total_winners.
/v1-beta/games/{slug}/stats/multiplier-distribution?window=1hIstogramma dei moltiplicatori (giochi crash) o hit-rate dei segmenti (wheel show) sulla finestra richiesta. Usalo per grafici di fairness / convergenza RTP.
/v1-beta/games/{slug}/stats/delaysRound-da-ultimo-≥X per ogni soglia (1.5x … 1000x). Stessa metrica del temperature panel pubblico, più lifetime_hits e lifetime_rounds. Refresh-friendly: i numeri scendono ad ogni round.
/v1-beta/games/{slug}/stats/frequency?window=24hHit-rate osservato vs teorico per soglia, con il delta in punti percentuali rispetto al baseline fair-game (house edge configurabile). La tabella di fairness dietro la pagina stats pubblica.
/v1-beta/games/{slug}/stats/streaks?window=24hRun consecutive correnti e più lunghe sotto ogni soglia (2x … 100x) — current_under_count, longest_under_in_window e dove è iniziata la run più lunga.
/v1-beta/games/{slug}/stats/hourly?window=24hBucket orari: count, mean, max, p95 più conteggi hit per 2x / 10x / 50x. Usalo per heatmap e analisi per fascia oraria.
/v1-beta/games/{slug}/stats/multiplier-distribution?window=1hIstogramma dei moltiplicatori (giochi crash) più mean / median / p95 / p99 / max sulla finestra. Usalo per grafici di fairness / convergenza RTP.
/v1-beta/games/{slug}/stats/rtp-empirical?window=24hRTP empirico direzionale dagli snapshot di puntate osservate (volume, payout, rapporto). Biased da snapshot — vedi il campo note nella risposta.
/v1-beta/games/{slug}/stats/rtp-detailed?window=24hStesso RTP scomposto per target-multiplier: bets_count, volume, payout, win_rate e rtp per ogni target di cash-out.
/v1-beta/games/{slug}/stats/currency-volume?window=24hVolume puntate e payout raggruppati per tipo di saldo (valuta), più i totali su tutte le valute.
/v1-beta/games/{slug}/stats/recent-bets?limit=NUltime puntate osservate con l'esito del round risolto — bet_amount, balance_type, target_multiplier, round_multiplier e flag won.
/v1-beta/games/{slug}/crazytime/segments?window=24hBreakdown segmenti wheel-show (Crazy Time / Monopoly Live / Lightning Storm / Dream Catcher): hit per segmento, % osservata vs teorica, spins_since, multiplier medio e ultimo hit.
Forma delle risposte (esempi reali)
Ogni esempio qui sotto è una risposta reale, non modificata, catturata dall'API live. I numeri che richiedono precisione (multiplier, payout) tornano come stringhe JSON.
[
{
"id": "stake-crash",
"name": "Crash",
"provider": "Stake",
"kind": "crash",
"enabled": true,
"rounds_total": 108457,
"last_observed_at": "2026-06-01T12:20:48.669425Z",
"last_finalized_index": 7393228772258146753,
"last_finalized_multiplier": "4.7100"
},
{
"id": "crazytime",
"name": "Crazy Time",
"provider": "Evolution",
"kind": "wheel-show",
"enabled": true,
"rounds_total": 53413,
"last_observed_at": "2026-06-01T12:19:00.573935Z",
"last_finalized_index": 46639897866258233,
"last_finalized_multiplier": "1.0000"
}
][
{
"round_index": 7393228772258146753,
"round_id": "cc0706c3f891d301fcec3855",
"multiplier": "4.7100",
"random_number": null,
"state": "finalized",
"time_spin_stop": "2026-06-01T12:20:27Z",
"finalized_at": "2026-06-01T12:20:27Z",
"observed_at": "2026-06-01T12:20:28.580645Z",
"raw": {
"result": { "rtp": 196.23, "maxMultiplier": 4.71, "roundDuration": 25825.0 },
"source": "casino.org",
"round_id": "cc0706c3f891d301fcec3855",
"settledAt": "2026-06-01T12:20:27Z",
"startedAt": "2026-06-01T12:20:01Z",
"totalAmount": 13609.24,
"bettorsCount": 320,
"totalWinners": 270,
"totalBetAmount": 6935.21
}
}
][
{
"round_index": 68099814944532018,
"round_id": "cdHphY2_tby8",
"multiplier": "4.0000",
"random_number": 2,
"state": "finalized",
"time_spin_stop": "2026-06-01T12:19:36Z",
"finalized_at": "2026-06-01T12:19:36Z",
"observed_at": "2026-06-01T12:20:23.015118Z",
"raw": {
"result": 2,
"source": "tracksino",
"segment": "n2",
"slot_result": 2,
"slot_multiplier": 2,
"total_payout": 19461,
"total_winners": 3381,
"is_top_slot_matched": true,
"bonus_data": null
}
}
]{
"round_index": 6823731385927563902,
"round_id": "18b4f444d3876dca4aeac5ff",
"multiplier": "1.0000",
"state": "finalized",
"finalized_at": "2026-06-01T12:19:52.013Z",
"observed_at": "2026-06-01T12:19:57.175784Z",
"raw": {
"outcome": "EvoLeaf",
"segment": "leaf",
"source": "casino.org",
"multiplier_text": "1x",
"multiplier_low": "1.00",
"multiplier_high": "1.00",
"wheel_result": { "wheelSector": { "type": "EvoLeaf" }, "maxMultiplier": 1 },
"totalWinners": 451,
"bettorsCount": 2275
}
}{
"game_id": "stake-crash",
"name": "Crash",
"provider": "Stake",
"kind": "crash",
"rounds_total": 108457,
"last_round": { "...": "full round object, same shape as /rounds" },
"last_finalized_index": 7393228772258146753,
"last_finalized_multiplier": "4.7100",
"last_finalized_at": "2026-06-01T12:20:42Z",
"last_observed_at": "2026-06-01T12:20:28.580645Z",
"counts": { "last_5m": 13, "last_15m": 39, "last_1h": 175, "last_24h": 3964 },
"multiplier_24h": {
"window": "24h",
"mean": "9.3272619828456105",
"median": "2.1597",
"p95": "22.52",
"max": "3986.5790"
},
"delays": [
{ "threshold": "2", "rounds_since": 1, "last_multiplier": "4.7100", "last_finalized_at": "2026-06-01T12:20:27Z" },
{ "threshold": "10", "rounds_since": 3, "last_multiplier": "33.2000", "last_finalized_at": "2026-06-01T12:19:36Z" },
{ "threshold": "50", "rounds_since": 116, "last_multiplier": "368.6026", "last_finalized_at": "2026-06-01T11:38:57Z" },
{ "threshold": "100", "rounds_since": 116, "last_multiplier": "368.6026", "last_finalized_at": "2026-06-01T11:38:57Z" }
],
"generated_at": "2026-06-01T12:20:57.684532Z"
}[
{
"threshold": "1.5",
"rounds_since": 1,
"last_round_index": 7393228772258146753,
"last_multiplier": "4.7100",
"last_finalized_at": "2026-06-01T12:20:27Z",
"lifetime_hits": 73847,
"lifetime_rounds": 108458
},
{
"threshold": "2",
"rounds_since": 1,
"last_multiplier": "4.7100",
"lifetime_hits": 55412,
"lifetime_rounds": 108458
}
]Stream WebSocket
I tier Pro ed Enterprise possono sottoscrivere un canale push: ogni round finalizzato viene emesso come frame JSON appena lo scraper lo scrive su storage. Stessa forma di /rounds. Sottoscrivi tutti i giochi o filtra per slug alla connessione.
const ws = new WebSocket(
'wss://api.trackersino.com/v1-beta/stream?games=stake-crash,roobet-crash',
['Authorization', 'Bearer YOUR_KEY']
);
ws.onmessage = (ev) => {
const round = JSON.parse(ev.data);
console.log(round.game_id, round.multiplier, round.finalized_at);
};Riconnetti alla chiusura. Mandiamo un heartbeat ping ogni 25s; se ne perdi due consecutivi, droppa e riconnetti — il tuo ultimo `finalized_at` osservato è il punto di ripresa per un backfill via /rounds.
Esempi di codice
# Last 5 minutes of Stake Crash — relative window, no timestamp math
curl -H "Authorization: Bearer YOUR_KEY" \
"https://api.trackersino.com/v1-beta/games/stake-crash/rounds?window=5m"
# Same call for a different game — just swap the {slug}
curl -H "Authorization: Bearer YOUR_KEY" \
"https://api.trackersino.com/v1-beta/games/crazytime/rounds?window=5m"
# Exact minute count instead of a preset window
curl -H "Authorization: Bearer YOUR_KEY" \
"https://api.trackersino.com/v1-beta/games/lightningstorm/rounds?since_minutes=30&limit=500"
# The single most recent settled round
curl -H "Authorization: Bearer YOUR_KEY" \
"https://api.trackersino.com/v1-beta/games/duel-crash/rounds/latest"
# Everything at a glance (last round + counts + 24h shape + delays)
curl -H "Authorization: Bearer YOUR_KEY" \
"https://api.trackersino.com/v1-beta/games/stake-crash/summary"const KEY = 'Bearer YOUR_KEY';
const BASE = 'https://api.trackersino.com/v1-beta';
// The 'games' you care about — any slug from the Games & slugs table.
const games = ['stake-crash', 'crazytime', 'lightningstorm'];
// Fetch the last 5 minutes of history for each, in parallel.
const histories = await Promise.all(
games.map(async (slug) => {
const res = await fetch(
`${BASE}/games/${slug}/rounds?window=5m&limit=1000`,
{ headers: { Authorization: KEY } },
);
return { slug, rounds: await res.json() };
}),
);
for (const { slug, rounds } of histories) {
console.log(slug, '→', rounds.length, 'rounds');
console.log(' newest:', rounds[0]?.multiplier, 'at', rounds[0]?.finalized_at);
}import requests
BASE = "https://api.trackersino.com/v1-beta"
HEADERS = {"Authorization": "Bearer YOUR_KEY"}
def fetch_window(slug: str, minutes: int = 5):
"""Last N minutes of rounds for a game."""
r = requests.get(
f"{BASE}/games/{slug}/rounds",
params={"since_minutes": minutes, "limit": 1000},
headers=HEADERS, timeout=10,
)
r.raise_for_status()
return r.json()
def backfill(slug: str, pages: int = 5, page_size: int = 1000):
"""Walk older history with before_index (keyset pagination)."""
out, cursor = [], None
for _ in range(pages):
params = {"limit": page_size, "only_finalized": "true"}
if cursor is not None:
params["before_index"] = cursor
rows = requests.get(f"{BASE}/games/{slug}/rounds",
params=params, headers=HEADERS, timeout=10).json()
if not rows:
break
out += rows
cursor = rows[-1]["round_index"] # resume point for the next page
return out
for slug in ("stake-crash", "crazytime", "lightningstorm"):
last5 = fetch_window(slug, 5)
print(slug, "→", len(last5), "rounds in last 5m,",
"newest:", last5[0]["multiplier"] if last5 else None)Rate limit
Budget richieste per chiave. Starter è solo REST a 5 req/s, burst 10. Pro è 50 req/s + frame WebSocket illimitati. Enterprise è custom (default 200 req/s + WS dedicato).
Su 429 mandiamo Retry-After (in secondi). Ritarda e riprova. Non auto-throttliamo in silenzio — sai sempre quando hai raggiunto il limite.
Risposte di errore
{
"error": "rate_limited",
"message": "Exceeded 50 req/s on tier=pro",
"retry_after_s": 3
}Sempre JSON, sempre porta `error` (codice machine-readable) e `message` (umano). Semantica HTTP standard — 400 errore client, 401/403 auth, 404 gioco/round non trovato, 429 rate limit, 5xx problema upstream (raro, gestiamo failover internamente).
Changelog e versioning
Versionato via URL (/v1-beta è la superficie pubblica attuale). Le breaking change passano a /v1 una volta stabili, con almeno 90 giorni di overlap prima del ritiro di /v1-beta. Aggiunte non-breaking (campi nuovi, endpoint nuovi) escono in /v1-beta senza bump.
Iscriviti al canale Telegram @TrackerSinoStatus per essere avvisato di cambiamenti e incidenti.
Hai bisogno di aiuto nell'integrazione?
Scrivici su Telegram con il linguaggio che usi — ti mandiamo un sample minimale funzionante per il tuo stack.
Apri Telegram →