{"components":{"responses":{"ServerError":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`internal`."},"TooManyRequests":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`rate.limited`: the bucket is empty or the day's quota is used up.","headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds until a request would pass.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"Unauthorized":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`api_key.invalid`, `api_key.revoked` or `api_key.required`."}},"schemas":{"ActivityResponse":{"description":"When players play: sampled bets by UTC weekday (0 = Monday) and hour,\nsummed over the window. Observed activity on the public feeds, a floor.","properties":{"bets":{"description":"`[weekday][hour]` bet counts, 7 × 24.","items":{"items":{"format":"int64","minimum":0,"type":"integer"},"type":"array"},"type":"array"},"casino":{"description":"The one casino the grid was kept to, when asked.","type":["string","null"]},"days":{"description":"Whole UTC days the grid covers, at least 1 while `from` is set; 0\nwhen `from` is null.","format":"int32","minimum":0,"type":"integer"},"from":{"description":"Where the count starts (ISO 8601): the window's start, or the\ntracking start when that is later. Null only without either.","type":["string","null"]},"scope":{"$ref":"#/components/schemas/ActivityScope"},"slug":{"description":"The game, casino, provider or kind the grid is for, as resolved.","type":"string"},"wagered_usd":{"description":"`[weekday][hour]` wagered USD, 7 × 24.","items":{"items":{"format":"double","type":"number"},"type":"array"},"type":"array"},"window":{"$ref":"#/components/schemas/Window"}},"required":["scope","slug","window","days","bets","wagered_usd"],"type":"object"},"ActivityScope":{"description":"What `/v1/activity` counts the bets of.","enum":["game","casino","provider","originals"],"type":"string"},"Affiliate":{"properties":{"code":{"description":"The referral code to enter at sign-up where the casino works with\ncodes (the link carries it too); `null` for a plain tracked link.","type":["string","null"]},"label":{"type":"string"},"url":{"description":"`/go/<casino>` or `/go/<casino>?game=<id>` when this row is a game CTA.","type":"string"}},"required":["url","label"],"type":"object"},"ApiKeyConfirm":{"additionalProperties":false,"description":"`POST /v1/keys/confirm` body: the token from the link's `#token=`.","properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"ApiKeyCreated":{"description":"`POST /v1/keys/confirm` answer (201). The only time the key is shown;\nonly its SHA-256 is stored.","properties":{"info":{"$ref":"#/components/schemas/ApiKeyInfo"},"key":{"description":"`gt_live_<32 characters>`","type":"string"}},"required":["key","info"],"type":"object"},"ApiKeyInfo":{"description":"A key as its holder sees it.","properties":{"created_at":{"type":"string"},"last_used_at":{"type":["string","null"]},"limits":{"$ref":"#/components/schemas/ApiLimits"},"name":{"type":"string"},"prefix":{"description":"`gt_live_` and the key's first 8 characters, for telling keys apart.","type":"string"},"tier":{"$ref":"#/components/schemas/ApiTier"}},"required":["prefix","name","tier","limits","created_at"],"type":"object"},"ApiKeyRequest":{"additionalProperties":false,"description":"`POST /v1/keys/request` body.","properties":{"email":{"description":"Where the confirmation link goes.","type":"string"},"name":{"description":"The app or project the key is for (1–80 characters).","type":"string"},"use_case":{"description":"What the key will be used for (3–1000 characters).","type":"string"}},"required":["email","name","use_case"],"type":"object"},"ApiKeyRequested":{"description":"`POST /v1/keys/request` answer (202): the confirmation link is on its way.","properties":{"email":{"type":"string"},"expires_at":{"description":"When the link stops working.","type":"string"},"ok":{"type":"boolean"}},"required":["ok","email","expires_at"],"type":"object"},"ApiKeyUsage":{"description":"`GET /v1/keys/me`: the calling key and its last 30 UTC days, oldest\nfirst, today last (days without requests included).","properties":{"days":{"items":{"$ref":"#/components/schemas/ApiUsageDay"},"type":"array"},"key":{"$ref":"#/components/schemas/ApiKeyInfo"}},"required":["key","days"],"type":"object"},"ApiLimits":{"description":"A token bucket of `burst` requests refilled at `per_minute`, plus\n`daily` requests per UTC day.","properties":{"burst":{"format":"int32","minimum":0,"type":"integer"},"daily":{"format":"int64","minimum":0,"type":"integer"},"per_minute":{"format":"int32","minimum":0,"type":"integer"}},"required":["per_minute","burst","daily"],"type":"object"},"ApiTier":{"description":"`anonymous` is a visitor without a key, limited per IP.","enum":["anonymous","free","paid"],"type":"string"},"ApiUsageDay":{"description":"Requests counted on one UTC day; `limited` were answered 429.","properties":{"day":{"description":"`YYYY-MM-DD`","type":"string"},"limited":{"format":"int64","minimum":0,"type":"integer"},"requests":{"format":"int64","minimum":0,"type":"integer"}},"required":["day","requests","limited"],"type":"object"},"Battle":{"properties":{"cases":{"items":{"$ref":"#/components/schemas/BattleCase"},"type":"array"},"casino":{"$ref":"#/components/schemas/CasinoRef"},"cost_usd":{"oneOf":[{"$ref":"#/components/schemas/Usd","description":"Entry per player."},{"type":"null"}]},"finished_at":{"type":["string","null"]},"id":{"description":"`<casino>:<ext_id>`","type":"string"},"mode":{"type":"string"},"players":{"format":"int32","minimum":0,"type":"integer"},"rounds":{"description":"Openings per player.","format":"int32","minimum":0,"type":"integer"},"rtp":{"description":"total value / total cost","format":"double","type":["number","null"]},"seats":{"items":{"$ref":"#/components/schemas/BattleSeat"},"type":"array"},"status":{"type":"string"},"teams":{"format":"int32","minimum":0,"type":"integer"},"total_cost_usd":{"oneOf":[{"$ref":"#/components/schemas/Usd","description":"Entry × players."},{"type":"null"}]},"total_value_usd":{"oneOf":[{"$ref":"#/components/schemas/Usd"},{"type":"null"}]},"ts":{"type":"string"},"variant":{"type":["string","null"]},"winners":{"items":{"format":"int32","minimum":0,"type":"integer"},"type":"array"}},"required":["id","casino","ts","status","mode","players","teams","cases","rounds","seats","winners"],"type":"object"},"BattleCase":{"properties":{"case":{"$ref":"#/components/schemas/CaseRef"},"count":{"description":"Openings per player.","format":"int32","minimum":0,"type":"integer"}},"required":["case","count"],"type":"object"},"BattleSeat":{"properties":{"bot":{"type":"boolean"},"player":{"$ref":"#/components/schemas/PlayerRef"},"team":{"format":"int32","minimum":0,"type":"integer"},"value_usd":{"oneOf":[{"$ref":"#/components/schemas/Usd"},{"type":"null"}]}},"required":["player","team","bot"],"type":"object"},"BattleStat":{"properties":{"battles":{"format":"int64","minimum":0,"type":"integer"},"bots":{"description":"Seats the site filled with bots.","format":"int64","minimum":0,"type":"integer"},"casino":{"$ref":"#/components/schemas/CasinoRef"},"cost_usd":{"$ref":"#/components/schemas/Usd"},"max_value_usd":{"oneOf":[{"$ref":"#/components/schemas/Usd"},{"type":"null"}]},"mode":{"type":"string"},"rtp":{"format":"double","type":["number","null"]},"seats":{"format":"int64","minimum":0,"type":"integer"},"value_usd":{"$ref":"#/components/schemas/Usd"},"variant":{"type":["string","null"]}},"required":["casino","mode","battles","seats","bots","cost_usd","value_usd"],"type":"object"},"BattleStatsResponse":{"properties":{"biggest":{"items":{"$ref":"#/components/schemas/Battle"},"type":"array"},"stats":{"items":{"$ref":"#/components/schemas/BattleStat"},"type":"array"},"totals":{"$ref":"#/components/schemas/BattleTotals"},"window":{"$ref":"#/components/schemas/Window"}},"required":["window","totals","stats","biggest"],"type":"object"},"BattleTotals":{"properties":{"battles":{"format":"int64","minimum":0,"type":"integer"},"cost_usd":{"format":"double","type":"number"},"rtp":{"format":"double","type":["number","null"]},"value_usd":{"format":"double","type":"number"}},"required":["battles","cost_usd","value_usd"],"type":"object"},"BattlesResponse":{"properties":{"battles":{"items":{"$ref":"#/components/schemas/Battle"},"type":"array"},"next":{"type":["string","null"]}},"required":["battles"],"type":"object"},"Bet":{"properties":{"amount":{"format":"double","type":"number"},"amount_usd":{"$ref":"#/components/schemas/Usd"},"casino":{"$ref":"#/components/schemas/CasinoRef"},"currency":{"type":"string"},"edge":{"format":"double","type":["number","null"]},"expected_loss_usd":{"oneOf":[{"$ref":"#/components/schemas/Usd"},{"type":"null"}]},"feeds":{"items":{"type":"string"},"type":"array"},"game":{"$ref":"#/components/schemas/GameRef"},"id":{"description":"`<casino>:<ext_id>`","type":"string"},"multiplier":{"format":"double","type":"number"},"payout_usd":{"$ref":"#/components/schemas/Usd"},"player":{"$ref":"#/components/schemas/PlayerRef"},"ts":{"type":"string"}},"required":["id","casino","ts","player","game","feeds","currency","amount","amount_usd","payout_usd","multiplier"],"type":"object"},"BetsResponse":{"properties":{"bets":{"items":{"$ref":"#/components/schemas/Bet"},"type":"array"},"next":{"description":"The next page's `cursor`, `null` on the last page.","type":["string","null"]}},"required":["bets"],"type":"object"},"BlogCategory":{"properties":{"description":{"type":"string"},"label":{"type":"string"},"posts":{"description":"Published posts in it.","format":"int32","minimum":0,"type":"integer"},"slug":{"type":"string"}},"required":["slug","label","description","posts"],"type":"object"},"BlogFeedResponse":{"description":"The newest published posts with their bodies, for the RSS feed.","properties":{"posts":{"items":{"$ref":"#/components/schemas/BlogPost"},"type":"array"}},"required":["posts"],"type":"object"},"BlogListResponse":{"properties":{"categories":{"description":"Every category with its count, empty ones included.","items":{"$ref":"#/components/schemas/BlogCategory"},"type":"array"},"category":{"type":["string","null"]},"page":{"description":"From 1. A page past the last answers an empty `posts`.","format":"int32","minimum":0,"type":"integer"},"pages":{"format":"int32","minimum":0,"type":"integer"},"per_page":{"format":"int32","minimum":0,"type":"integer"},"posts":{"items":{"$ref":"#/components/schemas/BlogPostCard"},"type":"array"},"tag":{"type":["string","null"]},"total":{"description":"Published posts matching the filter.","format":"int32","minimum":0,"type":"integer"}},"required":["posts","total","page","pages","per_page","categories"],"type":"object"},"BlogPost":{"properties":{"body_html":{"description":"Sanitised HTML: no raw HTML from the markdown, no images, links\nlimited to site paths, anchors and `http(s)`; external links open in\na new tab with `rel=\"noopener\"`.","type":"string"},"category":{"type":"string"},"category_label":{"type":"string"},"data_as_of":{"description":"When the first-party figures in the article were read.","type":["string","null"]},"description":{"type":"string"},"format":{"type":"string"},"model":{"description":"The model that wrote it; null for a post written by hand.","type":["string","null"]},"published_at":{"type":"string"},"reading_minutes":{"format":"int32","minimum":0,"type":"integer"},"slug":{"type":"string"},"sources":{"items":{"$ref":"#/components/schemas/BlogSource"},"type":"array"},"tags":{"items":{"type":"string"},"type":"array"},"title":{"type":"string"},"toc":{"items":{"$ref":"#/components/schemas/BlogTocEntry"},"type":"array"},"updated_at":{"type":"string"},"word_count":{"format":"int32","minimum":0,"type":"integer"}},"required":["slug","title","description","category","category_label","tags","format","published_at","updated_at","reading_minutes","word_count","body_html","toc","sources"],"type":"object"},"BlogPostCard":{"description":"A post in a list: everything but the body.","properties":{"category":{"type":"string"},"category_label":{"type":"string"},"description":{"type":"string"},"format":{"type":"string"},"published_at":{"description":"RFC 3339 UTC.","type":"string"},"reading_minutes":{"format":"int32","minimum":0,"type":"integer"},"slug":{"type":"string"},"tags":{"items":{"type":"string"},"type":"array"},"title":{"type":"string"},"updated_at":{"type":"string"},"word_count":{"format":"int32","minimum":0,"type":"integer"}},"required":["slug","title","description","category","category_label","tags","format","published_at","updated_at","reading_minutes","word_count"],"type":"object"},"BlogPostResponse":{"properties":{"newer":{"oneOf":[{"$ref":"#/components/schemas/BlogPostCard"},{"type":"null"}]},"older":{"oneOf":[{"$ref":"#/components/schemas/BlogPostCard"},{"type":"null"}]},"post":{"$ref":"#/components/schemas/BlogPost"},"related":{"description":"Up to 3 others: the same category first, then shared tags, newest first.","items":{"$ref":"#/components/schemas/BlogPostCard"},"type":"array"}},"required":["post","related"],"type":"object"},"BlogSitemapEntry":{"properties":{"category":{"type":"string"},"published_at":{"type":"string"},"slug":{"type":"string"},"tags":{"items":{"type":"string"},"type":"array"},"updated_at":{"type":"string"}},"required":["slug","category","tags","published_at","updated_at"],"type":"object"},"BlogSitemapResponse":{"properties":{"posts":{"items":{"$ref":"#/components/schemas/BlogSitemapEntry"},"type":"array"}},"required":["posts"],"type":"object"},"BlogSource":{"additionalProperties":false,"properties":{"kind":{"$ref":"#/components/schemas/BlogSourceKind"},"publisher":{"type":["string","null"]},"title":{"type":"string"},"url":{"description":"Absolute `https://` for web sources, a site path (`/big-wins`) for data.","type":"string"}},"required":["title","url","kind"],"type":"object"},"BlogSourceKind":{"enum":["web","data"],"type":"string"},"BlogTocEntry":{"description":"A heading of the body; `id` is its anchor in `body_html`.","properties":{"id":{"type":"string"},"level":{"description":"2 or 3.","format":"int32","minimum":0,"type":"integer"},"text":{"type":"string"}},"required":["id","text","level"],"type":"object"},"CaseCapture":{"properties":{"advertised_rtp":{"format":"double","type":["number","null"]},"captured_at":{"type":"string"},"items":{"format":"int32","minimum":0,"type":"integer"},"price_usd":{"oneOf":[{"$ref":"#/components/schemas/Usd"},{"type":"null"}]}},"required":["captured_at","items"],"type":"object"},"CaseCompareResponse":{"properties":{"series":{"additionalProperties":{"$ref":"#/components/schemas/CaseCompareSeries"},"description":"By site slug.","propertyNames":{"type":"string"},"type":"object"},"sites":{"items":{"$ref":"#/components/schemas/CaseSiteRow"},"type":"array"},"top_cases":{"additionalProperties":{"items":{"$ref":"#/components/schemas/CaseStat"},"type":"array"},"description":"Most opened cases in 24 h, by site slug.","propertyNames":{"type":"string"},"type":"object"}},"required":["sites","series","top_cases"],"type":"object"},"CaseCompareSeries":{"properties":{"openings_24h":{"$ref":"#/components/schemas/Series"}},"required":["openings_24h"],"type":"object"},"CaseDetail":{"properties":{"active":{"description":"Listed in the site's latest catalog.","type":"boolean"},"advertised_rtp":{"format":"double","type":["number","null"]},"captured_at":{"description":"The latest catalog capture.","type":["string","null"]},"case":{"$ref":"#/components/schemas/CaseRef"},"casino":{"$ref":"#/components/schemas/CasinoRef"},"category":{"type":["string","null"]},"currency":{"type":"string"},"ev":{"description":"Σ published chance × the site's item value, in `currency` and USD.","format":"double","type":["number","null"]},"ev_usd":{"oneOf":[{"$ref":"#/components/schemas/Usd"},{"type":"null"}]},"first_seen":{"type":"string"},"items":{"format":"int32","minimum":0,"type":"integer"},"odds_off":{"description":"The odds sum more than 0.5% away from 1.","type":"boolean"},"odds_source":{"type":["string","null"]},"odds_sum":{"description":"The published odds' sum before rescaling to 1.","format":"double","type":["number","null"]},"price":{"description":"In `currency`.","format":"double","type":["number","null"]},"price_usd":{"oneOf":[{"$ref":"#/components/schemas/Usd"},{"type":"null"}]}},"required":["case","casino","currency","odds_off","items","first_seen","active"],"type":"object"},"CaseDrop":{"description":"One case opening.","properties":{"battle_id":{"type":["string","null"]},"case":{"$ref":"#/components/schemas/CaseRef"},"casino":{"$ref":"#/components/schemas/CasinoRef"},"currency":{"description":"The site's currency (`USD` or its coin) and the raw amounts in it.","type":"string"},"feeds":{"items":{"type":"string"},"type":"array"},"id":{"description":"`<casino>:<ext_id>`","type":"string"},"item":{"$ref":"#/components/schemas/ItemRef"},"multiplier":{"description":"value / price","format":"double","type":"number"},"origin":{"description":"`case`, `battle` or `free`.","type":"string"},"player":{"$ref":"#/components/schemas/PlayerRef"},"price":{"format":"double","type":"number"},"price_usd":{"$ref":"#/components/schemas/Usd"},"ts":{"type":"string"},"value":{"format":"double","type":"number"},"value_usd":{"$ref":"#/components/schemas/Usd"}},"required":["id","casino","ts","player","case","item","origin","feeds","currency","price","value","price_usd","value_usd","multiplier"],"type":"object"},"CaseLeaderboardResponse":{"properties":{"biggest_battles":{"items":{"$ref":"#/components/schemas/Battle"},"type":"array"},"biggest_drops":{"items":{"$ref":"#/components/schemas/CaseDrop"},"type":"array"},"highest_multipliers":{"items":{"$ref":"#/components/schemas/CaseDrop"},"type":"array"},"luckiest_players":{"items":{"$ref":"#/components/schemas/PlayerStat"},"type":"array"},"month":{"type":"string"},"most_opened_cases":{"items":{"$ref":"#/components/schemas/CaseStat"},"type":"array"},"since":{"description":"Where the counts start when the first case site was tracked during the month.","type":["string","null"]},"top_openers":{"items":{"$ref":"#/components/schemas/SiteOpeners"},"type":"array"}},"required":["month","biggest_drops","highest_multipliers","luckiest_players","top_openers","most_opened_cases","biggest_battles"],"type":"object"},"CaseOdds":{"description":"One item of a case: its published chance and value, and how often it dropped.","properties":{"ev_share":{"description":"Share of the EV this item carries.","format":"double","type":"number"},"expected":{"description":"odds × openings in that feed and window.","format":"double","type":"number"},"item":{"$ref":"#/components/schemas/ItemRef"},"observed":{"description":"Drops of this item from this case in the all-drops feed over the window.","format":"int64","minimum":0,"type":"integer"},"odds":{"format":"double","type":"number"},"value":{"description":"In the case's currency.","format":"double","type":"number"},"value_usd":{"oneOf":[{"$ref":"#/components/schemas/Usd"},{"type":"null"}]}},"required":["item","odds","value","ev_share","observed","expected"],"type":"object"},"CaseRef":{"properties":{"casino":{"description":"The site's slug.","type":"string"},"id":{"format":"int64","type":"integer"},"image":{"type":["string","null"]},"name":{"type":"string"},"price_usd":{"oneOf":[{"$ref":"#/components/schemas/Usd","description":"One opening, at the latest known price."},{"type":"null"}]},"slug":{"description":"Unique within the site; the case page is `/cases/<casino>/<slug>`.","type":"string"}},"required":["id","casino","slug","name"],"type":"object"},"CaseResponse":{"properties":{"biggest_drops":{"items":{"$ref":"#/components/schemas/CaseDrop"},"type":"array"},"captures":{"description":"Latest first.","items":{"$ref":"#/components/schemas/CaseCapture"},"type":"array"},"case":{"$ref":"#/components/schemas/CaseDetail"},"latest_drops":{"items":{"$ref":"#/components/schemas/CaseDrop"},"type":"array"},"odds":{"items":{"$ref":"#/components/schemas/CaseOdds"},"type":"array"},"odds_openings":{"description":"Openings in the all-drops feed over `odds_window`.","format":"int64","minimum":0,"type":"integer"},"odds_window":{"$ref":"#/components/schemas/Window"},"rtp":{"description":"`24h`, `7d`, `30d` and `all`.","items":{"$ref":"#/components/schemas/CaseRtp"},"type":"array"},"series":{"$ref":"#/components/schemas/Series","description":"Daily observed RTP of the all-drops feed, 30 days."}},"required":["case","rtp","odds_window","odds_openings","odds","biggest_drops","latest_drops","series","captures"],"type":"object"},"CaseRtp":{"description":"A case's observed return over a window against what its published odds\nadvertised for the same openings.","properties":{"advertised_rtp":{"description":"What the published odds and item values advertised for these openings (EV / price).","format":"double","type":["number","null"]},"ci_high":{"format":"double","type":["number","null"]},"ci_low":{"format":"double","type":["number","null"]},"enough_sample":{"type":"boolean"},"expected_tail_hits":{"description":"Expected hits of the rare items that carry half the EV.","format":"double","type":["number","null"]},"flagged":{"description":"The advertised RTP lies outside the 95% band of an adequate sample.","type":"boolean"},"method":{"description":"`odds`: tested against the published distribution; `sample`: the sample's own variance (no odds); `none`: no openings.","type":"string"},"n":{"description":"Openings in the all-drops feed that the figures use.","format":"int64","minimum":0,"type":"integer"},"paid_usd":{"$ref":"#/components/schemas/Usd"},"rtp":{"format":"double","type":["number","null"]},"wagered_usd":{"$ref":"#/components/schemas/Usd"},"window":{"$ref":"#/components/schemas/Window"},"z":{"format":"double","type":["number","null"]}},"required":["window","n","wagered_usd","paid_usd","enough_sample","flagged","method"],"type":"object"},"CaseSiteDetail":{"allOf":[{"$ref":"#/components/schemas/CaseSiteRow"},{"properties":{"about":{"type":["string","null"]},"homepage":{"type":"string"}},"required":["homepage"],"type":"object"}]},"CaseSiteDetailResponse":{"properties":{"battles":{"description":"By mode and variant, 7 days.","items":{"$ref":"#/components/schemas/BattleStat"},"type":"array"},"biggest_battles":{"items":{"$ref":"#/components/schemas/Battle"},"type":"array"},"lucky_drops":{"description":"Highest multipliers on a price of at least $0.10, 30 days.","items":{"$ref":"#/components/schemas/CaseDrop"},"type":"array"},"originals_rtp":{"description":"The site's originals cells over 7 days.","items":{"$ref":"#/components/schemas/OriginalsCell"},"type":"array"},"races":{"items":{"$ref":"#/components/schemas/Race"},"type":"array"},"series":{"$ref":"#/components/schemas/CaseSiteSeries"},"site":{"$ref":"#/components/schemas/CaseSiteDetail"},"top_cases":{"description":"Most opened cases, 7 days.","items":{"$ref":"#/components/schemas/CaseStat"},"type":"array"},"top_drops":{"description":"Biggest drops by value, 30 days.","items":{"$ref":"#/components/schemas/CaseDrop"},"type":"array"},"top_openers":{"description":"Public openers by money spent on cases, 30 days.","items":{"$ref":"#/components/schemas/PlayerStat"},"type":"array"},"upgrades":{"description":"By mode, 7 days.","items":{"$ref":"#/components/schemas/UpgradeStat"},"type":"array"}},"required":["site","series","top_drops","lucky_drops","top_cases","battles","biggest_battles","upgrades","races","originals_rtp","top_openers"],"type":"object"},"CaseSiteRow":{"properties":{"affiliate":{"oneOf":[{"$ref":"#/components/schemas/Affiliate"},{"type":"null"}]},"battles_24h":{"oneOf":[{"$ref":"#/components/schemas/Metric"},{"type":"null"}]},"cases":{"description":"Cases in the site's catalog (with published odds where it has them).","format":"int32","minimum":0,"type":"integer"},"cases_with_odds":{"format":"int32","minimum":0,"type":"integer"},"casino":{"$ref":"#/components/schemas/CasinoRef"},"coverage":{"$ref":"#/components/schemas/Coverage"},"currency":{"oneOf":[{"$ref":"#/components/schemas/SiteCurrency","description":"`null` when the site prices in USD."},{"type":"null"}]},"has_affiliate":{"description":"Whether the site has an active affiliate link at all, the same for every visitor.","type":"boolean"},"online":{"oneOf":[{"$ref":"#/components/schemas/Metric"},{"type":"null"}]},"openings_24h":{"oneOf":[{"$ref":"#/components/schemas/Metric","description":"Openings seen through any feed in 24 h (observed; most sites publish a part of them)."},{"type":"null"}]},"paid_24h":{"oneOf":[{"$ref":"#/components/schemas/Metric","description":"What they paid out at the site's item values."},{"type":"null"}]},"rtp_24h":{"description":"Observed RTP of the all-drops feed over 24 h, when it has one.","format":"double","type":["number","null"]},"upgrades_24h":{"oneOf":[{"$ref":"#/components/schemas/Metric"},{"type":"null"}]},"wagered_24h":{"oneOf":[{"$ref":"#/components/schemas/Metric","description":"What those openings cost."},{"type":"null"}]}},"required":["casino","cases","cases_with_odds","coverage","has_affiliate"],"type":"object"},"CaseSiteSeries":{"properties":{"online_7d":{"$ref":"#/components/schemas/Series"},"openings_24h":{"$ref":"#/components/schemas/Series","description":"Openings seen per 15 minutes over 24 h."}},"required":["openings_24h","online_7d"],"type":"object"},"CaseSitesResponse":{"properties":{"sites":{"items":{"$ref":"#/components/schemas/CaseSiteRow"},"type":"array"},"totals":{"$ref":"#/components/schemas/CaseSitesTotals"}},"required":["totals","sites"],"type":"object"},"CaseSitesTotals":{"properties":{"battles_24h":{"$ref":"#/components/schemas/Metric"},"online_now":{"$ref":"#/components/schemas/Metric"},"openings_24h":{"$ref":"#/components/schemas/Metric"},"wagered_24h":{"$ref":"#/components/schemas/Metric"}},"required":["openings_24h","wagered_24h","online_now","battles_24h"],"type":"object"},"CaseStat":{"properties":{"case":{"$ref":"#/components/schemas/CaseRef"},"casino":{"$ref":"#/components/schemas/CasinoRef"},"catalog_rtp":{"description":"The latest catalog capture's EV / price.","format":"double","type":["number","null"]},"max_multiplier":{"format":"double","type":["number","null"]},"max_value_usd":{"oneOf":[{"$ref":"#/components/schemas/Usd"},{"type":"null"}]},"opened":{"description":"Openings seen through any feed.","format":"int64","minimum":0,"type":"integer"},"paid_usd":{"$ref":"#/components/schemas/Usd"},"rtp":{"$ref":"#/components/schemas/CaseRtp"},"wagered_usd":{"$ref":"#/components/schemas/Usd"}},"required":["case","casino","opened","wagered_usd","paid_usd","rtp"],"type":"object"},"CasesResponse":{"properties":{"cases":{"items":{"$ref":"#/components/schemas/CaseStat"},"type":"array"},"next":{"type":["string","null"]}},"required":["cases"],"type":"object"},"CasinoCategory":{"description":"`case_site`: a CS2 skin and case-opening site, `casino` for everything else.\nA case site with `CasinoRef.hybrid` is in both.","enum":["casino","case_site"],"type":"string"},"CasinoDetail":{"allOf":[{"$ref":"#/components/schemas/CasinoRow"},{"properties":{"about":{"type":["string","null"]},"homepage":{"type":"string"}},"required":["homepage"],"type":"object"}]},"CasinoDetailResponse":{"properties":{"big_wins":{"items":{"$ref":"#/components/schemas/Bet"},"type":"array"},"casino":{"$ref":"#/components/schemas/CasinoDetail"},"flows_by_chain":{"items":{"$ref":"#/components/schemas/FlowByChain"},"type":"array"},"high_rollers":{"items":{"$ref":"#/components/schemas/Bet"},"type":"array"},"originals_rtp":{"description":"This casino's originals cells over 7 days.","items":{"$ref":"#/components/schemas/OriginalsCell"},"type":"array"},"races":{"items":{"$ref":"#/components/schemas/Race"},"type":"array"},"series":{"$ref":"#/components/schemas/CasinoSeries"},"top_games":{"items":{"$ref":"#/components/schemas/GameStat"},"type":"array"},"top_providers":{"items":{"$ref":"#/components/schemas/ProviderStat"},"type":"array"},"top_wagerers":{"items":{"$ref":"#/components/schemas/PlayerStat"},"type":"array"}},"required":["casino","series","top_games","top_providers","big_wins","high_rollers","races","top_wagerers","originals_rtp","flows_by_chain"],"type":"object"},"CasinoFlow":{"properties":{"avg_deposit_usd":{"format":"double","type":"number"},"casino":{"$ref":"#/components/schemas/CasinoRef"},"deposits":{"format":"int64","minimum":0,"type":"integer"},"deposits_usd":{"format":"double","type":"number"},"net_usd":{"format":"double","type":"number"},"withdrawals_usd":{"format":"double","type":"number"}},"required":["casino","deposits_usd","withdrawals_usd","net_usd","deposits","avg_deposit_usd"],"type":"object"},"CasinoInsightsResponse":{"properties":{"basis":{"$ref":"#/components/schemas/InsightsBasis"},"casino":{"$ref":"#/components/schemas/CasinoRef"},"casino_rank":{"description":"A hybrid's rank and share among the tracked casinos, which list it too\n(its casino page shows these); null for every other site.","format":"int32","minimum":0,"type":["integer","null"]},"casino_share":{"format":"double","type":["number","null"]},"chains":{"items":{"$ref":"#/components/schemas/ChainMix"},"type":"array"},"concentration":{"$ref":"#/components/schemas/Concentration"},"heatmap":{"$ref":"#/components/schemas/Heatmap"},"overlap":{"items":{"$ref":"#/components/schemas/OverlapRow"},"type":"array"},"rank":{"description":"Rank and share (0 to 1) by deposited USD among the tracked sites of its category.","format":"int32","minimum":0,"type":["integer","null"]},"reserves":{"$ref":"#/components/schemas/ReservesFlows"},"retention":{"description":"Weekly cohorts over the last eight weeks (or since tracking began).","items":{"$ref":"#/components/schemas/Cohort"},"type":"array"},"series":{"$ref":"#/components/schemas/InsightsSeries"},"share":{"format":"double","type":["number","null"]},"sizes":{"items":{"$ref":"#/components/schemas/SizeBucket"},"type":"array"},"summary":{"$ref":"#/components/schemas/InsightsSummary"},"top_depositors":{"description":"The largest depositing addresses, truncated.","items":{"$ref":"#/components/schemas/TopAddress"},"type":"array"},"window":{"$ref":"#/components/schemas/InsightsWindow"}},"required":["casino","window","basis","summary","series","sizes","heatmap","chains","concentration","top_depositors","overlap","retention","reserves"],"type":"object"},"CasinoPoints":{"properties":{"casino":{"description":"Casino slug.","type":"string"},"points":{"$ref":"#/components/schemas/Series"}},"required":["casino","points"],"type":"object"},"CasinoRef":{"properties":{"category":{"$ref":"#/components/schemas/CasinoCategory","description":"Stored references from before categories read as `casino`."},"hybrid":{"description":"A case site (`category` stays `case_site`) that also runs a casino\nsection we read: it is a casino too, on `category=casino` and with a\ncasino page. Always false for a `casino`.","type":"boolean"},"logo":{"description":"`/casinos/<slug>.svg`","type":"string"},"name":{"type":"string"},"slug":{"type":"string"}},"required":["slug","name","logo"],"type":"object"},"CasinoReserves":{"properties":{"by_chain":{"items":{"$ref":"#/components/schemas/ChainBalance"},"type":"array"},"casino":{"$ref":"#/components/schemas/CasinoRef"},"reserves_usd":{"format":"double","type":"number"},"series":{"$ref":"#/components/schemas/Series"}},"required":["casino","reserves_usd","series","by_chain"],"type":"object"},"CasinoRow":{"properties":{"affiliate":{"oneOf":[{"$ref":"#/components/schemas/Affiliate","description":"The visitor's link: `null` where the casino is restricted in their\ncountry, or has no active link."},{"type":"null"}]},"bets_24h":{"oneOf":[{"$ref":"#/components/schemas/Metric"},{"type":"null"}]},"casino":{"$ref":"#/components/schemas/CasinoRef"},"coverage":{"$ref":"#/components/schemas/Coverage"},"deposits_30d":{"oneOf":[{"$ref":"#/components/schemas/Metric"},{"type":"null"}]},"has_affiliate":{"description":"Whether the casino has an active affiliate link at all, the same for\nevery visitor; lists put these casinos first.","type":"boolean"},"net_flow_30d":{"oneOf":[{"$ref":"#/components/schemas/Metric"},{"type":"null"}]},"online":{"oneOf":[{"$ref":"#/components/schemas/Metric"},{"type":"null"}]},"reserves_usd":{"oneOf":[{"$ref":"#/components/schemas/Metric"},{"type":"null"}]},"wager_24h":{"oneOf":[{"$ref":"#/components/schemas/Metric"},{"type":"null"}]},"withdrawals_30d":{"oneOf":[{"$ref":"#/components/schemas/Metric"},{"type":"null"}]}},"required":["casino","coverage","has_affiliate"],"type":"object"},"CasinoSeries":{"properties":{"deposits_30d":{"$ref":"#/components/schemas/Series"},"online_7d":{"$ref":"#/components/schemas/Series"},"reserves_30d":{"$ref":"#/components/schemas/Series"},"wager_24h":{"$ref":"#/components/schemas/Series"},"withdrawals_30d":{"$ref":"#/components/schemas/Series"}},"required":["wager_24h","online_7d","deposits_30d","withdrawals_30d","reserves_30d"],"type":"object"},"CasinoWagerers":{"properties":{"casino":{"$ref":"#/components/schemas/CasinoRef"},"players":{"items":{"$ref":"#/components/schemas/PlayerStat"},"type":"array"}},"required":["casino","players"],"type":"object"},"CasinosResponse":{"properties":{"casinos":{"items":{"$ref":"#/components/schemas/CasinoRow"},"type":"array"}},"required":["casinos"],"type":"object"},"ChainBalance":{"properties":{"balance_usd":{"format":"double","type":"number"},"chain":{"type":"string"},"token":{"type":"string"}},"required":["chain","token","balance_usd"],"type":"object"},"ChainMix":{"properties":{"chain":{"type":"string"},"deposits":{"format":"int64","minimum":0,"type":"integer"},"deposits_usd":{"format":"double","type":"number"},"token":{"type":"string"},"withdrawals":{"format":"int64","minimum":0,"type":"integer"},"withdrawals_usd":{"format":"double","type":"number"}},"required":["chain","token","deposits_usd","deposits","withdrawals_usd","withdrawals"],"type":"object"},"ChainStatus":{"properties":{"chain":{"type":"string"},"head":{"description":"The last block (Solana: slot) fully read.","format":"int64","type":"integer"},"lag_s":{"format":"int64","type":"integer"},"status":{"description":"`ok` (under 5 minutes behind), `degraded` (under 30) or `down`.","type":"string"}},"required":["chain","head","lag_s","status"],"type":"object"},"ChatKind":{"enum":["message","rain","tip","win_share","system"],"type":"string"},"ChatMessage":{"description":"One moderated line of a casino's public chat.","properties":{"amount_usd":{"description":"Rain and tip amounts.","format":"double","type":["number","null"]},"casino":{"type":"string"},"id":{"description":"`<casino>:<the casino's message id or a hash of the line>`.","type":"string"},"kind":{"$ref":"#/components/schemas/ChatKind"},"room":{"description":"The casino's room or language (`en`).","type":["string","null"]},"text":{"description":"Plain text, already sanitized: render it as text, never as HTML.","type":"string"},"ts":{"type":"string"},"user":{"$ref":"#/components/schemas/ChatUser"}},"required":["id","casino","ts","user","text","kind"],"type":"object"},"ChatResponse":{"description":"`GET /v1/chat`.","properties":{"messages":{"description":"Newest first.","items":{"$ref":"#/components/schemas/ChatMessage"},"type":"array"},"sources":{"items":{"$ref":"#/components/schemas/ChatSource"},"type":"array"}},"required":["messages","sources"],"type":"object"},"ChatSource":{"properties":{"casino":{"type":"string"},"per_min":{"description":"Published lines per minute over the last 10 minutes.","format":"double","type":"number"},"room":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/ChatSourceStatus"}},"required":["casino","status","per_min"],"type":"object"},"ChatSourceStatus":{"enum":["live","off","unavailable"],"type":"string"},"ChatUser":{"properties":{"href":{"description":"This site's player page (`/players/<casino>/<segment>`) when the\nplayer has public bets here.","type":["string","null"]},"level":{"description":"The casino's public VIP or rank label.","type":["string","null"]},"name":{"description":"As the casino shows it (masked names included).","type":"string"}},"required":["name"],"type":"object"},"Cohort":{"description":"Depositors first seen in one week, and how many of them deposited\nagain in each week after.","properties":{"active":{"description":"Active depositors of the cohort in week 0, 1, 2 … up to this week.","items":{"format":"int64","minimum":0,"type":"integer"},"type":"array"},"size":{"format":"int64","minimum":0,"type":"integer"},"week":{"description":"Monday of the first week, `YYYY-MM-DD`.","type":"string"}},"required":["week","size","active"],"type":"object"},"CompareResponse":{"properties":{"casinos":{"items":{"$ref":"#/components/schemas/CasinoRow"},"type":"array"},"series":{"additionalProperties":{"$ref":"#/components/schemas/CompareSeries"},"description":"By casino slug.","propertyNames":{"type":"string"},"type":"object"},"top_games":{"additionalProperties":{"items":{"$ref":"#/components/schemas/GameStat"},"type":"array"},"description":"By casino slug.","propertyNames":{"type":"string"},"type":"object"}},"required":["casinos","series","top_games"],"type":"object"},"CompareSeries":{"properties":{"deposits_30d":{"$ref":"#/components/schemas/Series"},"wager_24h":{"$ref":"#/components/schemas/Series"}},"required":["wager_24h","deposits_30d"],"type":"object"},"Concentration":{"description":"How concentrated deposits are across sending addresses.","properties":{"curve":{"description":"`[share of addresses, share of USD]`, largest first: the top x of\naddresses deposited y.","items":{"items":false,"prefixItems":[{"format":"double","type":"number"},{"format":"double","type":"number"}],"type":"array"},"type":"array"},"depositors":{"format":"int64","minimum":0,"type":"integer"},"gini":{"description":"0 when every address deposited the same, near 1 when one did nearly all.","format":"double","type":["number","null"]},"segments":{"items":{"$ref":"#/components/schemas/Segment"},"type":"array"},"top10_share":{"format":"double","type":["number","null"]},"top1_share":{"description":"Shares (0 to 1) of the deposited USD from the largest address, the\nten largest and the largest 1% of addresses.","format":"double","type":["number","null"]},"top1pct_share":{"format":"double","type":["number","null"]}},"required":["depositors","curve","segments"],"type":"object"},"Coverage":{"properties":{"feeds":{"items":{"type":"string"},"type":"array"},"rtp_trusted":{"type":"boolean"},"sample_ratio":{"description":"All-bets feed bets over the casino's own bet counter, by count.","format":"double","type":["number","null"]},"status":{"description":"`ok`, `degraded`, `down` or `chain_only`.","type":"string"},"wager_basis":{"oneOf":[{"$ref":"#/components/schemas/WagerBasis","description":"What `wager_24h` is; absent without a bet feed."},{"type":"null"}]},"wager_check":{"description":"Why an estimate of `wager_24h` failed the plausibility check, so the\nobserved sum is shown instead.","type":["string","null"]}},"required":["feeds","status","rtp_trusted"],"type":"object"},"CrashResponse":{"properties":{"rounds":{"description":"The latest rounds.","items":{"$ref":"#/components/schemas/Round"},"type":"array"},"stats":{"$ref":"#/components/schemas/CrashStats"}},"required":["stats","rounds"],"type":"object"},"CrashStats":{"description":"`GET /v1/crash/:casino` `stats`: the edge measured from every public\nround.","properties":{"advertised_edge":{"format":"double","type":["number","null"]},"ci_high":{"format":"double","type":"number"},"ci_low":{"format":"double","type":"number"},"instant_rate":{"description":"Share of rounds that crash at 1.00x.","format":"double","type":"number"},"observed_edge":{"format":"double","type":"number"},"rounds":{"format":"int64","minimum":0,"type":"integer"},"survival":{"description":"`[x, observed P(X ≥ x), theoretical]`","items":{"items":{"format":"double","type":"number"},"type":"array"},"type":"array"}},"required":["rounds","observed_edge","ci_low","ci_high","instant_rate","survival"],"type":"object"},"DemoMode":{"enum":["embed","link"],"type":"string"},"DemoReport":{"additionalProperties":false,"properties":{"reason":{"$ref":"#/components/schemas/DemoReportReason"}},"required":["reason"],"type":"object"},"DemoReportReason":{"description":"Body of `POST /v1/games/:slug/demo-report`.","enum":["not_loading","wrong_game","other"],"type":"string"},"DropsResponse":{"properties":{"drops":{"items":{"$ref":"#/components/schemas/CaseDrop"},"type":"array"},"next":{"type":["string","null"]}},"required":["drops"],"type":"object"},"ErrorBody":{"description":"Every error: `{ \"error\": { \"code\", \"params\" } }`.","properties":{"error":{"$ref":"#/components/schemas/ErrorDetail"}},"required":["error"],"type":"object"},"ErrorDetail":{"properties":{"code":{"description":"A stable, dotted code such as `window.invalid`, `not_found` or `rate.limited`.","example":"window.invalid","type":"string"},"params":{"description":"Details for the code; `rate.limited` has `tier`, `limit` (`minute` or `day`) and `retry_after` (seconds).","type":"object"}},"required":["code","params"],"type":"object"},"Excluded":{"properties":{"count":{"format":"int64","minimum":0,"type":"integer"},"direction":{"description":"`deposit` or `withdrawal`.","type":"string"},"reason":{"$ref":"#/components/schemas/ExcludedReason"},"usd":{"format":"double","type":"number"}},"required":["reason","direction","count","usd"],"type":"object"},"ExcludedReason":{"description":"Why transfers were left out of the insight figures.","enum":["own","casino","exchange","processor"],"type":"string"},"FeedStatus":{"properties":{"access":{"type":"string"},"casino":{"$ref":"#/components/schemas/CasinoRef"},"events_per_min":{"format":"double","type":"number"},"feed":{"type":"string"},"last_event_at":{"type":["string","null"]},"note":{"type":["string","null"]},"rtp_trusted":{"type":"boolean"},"sample_ratio":{"format":"double","type":["number","null"]},"status":{"type":"string"},"wager_check":{"description":"The casino's `Coverage.wager_check`.","type":["string","null"]}},"required":["casino","feed","access","status","events_per_min","rtp_trusted"],"type":"object"},"FigureKind":{"description":"Which disagreement a published-figures row shows (docs/contracts.md\n\"Published figures\").","enum":["mismatch","lower","split"],"type":"string"},"FigureRow":{"description":"A slot whose RTP at one casino disagrees with what its studio publishes.","properties":{"captured_at":{"description":"When `casino_rtp` was read (RFC 3339).","type":["string","null"]},"casino_rtp":{"description":"The casino's figure, 0..1; for `split` its highest.","format":"double","type":"number"},"figures":{"description":"`split` only: each figure, highest first; null otherwise.","items":{"$ref":"#/components/schemas/PublishedRtp"},"type":["array","null"]},"game":{"$ref":"#/components/schemas/GameRef"},"gap_pp":{"description":"Signed, in percentage points: `casino_rtp` minus `reference`, or for\n`split` the casino's highest figure minus its lowest.","format":"double","type":"number"},"kind":{"$ref":"#/components/schemas/FigureKind"},"reference":{"description":"The studio version `gap_pp` is measured from: the nearest one for a\n`mismatch` (the higher of two as near), the highest for `lower`;\nnull for `split`.","format":"double","type":["number","null"]},"source":{"type":"string"},"studio_rtp":{"description":"Every RTP version the studio lists, 0..1, highest first.","items":{"format":"double","type":"number"},"type":"array"}},"required":["kind","game","studio_rtp","casino_rtp","gap_pp","source"],"type":"object"},"FiguresCasino":{"description":"One casino's published RTPs against the studios' (`GET /v1/figures`).","properties":{"casino":{"$ref":"#/components/schemas/CasinoRef"},"compared":{"description":"Slots with a studio RTP that the casino publishes an RTP for.","format":"int32","minimum":0,"type":"integer"},"less":{"description":"Mismatches below the nearest studio figure.","format":"int32","minimum":0,"type":"integer"},"lower_versions":{"description":"Its figures that are a studio version below the highest.","format":"int32","minimum":0,"type":"integer"},"max_gap_pp":{"description":"The largest mismatch, in percentage points either way; null without one.","format":"double","type":["number","null"]},"mismatches":{"description":"Its figures that are none of the studio's versions.","format":"int32","minimum":0,"type":"integer"},"more":{"description":"Mismatches above the nearest studio figure.","format":"int32","minimum":0,"type":"integer"},"split_games":{"description":"Games it lists with figures more than 0.02 points apart.","format":"int32","minimum":0,"type":"integer"}},"required":["casino","compared","mismatches","more","less","lower_versions","split_games"],"type":"object"},"FiguresCasinoResponse":{"description":"`GET /v1/figures/:casino`: one casino's counts and a page of one kind's rows.","properties":{"casino":{"$ref":"#/components/schemas/CasinoRef"},"compared":{"format":"int32","minimum":0,"type":"integer"},"kind":{"$ref":"#/components/schemas/FigureKind"},"less":{"description":"Mismatches below the nearest studio figure. Over every mismatch, not just this page.","format":"int32","minimum":0,"type":"integer"},"lower_versions":{"format":"int32","minimum":0,"type":"integer"},"max_gap_pp":{"format":"double","type":["number","null"]},"mismatches":{"format":"int32","minimum":0,"type":"integer"},"more":{"description":"Mismatches above the nearest studio figure. Over every mismatch, not just this page.","format":"int32","minimum":0,"type":"integer"},"next":{"description":"The next page's `cursor`; null on the last page.","type":["string","null"]},"rows":{"description":"Largest gap first, then by game slug.","items":{"$ref":"#/components/schemas/FigureRow"},"type":"array"},"same_gap":{"oneOf":[{"$ref":"#/components/schemas/SameGap","description":"Over every mismatch of the casino, not just this page."},{"type":"null"}]},"split_games":{"format":"int32","minimum":0,"type":"integer"},"tolerance_pp":{"format":"double","type":"number"}},"required":["casino","kind","compared","mismatches","more","less","lower_versions","split_games","tolerance_pp","rows"],"type":"object"},"FiguresResponse":{"description":"`GET /v1/figures`: every casino that publishes a comparable RTP, most\nmismatches first, then by name.","properties":{"casinos":{"items":{"$ref":"#/components/schemas/FiguresCasino"},"type":"array"},"tolerance_pp":{"description":"Figures this close count as the same, in percentage points (0.02).","format":"double","type":"number"}},"required":["casinos","tolerance_pp"],"type":"object"},"FlowByChain":{"properties":{"chain":{"type":"string"},"deposits_usd":{"format":"double","type":"number"},"token":{"type":"string"},"withdrawals_usd":{"format":"double","type":"number"}},"required":["chain","token","deposits_usd","withdrawals_usd"],"type":"object"},"FlowSeries":{"properties":{"deposits":{"$ref":"#/components/schemas/Series"},"withdrawals":{"$ref":"#/components/schemas/Series"}},"required":["deposits","withdrawals"],"type":"object"},"FlowTotals":{"properties":{"deposits":{"$ref":"#/components/schemas/Metric"},"net_flow":{"$ref":"#/components/schemas/Metric"},"withdrawals":{"$ref":"#/components/schemas/Metric"}},"required":["deposits","withdrawals","net_flow"],"type":"object"},"FlowsResponse":{"properties":{"by_casino":{"items":{"$ref":"#/components/schemas/CasinoFlow"},"type":"array"},"by_chain":{"items":{"$ref":"#/components/schemas/FlowByChain"},"type":"array"},"series":{"$ref":"#/components/schemas/FlowSeries"},"totals":{"$ref":"#/components/schemas/FlowTotals"},"whales":{"description":"Deposits and withdrawals of at least the whale threshold ($10 000).","items":{"$ref":"#/components/schemas/Transfer"},"type":"array"}},"required":["totals","by_casino","by_chain","series","whales"],"type":"object"},"GameDemo":{"description":"The studio's own free-play launcher for a game. Play money only; never a\ncasino's page.","properties":{"mode":{"$ref":"#/components/schemas/DemoMode"},"origin":{"description":"The launcher's origin, e.g. `https://demogamesfree.pragmaticplay.net`.","type":"string"},"restricted":{"description":"Per request: demos are not offered in the visitor's country (where\nthe site hides casino links, and the UK).","type":"boolean"},"source":{"description":"The site credited, as `GameFacts::source`.","type":"string"},"url":{"description":"The launcher; null where `restricted`.","type":["string","null"]}},"required":["mode","origin","source","restricted"],"type":"object"},"GameDetail":{"allOf":[{"$ref":"#/components/schemas/GameRef"},{"properties":{"demo":{"oneOf":[{"$ref":"#/components/schemas/GameDemo","description":"The studio's free-play demo."},{"type":"null"}]},"details":{"oneOf":[{"$ref":"#/components/schemas/GameFacts","description":"What the studio publishes about the game on its own site."},{"type":"null"}]},"official_rtp":{"description":"The RTP each casino advertises for the game, 0..1.","items":{"$ref":"#/components/schemas/OfficialRtp"},"type":"array"}},"required":["official_rtp"],"type":"object"}]},"GameDetailResponse":{"properties":{"biggest_hits":{"items":{"$ref":"#/components/schemas/Bet"},"type":"array"},"distribution":{"$ref":"#/components/schemas/GameDistribution","description":"The same spins' hit rate, big-win shares and multiplier spread,\nwith the spread ranked among the tracked slots."},"game":{"$ref":"#/components/schemas/GameDetail"},"histogram":{"description":"Spins of every casino's all-bets feed over the window by\nmultiplier, every bucket in order.","items":{"$ref":"#/components/schemas/HistogramBucket"},"type":"array"},"hot_cold":{"$ref":"#/components/schemas/HotCold","description":"The 7-day RTP against the advertised one."},"max_win":{"oneOf":[{"$ref":"#/components/schemas/MaxWinSummary","description":"The studio's max win and how often it was hit; `null` without a\npublished max win of at least 100x."},{"type":"null"}]},"play_on":{"description":"Casinos where this game has been observed, in site casino order.","items":{"$ref":"#/components/schemas/PlayOn"},"type":"array"},"rtp":{"items":{"$ref":"#/components/schemas/RtpRow"},"type":"array"},"stats":{"$ref":"#/components/schemas/GameStat"}},"required":["game","stats","rtp","histogram","distribution","biggest_hits","hot_cold","play_on"],"type":"object"},"GameDistribution":{"description":"What a game's spins paid over the window: every casino's all-bets\nfeed, the sample `histogram` counts (docs/contracts.md \"Multiplier\ndistribution\"). Past results only; every spin is independent.","properties":{"buckets":{"description":"The histogram's buckets with `100-1000` and `1000+` split.","items":{"$ref":"#/components/schemas/MultBucket"},"type":"array"},"hit_rate":{"description":"Share of them that paid anything (a multiplier above 0); `null`\nwithout spins.","format":"double","type":["number","null"]},"mult_sd":{"description":"Standard deviation of the multiplier over the `sd_n` spins staked\nat least $0.10; `null` under two.","format":"double","type":["number","null"]},"n":{"description":"Spins sampled.","format":"int64","minimum":0,"type":"integer"},"over_1000x":{"format":"double","type":["number","null"]},"over_100x":{"format":"double","type":["number","null"]},"over_10x":{"description":"Shares that paid at least 10, 100 and 1000 times the stake.","format":"double","type":["number","null"]},"sd_min_n":{"format":"int64","minimum":0,"type":"integer"},"sd_n":{"format":"int64","minimum":0,"type":"integer"},"sd_peers":{"description":"The slots `sd_percentile` ranks against.","format":"int32","minimum":0,"type":"integer"},"sd_percentile":{"description":"Percent (0–100) of the other slots with at least `sd_min_n` such\nspins over the window whose `mult_sd` is lower. `null` for a game\nthat isn't a slot or has fewer itself, without such slots, and\nwhile the rollup's earlier days are still being filled.","format":"double","type":["number","null"]}},"required":["n","sd_n","sd_peers","sd_min_n","buckets"],"type":"object"},"GameFacts":{"description":"The facts a game's studio publishes, with where and when they were read.","properties":{"bet_currency":{"description":"Of `min_bet` and `max_bet`, e.g. `EUR`.","type":["string","null"]},"captured_at":{"description":"When they were read (RFC 3339).","type":"string"},"features":{"items":{"$ref":"#/components/schemas/GameFeature"},"type":"array"},"lines":{"format":"int32","minimum":0,"type":["integer","null"]},"max_bet":{"format":"double","type":["number","null"]},"max_win_contradicted":{"description":"The studio publishes a max win, but sampled bets have gone more than\n2% past it. `max_win_x` is null here and in `GameStat::facts`, and\nthe slot finder treats the game as having none, until the studio\nchanges the figure or the bets stop contradicting it.","type":"boolean"},"max_win_x":{"description":"Largest win, times the bet. Null while the bet feeds contradict the\nstudio's figure (`max_win_contradicted`).","format":"double","type":["number","null"]},"min_bet":{"format":"double","type":["number","null"]},"pay":{"oneOf":[{"$ref":"#/components/schemas/PayKind"},{"type":"null"}]},"reels":{"format":"int32","minimum":0,"type":["integer","null"]},"released":{"description":"The studio's release date, `YYYY-MM-DD`, which may be ahead of\ntoday; one before 1995 or more than 365 days ahead is left out.","type":["string","null"]},"rows":{"format":"int32","minimum":0,"type":["integer","null"]},"rtp":{"description":"Every RTP version the studio lists, 0..1, highest first. Casinos\nchoose the version they run.","items":{"format":"double","type":"number"},"type":"array"},"source":{"description":"The site the figures are credited to, e.g. `pragmaticplay.com`.","type":"string"},"source_url":{"description":"The page or feed they were read from.","type":"string"},"tags":{"description":"The studio's own feature names, as listed.","items":{"type":"string"},"type":"array"},"url":{"description":"The studio's own page for the game.","type":["string","null"]},"volatility":{"oneOf":[{"$ref":"#/components/schemas/Volatility"},{"type":"null"}]},"volatility_label":{"description":"The studio's own rating, e.g. `4/5` or `Very high`.","type":["string","null"]},"ways":{"format":"int32","minimum":0,"type":["integer","null"]}},"required":["source","source_url","captured_at","rtp","max_win_contradicted","features","tags"],"type":"object"},"GameFactsBrief":{"description":"A game list row's few studio facts (`GameStat::facts`), for badges and\nthe slot finder.","properties":{"demo":{"description":"The studio has a free-play demo for it, to play here or on its site.\nThe game page still hides it from visitors in countries without demos.","type":"boolean"},"max_win_x":{"description":"Largest win, times the bet; null where the feeds contradict it\n(`GameFacts::max_win_contradicted`).","format":"double","type":["number","null"]},"released":{"description":"The studio's release date, `YYYY-MM-DD`, which may be ahead of\ntoday; one before 1995 or more than 365 days ahead is left out.","type":["string","null"]},"rtp_max":{"description":"The highest RTP version the studio lists, 0..1.","format":"double","type":["number","null"]},"volatility":{"oneOf":[{"$ref":"#/components/schemas/Volatility"},{"type":"null"}]}},"required":["demo"],"type":"object"},"GameFeature":{"description":"A game mechanic, normalized from the studio's own feature words\n(`GameFacts::tags` keeps those).","enum":["free_spins","bonus_buy","feature_bet","multipliers","cascades","megaways","hold_and_win","sticky_wilds","expanding_wilds","walking_wilds","respins","mystery_symbols","jackpot","gamble","bonus_game"],"type":"string"},"GameRef":{"properties":{"id":{"format":"int64","type":"integer"},"kind":{"type":"string"},"name":{"type":"string"},"original_kind":{"type":["string","null"]},"provider":{"oneOf":[{"$ref":"#/components/schemas/ProviderRef"},{"type":"null"}]},"slug":{"type":"string"},"thumb":{"description":"The game's picture as this site stores it: `/media/games/<id>-<hash>.webp`,\na 360×480 WebP served immutable; null until one is stored. Never a\ncasino's or provider's URL.","type":["string","null"]}},"required":["id","slug","name","kind"],"type":"object"},"GameRelease":{"description":"A catalog game with the release date its studio's site gives\n(`GET /v1/games/releases`, a provider's `releases`). The date is the\nstudio's own and can be wrong; one before 1995 or more than 365 days\nahead counts as no date.","properties":{"casinos":{"description":"Tracked casinos where it has been seen, in a catalog or a bet.","format":"int32","minimum":0,"type":"integer"},"demo":{"description":"The studio has a free-play demo for it.","type":"boolean"},"first_casino":{"oneOf":[{"$ref":"#/components/schemas/CasinoRef","description":"Where the radar first saw it."},{"type":"null"}]},"first_seen":{"description":"When the new slot radar first saw it at a casino (RFC 3339); null for\na game the casinos already listed when their tracking began.","type":["string","null"]},"game":{"$ref":"#/components/schemas/GameRef"},"lag_days":{"description":"Days from `released` to `first_seen`, as UTC dates; negative when a\ncasino had it before the studio's date.","format":"int32","type":["integer","null"]},"released":{"description":"The studio's release date, `YYYY-MM-DD`.","type":"string"},"upcoming":{"description":"The date is after today (UTC).","type":"boolean"}},"required":["game","released","upcoming","casinos","demo"],"type":"object"},"GameStat":{"properties":{"bets":{"format":"int64","minimum":0,"type":"integer"},"casinos":{"format":"int32","minimum":0,"type":"integer"},"facts":{"oneOf":[{"$ref":"#/components/schemas/GameFactsBrief","description":"The studio's facts, on `/v1/games` and a provider's games; absent\nelsewhere and for games the studios' sites don't list."},{"type":"null"}]},"game":{"$ref":"#/components/schemas/GameRef"},"max_multiplier":{"format":"double","type":["number","null"]},"max_payout_usd":{"oneOf":[{"$ref":"#/components/schemas/Usd"},{"type":"null"}]},"paid_usd":{"$ref":"#/components/schemas/Usd"},"rtp":{"format":"double","type":["number","null"]},"wagered_usd":{"$ref":"#/components/schemas/Usd"}},"required":["game","bets","wagered_usd","paid_usd","casinos"],"type":"object"},"GamesResponse":{"properties":{"games":{"items":{"$ref":"#/components/schemas/GameStat"},"type":"array"},"next":{"type":["string","null"]}},"required":["games"],"type":"object"},"HealthResponse":{"properties":{"clickhouse":{"type":"boolean"},"ok":{"type":"boolean"},"postgres":{"type":"boolean"},"service":{"example":"api","type":"string"},"version":{"type":"string"}},"required":["ok","service","version","postgres","clickhouse"],"type":"object"},"Heatmap":{"description":"Deposits by UTC weekday (0 = Monday) and hour.","properties":{"deposits":{"description":"`[weekday][hour]` deposit counts.","items":{"items":{"format":"int32","minimum":0,"type":"integer"},"type":"array"},"type":"array"},"deposits_usd":{"description":"`[weekday][hour]` deposited USD.","items":{"items":{"format":"double","type":"number"},"type":"array"},"type":"array"}},"required":["deposits","deposits_usd"],"type":"object"},"HistogramBucket":{"properties":{"bucket":{"description":"Multiplier range: `0`, `0-1`, `1-2`, `2-5`, `5-10`, `10-50`, `50-100`, `100-1000`, `1000+`.\n`distribution.buckets` splits the last two.","type":"string"},"count":{"format":"int64","minimum":0,"type":"integer"}},"required":["bucket","count"],"type":"object"},"HitRate":{"description":"Dice/limbo hit rate for one target bucket of one game, against the\ntheoretical win probability (1 − edge)/target.","properties":{"casino":{"$ref":"#/components/schemas/CasinoRef"},"ci_high":{"format":"double","type":"number"},"ci_low":{"format":"double","type":"number"},"enough_sample":{"type":"boolean"},"expected":{"description":"`null` without an advertised RTP.","format":"double","type":["number","null"]},"game":{"$ref":"#/components/schemas/GameRef"},"n":{"format":"int64","minimum":0,"type":"integer"},"observed":{"format":"double","type":"number"},"target":{"description":"Lower edge of the target bucket.","format":"double","type":"number"},"target_to":{"description":"Upper edge, `null` for the last bucket.","format":"double","type":["number","null"]},"wins":{"format":"int64","minimum":0,"type":"integer"},"z":{"format":"double","type":["number","null"]}},"required":["casino","game","target","n","wins","observed","ci_low","ci_high","enough_sample"],"type":"object"},"HotCold":{"properties":{"label":{"$ref":"#/components/schemas/HotColdLabel"},"z":{"format":"double","type":["number","null"]}},"required":["label"],"type":"object"},"HotColdLabel":{"enum":["hot","cold","normal","too-early"],"type":"string"},"InsightsBasis":{"description":"What the figures stand on. Never a casino's full volume: only the\ntracked wallets on the tracked chains, from each chain's scanner start.","properties":{"chains":{"description":"Chains with tracked transfers in the window.","items":{"type":"string"},"type":"array"},"days":{"description":"Days of the window with tracked data; fewer than `window_days` while\ntracking is younger than the window.","format":"int32","minimum":0,"type":"integer"},"excluded":{"description":"Transfers left out, by reason and direction.","items":{"$ref":"#/components/schemas/Excluded"},"type":"array"},"from":{"description":"First and last UTC day counted, `YYYY-MM-DD`.","type":"string"},"refreshed_at":{"description":"When the rollup was last rebuilt (RFC 3339).","type":["string","null"]},"to":{"type":"string"},"tracked_since":{"description":"When the earliest chain scanner started (RFC 3339), `None` before any.","type":["string","null"]},"wallets":{"description":"Approved hot, cold and deposit wallets behind the figures.","format":"int64","minimum":0,"type":"integer"},"window_days":{"format":"int32","minimum":0,"type":"integer"}},"required":["from","to","days","window_days","chains","wallets","excluded"],"type":"object"},"InsightsCasinoRow":{"description":"One casino in the cross-casino table.","properties":{"avg_deposit_usd":{"format":"double","type":["number","null"]},"casino":{"$ref":"#/components/schemas/CasinoRef"},"chains":{"description":"Chains with tracked transfers in the window.","items":{"type":"string"},"type":"array"},"deposit_count":{"format":"int64","minimum":0,"type":"integer"},"depositors":{"format":"int64","minimum":0,"type":"integer"},"depositors_change_pct":{"format":"double","type":["number","null"]},"deposits_change_pct":{"description":"Against the previous window, when tracking covered it.","format":"double","type":["number","null"]},"deposits_usd":{"format":"double","type":"number"},"dw_ratio":{"format":"double","type":["number","null"]},"median_deposit_usd":{"format":"double","type":["number","null"]},"multi_site":{"description":"Share (0 to 1) of its depositors who also deposited at another tracked casino.","format":"double","type":["number","null"]},"net_usd":{"format":"double","type":"number"},"new_depositors":{"format":"int64","minimum":0,"type":"integer"},"series":{"$ref":"#/components/schemas/Series","description":"Daily deposited USD."},"share":{"description":"Share (0 to 1) of the tracked deposits in this table.","format":"double","type":"number"},"withdrawal_count":{"format":"int64","minimum":0,"type":"integer"},"withdrawals_usd":{"format":"double","type":"number"}},"required":["casino","deposits_usd","deposit_count","depositors","withdrawals_usd","withdrawal_count","net_usd","share","new_depositors","chains","series"],"type":"object"},"InsightsResponse":{"properties":{"basis":{"$ref":"#/components/schemas/InsightsBasis"},"casinos":{"items":{"$ref":"#/components/schemas/InsightsCasinoRow"},"type":"array"},"chains":{"items":{"$ref":"#/components/schemas/ChainMix"},"type":"array"},"concentration":{"$ref":"#/components/schemas/Concentration"},"heatmap":{"$ref":"#/components/schemas/Heatmap"},"overlap":{"$ref":"#/components/schemas/Overlap"},"series":{"$ref":"#/components/schemas/InsightsSeries"},"sizes":{"items":{"$ref":"#/components/schemas/SizeBucket"},"type":"array"},"summary":{"$ref":"#/components/schemas/InsightsSummary"},"top_depositors":{"description":"The largest depositing addresses across the tracked casinos, truncated.","items":{"$ref":"#/components/schemas/TopAddress"},"type":"array"},"window":{"$ref":"#/components/schemas/InsightsWindow"}},"required":["window","basis","summary","casinos","series","sizes","heatmap","chains","concentration","overlap","top_depositors"],"type":"object"},"InsightsSeries":{"description":"Daily points (`[unix ms of the UTC day, value]`).","properties":{"deposit_count":{"$ref":"#/components/schemas/Series"},"depositors":{"$ref":"#/components/schemas/Series","description":"Distinct depositing addresses that day."},"deposits":{"$ref":"#/components/schemas/Series"},"net_flow":{"$ref":"#/components/schemas/Series"},"new_depositors":{"$ref":"#/components/schemas/Series","description":"Of those, first seen that day."},"withdrawals":{"$ref":"#/components/schemas/Series"}},"required":["deposits","withdrawals","net_flow","deposit_count","depositors","new_depositors"],"type":"object"},"InsightsSummary":{"description":"The headline numbers. `Metric.change_pct` compares with the previous\nwindow of the same length, only when tracking covered all of it.","properties":{"avg_deposit_usd":{"format":"double","type":["number","null"]},"avg_withdrawal_usd":{"format":"double","type":["number","null"]},"deposit_count":{"$ref":"#/components/schemas/Metric"},"depositors":{"$ref":"#/components/schemas/Metric","description":"Distinct sending addresses (not people: one person can use several,\nand an exchange address is many people, which is why those are left\nout). Exact up to 65,536, an estimate within about 1% above."},"deposits":{"$ref":"#/components/schemas/Metric","description":"Deposited, USD at the time of each transfer."},"deposits_per_depositor":{"format":"double","type":["number","null"]},"dw_ratio":{"description":"Deposited ÷ withdrawn (USD); `None` without withdrawals.","format":"double","type":["number","null"]},"largest_deposit_usd":{"format":"double","type":["number","null"]},"median_deposit_usd":{"format":"double","type":["number","null"]},"median_withdrawal_usd":{"format":"double","type":["number","null"]},"net_flow":{"$ref":"#/components/schemas/Metric"},"new_depositors":{"description":"Depositors first seen in the window (since tracking began).","format":"int64","minimum":0,"type":"integer"},"recipients":{"$ref":"#/components/schemas/Metric","description":"Distinct receiving addresses."},"returning_depositors":{"format":"int64","minimum":0,"type":"integer"},"withdrawal_count":{"$ref":"#/components/schemas/Metric"},"withdrawals":{"$ref":"#/components/schemas/Metric"}},"required":["deposits","deposit_count","depositors","withdrawals","withdrawal_count","recipients","net_flow","new_depositors","returning_depositors"],"type":"object"},"InsightsWindow":{"description":"Whole UTC days up to and including today.","enum":["7d","30d","90d"],"type":"string"},"ItemInCase":{"properties":{"case":{"$ref":"#/components/schemas/CaseRef"},"casino":{"$ref":"#/components/schemas/CasinoRef"},"odds":{"format":"double","type":"number"},"value_usd":{"oneOf":[{"$ref":"#/components/schemas/Usd"},{"type":"null"}]}},"required":["case","casino","odds"],"type":"object"},"ItemRef":{"properties":{"id":{"format":"int64","type":"integer"},"image":{"type":["string","null"]},"kind":{"description":"`weapon | knife | gloves | sticker | agent | container | charm | patch | music_kit | graffiti | pin | other`.","type":"string"},"market_hash_name":{"type":"string"},"name":{"description":"The market name, with the Doppler phase in parentheses when there is one.","type":"string"},"phase":{"type":["string","null"]},"rarity":{"type":["string","null"]},"skin":{"type":["string","null"]},"slug":{"description":"The item page is `/items/<slug>`.","type":"string"},"souvenir":{"type":"boolean"},"stattrak":{"type":"boolean"},"weapon":{"type":["string","null"]},"wear":{"description":"`FN | MW | FT | WW | BS`.","type":["string","null"]}},"required":["id","slug","name","market_hash_name","kind","stattrak","souvenir"],"type":"object"},"ItemResponse":{"properties":{"biggest_drops":{"items":{"$ref":"#/components/schemas/CaseDrop"},"type":"array"},"cases":{"description":"Active cases listing it, likeliest first.","items":{"$ref":"#/components/schemas/ItemInCase"},"type":"array"},"item":{"$ref":"#/components/schemas/ItemRef"},"latest_drops":{"items":{"$ref":"#/components/schemas/CaseDrop"},"type":"array"},"series":{"$ref":"#/components/schemas/Series","description":"Daily average drop value, 90 days."},"sites":{"items":{"$ref":"#/components/schemas/ItemSite"},"type":"array"},"stats":{"oneOf":[{"$ref":"#/components/schemas/ItemStat","description":"Since tracking started; `null` before the item dropped."},{"type":"null"}]}},"required":["item","sites","cases","biggest_drops","latest_drops","series"],"type":"object"},"ItemSite":{"description":"Where an item dropped and at what value.","properties":{"avg_value_usd":{"$ref":"#/components/schemas/Usd"},"casino":{"$ref":"#/components/schemas/CasinoRef"},"drops":{"format":"int64","minimum":0,"type":"integer"},"last_seen":{"type":"string"},"max_value_usd":{"$ref":"#/components/schemas/Usd"},"min_value_usd":{"$ref":"#/components/schemas/Usd"}},"required":["casino","drops","avg_value_usd","min_value_usd","max_value_usd","last_seen"],"type":"object"},"ItemStat":{"properties":{"avg_value_usd":{"oneOf":[{"$ref":"#/components/schemas/Usd"},{"type":"null"}]},"drops":{"format":"int64","minimum":0,"type":"integer"},"item":{"$ref":"#/components/schemas/ItemRef"},"max_value_usd":{"oneOf":[{"$ref":"#/components/schemas/Usd"},{"type":"null"}]},"min_value_usd":{"oneOf":[{"$ref":"#/components/schemas/Usd"},{"type":"null"}]},"sites":{"format":"int32","minimum":0,"type":"integer"}},"required":["item","drops","sites"],"type":"object"},"ItemsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ItemStat"},"type":"array"},"next":{"type":["string","null"]}},"required":["items"],"type":"object"},"Jackpot":{"properties":{"amount_usd":{"$ref":"#/components/schemas/Usd"},"casino":{"$ref":"#/components/schemas/CasinoRef"},"id":{"type":"string"},"last_win":{"oneOf":[{"$ref":"#/components/schemas/JackpotWin"},{"type":"null"}]},"name":{"type":"string"},"series":{"$ref":"#/components/schemas/Series"}},"required":["id","casino","name","amount_usd","series"],"type":"object"},"JackpotWin":{"properties":{"amount_usd":{"$ref":"#/components/schemas/Usd"},"player":{"$ref":"#/components/schemas/PlayerRef"},"ts":{"type":"string"}},"required":["ts","player","amount_usd"],"type":"object"},"JackpotsResponse":{"properties":{"jackpots":{"items":{"$ref":"#/components/schemas/Jackpot"},"type":"array"}},"required":["jackpots"],"type":"object"},"LatestReview":{"description":"An approved review with the site it is about, on the cross-site list.","properties":{"casino":{"$ref":"#/components/schemas/CasinoRef"},"review":{"$ref":"#/components/schemas/Review"}},"required":["casino","review"],"type":"object"},"LeaderboardResponse":{"properties":{"best_rtp_slots":{"items":{"$ref":"#/components/schemas/RtpRow"},"type":"array"},"biggest_losses":{"items":{"$ref":"#/components/schemas/PlayerStat"},"type":"array"},"biggest_wins":{"items":{"$ref":"#/components/schemas/Bet"},"type":"array"},"highest_multipliers":{"items":{"$ref":"#/components/schemas/Bet"},"type":"array"},"luckiest_players":{"items":{"$ref":"#/components/schemas/PlayerStat"},"type":"array"},"month":{"type":"string"},"since":{"description":"Where the counts start when tracking began during the month.","type":["string","null"]},"top_providers":{"items":{"$ref":"#/components/schemas/ProviderStat"},"type":"array"},"top_slots":{"items":{"$ref":"#/components/schemas/GameStat"},"type":"array"},"top_wagerers":{"items":{"$ref":"#/components/schemas/CasinoWagerers"},"type":"array"}},"required":["month","biggest_wins","highest_multipliers","luckiest_players","biggest_losses","top_wagerers","top_slots","top_providers","best_rtp_slots"],"type":"object"},"LiveStreamer":{"properties":{"biggest_win":{"oneOf":[{"$ref":"#/components/schemas/Bet"},{"type":"null"}]},"session":{"$ref":"#/components/schemas/StreamerSession"},"streamer":{"$ref":"#/components/schemas/Streamer"}},"required":["streamer","session"],"type":"object"},"LiveStreamersResponse":{"description":"`GET /v1/streamers/live`, most viewers first.","properties":{"live":{"items":{"$ref":"#/components/schemas/LiveStreamer"},"type":"array"}},"required":["live"],"type":"object"},"MaxWinGame":{"description":"One game's max-win hits on its provider's page.","properties":{"cap_x":{"description":"The studio's max win, times the bet.","format":"double","type":"number"},"game":{"$ref":"#/components/schemas/GameRef"},"hits":{"format":"int64","minimum":0,"type":"integer"},"last":{"description":"The latest hit's time (RFC 3339).","type":"string"}},"required":["game","cap_x","hits","last"],"type":"object"},"MaxWinHit":{"description":"A bet that reached the max win its studio publishes for the game: not a\nbonus buy, a stake of at least $0.10, and a multiplier within 2% of the\nmax win (ante and feature-bet stakes pay a little under it), on a game\nwhere no such bet went further past it. A record, not a forecast.","properties":{"bet":{"$ref":"#/components/schemas/Bet"},"cap_x":{"description":"The studio's max win, times the bet, when the hit was counted.","format":"double","type":"number"},"id":{"description":"The bet's id, `<casino>:<ext_id>`.","type":"string"},"ts":{"type":"string"}},"required":["id","ts","cap_x","bet"],"type":"object"},"MaxWinSummary":{"description":"A game's max win and how often it was hit (`GET /v1/games/:slug`).","properties":{"cap_x":{"description":"The studio's max win, times the bet.","format":"double","type":"number"},"hits":{"description":"Hits since `since`.","format":"int64","minimum":0,"type":"integer"},"last":{"oneOf":[{"$ref":"#/components/schemas/MaxWinHit","description":"The latest hit."},{"type":"null"}]},"since":{"description":"Where the count starts: the tracking start (RFC 3339).","type":["string","null"]}},"required":["cap_x","hits"],"type":"object"},"MaxWinsResponse":{"properties":{"games":{"description":"The games among them.","format":"int64","minimum":0,"type":"integer"},"hits":{"description":"Every hit of the filter since `since`.","format":"int64","minimum":0,"type":"integer"},"max_wins":{"items":{"$ref":"#/components/schemas/MaxWinHit"},"type":"array"},"next":{"description":"The next page's `cursor`; `null` on the last page.","type":["string","null"]},"since":{"description":"The tracking start: hits count from it.","type":["string","null"]}},"required":["max_wins","hits","games"],"type":"object"},"Measure":{"enum":["observed","estimated","onchain"],"type":"string"},"Metric":{"properties":{"change_pct":{"description":"Change against the previous window of the same length.","format":"double","type":["number","null"]},"measure":{"$ref":"#/components/schemas/Measure"},"value":{"format":"double","type":"number"}},"required":["value","measure"],"type":"object"},"MonthsResponse":{"properties":{"months":{"description":"`YYYY-MM`, newest first.","items":{"type":"string"},"type":"array"}},"required":["months"],"type":"object"},"MultBucket":{"description":"Spins in one multiplier bucket.","properties":{"bucket":{"description":"`0`, `0-1`, `1-2`, `2-5`, `5-10`, `10-50`, `50-100`, `100-500`, `500-1000`, `1000-5000` or `5000+`.","type":"string"},"count":{"format":"int64","minimum":0,"type":"integer"}},"required":["bucket","count"],"type":"object"},"MyReviewResponse":{"description":"`GET /v1/reviews/:target/mine`.","properties":{"review":{"oneOf":[{"$ref":"#/components/schemas/OwnReview"},{"type":"null"}]}},"type":"object"},"NewGameStat":{"allOf":[{"$ref":"#/components/schemas/GameStat"},{"properties":{"first_big_win":{"oneOf":[{"$ref":"#/components/schemas/Bet"},{"type":"null"}]},"first_casino":{"$ref":"#/components/schemas/CasinoRef"},"first_seen":{"type":"string"}},"required":["first_seen","first_casino"],"type":"object"}],"description":"A game on the new slot radar (`/v1/games/new`)."},"NewGamesResponse":{"properties":{"games":{"items":{"$ref":"#/components/schemas/NewGameStat"},"type":"array"}},"required":["games"],"type":"object"},"NewsletterAnswer":{"properties":{"ok":{"type":"boolean"},"state":{"$ref":"#/components/schemas/NewsletterState"}},"required":["ok","state"],"type":"object"},"NewsletterState":{"enum":["pending","confirmed","unsubscribed"],"type":"string"},"NewsletterSubscribe":{"additionalProperties":false,"description":"`POST /v1/newsletter/subscribe`.","properties":{"email":{"type":"string"},"source":{"description":"Where the form was (`footer`, `reports`, `report:2026-11`, …).","type":["string","null"]},"website":{"description":"A field people don't see; bots that fill it are answered as if\nsubscribed and nothing is stored.","type":["string","null"]}},"required":["email"],"type":"object"},"NewsletterToken":{"additionalProperties":false,"description":"`POST /v1/newsletter/confirm` and `/v1/newsletter/unsubscribe`.","properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"OfficialRtp":{"properties":{"casino":{"$ref":"#/components/schemas/CasinoRef"},"rtp":{"format":"double","type":"number"},"source":{"type":"string"}},"required":["casino","rtp","source"],"type":"object"},"OnlineTick":{"description":"`online` topic payload.","properties":{"casino":{"type":"string"},"logged_in":{"format":"int32","minimum":0,"type":["integer","null"]},"total":{"format":"int32","minimum":0,"type":"integer"},"ts":{"type":"string"}},"required":["casino","ts","total"],"type":"object"},"OriginalsCell":{"allOf":[{"$ref":"#/components/schemas/RtpRow"},{"properties":{"advertised_rtp":{"format":"double","type":["number","null"]},"flagged":{"type":"boolean"},"kind":{"type":"string"},"method":{"description":"`bets`, or `rounds` for crash and slide measured from the round history.","type":"string"}},"required":["kind","flagged","method"],"type":"object"}],"description":"One cell of the originals matrix (`/v1/rtp/originals`)."},"OriginalsKindResponse":{"properties":{"biggest_wins":{"items":{"$ref":"#/components/schemas/Bet"},"type":"array"},"cells":{"items":{"$ref":"#/components/schemas/OriginalsCell"},"type":"array"},"hit_rates":{"description":"Empty except for `dice` and `limbo`.","items":{"$ref":"#/components/schemas/HitRate"},"type":"array"},"kind":{"type":"string"},"play_on":{"description":"Casinos where this original has been observed, in site casino order.","items":{"$ref":"#/components/schemas/PlayOn"},"type":"array"},"series":{"description":"Observed RTP over time per casino.","items":{"$ref":"#/components/schemas/CasinoPoints"},"type":"array"}},"required":["kind","cells","series","biggest_wins","hit_rates","play_on"],"type":"object"},"OriginalsMatrixResponse":{"properties":{"casinos":{"items":{"$ref":"#/components/schemas/CasinoRef"},"type":"array"},"cells":{"items":{"$ref":"#/components/schemas/OriginalsCell"},"type":"array"},"kinds":{"items":{"type":"string"},"type":"array"}},"required":["kinds","casinos","cells"],"type":"object"},"Overlap":{"description":"Addresses that deposited at more than one tracked casino.","properties":{"by_count":{"description":"`[casinos, addresses]`: how many addresses deposited at exactly that many.","items":{"items":false,"prefixItems":[{"format":"int32","minimum":0,"type":"integer"},{"format":"int64","minimum":0,"type":"integer"}],"type":"array"},"type":"array"},"depositors":{"format":"int64","minimum":0,"type":"integer"},"multi":{"description":"At two or more casinos.","format":"int64","minimum":0,"type":"integer"},"pairs":{"description":"The casino pairs sharing the most depositors, most first.","items":{"$ref":"#/components/schemas/OverlapPair"},"type":"array"}},"required":["depositors","multi","by_count","pairs"],"type":"object"},"OverlapPair":{"properties":{"a":{"type":"string"},"b":{"type":"string"},"shared":{"format":"int64","minimum":0,"type":"integer"}},"required":["a","b","shared"],"type":"object"},"OverlapRow":{"description":"Where else a casino's depositors deposited in the window.","properties":{"casino":{"$ref":"#/components/schemas/CasinoRef"},"share":{"description":"`shared` as a share (0 to 1) of this casino's depositors.","format":"double","type":"number"},"shared":{"description":"Addresses that deposited at both.","format":"int64","minimum":0,"type":"integer"}},"required":["casino","shared","share"],"type":"object"},"OverviewResponse":{"properties":{"big_wins":{"items":{"$ref":"#/components/schemas/Bet"},"type":"array"},"casinos":{"items":{"$ref":"#/components/schemas/CasinoRow"},"type":"array"},"series":{"$ref":"#/components/schemas/OverviewSeries"},"totals":{"$ref":"#/components/schemas/OverviewTotals"}},"required":["totals","casinos","big_wins","series"],"type":"object"},"OverviewSeries":{"properties":{"deposits_30d":{"$ref":"#/components/schemas/Series"},"online_24h":{"$ref":"#/components/schemas/Series"},"wager_24h":{"$ref":"#/components/schemas/Series"},"withdrawals_30d":{"$ref":"#/components/schemas/Series"}},"required":["wager_24h","online_24h","deposits_30d","withdrawals_30d"],"type":"object"},"OverviewTotals":{"description":"`GET /v1/overview` `totals`.","properties":{"bets_24h":{"$ref":"#/components/schemas/Metric"},"deposits_24h":{"$ref":"#/components/schemas/Metric"},"deposits_30d":{"$ref":"#/components/schemas/Metric"},"online_now":{"$ref":"#/components/schemas/Metric"},"wager_24h":{"$ref":"#/components/schemas/Metric"},"withdrawals_24h":{"$ref":"#/components/schemas/Metric"},"withdrawals_30d":{"$ref":"#/components/schemas/Metric"}},"required":["wager_24h","bets_24h","online_now","deposits_24h","withdrawals_24h","deposits_30d","withdrawals_30d"],"type":"object"},"OwnReview":{"description":"The author's own review, in any status.","properties":{"reject_reason":{"oneOf":[{"$ref":"#/components/schemas/ReviewRejectReason"},{"type":"null"}]},"review":{"$ref":"#/components/schemas/Review"},"status":{"$ref":"#/components/schemas/ReviewStatus"}},"required":["status","review"],"type":"object"},"PayKind":{"description":"How wins are formed.","enum":["lines","ways","cluster","anywhere"],"type":"string"},"PlayOn":{"description":"A casino where this game has been observed, for the Play now CTA.\n`affiliate` is filled per request the same way as `CasinoRow`.","properties":{"affiliate":{"oneOf":[{"$ref":"#/components/schemas/Affiliate"},{"type":"null"}]},"casino":{"$ref":"#/components/schemas/CasinoRef"},"game_id":{"format":"int64","type":"integer"},"has_affiliate":{"type":"boolean"}},"required":["casino","game_id","has_affiliate"],"type":"object"},"PlayerRef":{"properties":{"casino":{"type":"string"},"hidden":{"type":"boolean"},"id":{"description":"The casino's user id, only for a masked name (`Pat****`): such a\nplayer is keyed by it, and its page is `/players/<casino>/<name>-<id>`.","type":["string","null"]},"name":{"description":"`null` when hidden.","type":["string","null"]}},"required":["casino","hidden"],"type":"object"},"PlayerResponse":{"properties":{"biggest_wins":{"items":{"$ref":"#/components/schemas/Bet"},"type":"array"},"favorite_games":{"items":{"$ref":"#/components/schemas/GameStat"},"type":"array"},"player":{"$ref":"#/components/schemas/PlayerRef"},"series":{"$ref":"#/components/schemas/Series","description":"Wagered per day over 90 days."},"stats":{"$ref":"#/components/schemas/PlayerStats"}},"required":["player","stats","biggest_wins","favorite_games","series"],"type":"object"},"PlayerStat":{"properties":{"bets":{"format":"int64","minimum":0,"type":"integer"},"max_multiplier":{"format":"double","type":["number","null"]},"max_payout_usd":{"oneOf":[{"$ref":"#/components/schemas/Usd"},{"type":"null"}]},"player":{"$ref":"#/components/schemas/PlayerRef"},"profit_usd":{"$ref":"#/components/schemas/Usd"},"wagered_usd":{"$ref":"#/components/schemas/Usd"}},"required":["player","bets","wagered_usd","profit_usd"],"type":"object"},"PlayerStats":{"properties":{"24h":{"$ref":"#/components/schemas/PlayerStat"},"30d":{"$ref":"#/components/schemas/PlayerStat"},"7d":{"$ref":"#/components/schemas/PlayerStat"},"all":{"$ref":"#/components/schemas/PlayerStat"}},"required":["24h","7d","30d","all"],"type":"object"},"ProviderDetailResponse":{"properties":{"biggest_hits":{"items":{"$ref":"#/components/schemas/Bet"},"type":"array"},"games":{"items":{"$ref":"#/components/schemas/GameStat"},"type":"array"},"max_wins":{"$ref":"#/components/schemas/ProviderMaxWins","description":"Bets on the provider's games that reached the game's max win."},"official":{"oneOf":[{"$ref":"#/components/schemas/ProviderOfficial","description":"The studio's own site, when the details job reads it."},{"type":"null"}]},"provider":{"$ref":"#/components/schemas/ProviderStat"},"releases":{"$ref":"#/components/schemas/ProviderReleases","description":"The provider's games by the release date its site gives."},"rtp":{"items":{"$ref":"#/components/schemas/RtpRow"},"type":"array"}},"required":["provider","games","biggest_hits","max_wins","releases","rtp"],"type":"object"},"ProviderMaxWins":{"description":"A provider's max-win hits (`GET /v1/providers/:slug`).","properties":{"games":{"description":"Games with at least one hit.","format":"int32","minimum":0,"type":"integer"},"hits":{"description":"Hits on the provider's games since `since`.","format":"int64","minimum":0,"type":"integer"},"since":{"description":"Where the count starts: the tracking start (RFC 3339).","type":["string","null"]},"top":{"description":"The games hit most, at most 10.","items":{"$ref":"#/components/schemas/MaxWinGame"},"type":"array"}},"required":["hits","games","top"],"type":"object"},"ProviderOfficial":{"description":"A studio library the details job reads, on its provider's page.","properties":{"checked_at":{"description":"Last successful read (RFC 3339).","type":["string","null"]},"demo_mode":{"oneOf":[{"$ref":"#/components/schemas/DemoMode"},{"type":"null"}]},"demos":{"description":"Matched games with a demo.","format":"int32","minimum":0,"type":"integer"},"listed":{"description":"Games the studio lists, and how many of them are in the catalog.","format":"int32","minimum":0,"type":"integer"},"matched":{"format":"int32","minimum":0,"type":"integer"},"site":{"description":"e.g. `pragmaticplay.com`","type":"string"}},"required":["site","listed","matched","demos"],"type":"object"},"ProviderRef":{"properties":{"name":{"type":"string"},"slug":{"type":"string"}},"required":["slug","name"],"type":"object"},"ProviderReleases":{"description":"A provider's releases by studio date (`GET /v1/providers/:slug`).","properties":{"dated":{"description":"The provider's catalog games with a studio release date.","format":"int32","minimum":0,"type":"integer"},"latest":{"description":"The latest releases up to today, newest first, at most 10.","items":{"$ref":"#/components/schemas/GameRelease"},"type":"array"},"months":{"description":"Games released in each of the last 12 months up to today, oldest\nfirst, the current month last; months without one count 0.","items":{"$ref":"#/components/schemas/ReleaseMonth"},"type":"array"},"upcoming":{"description":"Release dates after today, soonest first, at most 10.","items":{"$ref":"#/components/schemas/GameRelease"},"type":"array"}},"required":["dated","months","latest","upcoming"],"type":"object"},"ProviderStat":{"properties":{"bets":{"format":"int64","minimum":0,"type":"integer"},"games":{"format":"int32","minimum":0,"type":"integer"},"provider":{"$ref":"#/components/schemas/ProviderRef"},"rtp":{"format":"double","type":["number","null"]},"wagered_usd":{"$ref":"#/components/schemas/Usd"}},"required":["provider","games","bets","wagered_usd"],"type":"object"},"ProvidersResponse":{"properties":{"providers":{"items":{"$ref":"#/components/schemas/ProviderStat"},"type":"array"}},"required":["providers"],"type":"object"},"PublishedRtp":{"description":"One RTP a casino publishes for a game: the latest figure of one of its\ncodes for it, codes with the same figure counted once.","properties":{"captured_at":{"description":"When it was read (RFC 3339).","type":["string","null"]},"rtp":{"description":"0..1","format":"double","type":"number"},"source":{"description":"Where the casino publishes it, as on the game's `official_rtp`.","type":"string"},"studio_figure":{"description":"Within 0.02 percentage points of one of the studio's versions.","type":"boolean"}},"required":["rtp","source","studio_figure"],"type":"object"},"Race":{"properties":{"casino":{"$ref":"#/components/schemas/CasinoRef"},"ends_at":{"type":"string"},"entries":{"items":{"$ref":"#/components/schemas/RaceEntry"},"type":"array"},"id":{"type":"string"},"name":{"type":"string"},"period":{"type":"string"},"prize_pool_usd":{"oneOf":[{"$ref":"#/components/schemas/Usd"},{"type":"null"}]},"starts_at":{"type":"string"},"status":{"description":"`active` or `ended`.","type":"string"}},"required":["id","casino","name","period","starts_at","ends_at","status","entries"],"type":"object"},"RaceEntry":{"properties":{"player":{"$ref":"#/components/schemas/PlayerRef"},"prize_usd":{"oneOf":[{"$ref":"#/components/schemas/Usd"},{"type":"null"}]},"rank":{"format":"int32","minimum":0,"type":"integer"},"wagered_usd":{"oneOf":[{"$ref":"#/components/schemas/Usd","description":"`null` when the race counts wager in a currency without a price."},{"type":"null"}]}},"required":["rank","player"],"type":"object"},"RacesResponse":{"properties":{"races":{"items":{"$ref":"#/components/schemas/Race"},"type":"array"}},"required":["races"],"type":"object"},"RecordEvent":{"properties":{"bet":{"$ref":"#/components/schemas/Bet"},"id":{"type":"string"},"metric":{"$ref":"#/components/schemas/RecordMetric"},"previous":{"oneOf":[{"$ref":"#/components/schemas/Bet"},{"type":"null"}]},"scope":{"$ref":"#/components/schemas/RecordScope"},"subject":{"description":"The game, casino or provider slug the record belongs to.","type":"string"},"ts":{"type":"string"}},"required":["id","ts","scope","metric","subject","bet"],"type":"object"},"RecordMetric":{"enum":["multiplier","payout"],"type":"string"},"RecordScope":{"enum":["slot","casino","provider"],"type":"string"},"RecordsResponse":{"properties":{"records":{"items":{"$ref":"#/components/schemas/RecordEvent"},"type":"array"}},"required":["records"],"type":"object"},"ReleaseMonth":{"description":"Releases in one month, `YYYY-MM`.","properties":{"count":{"format":"int32","minimum":0,"type":"integer"},"month":{"type":"string"}},"required":["month","count"],"type":"object"},"ReleasesResponse":{"properties":{"releases":{"items":{"$ref":"#/components/schemas/GameRelease"},"type":"array"}},"required":["releases"],"type":"object"},"Report":{"description":"`GET /v1/reports/:yyyy-mm`. Frozen months are stored as this JSON, so a\nfield added later needs `#[serde(default)]` for older snapshots to read.","properties":{"biggest_wins":{"items":{"$ref":"#/components/schemas/Bet"},"type":"array"},"casinos":{"description":"Every active site (crypto casinos and CS2 case sites), in display order.","items":{"$ref":"#/components/schemas/ReportCasino"},"type":"array"},"findings":{"items":{"$ref":"#/components/schemas/ReportFinding"},"type":"array"},"generated_at":{"type":"string"},"high_rollers":{"items":{"$ref":"#/components/schemas/PlayerStat"},"type":"array"},"jackpots":{"$ref":"#/components/schemas/ReportJackpots"},"month":{"type":"string"},"new_slots":{"$ref":"#/components/schemas/ReportNewSlots"},"originals":{"$ref":"#/components/schemas/ReportOriginals"},"period":{"$ref":"#/components/schemas/ReportPeriod"},"races":{"$ref":"#/components/schemas/ReportRaces"},"records":{"$ref":"#/components/schemas/ReportRecords"},"status":{"$ref":"#/components/schemas/ReportStatus"},"top_providers":{"items":{"$ref":"#/components/schemas/ProviderStat"},"type":"array"},"top_slots":{"items":{"$ref":"#/components/schemas/GameStat"},"type":"array"},"totals":{"$ref":"#/components/schemas/ReportTotals"}},"required":["month","status","generated_at","period","findings","totals","casinos","biggest_wins","high_rollers","top_slots","top_providers","originals","records","races","jackpots","new_slots"],"type":"object"},"ReportBasis":{"description":"What a casino's wager and bet totals stand for.","enum":["full","sample","biased","chain_only","none"],"type":"string"},"ReportCasino":{"properties":{"bets":{"oneOf":[{"$ref":"#/components/schemas/ReportMetric"},{"type":"null"}]},"biggest_wins":{"items":{"$ref":"#/components/schemas/Bet"},"type":"array"},"casino":{"$ref":"#/components/schemas/CasinoRef"},"coverage":{"$ref":"#/components/schemas/ReportCoverage"},"deposits":{"oneOf":[{"$ref":"#/components/schemas/ReportMetric"},{"type":"null"}]},"high_rollers":{"description":"Public players by observed wager.","items":{"$ref":"#/components/schemas/PlayerStat"},"type":"array"},"net_flow":{"oneOf":[{"$ref":"#/components/schemas/ReportMetric"},{"type":"null"}]},"online_avg":{"oneOf":[{"$ref":"#/components/schemas/ReportMetric","description":"The casino's own online count: the mean of hourly means, and the\nhighest sample."},{"type":"null"}]},"online_peak":{"oneOf":[{"$ref":"#/components/schemas/ReportPeak"},{"type":"null"}]},"reserves":{"oneOf":[{"$ref":"#/components/schemas/ReportReserves"},{"type":"null"}]},"top_providers":{"items":{"$ref":"#/components/schemas/ProviderStat"},"type":"array"},"top_slots":{"items":{"$ref":"#/components/schemas/GameStat"},"type":"array"},"wagered":{"oneOf":[{"$ref":"#/components/schemas/ReportMetric","description":"Every distinct priced bet seen through any feed; null for casinos\nwithout bet feeds."},{"type":"null"}]},"withdrawals":{"oneOf":[{"$ref":"#/components/schemas/ReportMetric"},{"type":"null"}]}},"required":["casino","biggest_wins","high_rollers","top_slots","top_providers","coverage"],"type":"object"},"ReportCasinoRaces":{"properties":{"casino":{"$ref":"#/components/schemas/CasinoRef"},"prize_pool_usd":{"$ref":"#/components/schemas/Usd"},"prizes_usd":{"$ref":"#/components/schemas/Usd"},"races":{"format":"int32","minimum":0,"type":"integer"}},"required":["casino","races","prize_pool_usd","prizes_usd"],"type":"object"},"ReportCoverage":{"properties":{"basis":{"$ref":"#/components/schemas/ReportBasis"},"counter_bets":{"description":"Bets the casino's own counter advanced by, when it publishes one.","format":"int64","minimum":0,"type":["integer","null"]},"feeds":{"items":{"$ref":"#/components/schemas/ReportFeed"},"type":"array"},"first_data_at":{"type":["string","null"]},"notes":{"description":"What the coverage means for this casino's totals, in full sentences.","items":{"type":"string"},"type":"array"},"rtp_trusted":{"type":"boolean"},"sample_ratio":{"description":"All-bets feed bets over the casino's own bet counter.","format":"double","type":["number","null"]},"uptime":{"description":"Share of the period at least one bet feed was up.","format":"double","type":["number","null"]},"wallets":{"description":"Approved hot, cold and deposit wallets read on-chain.","format":"int32","minimum":0,"type":"integer"}},"required":["basis","rtp_trusted","wallets","feeds","notes"],"type":"object"},"ReportFeed":{"properties":{"bets":{"description":"Priced bets that came through it (a bet seen on several feeds\ncounts on each).","format":"int64","minimum":0,"type":"integer"},"feed":{"description":"The collector's feed name (`bets:all`, `bets:bigwin`, `online`, …).","type":"string"},"kind":{"type":"string"},"uptime":{"description":"Share of the period the feed reported ok or degraded; null without\nhealth reports.","format":"double","type":["number","null"]},"wagered_usd":{"$ref":"#/components/schemas/Usd"}},"required":["feed","kind","bets","wagered_usd"],"type":"object"},"ReportFinding":{"description":"One sentence generated from the report's numbers; `key` names the rule.","properties":{"key":{"type":"string"},"text":{"type":"string"}},"required":["key","text"],"type":"object"},"ReportJackpotWin":{"properties":{"amount_usd":{"$ref":"#/components/schemas/Usd"},"casino":{"$ref":"#/components/schemas/CasinoRef"},"name":{"type":"string"},"player":{"$ref":"#/components/schemas/PlayerRef"},"ts":{"type":"string"}},"required":["casino","name","ts","player","amount_usd"],"type":"object"},"ReportJackpots":{"properties":{"largest":{"items":{"$ref":"#/components/schemas/ReportJackpotWin"},"type":"array"},"paid_usd":{"$ref":"#/components/schemas/Usd"},"wins":{"format":"int32","minimum":0,"type":"integer"}},"required":["wins","paid_usd","largest"],"type":"object"},"ReportMetric":{"description":"A month's figure with the previous period's; both `previous` and\n`change_pct` are null without a previous month of data.","properties":{"change_pct":{"format":"double","type":["number","null"]},"measure":{"$ref":"#/components/schemas/Measure"},"previous":{"format":"double","type":["number","null"]},"value":{"format":"double","type":"number"}},"required":["value","measure"],"type":"object"},"ReportMonth":{"description":"One month of `GET /v1/reports`.","properties":{"as_of":{"type":"string"},"biggest_win_usd":{"oneOf":[{"$ref":"#/components/schemas/Usd"},{"type":"null"}]},"deposits_usd":{"$ref":"#/components/schemas/Usd"},"finding":{"description":"The report's first key finding.","type":["string","null"]},"generated_at":{"type":"string"},"month":{"type":"string"},"status":{"$ref":"#/components/schemas/ReportStatus"},"wagered_usd":{"$ref":"#/components/schemas/Usd","description":"Observed wager over every site."},"withdrawals_usd":{"$ref":"#/components/schemas/Usd"}},"required":["month","status","generated_at","as_of","wagered_usd","deposits_usd","withdrawals_usd"],"type":"object"},"ReportNewSlots":{"description":"Slots first seen in the period (not the catalog import of a casino's\nfirst days), the most played first.","properties":{"count":{"format":"int32","minimum":0,"type":"integer"},"games":{"items":{"$ref":"#/components/schemas/NewGameStat"},"type":"array"}},"required":["count","games"],"type":"object"},"ReportOriginals":{"description":"Originals cells of the month (`window` is `30d`), with the cells whose\nsample passed the minimum and the ones whose advertised RTP falls\noutside the 95% band.","properties":{"cells":{"items":{"$ref":"#/components/schemas/OriginalsCell"},"type":"array"},"checked":{"format":"int32","minimum":0,"type":"integer"},"flagged":{"format":"int32","minimum":0,"type":"integer"}},"required":["checked","flagged","cells"],"type":"object"},"ReportPeak":{"properties":{"ts":{"type":"string"},"value":{"format":"double","type":"number"}},"required":["value","ts"],"type":"object"},"ReportPeriod":{"properties":{"as_of":{"description":"Where the data ends: `to` for a finished month, the build time for\nmonth to date.","type":"string"},"days":{"format":"double","type":"number"},"first_data_at":{"description":"The first data of any site in the month; later than `from` when\ntracking started during the month.","type":["string","null"]},"flows_from":{"description":"Where on-chain flows start counting when the chain scanners began\nduring the month (earlier transfers are backfilled wallet history).","type":["string","null"]},"from":{"description":"The month's first instant and the next month's (RFC 3339 UTC).","type":"string"},"previous":{"oneOf":[{"$ref":"#/components/schemas/ReportSpan","description":"Null unless the previous span was tracked from its start."},{"type":"null"}]},"to":{"type":"string"}},"required":["from","to","as_of","days"],"type":"object"},"ReportRaces":{"description":"Races that ended in the period. `prizes_usd` sums the prizes listed in\neach race's last published standings.","properties":{"by_casino":{"items":{"$ref":"#/components/schemas/ReportCasinoRaces"},"type":"array"},"ended":{"format":"int32","minimum":0,"type":"integer"},"largest":{"items":{"$ref":"#/components/schemas/Race"},"type":"array"},"prize_pool_usd":{"$ref":"#/components/schemas/Usd"},"prizes_usd":{"$ref":"#/components/schemas/Usd"}},"required":["ended","prize_pool_usd","prizes_usd","by_casino","largest"],"type":"object"},"ReportRecords":{"properties":{"broken":{"format":"int64","minimum":0,"type":"integer"},"casino":{"format":"int64","minimum":0,"type":"integer"},"provider":{"format":"int64","minimum":0,"type":"integer"},"slot":{"format":"int64","minimum":0,"type":"integer"},"top":{"description":"The largest broken records, one per bet, payout records first.","items":{"$ref":"#/components/schemas/RecordEvent"},"type":"array"}},"required":["broken","slot","casino","provider","top"],"type":"object"},"ReportReserves":{"description":"Hot-wallet reserves at the first and the last hourly snapshot of the\nperiod, each valued at its own time's prices.","properties":{"change_at_end_prices_usd":{"oneOf":[{"$ref":"#/components/schemas/Usd","description":"The change of token balances valued at the end prices, over chains\nand tokens read from the same number of wallets at both ends: the\nchange without price moves and wallet approvals."},{"type":"null"}]},"change_pct":{"format":"double","type":["number","null"]},"change_usd":{"$ref":"#/components/schemas/Usd"},"end_at":{"type":"string"},"end_usd":{"$ref":"#/components/schemas/Usd"},"start_at":{"type":"string"},"start_usd":{"$ref":"#/components/schemas/Usd"},"wallets_changed":{"description":"Wallets were added or dropped during the period.","type":"boolean"}},"required":["start_usd","end_usd","start_at","end_at","change_usd","wallets_changed"],"type":"object"},"ReportSpan":{"description":"The span deltas compare against: the whole previous month, or its\nfirst days for month to date.","properties":{"from":{"type":"string"},"month":{"type":"string"},"to":{"type":"string"}},"required":["month","from","to"],"type":"object"},"ReportStatus":{"enum":["month_to_date","provisional","final"],"type":"string"},"ReportTotals":{"properties":{"bets":{"$ref":"#/components/schemas/ReportMetric"},"casinos":{"description":"Active sites in the report: crypto casinos and CS2 case sites.","format":"int32","minimum":0,"type":"integer"},"casinos_with_bets":{"description":"Sites with at least one observed bet.","format":"int32","minimum":0,"type":"integer"},"deposits":{"$ref":"#/components/schemas/ReportMetric"},"net_flow":{"$ref":"#/components/schemas/ReportMetric"},"online_avg":{"oneOf":[{"$ref":"#/components/schemas/ReportMetric","description":"Summed over the sites that publish an online count."},{"type":"null"}]},"reserves":{"oneOf":[{"$ref":"#/components/schemas/ReportReserves"},{"type":"null"}]},"uptime":{"description":"Mean bet-feed uptime of the sites with bet feeds, in the period\nand in the previous one.","format":"double","type":["number","null"]},"uptime_previous":{"format":"double","type":["number","null"]},"wagered":{"$ref":"#/components/schemas/ReportMetric"},"withdrawals":{"$ref":"#/components/schemas/ReportMetric"}},"required":["casinos","casinos_with_bets","wagered","bets","deposits","withdrawals","net_flow"],"type":"object"},"ReportsResponse":{"properties":{"months":{"description":"Newest first: the current month, months in their grace period, and\nevery frozen month.","items":{"$ref":"#/components/schemas/ReportMonth"},"type":"array"}},"required":["months"],"type":"object"},"ReservesFlows":{"description":"Hot- and cold-wallet balances next to the money moving through them.","properties":{"cumulative_net":{"$ref":"#/components/schemas/Series","description":"Running sum of `net_flow` from the window's start."},"net_flow":{"$ref":"#/components/schemas/Series","description":"Daily deposits minus withdrawals over every public transfer (like `/flows`)."},"reserves":{"$ref":"#/components/schemas/Series","description":"Daily closing balance of the tracked hot and cold wallets."}},"required":["reserves","net_flow","cumulative_net"],"type":"object"},"ReservesResponse":{"properties":{"casinos":{"items":{"$ref":"#/components/schemas/CasinoReserves"},"type":"array"}},"required":["casinos"],"type":"object"},"Review":{"description":"One approved review. Every text is plain text: render it as text, never\nas HTML or with links.","properties":{"author":{"$ref":"#/components/schemas/ReviewAuthor"},"body":{"type":"string"},"cons":{"type":["string","null"]},"created_at":{"type":"string"},"edited_at":{"description":"The author's last edit, null if never edited.","type":["string","null"]},"helpful":{"description":"Helpful votes.","format":"int32","minimum":0,"type":"integer"},"id":{"format":"int64","type":"integer"},"played_since":{"description":"`YYYY-MM`, as the author gave it.","type":["string","null"]},"pros":{"type":["string","null"]},"redacted":{"description":"A moderator edited the text (personal data, links, abuse).","type":"boolean"},"reply":{"oneOf":[{"$ref":"#/components/schemas/ReviewReply"},{"type":"null"}]},"stars":{"description":"1 to 5.","format":"int32","minimum":0,"type":"integer"},"target":{"description":"The site's slug, or `gambatracker`.","type":"string"},"title":{"type":"string"},"verified":{"description":"Set by gambatracker only, never by the author: the author is shown to\nbe a player of the site. Nothing sets it yet.","type":"boolean"}},"required":["id","target","stars","title","body","author","verified","helpful","redacted","created_at"],"type":"object"},"ReviewAuthor":{"properties":{"kind":{"$ref":"#/components/schemas/ReviewAuthorKind"},"name":{"description":"A guest's chosen name (`Anonymous` without one) or the account's\ndisplay name when the review was last saved.","type":"string"}},"required":["name","kind"],"type":"object"},"ReviewAuthorKind":{"enum":["guest","account"],"type":"string"},"ReviewLimits":{"description":"Character limits the api enforces (trimmed lengths).","properties":{"body_max":{"format":"int32","minimum":0,"type":"integer"},"body_min":{"format":"int32","minimum":0,"type":"integer"},"list_max":{"description":"Pros and cons, each.","format":"int32","minimum":0,"type":"integer"},"name_max":{"format":"int32","minimum":0,"type":"integer"},"name_min":{"description":"A guest's display name.","format":"int32","minimum":0,"type":"integer"},"note_max":{"description":"A report's note.","format":"int32","minimum":0,"type":"integer"},"title_max":{"format":"int32","minimum":0,"type":"integer"},"title_min":{"format":"int32","minimum":0,"type":"integer"}},"required":["title_min","title_max","body_min","body_max","list_max","name_min","name_max","note_max"],"type":"object"},"ReviewMode":{"description":"Who may write: `guest` anyone who passes a Turnstile check (no sign-in\nmethod works yet), `account` signed-in accounts only, `closed` nobody\n(reading still works).","enum":["guest","account","closed"],"type":"string"},"ReviewOk":{"description":"`{ \"ok\": true }`.","properties":{"ok":{"type":"boolean"}},"required":["ok"],"type":"object"},"ReviewRatingsResponse":{"description":"`GET /v1/reviews/ratings`: every target with an approved review.","properties":{"min_reviews":{"format":"int32","minimum":0,"type":"integer"},"ratings":{"items":{"$ref":"#/components/schemas/ReviewSummary"},"type":"array"}},"required":["min_reviews","ratings"],"type":"object"},"ReviewRejectReason":{"enum":["spam","off_topic","personal_data","abuse","promotion","duplicate","banned","other"],"type":"string"},"ReviewReply":{"description":"The site's answer to a review. Entered by gambatracker's moderators for\nnow; `author` is who it speaks for (`Stake support`).","properties":{"author":{"type":"string"},"body":{"type":"string"},"created_at":{"type":"string"},"updated_at":{"type":["string","null"]}},"required":["author","body","created_at"],"type":"object"},"ReviewReport":{"additionalProperties":false,"description":"`POST /v1/reviews/:target/:id/report`.","properties":{"note":{"type":["string","null"]},"reason":{"$ref":"#/components/schemas/ReviewReportReason"}},"required":["reason"],"type":"object"},"ReviewReportReason":{"enum":["spam","fake","offensive","personal_data","off_topic","other"],"type":"string"},"ReviewSort":{"enum":["helpful","newest","highest","lowest"],"type":"string"},"ReviewStatus":{"enum":["pending","approved","rejected"],"type":"string"},"ReviewSubmit":{"additionalProperties":false,"description":"`POST /v1/reviews/:target`: a new review, or an edit of the caller's\n(a guest's needs `edit_key`). Empty optional texts count as none.","properties":{"body":{"type":"string"},"cons":{"type":["string","null"]},"edit_key":{"description":"Guests: the key the first submit returned, to edit that review.","type":["string","null"]},"name":{"description":"Guests: the name to show.","type":["string","null"]},"played_since":{"description":"`YYYY-MM`, not after this month.","type":["string","null"]},"pros":{"type":["string","null"]},"stars":{"format":"int32","minimum":0,"type":"integer"},"title":{"type":"string"},"turnstile":{"description":"Guests: the Turnstile response token (action `review`).","type":["string","null"]}},"required":["stars","title","body"],"type":"object"},"ReviewSubmitted":{"properties":{"edit_key":{"description":"Guests, on the first submit only: the key to edit or delete the\nreview later. It is not stored and can't be shown again.","type":["string","null"]},"review":{"$ref":"#/components/schemas/OwnReview"}},"required":["review"],"type":"object"},"ReviewSummary":{"description":"A target's approved reviews. `average` and `distribution` are null below\n`MIN_FOR_RATING` reviews.","properties":{"average":{"description":"Mean stars, two decimals.","format":"double","type":["number","null"]},"count":{"format":"int32","minimum":0,"type":"integer"},"distribution":{"description":"Reviews with 1, 2, 3, 4 and 5 stars.","items":{"format":"int32","minimum":0,"type":"integer"},"type":["array","null"]},"target":{"type":"string"}},"required":["target","count"],"type":"object"},"ReviewVoted":{"description":"`POST` / `DELETE /v1/reviews/:target/:id/helpful`.","properties":{"helpful":{"format":"int32","minimum":0,"type":"integer"},"voted":{"type":"boolean"}},"required":["helpful","voted"],"type":"object"},"ReviewsConfig":{"description":"`GET /v1/reviews/config`.","properties":{"limits":{"$ref":"#/components/schemas/ReviewLimits"},"min_reviews":{"description":"`MIN_FOR_RATING`.","format":"int32","minimum":0,"type":"integer"},"mode":{"$ref":"#/components/schemas/ReviewMode"},"turnstile_site_key":{"description":"The Turnstile widget's site key, in `guest` mode.","type":["string","null"]}},"required":["mode","min_reviews","limits"],"type":"object"},"ReviewsLatestResponse":{"description":"`GET /v1/reviews/latest`: the newest approved reviews of every tracked\nsite (never feedback about gambatracker), newest first.","properties":{"category":{"oneOf":[{"$ref":"#/components/schemas/CasinoCategory","description":"The `category` asked for; null for every site."},{"type":"null"}]},"page":{"description":"1-based.","format":"int32","minimum":0,"type":"integer"},"pages":{"description":"At least 1.","format":"int32","minimum":0,"type":"integer"},"per_page":{"format":"int32","minimum":0,"type":"integer"},"reviews":{"items":{"$ref":"#/components/schemas/LatestReview"},"type":"array"},"total":{"description":"Approved reviews of the sites in `category`, for paging.","format":"int32","minimum":0,"type":"integer"}},"required":["total","page","per_page","pages","reviews"],"type":"object"},"ReviewsResponse":{"description":"`GET /v1/reviews/:target`.","properties":{"casino":{"oneOf":[{"$ref":"#/components/schemas/CasinoRef","description":"The site; null for `gambatracker`."},{"type":"null"}]},"page":{"description":"1-based.","format":"int32","minimum":0,"type":"integer"},"pages":{"description":"At least 1.","format":"int32","minimum":0,"type":"integer"},"per_page":{"format":"int32","minimum":0,"type":"integer"},"reviews":{"items":{"$ref":"#/components/schemas/Review"},"type":"array"},"sort":{"$ref":"#/components/schemas/ReviewSort"},"summary":{"$ref":"#/components/schemas/ReviewSummary"},"target":{"type":"string"}},"required":["target","summary","sort","page","per_page","pages","reviews"],"type":"object"},"Round":{"properties":{"casino":{"$ref":"#/components/schemas/CasinoRef"},"game":{"type":"string"},"hash":{"description":"The round hash, where the casino publishes it.","type":["string","null"]},"id":{"type":"string"},"players":{"format":"int32","minimum":0,"type":["integer","null"]},"result":{"format":"double","type":"number"},"ts":{"type":"string"}},"required":["id","casino","game","ts","result"],"type":"object"},"RtpResponse":{"properties":{"rows":{"items":{"$ref":"#/components/schemas/RtpRow"},"type":"array"}},"required":["rows"],"type":"object"},"RtpRow":{"properties":{"casino":{"oneOf":[{"$ref":"#/components/schemas/CasinoRef"},{"type":"null"}]},"ci_high":{"format":"double","type":"number"},"ci_low":{"format":"double","type":"number"},"enough_sample":{"type":"boolean"},"game":{"oneOf":[{"$ref":"#/components/schemas/GameRef"},{"type":"null"}]},"key":{"type":"string"},"label":{"type":"string"},"n":{"format":"int64","minimum":0,"type":"integer"},"official_rtp":{"format":"double","type":["number","null"]},"paid_usd":{"$ref":"#/components/schemas/Usd"},"provider":{"oneOf":[{"$ref":"#/components/schemas/ProviderRef"},{"type":"null"}]},"rtp":{"format":"double","type":"number"},"scope":{"$ref":"#/components/schemas/RtpScope"},"wagered_usd":{"$ref":"#/components/schemas/Usd"},"window":{"$ref":"#/components/schemas/Window"},"z":{"format":"double","type":["number","null"]}},"required":["scope","key","label","window","n","wagered_usd","paid_usd","rtp","ci_low","ci_high","enough_sample"],"type":"object"},"RtpScope":{"enum":["slot","slot_casino","provider","casino","original"],"type":"string"},"SameGap":{"description":"Five or more mismatches with one signed gap (rounded to 0.01 percentage\npoints), the most common such gap.","properties":{"gap_pp":{"format":"double","type":"number"},"n":{"format":"int32","minimum":0,"type":"integer"}},"required":["gap_pp","n"],"type":"object"},"SearchResponse":{"properties":{"casinos":{"items":{"$ref":"#/components/schemas/CasinoRef"},"type":"array"},"games":{"items":{"$ref":"#/components/schemas/GameRef"},"type":"array"},"players":{"items":{"$ref":"#/components/schemas/PlayerRef"},"type":"array"},"providers":{"items":{"$ref":"#/components/schemas/ProviderRef"},"type":"array"}},"required":["casinos","games","providers","players"],"type":"object"},"Segment":{"description":"Depositors grouped by what each address deposited in the window.","properties":{"addresses":{"format":"int64","minimum":0,"type":"integer"},"hi":{"format":"double","type":["number","null"]},"key":{"description":"`large` (≥ $10,000), `mid` ($1,000 to $10,000) or `small` (< $1,000).","type":"string"},"lo":{"format":"double","type":"number"},"usd":{"format":"double","type":"number"}},"required":["key","lo","addresses","usd"],"type":"object"},"Series":{"description":"`[unix ms, value]` points.","example":[[1762041600000,1250.5]],"items":{"items":{"format":"double","type":"number"},"type":"array"},"type":"array"},"SiteCurrency":{"description":"A site's own coin and the USD rate ingest converts it at.","properties":{"captured_at":{"type":"string"},"code":{"type":"string"},"name":{"type":"string"},"source":{"type":"string"},"source_url":{"type":["string","null"]},"usd_rate":{"description":"USD per unit.","format":"double","type":"number"}},"required":["code","name","usd_rate","source","captured_at"],"type":"object"},"SiteOpeners":{"properties":{"casino":{"$ref":"#/components/schemas/CasinoRef"},"players":{"items":{"$ref":"#/components/schemas/PlayerStat"},"type":"array"}},"required":["casino","players"],"type":"object"},"SitemapLastmod":{"description":"When a page's figures last changed, RFC 3339: the last observed bet's hour, else the latest catalog RTP capture.","properties":{"games":{"additionalProperties":{"type":"string"},"description":"By game slug; a game without either time is left out.","propertyNames":{"type":"string"},"type":"object"},"providers":{"additionalProperties":{"type":"string"},"description":"By provider slug.","propertyNames":{"type":"string"},"type":"object"}},"required":["games","providers"],"type":"object"},"SitemapPlayer":{"properties":{"bets":{"format":"int64","minimum":0,"type":"integer"},"last_seen":{"description":"Midnight UTC of the last day with a bet.","type":["string","null"]},"player":{"$ref":"#/components/schemas/PlayerRef"},"wagered_usd":{"format":"double","type":"number"}},"required":["player","bets","wagered_usd"],"type":"object"},"SitemapResponse":{"properties":{"games":{"description":"Slugs of games whose slot page is indexed, sorted: bets in the last 30 days, or an official RTP from a casino's catalog.","items":{"type":"string"},"type":"array"},"lastmod":{"$ref":"#/components/schemas/SitemapLastmod"},"players":{"description":"Up to 500 public players by 30-day wager; never hidden, opted-out or masked ones.","items":{"$ref":"#/components/schemas/PlayerRef"},"type":"array"},"players_30d":{"description":"The same players with their 30-day activity, for the web's player-page bar.","items":{"$ref":"#/components/schemas/SitemapPlayer"},"type":"array"},"providers":{"description":"Providers with bets in the last 30 days, sorted.","items":{"type":"string"},"type":"array"}},"required":["games","providers","players","players_30d","lastmod"],"type":"object"},"SizeBucket":{"description":"One deposit-size band: `lo` ≤ USD < `hi` (`hi` `None` for the top band).","properties":{"deposits":{"format":"int64","minimum":0,"type":"integer"},"deposits_usd":{"format":"double","type":"number"},"hi":{"format":"double","type":["number","null"]},"lo":{"format":"double","type":"number"},"withdrawals":{"format":"int64","minimum":0,"type":"integer"},"withdrawals_usd":{"format":"double","type":"number"}},"required":["lo","deposits","deposits_usd","withdrawals","withdrawals_usd"],"type":"object"},"SportBet":{"properties":{"amount_usd":{"$ref":"#/components/schemas/Usd"},"casino":{"$ref":"#/components/schemas/CasinoRef"},"id":{"type":"string"},"legs":{"items":{"$ref":"#/components/schemas/SportLeg"},"type":"array"},"odds":{"format":"double","type":"number"},"payout_usd":{"oneOf":[{"$ref":"#/components/schemas/Usd"},{"type":"null"}]},"player":{"$ref":"#/components/schemas/PlayerRef"},"potential_payout_usd":{"oneOf":[{"$ref":"#/components/schemas/Usd"},{"type":"null"}]},"status":{"type":"string"},"ts":{"type":"string"}},"required":["id","casino","ts","player","amount_usd","odds","status","legs"],"type":"object"},"SportLeg":{"properties":{"competition":{"type":["string","null"]},"event":{"type":"string"},"market":{"type":"string"},"odds":{"format":"double","type":"number"},"outcome":{"type":"string"},"sport":{"type":"string"},"starts_at":{"type":["string","null"]}},"required":["sport","event","market","outcome","odds"],"type":"object"},"SportsResponse":{"properties":{"bets":{"items":{"$ref":"#/components/schemas/SportBet"},"type":"array"}},"required":["bets"],"type":"object"},"StatusResponse":{"properties":{"chains":{"items":{"$ref":"#/components/schemas/ChainStatus"},"type":"array"},"feeds":{"items":{"$ref":"#/components/schemas/FeedStatus"},"type":"array"}},"required":["feeds","chains"],"type":"object"},"StreamPlatform":{"enum":["kick","twitch"],"type":"string"},"Streamer":{"properties":{"avatar_url":{"description":"The admin's choice, else the Kick or Twitch profile picture.","type":["string","null"]},"channels":{"items":{"$ref":"#/components/schemas/StreamerChannel"},"type":"array"},"name":{"type":"string"},"slug":{"type":"string"},"socials":{"items":{"$ref":"#/components/schemas/StreamerSocial"},"type":"array"}},"required":["slug","name","channels","socials"],"type":"object"},"StreamerAccount":{"description":"A casino account as the public sees it. Accounts of opted-out players\naren't listed at all.","properties":{"casino":{"$ref":"#/components/schemas/CasinoRef"},"confidence":{"description":"0..1","format":"double","type":"number"},"name":{"description":"The casino username; `null` while it isn't publicly known (or the\naccount is matched by the casino's player id only).","type":["string","null"]},"source":{"type":"string"},"source_url":{"type":["string","null"]},"tracked":{"description":"Bets are matched to it (a name or id, and confidence ≥ 0.5).","type":"boolean"}},"required":["casino","source","confidence","tracked"],"type":"object"},"StreamerCard":{"properties":{"best_win":{"oneOf":[{"$ref":"#/components/schemas/StreamerWin","description":"The biggest win of the last 30 days."},{"type":"null"}]},"casinos":{"description":"Casinos of the listed accounts.","items":{"$ref":"#/components/schemas/CasinoRef"},"type":"array"},"last_live_at":{"type":["string","null"]},"live":{"oneOf":[{"$ref":"#/components/schemas/StreamerSession","description":"The live session with the most viewers."},{"type":"null"}]},"streamer":{"$ref":"#/components/schemas/Streamer"}},"required":["streamer","casinos"],"type":"object"},"StreamerCasinoStat":{"properties":{"bets":{"format":"int64","minimum":0,"type":"integer"},"casino":{"$ref":"#/components/schemas/CasinoRef"},"paid_usd":{"format":"double","type":"number"},"wagered_usd":{"format":"double","type":"number"}},"required":["casino","bets","wagered_usd","paid_usd"],"type":"object"},"StreamerChannel":{"properties":{"channel":{"description":"The Kick slug or Twitch login.","type":"string"},"platform":{"$ref":"#/components/schemas/StreamPlatform"},"url":{"type":"string"}},"required":["platform","channel","url"],"type":"object"},"StreamerHit":{"description":"`streamer_hit` (`/v1/ws` `streamers:hits`): a notable winning bet by a\nlive streamer's account.","properties":{"bet":{"$ref":"#/components/schemas/Bet"},"platform":{"oneOf":[{"$ref":"#/components/schemas/StreamPlatform"},{"type":"null"}]},"streamer":{"$ref":"#/components/schemas/StreamerRef"}},"required":["streamer","bet"],"type":"object"},"StreamerLeaderboardResponse":{"description":"`GET /v1/leaderboards/streamers`","properties":{"casino":{"type":["string","null"]},"game":{"type":["string","null"]},"month":{"type":["string","null"]},"rows":{"items":{"$ref":"#/components/schemas/StreamerRank"},"type":"array"},"sort":{"type":"string"},"window":{"oneOf":[{"$ref":"#/components/schemas/Window","description":"The period: a window, or a `YYYY-MM` month."},{"type":"null"}]}},"required":["sort","rows"],"type":"object"},"StreamerRank":{"properties":{"best":{"$ref":"#/components/schemas/StreamerWin"},"rank":{"format":"int32","minimum":0,"type":"integer"},"streamer":{"$ref":"#/components/schemas/Streamer"},"wins":{"description":"Notable wins in the period.","format":"int64","minimum":0,"type":"integer"}},"required":["rank","streamer","best","wins"],"type":"object"},"StreamerRecap":{"description":"What a session's observed bets add up to. Feeds are samples, so this is\na lower bound of what was played on stream.","properties":{"best_multiplier":{"oneOf":[{"$ref":"#/components/schemas/Bet","description":"The highest multiplier on a stake of at least $0.10."},{"type":"null"}]},"biggest_win":{"oneOf":[{"$ref":"#/components/schemas/Bet","description":"The highest payout among winning bets."},{"type":"null"}]},"casinos":{"items":{"$ref":"#/components/schemas/StreamerCasinoStat"},"type":"array"},"frozen":{"description":"`false` while the session is live (refreshed every poll).","type":"boolean"},"hits":{"description":"The 10 biggest wins.","items":{"$ref":"#/components/schemas/Bet"},"type":"array"},"measure":{"$ref":"#/components/schemas/Measure"},"series":{"$ref":"#/components/schemas/Series","description":"Running net per minute."},"top_games":{"description":"By wagered, at most 5 (`rtp` is null).","items":{"$ref":"#/components/schemas/GameStat"},"type":"array"},"totals":{"$ref":"#/components/schemas/StreamerTotals"},"updated_at":{"type":"string"}},"required":["measure","frozen","updated_at","totals","top_games","casinos","hits","series"],"type":"object"},"StreamerRef":{"properties":{"name":{"type":"string"},"slug":{"type":"string"}},"required":["slug","name"],"type":"object"},"StreamerResponse":{"description":"`GET /v1/streamers/:slug`","properties":{"accounts":{"items":{"$ref":"#/components/schemas/StreamerAccount"},"type":"array"},"best_wins":{"description":"The 10 biggest wins of all time.","items":{"$ref":"#/components/schemas/StreamerWin"},"type":"array"},"live":{"items":{"$ref":"#/components/schemas/StreamerSession"},"type":"array"},"sessions":{"description":"The latest 20, newest first; `/sessions` pages through the rest.","items":{"$ref":"#/components/schemas/StreamerSession"},"type":"array"},"stats":{"$ref":"#/components/schemas/StreamerStats"},"streamer":{"$ref":"#/components/schemas/Streamer"}},"required":["streamer","accounts","live","sessions","best_wins","stats"],"type":"object"},"StreamerSession":{"properties":{"avg_viewers":{"format":"int32","minimum":0,"type":"integer"},"category":{"type":["string","null"]},"duration_s":{"format":"int64","type":"integer"},"ended_at":{"type":["string","null"]},"id":{"format":"int64","type":"integer"},"live":{"type":"boolean"},"peak_viewers":{"format":"int32","minimum":0,"type":"integer"},"platform":{"$ref":"#/components/schemas/StreamPlatform"},"started_at":{"type":"string"},"title":{"type":["string","null"]},"totals":{"oneOf":[{"$ref":"#/components/schemas/StreamerTotals","description":"`null` while the streamer has no tracked account."},{"type":"null"}]},"url":{"type":"string"},"viewers":{"description":"The latest count (the last one seen once it ended).","format":"int32","minimum":0,"type":"integer"}},"required":["id","platform","url","started_at","live","duration_s","viewers","peak_viewers","avg_viewers"],"type":"object"},"StreamerSessionResponse":{"description":"`GET /v1/streamers/:slug/sessions/:id`","properties":{"next":{"format":"int64","type":["integer","null"]},"previous":{"description":"Ids of the streamer's sessions before and after this one.","format":"int64","type":["integer","null"]},"recap":{"oneOf":[{"$ref":"#/components/schemas/StreamerRecap"},{"type":"null"}]},"session":{"$ref":"#/components/schemas/StreamerSession"},"streamer":{"$ref":"#/components/schemas/Streamer"}},"required":["streamer","session"],"type":"object"},"StreamerSessionsResponse":{"description":"`GET /v1/streamers/:slug/sessions`","properties":{"next":{"type":["string","null"]},"sessions":{"items":{"$ref":"#/components/schemas/StreamerSession"},"type":"array"}},"required":["sessions"],"type":"object"},"StreamerSocial":{"properties":{"kind":{"description":"`x | youtube | instagram | tiktok | discord | website | other`","type":"string"},"url":{"type":"string"}},"required":["kind","url"],"type":"object"},"StreamerStats":{"properties":{"hours_30d":{"format":"double","type":"number"},"net_30d":{"format":"double","type":"number"},"sessions_30d":{"format":"int32","minimum":0,"type":"integer"},"wagered_30d":{"format":"double","type":"number"}},"required":["sessions_30d","hours_30d","wagered_30d","net_30d"],"type":"object"},"StreamerStatus":{"description":"`streamer_status` (`/v1/ws` `streamers`): a session started, changed\n(every poll while live) or ended.","properties":{"session":{"$ref":"#/components/schemas/StreamerSession"},"streamer":{"$ref":"#/components/schemas/Streamer"}},"required":["streamer","session"],"type":"object"},"StreamerTotals":{"properties":{"best_multiplier":{"format":"double","type":["number","null"]},"bets":{"format":"int64","minimum":0,"type":"integer"},"biggest_win_usd":{"format":"double","type":["number","null"]},"net_usd":{"description":"`paid_usd − wagered_usd`: positive when the streamer is up.","format":"double","type":"number"},"paid_usd":{"format":"double","type":"number"},"wagered_usd":{"format":"double","type":"number"}},"required":["bets","wagered_usd","paid_usd","net_usd"],"type":"object"},"StreamerWin":{"description":"A win of a streamer's account; `session_id` when it happened on stream.","properties":{"bet":{"$ref":"#/components/schemas/Bet"},"session_id":{"format":"int64","type":["integer","null"]}},"required":["bet"],"type":"object"},"StreamersResponse":{"description":"`GET /v1/streamers`","properties":{"streamers":{"items":{"$ref":"#/components/schemas/StreamerCard"},"type":"array"}},"required":["streamers"],"type":"object"},"TopAddress":{"description":"One sending address, truncated; never a person.","properties":{"address":{"description":"The first six and last four characters only, e.g. `TLn8Uu…Yvwz`.","type":"string"},"casinos":{"description":"Tracked casinos this address deposited to in the window.","format":"int32","minimum":0,"type":"integer"},"chain":{"type":"string"},"count":{"format":"int64","minimum":0,"type":"integer"},"first_day":{"description":"UTC days, `YYYY-MM-DD`: first seen at this casino (market-wide: at any) and last in the window.","type":"string"},"largest_usd":{"format":"double","type":"number"},"last_day":{"type":"string"},"usd":{"format":"double","type":"number"}},"required":["address","chain","usd","count","largest_usd","first_day","last_day","casinos"],"type":"object"},"Transfer":{"properties":{"amount":{"format":"double","type":"number"},"amount_usd":{"$ref":"#/components/schemas/Usd"},"casino":{"$ref":"#/components/schemas/CasinoRef"},"chain":{"type":"string"},"direction":{"description":"`deposit` or `withdrawal`.","type":"string"},"explorer_url":{"type":"string"},"from":{"type":"string"},"to":{"type":"string"},"token":{"type":"string"},"ts":{"type":"string"},"tx":{"type":"string"}},"required":["ts","chain","token","amount","amount_usd","direction","casino","tx","from","to","explorer_url"],"type":"object"},"Upgrade":{"properties":{"amount":{"format":"double","type":"number"},"amount_usd":{"$ref":"#/components/schemas/Usd"},"casino":{"$ref":"#/components/schemas/CasinoRef"},"chance":{"format":"double","type":"number"},"currency":{"type":"string"},"feeds":{"items":{"type":"string"},"type":"array"},"id":{"description":"`<casino>:<ext_id>`","type":"string"},"item":{"oneOf":[{"$ref":"#/components/schemas/ItemRef"},{"type":"null"}]},"mode":{"type":"string"},"multiplier":{"description":"target / amount","format":"double","type":"number"},"payout_usd":{"$ref":"#/components/schemas/Usd"},"player":{"$ref":"#/components/schemas/PlayerRef"},"target_usd":{"$ref":"#/components/schemas/Usd"},"ts":{"type":"string"},"won":{"type":"boolean"}},"required":["id","casino","ts","player","mode","feeds","currency","amount","amount_usd","target_usd","payout_usd","chance","won","multiplier"],"type":"object"},"UpgradeStat":{"description":"Upgrades of one site and mode: wins against the summed shown chance.","properties":{"casino":{"$ref":"#/components/schemas/CasinoRef"},"enough_sample":{"type":"boolean"},"expected_wins":{"description":"Σ shown chance.","format":"double","type":"number"},"mode":{"type":"string"},"paid_usd":{"$ref":"#/components/schemas/Usd"},"rtp":{"format":"double","type":["number","null"]},"shown_rtp":{"description":"Σ chance × target / Σ amount: the return the shown chances imply.","format":"double","type":["number","null"]},"upgrades":{"format":"int64","minimum":0,"type":"integer"},"wagered_usd":{"$ref":"#/components/schemas/Usd"},"wins":{"format":"int64","minimum":0,"type":"integer"},"z":{"description":"(wins − Σ chance) / √Σ chance (1 − chance)","format":"double","type":["number","null"]}},"required":["casino","mode","upgrades","wins","expected_wins","wagered_usd","paid_usd","enough_sample"],"type":"object"},"UpgradesResponse":{"properties":{"next":{"type":["string","null"]},"upgrades":{"items":{"$ref":"#/components/schemas/Upgrade"},"type":"array"}},"required":["upgrades"],"type":"object"},"Usd":{"description":"US dollars.","format":"double","type":"number"},"Volatility":{"description":"The studio's volatility, on one scale: studios rate it 1–5, 1–10 or in\nwords, and `GameFacts::volatility_label` keeps their own.","enum":["low","low-medium","medium","medium-high","high","very-high"],"type":"string"},"WagerBasis":{"description":"How a casino's `wager_24h` was produced.","enum":["feed","counter","scaled"],"type":"string"},"Window":{"enum":["10m","1h","24h","7d","30d","90d","all"],"type":"string"},"WsClientMessage":{"description":"What a client sends on `/v1/ws`: `{\"sub\": [...]}` replaces the set of\ntopics, `{\"unsub\": [...]}` drops some. At most 50 topics and 4 KiB a\nmessage.","oneOf":[{"properties":{"sub":{"example":["bets:big","bets:live:stake","rtp:slot"],"items":{"type":"string"},"type":"array"}},"required":["sub"],"type":"object"},{"properties":{"unsub":{"items":{"type":"string"},"type":"array"}},"required":["unsub"],"type":"object"}]},"WsFrame":{"description":"What the server sends: `{ topic, data }`. `data` by topic: `bets:big`,\n`bets:live`, `bets:live:<casino>` → `Bet`; `online` → `OnlineTick`;\n`rtp:<scope>` → `RtpRow[]`; `records` → `RecordEvent`; `max_wins` →\n`MaxWinHit`; `whales` →\n`Transfer`; `races` → `Race`; `sports` → `SportBet`; `rounds`,\n`rounds:<casino>` → `Round`; `jackpots` → `Jackpot`; `status` →\n`FeedStatus`; `streamers` → `StreamerStatus`; `streamers:hits` →\n`StreamerHit`; `chat`, `chat:<casino>` → `ChatMessage`; `drops`,\n`drops:<casino>`, `drops:big` → `CaseDrop`; `battles`, `battles:<casino>`\n→ `Battle`; `upgrades`, `upgrades:<casino>` → `Upgrade`. Control topics: `subscribed` (the accepted topics, sorted),\n`error` (`subscription.invalid`) and `lagged` (frames skipped).","properties":{"data":{"type":"object"},"topic":{"example":"bets:big","type":"string"}},"required":["topic","data"],"type":"object"}},"securitySchemes":{"api_key":{"description":"A `gt_live_…` key. Optional: without one you are anonymous, limited per IP.","in":"header","name":"X-API-Key","type":"apiKey"},"bearer":{"bearerFormat":"gt_live_…","scheme":"bearer","type":"http"}}},"info":{"description":"Live big wins, high rollers, observed RTP, races and on-chain deposits, withdrawals and reserves for over 40 gambling sites (crypto casinos and CS2 case sites), plus the casinos' public chats, as JSON. This is the API behind [gambatracker.com](https://gambatracker.com).\n\n**Base URL:** `https://gambatracker.com/api` (every path below is relative to it). The live WebSocket is `wss://gambatracker.com/api/ws`.\n\n## Keys and limits\n\nA key is optional. Without one you are *anonymous*, limited per IP address (IPv6 per /64). A free key needs no account: request one at `POST /keys/request` and confirm the emailed link. Paid keys with custom limits are arranged with us.\n\nSend the key as `X-API-Key: gt_live_…` or `Authorization: Bearer gt_live_…`. A malformed, unknown or revoked key is `401`, never silently anonymous.\n\n| Tier | Requests a minute | Burst | Requests a day |\n| --- | --- | --- | --- |\n| anonymous (per IP) | 120 | 240 | 20000 |\n| free key | 300 | 300 | 50000 |\n| paid key | 1200 | 1200 | 1000000 |\n\nEach caller has a token bucket: it holds *burst* requests and refills at the per-minute rate; the daily quota starts over at 00:00 UTC. Every answer says where you stand:\n\n- `RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset` (seconds until the bucket is full) and `RateLimit-Policy`;\n- `X-Quota-Limit`, `X-Quota-Remaining`, `X-Quota-Reset` for the day, and `X-Api-Tier`.\n\nOver the limit the answer is `429` with `Retry-After` and `{\"error\": {\"code\": \"rate.limited\", \"params\": {\"tier\", \"limit\": \"minute\" | \"day\", \"retry_after\"}}}`. The API runs as one instance, so limits are exact, and a restart refills every bucket.\n\n## Conventions\n\n- Lists take `limit` (default 50, max 200) and, where paged, `cursor` (the previous page's `next`).\n- `window` is `10m | 1h | 24h | 7d | 30d | all`. Money is in USD unless a field says otherwise; timestamps are RFC 3339 UTC; `Series` are `[unix ms, value]` pairs.\n- Figures carry how they were measured: `observed` (summed from the bets a public feed showed, a floor), `estimated` (read from a casino's own public counter of bets or wager) or `onchain`. A casino's `coverage.wager_basis` says how its `wager_24h` was produced; an observed wager is never multiplied up by `sample_ratio`, because feeds do not show a fair sample of stakes.\n- Errors are `{\"error\": {\"code\": string, \"params\": object}}`, e.g. `window.invalid`, `not_found`, `rate.limited`.\n- CORS: `GET` from any origin, without credentials.\n- Answers carry `Cache-Control`; polling faster than `max-age` returns the same body.\n\n## Data and terms\n\n- **Feeds are samples.** Casinos publish a slice of their bets; `all` feeds are typically 1–10 bets a second, and curated feeds only show wins or high stakes. Treat counts and RTP as estimates from a sample, with the confidence intervals given.\n- **Attribution required:** show \"Data: gambatracker.com\" with a link wherever you display or publish the data.\n- **No reselling raw data:** don't sell, sublicense or redistribute the API's answers as a dataset or feed of your own. Building products, analysis and content on top of it is fine.\n- Player names are what casinos publish; hidden and opted-out players are never named. Don't use the API to identify or contact players.\n- Keys that break these terms or the limits may be revoked. The API comes as is, without warranty.\n","license":{"identifier":"UNLICENSED","name":"UNLICENSED"},"title":"gambatracker API","version":"0.1.0"},"openapi":"3.1.0","paths":{"/activity":{"get":{"description":"Sampled bets by UTC weekday (0 = Monday) and hour for one game, casino, provider or kind of original, summed over the window: when the public feeds we read showed people playing. Every distinct bet counts once; a feed is a sample, so the figures are a floor. Counts start at the tracking start when the window reaches further back.","operationId":"activity","parameters":[{"description":"`game`, `casino`, `provider` or `originals`: what `slug` names.","in":"query","name":"scope","required":true,"schema":{"description":"What `/v1/activity` counts the bets of.","enum":["game","casino","provider","originals"],"type":"string"}},{"description":"The game, casino or provider slug, or the kind of original (`dice`).","example":"gates-of-olympus","in":"query","name":"slug","required":true,"schema":{"type":"string"}},{"description":"Keep the grid to one casino (every scope but `casino`).","in":"query","name":"casino","required":false,"schema":{"type":"string"}},{"description":"`24h`, `7d`, `30d`, `90d` or `all` (default `all`, which counts from the tracking start).","in":"query","name":"window","required":false,"schema":{"enum":["24h","7d","30d","90d","all"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`scope.invalid`, `slug.invalid`, `casino.invalid` or `window.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`: no such game, casino, provider or kind"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"When players play","tags":["Games"]}},"/battles":{"get":{"description":"Finished (default) or cancelled battles, newest or biggest first, counted from each site's tracking start. Running battles are only on the `battles` WebSocket topic.","operationId":"battles","parameters":[{"description":"Time window (default `24h`).","in":"query","name":"window","required":false,"schema":{"enum":["10m","1h","24h","7d","30d","90d","all"],"type":"string"}},{"description":"Case site slug.","in":"query","name":"casino","required":false,"schema":{"type":"string"}},{"description":"`1v1`, `2v2`, `1v1v1`, …","in":"query","name":"mode","required":false,"schema":{"type":"string"}},{"description":"Default `finished`.","in":"query","name":"status","required":false,"schema":{"enum":["finished","cancelled"],"type":"string"}},{"description":"Default `ts`.","in":"query","name":"sort","required":false,"schema":{"enum":["ts","value","cost"],"type":"string"}},{"description":"Rows per page, 1–200 (default 50).","in":"query","name":"limit","required":false,"schema":{"format":"int32","minimum":0,"type":"integer"}},{"description":"`next` of the previous page.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BattlesResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`window.invalid`, `status.invalid`, `sort.invalid`, `limit.invalid` or `cursor.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`: `casino` is not a case site"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Case battles","tags":["Case sites"]}},"/battles/stats":{"get":{"description":"Battles per site, mode and variant: count, seats and bot seats, entry money in, value unboxed and their ratio, counted from each site's tracking start.","operationId":"stats","parameters":[{"description":"Time window (default `7d`).","in":"query","name":"window","required":false,"schema":{"enum":["10m","1h","24h","7d","30d","90d","all"],"type":"string"}},{"description":"Case site slug.","in":"query","name":"casino","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BattleStatsResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`window.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`: `casino` is not a case site"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Battle stats","tags":["Case sites"]}},"/bets":{"get":{"description":"The live firehose (raw bets, kept 90 days) or the notable bets kept forever: big wins, high rollers and lucky bets.","operationId":"bets","parameters":[{"description":"`live` (default; raw bets, window `1h` by default), `big-wins` (payout above stake), `high-rollers` (stake ≥ $1 000) or `lucky` (≥ 100x on ≥ $0.10).","in":"query","name":"feed","required":false,"schema":{"enum":["live","big-wins","high-rollers","lucky"],"type":"string"}},{"description":"Time window (default `1h` for `live`, else `24h`).","in":"query","name":"window","required":false,"schema":{"enum":["10m","1h","24h","7d","30d","90d","all"],"type":"string"}},{"description":"Casino slug.","in":"query","name":"casino","required":false,"schema":{"type":"string"}},{"in":"query","name":"kind","required":false,"schema":{"enum":["slots","originals","live","table","sports","other"],"type":"string"}},{"description":"Provider slug.","in":"query","name":"provider","required":false,"schema":{"type":"string"}},{"description":"Game slug.","in":"query","name":"game","required":false,"schema":{"type":"string"}},{"description":"Minimum stake in USD.","in":"query","name":"min_bet","required":false,"schema":{"format":"double","type":"number"}},{"description":"Default: `ts` for `live`, `payout` for big wins, `amount` for high rollers, `multiplier` for lucky.","in":"query","name":"sort","required":false,"schema":{"enum":["payout","multiplier","amount","ts"],"type":"string"}},{"description":"Rows per page, 1–200 (default 50).","in":"query","name":"limit","required":false,"schema":{"format":"int32","minimum":0,"type":"integer"}},{"description":"`next` of the previous page.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}},{"description":"`casino` or `case_site`: one category only (default both). A hybrid\ncase site (`CasinoRef.hybrid`) is in both.","in":"query","name":"category","required":false,"schema":{"description":"`case_site`: a CS2 skin and case-opening site, `casino` for everything else.\nA case site with `CasinoRef.hybrid` is in both.","enum":["casino","case_site"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BetsResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`feed.invalid`, `window.invalid`, `kind.invalid`, `min_bet.invalid`, `sort.invalid`, `limit.invalid`, `cursor.invalid` or `category.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Bet feeds","tags":["Bets"]}},"/blog/feed":{"get":{"description":"The 20 newest published posts with their bodies, for the RSS feed at /blog/rss.xml.","operationId":"feed","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogFeedResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Blog feed","tags":["Blog"]}},"/blog/posts":{"get":{"description":"Published posts, newest first, without their bodies. Every figure in a post comes from the tracker's data at `data_as_of` or from a source it lists.","operationId":"list","parameters":[{"description":"A category slug: `records`, `high-rollers`, `slots`, `originals`, `rtp`, `on-chain`, `case-sites`, `streamers`, `recaps`, `industry` or `guides`.","in":"query","name":"category","required":false,"schema":{"type":"string"}},{"description":"Only posts with this tag.","in":"query","name":"tag","required":false,"schema":{"type":"string"}},{"description":"From 1.","in":"query","name":"page","required":false,"schema":{"format":"int32","minimum":0,"type":"integer"}},{"description":"Posts per page, 12 by default, at most 50.","in":"query","name":"limit","required":false,"schema":{"format":"int32","minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogListResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`category.invalid`, `tag.invalid`, `page.invalid` or `limit.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Blog posts","tags":["Blog"]}},"/blog/posts/{slug}":{"get":{"description":"A published post with its rendered body, table of contents and sources, the posts before and after it and up to 3 related ones.","operationId":"post","parameters":[{"description":"The post's slug","example":"biggest-crypto-casino-wins-of-all-time","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogPostResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`: no such post, or one that isn't published"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"One blog post","tags":["Blog"]}},"/blog/sitemap":{"get":{"description":"Every published post with its category, tags and dates, for /sitemaps/blog.xml.","operationId":"sitemap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogSitemapResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Blog sitemap","tags":["Blog"]}},"/case-leaderboards/months":{"get":{"description":"Months with case-site drops since the first case site was tracked, newest first.","operationId":"months","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonthsResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Months with case-site leaderboards","tags":["Case sites"]}},"/case-leaderboards/{month}":{"get":{"description":"Counted from each site's tracking start: `since` is where the counts start when the first site began during the month. A month before any case site was tracked or without data is 404; the current month always answers once one was.","operationId":"month","parameters":[{"description":"`YYYY-MM`","example":"2026-11","in":"path","name":"month","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseLeaderboardResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`month.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"One month's case-site leaderboards","tags":["Case sites"]}},"/case-sites":{"get":{"description":"CS2 skin and case-opening sites: openings seen in 24 h (observed; most sites publish part of them), what they cost and paid at the site's own item values, battles, upgrades, the catalog with published odds and the coin's USD rate. `affiliate` is `null` where the site is restricted in the caller's country.","operationId":"list","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseSitesResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Every case site","tags":["Case sites"]}},"/case-sites/compare":{"get":{"operationId":"compare","parameters":[{"description":"2–4 case-site slugs, comma-separated, in the order to show.","example":"clash,csgoroll","in":"query","name":"sites","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseCompareResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`compare.sites`: not 2–4 known case-site slugs"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Compare case sites","tags":["Case sites"]}},"/case-sites/{slug}":{"get":{"operationId":"site","parameters":[{"description":"Case site slug, e.g. `clash`","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseSiteDetailResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`: no such case site"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"One case site","tags":["Case sites"]}},"/cases":{"get":{"description":"Cases with what they did over the window: most opened, money in, best or worst observed RTP (cases with an adequate sample only), the furthest below what the odds advertise (`deviation`, by z), or every catalog case by advertised RTP (`advertised`) or price. Counted from each site's tracking start.","operationId":"cases","parameters":[{"description":"Case site slug.","in":"query","name":"casino","required":false,"schema":{"type":"string"}},{"description":"Time window (default `7d`).","in":"query","name":"window","required":false,"schema":{"enum":["10m","1h","24h","7d","30d","90d","all"],"type":"string"}},{"description":"Default `opened`. The RTP sorts list only cases with an adequate sample.","in":"query","name":"sort","required":false,"schema":{"enum":["opened","wagered","best_rtp","worst_rtp","deviation","advertised","price"],"type":"string"}},{"description":"Part of the case's name.","in":"query","name":"q","required":false,"schema":{"type":"string"}},{"description":"Rows per page, 1–200 (default 50).","in":"query","name":"limit","required":false,"schema":{"format":"int32","minimum":0,"type":"integer"}},{"description":"`next` of the previous page.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CasesResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`window.invalid`, `sort.invalid`, `limit.invalid` or `cursor.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`: `casino` is not a case site"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Case boards","tags":["Case sites"]}},"/cases/{casino}/{slug}":{"get":{"description":"A case's published odds and item values, its advertised EV and RTP, the observed RTP per window against what was advertised for the same openings, how often each item dropped against its odds (over `window`, default `30d`, at most the 90 days raw drops are kept), the biggest drops and the catalog captures.","operationId":"case","parameters":[{"description":"Case site slug","in":"path","name":"casino","required":true,"schema":{"type":"string"}},{"description":"Case slug within the site","in":"path","name":"slug","required":true,"schema":{"type":"string"}},{"description":"Window of the item hit counts: `24h`, `7d`, `30d` (default) or `all` (raw drops are kept 90 days).","in":"query","name":"window","required":false,"schema":{"enum":["10m","1h","24h","7d","30d","90d","all"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`window.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"One case","tags":["Case sites"]}},"/casinos":{"get":{"description":"Every casino and case site (or one `category`), in display order.","operationId":"casinos","parameters":[{"description":"`casino` or `case_site`: one category only (default both). A hybrid\ncase site (`CasinoRef.hybrid`) is in both.","in":"query","name":"category","required":false,"schema":{"description":"`case_site`: a CS2 skin and case-opening site, `casino` for everything else.\nA case site with `CasinoRef.hybrid` is in both.","enum":["casino","case_site"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CasinosResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`category.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Every casino","tags":["Casinos"]}},"/casinos/{slug}":{"get":{"operationId":"casino","parameters":[{"description":"Casino slug, e.g. `stake`","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CasinoDetailResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"One casino","tags":["Casinos"]}},"/chat":{"get":{"description":"The latest lines of the casinos' public chats, newest first, after moderation: plain text (render it as text, never as HTML), links as `[link]`, contact details masked, slurs, scams, promo spam and floods dropped. `sources` lists every tracked casino's chat: `live`, `off` (switched off) or `unavailable` (no chat a guest can read, or not read right now). Lines are kept 6 hours at most. `before` (and `before_id`) pages back from the oldest line a client holds. Live lines: WebSocket topics `chat` and `chat:<casino>`.","operationId":"chat","parameters":[{"description":"Casino slugs, comma-separated (`stake,shuffle`). All tracked casinos without.","in":"query","name":"casino","required":false,"schema":{"type":"string"}},{"description":"Lines, newest first: 50 by default, at most 200.","in":"query","name":"limit","required":false,"schema":{"format":"int32","minimum":0,"type":"integer"}},{"description":"Only lines older than this one (RFC 3339): the `ts` of the oldest line a\nclient holds, to scroll back.","in":"query","name":"before","required":false,"schema":{"type":"string"}},{"description":"With `before`: that line's `id`, so lines of the same instant aren't skipped.","in":"query","name":"before_id","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`limit.invalid`, `before.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Global chat","tags":["Chat"]}},"/compare":{"get":{"operationId":"compare","parameters":[{"description":"2–4 casino slugs, comma-separated, in the order to show.","example":"stake,shuffle","in":"query","name":"casinos","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompareResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`compare.casinos`: not 2–4 known slugs"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Compare casinos","tags":["Casinos"]}},"/crash/{casino}":{"get":{"description":"The edge measured from every public round, the survival curve against the theoretical one, and the latest rounds.","operationId":"history","parameters":[{"description":"Casino slug","in":"path","name":"casino","required":true,"schema":{"type":"string"}},{"description":"Default `crash`.","in":"query","name":"game","required":false,"schema":{"enum":["crash","slide"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrashResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`game.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Crash or slide rounds","tags":["Crash"]}},"/drops":{"get":{"description":"The live drop stream (raw drops, kept 90 days, window `1h` by default) or the notable drops kept forever (value ≥ $500, or ≥ 50x on ≥ $0.10): `top` by value, `lucky` by multiplier. Windows count from each site's tracking start. `case` needs `casino`.","operationId":"drops","parameters":[{"description":"`live` (default; raw drops, window `1h` by default), `top` (notable drops by value) or `lucky` (≥ 50x on ≥ $0.10).","in":"query","name":"feed","required":false,"schema":{"enum":["live","top","lucky"],"type":"string"}},{"description":"Time window (default `1h` for `live`, else `24h`); `all` is since each site's tracking start.","in":"query","name":"window","required":false,"schema":{"enum":["10m","1h","24h","7d","30d","90d","all"],"type":"string"}},{"description":"Case site slug.","in":"query","name":"casino","required":false,"schema":{"type":"string"}},{"description":"Case slug within `casino`.","in":"query","name":"case","required":false,"schema":{"type":"string"}},{"description":"Item slug.","in":"query","name":"item","required":false,"schema":{"type":"string"}},{"in":"query","name":"origin","required":false,"schema":{"enum":["case","battle","free"],"type":"string"}},{"description":"Minimum item value in USD.","in":"query","name":"min_value","required":false,"schema":{"format":"double","type":"number"}},{"description":"Default: `ts` for `live`, `value` for `top`, `multiplier` for `lucky`.","in":"query","name":"sort","required":false,"schema":{"enum":["value","multiplier","price","ts"],"type":"string"}},{"description":"Rows per page, 1–200 (default 50).","in":"query","name":"limit","required":false,"schema":{"format":"int32","minimum":0,"type":"integer"}},{"description":"`next` of the previous page.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DropsResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`feed.invalid`, `window.invalid`, `origin.invalid`, `min_value.invalid`, `sort.invalid`, `case.casino`, `limit.invalid` or `cursor.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`: `casino` is not a case site"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Case drops","tags":["Case sites"]}},"/figures":{"get":{"description":"For every casino that publishes an RTP for a slot whose studio publishes one too (`game_facts.rtp`), how its figures compare: `mismatches` are figures that are none of the studio's RTP versions, split into `more` (above the nearest studio figure) and `less` (below it). `lower_versions` are figures that are a version below the studio's highest, `split_games` games it lists with two figures. Figures within 0.02 percentage points (`tolerance_pp`) count as the same. A casino's latest figure per game code counts, codes with the same figure once; originals and slots without a studio RTP take no part. Most mismatches first, then by name. A figure that isn't the studio's can be a mistake in the casino's catalog or a configuration the studio doesn't list; this says only that they disagree.","operationId":"list","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FiguresResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Published figures","tags":["Casinos"]}},"/figures/{casino}":{"get":{"description":"One casino's RTPs set against its slots' studios (see `/figures`), with a page of one `kind` of row: `mismatch` (default), a figure that is none of the studio's versions, with the gap to the nearest one (the higher of two as near); `lower`, a figure that is a studio version below the highest, with the gap to the highest; `split`, a game the casino lists with figures more than 0.02 points apart, every figure in `figures` and the gap between its highest and lowest. Gaps are signed percentage points; rows run by the largest gap, then by game slug. `same_gap` is set when 5 or more mismatches share one gap rounded to 0.01 points (the most common such gap).","operationId":"casino","parameters":[{"description":"Casino slug, e.g. `duel`","in":"path","name":"casino","required":true,"schema":{"type":"string"}},{"description":"Which rows: `mismatch` (default), `lower` or `split`.","in":"query","name":"kind","required":false,"schema":{"description":"Which disagreement a published-figures row shows (docs/contracts.md\n\"Published figures\").","enum":["mismatch","lower","split"],"type":"string"}},{"description":"Rows to answer, 1–200 (default 100).","in":"query","name":"limit","required":false,"schema":{"format":"int32","minimum":0,"type":"integer"}},{"description":"An earlier page's `next`.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FiguresCasinoResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`kind.invalid`, `limit.invalid` or `cursor.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`: no such casino"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"One casino's published figures","tags":["Casinos"]}},"/flows":{"get":{"description":"Transfers to and from casino wallets on public chains, by casino and chain, with the whale transfers. Each chain counts from its scanner's start: earlier transfers are wallet history found later, not a full record.","operationId":"flows","parameters":[{"description":"Time window (default `30d`).","in":"query","name":"window","required":false,"schema":{"enum":["10m","1h","24h","7d","30d","90d","all"],"type":"string"}},{"description":"Casino slug.","in":"query","name":"casino","required":false,"schema":{"type":"string"}},{"description":"`btc`, `ltc`, `doge`, `eth`, `bsc`, `tron`, `sol`, `polygon`, `base`,\n`arbitrum` or `xrp`.","in":"query","name":"chain","required":false,"schema":{"type":"string"}},{"description":"`casino` or `case_site`: one category only (default both). A hybrid\ncase site (`CasinoRef.hybrid`) is in both.","in":"query","name":"category","required":false,"schema":{"description":"`case_site`: a CS2 skin and case-opening site, `casino` for everything else.\nA case site with `CasinoRef.hybrid` is in both.","enum":["casino","case_site"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlowsResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`window.invalid` or `category.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Deposits and withdrawals","tags":["On-chain"]}},"/games":{"get":{"description":"Games by their observed figures in the window. With a filter or sort on the studios' facts (`volatility`, `feature`, `max_win_min`, `rtp_min`, `released`, `demo`, `sort=released|max_win|official_rtp`) it is the slot finder: every catalog game that matches, up to 20 000, with or without bets in the window (those after the played ones when sorting by a figure, by name). Every row carries the studio's `facts` where the studio's site lists the game.","operationId":"games","parameters":[{"in":"query","name":"kind","required":false,"schema":{"enum":["slots","originals","live","table","sports","other"],"type":"string"}},{"description":"Provider slug.","in":"query","name":"provider","required":false,"schema":{"type":"string"}},{"description":"Casino slug. With a facts filter or sort: games seen at the casino, with its figures.","in":"query","name":"casino","required":false,"schema":{"type":"string"}},{"description":"Time window (default `24h`).","in":"query","name":"window","required":false,"schema":{"enum":["10m","1h","24h","7d","30d","90d","all"],"type":"string"}},{"description":"Default `wagered`. `released`, `max_win` and `official_rtp` sort by the studios' facts, games without the fact last.","in":"query","name":"sort","required":false,"schema":{"enum":["wagered","bets","max_multiplier","max_payout","rtp","released","max_win","official_rtp"],"type":"string"}},{"description":"Part of the game's name.","in":"query","name":"q","required":false,"schema":{"type":"string"}},{"description":"Studio volatility, any of a comma list: `low`, `low-medium`, `medium`, `medium-high`, `high`, `very-high`.","example":"high,very-high","in":"query","name":"volatility","required":false,"schema":{"type":"string"}},{"description":"Studio features the game has all of, a comma list of `GameFeature`s.","example":"bonus_buy,megaways","in":"query","name":"feature","required":false,"schema":{"type":"string"}},{"description":"The studio's max win is at least this many times the bet.","in":"query","name":"max_win_min","required":false,"schema":{"format":"double","type":"number"}},{"description":"The studio's highest RTP version is at least this, 0..1.","example":0.96,"in":"query","name":"rtp_min","required":false,"schema":{"format":"double","type":"number"}},{"description":"Released by the studio within this many days up to today (UTC); upcoming games are left out.","in":"query","name":"released","required":false,"schema":{"enum":["30d","90d","365d"],"type":"string"}},{"description":"`1`: games with a studio demo (embedded or a link). The game page still hides it in countries without demos.","in":"query","name":"demo","required":false,"schema":{"type":"boolean"}},{"description":"Rows per page, 1–200 (default 50).","in":"query","name":"limit","required":false,"schema":{"format":"int32","minimum":0,"type":"integer"}},{"description":"`next` of the previous page.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GamesResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`window.invalid`, `sort.invalid`, `kind.invalid`, `volatility.invalid`, `feature.invalid`, `max_win_min.invalid`, `rtp_min.invalid`, `released.invalid`, `demo.invalid`, `limit.invalid` or `cursor.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Games","tags":["Games"]}},"/games/new":{"get":{"description":"Games first seen recently (not from the seeded catalog), newest first, with the first casino and first big win.","operationId":"new_games","parameters":[{"description":"Rows to answer, 1–200 (default 50).","in":"query","name":"limit","required":false,"schema":{"format":"int32","minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewGamesResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"New games","tags":["Games"]}},"/games/releases":{"get":{"description":"Catalog games by the release date their studio's own site gives, newest first (`released`, then the game id), dates after today (UTC) marked `upcoming`. A date before 1995-01-01 or more than 365 days after today counts as none: the studios' dates can be wrong or missing. `first_seen` and `first_casino` are the new slot radar's (`/games/new`), null for games the casinos already listed when their tracking began; `lag_days` runs from the studio's date to that first sighting.","operationId":"releases","parameters":[{"description":"Provider slug.","in":"query","name":"provider","required":false,"schema":{"type":"string"}},{"description":"Released on or after this day, `YYYY-MM-DD` (default and floor 1995-01-01).","example":"2026-01-01","in":"query","name":"from","required":false,"schema":{"type":"string"}},{"description":"Released on or before this day, `YYYY-MM-DD` (default and cap: 365 days after today, UTC).","example":"2026-12-31","in":"query","name":"to","required":false,"schema":{"type":"string"}},{"description":"Rows to answer, 1–200 (default 50).","in":"query","name":"limit","required":false,"schema":{"format":"int32","minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleasesResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`from.invalid`, `to.invalid` or `limit.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Studio releases","tags":["Games"]}},"/games/{slug}":{"get":{"operationId":"game","parameters":[{"description":"Game slug, e.g. `gates-of-olympus`. A duplicate's old slug answers with the game it was merged into (its `game.slug` differs).","in":"path","name":"slug","required":true,"schema":{"type":"string"}},{"description":"Time window (default `24h`).","in":"query","name":"window","required":false,"schema":{"enum":["10m","1h","24h","7d","30d","90d","all"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameDetailResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"One game","tags":["Games"]}},"/games/{slug}/demo-report":{"post":{"description":"\"Demo not working?\": flags the game's demo for the admin, who can turn it off. One open report per network and game (repeats answer `ok` and change nothing). Needs the site's `Origin` and `x-gamba-csrf: 1`. Limited to 10 an hour per network.","operationId":"report","parameters":[{"description":"Game slug","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoReport"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewOk"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`body.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`auth.csrf`"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`: no such game, or it has no demo"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`demo.rate_limited`"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Report a broken demo","tags":["Games"]}},"/go/{casino}":{"get":{"description":"Redirects to the casino: our affiliate link where it may be shown, the casino's page on gambatracker where it is restricted in the caller's country, else its homepage. `game` is a numeric game id; when an alias exists and a template keeps the referral, the Location is that game URL. Other query keys are ignored. Public on gambatracker.com as `/go/{casino}`.","operationId":"go","parameters":[{"description":"Casino slug","in":"path","name":"casino","required":true,"schema":{"type":"string"}},{"description":"Game id; digits only","in":"query","name":"game","required":false,"schema":{"format":"int64","type":"integer"}}],"responses":{"302":{"description":"To the casino"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Casino link","tags":["Casinos"]}},"/health":{"get":{"description":"Whether the api reaches Postgres and ClickHouse.","operationId":"health","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}},"description":"A database is down"}},"summary":"Health","tags":["Meta"]}},"/insights":{"get":{"description":"Deposit and withdrawal statistics across the tracked casinos (or case sites): averages and medians, distinct depositing addresses, new against returning ones, size bands, chain mix, the weekday and hour heatmap, concentration, overlap between sites and the largest addresses, truncated. Only the tracked wallets and chains count, from each chain's scanner start; transfers with registry-known counterparties (the site's own wallets, other tracked sites', exchanges', payment processors') are left out and totalled in `basis.excluded`. Refreshed every few minutes.","operationId":"overview","parameters":[{"description":"Whole UTC days up to and including today (default `30d`).","in":"query","name":"window","required":false,"schema":{"description":"Whole UTC days up to and including today.","enum":["7d","30d","90d"],"type":"string"}},{"description":"`casino` (default) or `case_site`.","in":"query","name":"category","required":false,"schema":{"description":"`case_site`: a CS2 skin and case-opening site, `casino` for everything else.\nA case site with `CasinoRef.hybrid` is in both.","enum":["casino","case_site"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsightsResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`window.invalid` or `category.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"On-chain insights","tags":["On-chain"]}},"/insights/{slug}":{"get":{"description":"The same statistics for one casino or case site, with its rank and share among its category, the sites its depositing addresses also used, weekly cohorts of new depositing addresses and its reserves next to its net flow.","operationId":"casino","parameters":[{"description":"Casino or case-site slug, e.g. `stake`","in":"path","name":"slug","required":true,"schema":{"type":"string"}},{"description":"Whole UTC days up to and including today (default `30d`).","in":"query","name":"window","required":false,"schema":{"description":"Whole UTC days up to and including today.","enum":["7d","30d","90d"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CasinoInsightsResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`window.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"One site's on-chain insights","tags":["On-chain"]}},"/items":{"get":{"description":"Items dropped on the case sites over the window, most dropped or most valuable first; `q` searches item names.","operationId":"items","parameters":[{"description":"Part of the item's name.","in":"query","name":"q","required":false,"schema":{"type":"string"}},{"description":"`weapon`, `knife`, `gloves`, `sticker`, `agent`, `container`, `charm`, `patch`, `music_kit`, `graffiti`, `pin` or `other`.","in":"query","name":"kind","required":false,"schema":{"type":"string"}},{"description":"Time window (default `7d`).","in":"query","name":"window","required":false,"schema":{"enum":["10m","1h","24h","7d","30d","90d","all"],"type":"string"}},{"description":"Default `drops`; `value` is the highest single drop.","in":"query","name":"sort","required":false,"schema":{"enum":["drops","value"],"type":"string"}},{"description":"Rows per page, 1–200 (default 50).","in":"query","name":"limit","required":false,"schema":{"format":"int32","minimum":0,"type":"integer"}},{"description":"`next` of the previous page.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemsResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`window.invalid`, `sort.invalid`, `kind.invalid`, `limit.invalid` or `cursor.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"CS2 items","tags":["Case sites"]}},"/items/{slug}":{"get":{"description":"Where the item dropped and at what value (each site's own valuation), the cases that list it with their odds, its biggest drops and its daily average drop value over 90 days.","operationId":"item","parameters":[{"description":"Item slug, e.g. `ak-47-redline-field-tested`","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"One CS2 item","tags":["Case sites"]}},"/jackpots":{"get":{"operationId":"jackpots","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JackpotsResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Jackpots","tags":["Races & jackpots"]}},"/keys/confirm":{"post":{"description":"Takes the token from the emailed link (`#token=…`) and answers the new free key. This is the only time the key is shown; gambatracker keeps only its SHA-256.","operationId":"confirm","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyConfirm"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreated"}}},"description":"The new key, shown once","headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`keys.token`: no such link"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`keys.limit`: the address already holds 3 active keys"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`keys.used` (the link already made its key) or `keys.expired`"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Create the key from a confirmation link","tags":["Keys"]}},"/keys/me":{"get":{"description":"Needs a key. The key's tier and limits, and its requests over the last 30 UTC days (oldest first, today last).","operationId":"me","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyUsage"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`api_key.required`: call it with your key"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"The calling key and its usage","tags":["Keys"]}},"/keys/request":{"post":{"description":"Sends a confirmation link to `email`; opening it creates a free key, shown once. No account needed. At most 3 active keys and 3 confirmation emails a day per address; per IP, 5 requests at once, one more a minute and 20 a day. The link works for 24 hours.","operationId":"request","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyRequested"}}},"description":"The confirmation email is on its way","headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`email.invalid`, `name.invalid`, `use_case.invalid` or `body.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`keys.limit`: the address already holds 3 active keys"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`email.unavailable`: the email couldn't be sent"}},"summary":"Request a free API key","tags":["Keys"]}},"/leaderboards/months":{"get":{"description":"Months with bets since tracking started, newest first; months before it have no leaderboard.","operationId":"months","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonthsResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Months with leaderboards","tags":["Leaderboards"]}},"/leaderboards/streamers":{"get":{"description":"Each streamer's best win in a window or month, best first, marked with the session it happened in.","operationId":"leaderboard","parameters":[{"description":"Time window (default `30d`); ignored with `month`.","in":"query","name":"window","required":false,"schema":{"enum":["10m","1h","24h","7d","30d","90d","all"],"type":"string"}},{"description":"A `YYYY-MM` month instead of a window.","example":"2026-10","in":"query","name":"month","required":false,"schema":{"type":"string"}},{"description":"Casino slug.","in":"query","name":"casino","required":false,"schema":{"type":"string"}},{"description":"Game slug.","in":"query","name":"game","required":false,"schema":{"type":"string"}},{"description":"Default `payout`.","in":"query","name":"sort","required":false,"schema":{"enum":["payout","multiplier"],"type":"string"}},{"description":"Rows, 1–200 (default 50).","in":"query","name":"limit","required":false,"schema":{"format":"int32","minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreamerLeaderboardResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`window.invalid`, `month.invalid`, `sort.invalid`, `limit.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`: a `month` in the future or before tracking started"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Streamers' biggest wins","tags":["Streamers"]}},"/leaderboards/{month}":{"get":{"description":"Counted from the tracking start: `since` is where the counts start when tracking began during the month. A month before tracking started or without data is 404; the current month always answers.","operationId":"month","parameters":[{"description":"`YYYY-MM`","example":"2026-11","in":"path","name":"month","required":true,"schema":{"type":"string"}},{"description":"`casino` or `case_site`: one category only (default both). A hybrid\ncase site (`CasinoRef.hybrid`) is in both.","in":"query","name":"category","required":false,"schema":{"description":"`case_site`: a CS2 skin and case-opening site, `casino` for everything else.\nA case site with `CasinoRef.hybrid` is in both.","enum":["casino","case_site"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaderboardResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`month.invalid` or `category.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`: a future month, one before tracking started or one without data"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"One month's leaderboards","tags":["Leaderboards"]}},"/max-wins":{"get":{"description":"Bets that reached the max win the game's studio publishes, newest first, from the tracking start: not a bonus buy, a stake of at least $0.10 and a multiplier within 2% of the max win (ante and feature-bet stakes pay a little under it). Only games with a published max win of at least 100x take part, and not those where such a bet went more than 2% past it: that figure isn't the game's cap. `hits` and `games` count every hit of the filter. A record of what the public feeds showed, not a forecast.","operationId":"max_wins","parameters":[{"description":"Game slug.","in":"query","name":"game","required":false,"schema":{"type":"string"}},{"description":"Provider slug.","in":"query","name":"provider","required":false,"schema":{"type":"string"}},{"description":"Casino slug.","in":"query","name":"casino","required":false,"schema":{"type":"string"}},{"description":"Hits per page, 1–200 (default 50).","in":"query","name":"limit","required":false,"schema":{"format":"int32","minimum":0,"type":"integer"}},{"description":"An earlier page's `next`.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaxWinsResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`limit.invalid` or `cursor.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Max win hits","tags":["Bets"]}},"/newsletter/confirm":{"post":{"description":"The token from the confirmation email's link, valid for 7 days.","operationId":"confirm","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterToken"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterAnswer"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`newsletter.token`"},"410":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`newsletter.expired`"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Confirm a subscription","tags":["Newsletter"]}},"/newsletter/subscribe":{"post":{"description":"Double opt-in: a confirmation link goes to the address, and nothing else is sent until it is opened. The answer is `pending` whether or not the address was already subscribed. Limited per IP; a filled `website` field is answered as subscribed and stores nothing.","operationId":"subscribe","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterSubscribe"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterAnswer"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`newsletter.email` or `body.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`rate_limited`"},"500":{"$ref":"#/components/responses/ServerError"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`newsletter.unavailable`"}},"summary":"Subscribe to the monthly report","tags":["Newsletter"]}},"/newsletter/unsubscribe":{"get":{"operationId":"unsubscribe_page","parameters":[{"description":"From the email","in":"query","name":"token","required":true,"schema":{"type":"string"}}],"responses":{"303":{"description":"To `/newsletter/unsubscribe?token=…` on the site, which unsubscribes and shows the result"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Unsubscribe link","tags":["Newsletter"]},"post":{"description":"`{ token }` as JSON, or RFC 8058 one-click: `?token=…` with the form body `List-Unsubscribe=One-Click`. Answers 200 without a redirect, also when already unsubscribed.","operationId":"unsubscribe","parameters":[{"description":"For the one-click POST","in":"query","name":"token","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterToken"}}},"description":"Or the form body `List-Unsubscribe=One-Click` with `?token=`","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterAnswer"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`newsletter.token`"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Unsubscribe","tags":["Newsletter"]}},"/overview":{"get":{"description":"Totals across casinos and case sites (or one `category`), every row, the day's biggest wins and the headline series. `affiliate` is `null` where the casino is restricted in the caller's country.","operationId":"overview","parameters":[{"description":"`casino` or `case_site`: one category only (default both). A hybrid\ncase site (`CasinoRef.hybrid`) is in both.","in":"query","name":"category","required":false,"schema":{"description":"`case_site`: a CS2 skin and case-opening site, `casino` for everything else.\nA case site with `CasinoRef.hybrid` is in both.","enum":["casino","case_site"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OverviewResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`category.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Market overview","tags":["Casinos"]}},"/players/{casino}/{name}":{"get":{"description":"`name` matches case-insensitively within the casino; `player.name` is the most active casing. A masked name (`Pat****`) is only a page with its player id appended (`Pat****-12345`, as in `player.id`). Hidden and opted-out players are 404.","operationId":"player","parameters":[{"description":"Casino slug","in":"path","name":"casino","required":true,"schema":{"type":"string"}},{"description":"The player's public name, or a masked name with `-<id>`","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"One public player","tags":["Players"]}},"/providers":{"get":{"operationId":"providers","parameters":[{"description":"Time window (default `24h`).","in":"query","name":"window","required":false,"schema":{"enum":["10m","1h","24h","7d","30d","90d","all"],"type":"string"}},{"description":"Casino slug.","in":"query","name":"casino","required":false,"schema":{"type":"string"}},{"description":"Rows, 1–200 (default 50).","in":"query","name":"limit","required":false,"schema":{"format":"int32","minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvidersResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Providers","tags":["Games"]}},"/providers/{slug}":{"get":{"operationId":"provider","parameters":[{"description":"Provider slug, e.g. `pragmatic-play`. A retired spelling answers with the provider it was folded into (its `provider.slug` differs).","in":"path","name":"slug","required":true,"schema":{"type":"string"}},{"description":"Time window (default `24h`).","in":"query","name":"window","required":false,"schema":{"enum":["10m","1h","24h","7d","30d","90d","all"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderDetailResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"One provider","tags":["Games"]}},"/races":{"get":{"operationId":"races","parameters":[{"in":"query","name":"status","required":false,"schema":{"enum":["active","ended"],"type":"string"}},{"description":"Casino slug.","in":"query","name":"casino","required":false,"schema":{"type":"string"}},{"description":"Races, 1–200 (default 50).","in":"query","name":"limit","required":false,"schema":{"format":"int32","minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RacesResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`status.invalid` or `limit.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Wager races","tags":["Races & jackpots"]}},"/records":{"get":{"description":"Bets that beat the biggest payout or multiplier seen for a slot, casino or provider, newest first.","operationId":"records","parameters":[{"in":"query","name":"scope","required":false,"schema":{"enum":["slot","casino","provider"],"type":"string"}},{"in":"query","name":"metric","required":false,"schema":{"enum":["multiplier","payout"],"type":"string"}},{"description":"Records per page, 1–200 (default 50).","in":"query","name":"limit","required":false,"schema":{"format":"int32","minimum":0,"type":"integer"}},{"description":"From an earlier page's position.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordsResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`scope.invalid`, `metric.invalid`, `limit.invalid` or `cursor.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Broken records","tags":["Races & jackpots"]}},"/reports":{"get":{"description":"Newest first: the current month, a finished month still in its grace period and every frozen month, each with its headline figures and first key finding. Only months the site tracked: none that ended before tracking started.","operationId":"list","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportsResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Monthly reports","tags":["Reports"]}},"/reports/{month}":{"get":{"description":"Built only from what was collected. A finished month is `final`: frozen once its grace period is over and never changed afterwards. The current month is `month_to_date` and a finished month still in its grace period `provisional`, both built live. Every casino's `coverage` says what its totals stand for; a sampled total is never its full volume.","operationId":"month","parameters":[{"description":"`YYYY-MM`","example":"2026-11","in":"path","name":"month","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Report"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`month.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`: a future month, one before tracking started or one without data"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"One month's report","tags":["Reports"]}},"/reserves":{"get":{"description":"What the known hot and cold wallets of each casino hold, valued in USD, with 30 days of history.","operationId":"reserves","parameters":[{"description":"Casino slug.","in":"query","name":"casino","required":false,"schema":{"type":"string"}},{"description":"`casino` or `case_site`: one category only (default both). A hybrid\ncase site (`CasinoRef.hybrid`) is in both.","in":"query","name":"category","required":false,"schema":{"description":"`case_site`: a CS2 skin and case-opening site, `casino` for everything else.\nA case site with `CasinoRef.hybrid` is in both.","enum":["casino","case_site"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReservesResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`category.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Reserves","tags":["On-chain"]}},"/reviews/config":{"get":{"description":"`mode` is `guest` (anyone who passes the Cloudflare Turnstile check with `turnstile_site_key`, action `review`), `account` (signed-in accounts only) or `closed` (reading only). `limits` are the character limits every text must keep, after trimming.","operationId":"config","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewsConfig"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Who may write reviews","tags":["Reviews"]}},"/reviews/latest":{"get":{"description":"Approved reviews of the tracked sites, newest first, each with its site. Feedback about gambatracker (`gambatracker`) is never in it. `category` keeps it to the casinos (hybrid case sites included) or to the case sites. Cached 60 s.","operationId":"latest","parameters":[{"description":"`casino` or `case_site`; every site without one. Hybrid case sites are in both.","in":"query","name":"category","required":false,"schema":{"type":"string"}},{"description":"1-based (default 1).","in":"query","name":"page","required":false,"schema":{"type":"string"}},{"description":"Reviews per page, 1–50 (default 10).","in":"query","name":"limit","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewsLatestResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`category.invalid`, `page.invalid` or `limit.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"The newest reviews of every site","tags":["Reviews"]}},"/reviews/ratings":{"get":{"description":"Each target with an approved review, in the sites' display order and `gambatracker` last. `average` and `distribution` are null below `min_reviews` approved reviews. Cached 60 s.","operationId":"ratings","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewRatingsResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Every site's rating","tags":["Reviews"]}},"/reviews/{target}":{"get":{"description":"Approved reviews only, with the target's summary. `target` is a site's slug or `gambatracker` (feedback about this site). Every text is plain text. Cached 60 s.","operationId":"list","parameters":[{"description":"A site's slug, or `gambatracker`","example":"stake","in":"path","name":"target","required":true,"schema":{"type":"string"}},{"description":"`helpful` (votes, then newest; the default), `newest`, `highest` or `lowest` (stars, then votes).","in":"query","name":"sort","required":false,"schema":{"type":"string"}},{"description":"1-based (default 1).","in":"query","name":"page","required":false,"schema":{"type":"string"}},{"description":"Reviews per page, 1–50 (default 10).","in":"query","name":"limit","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewsResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`sort.invalid`, `page.invalid` or `limit.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`: no such site"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"A site's reviews","tags":["Reviews"]},"post":{"description":"One review per account and site; a guest edits theirs with the `edit_key` the first submit answered (stored hashed, never shown again). A guest gets one review per site and network in 90 days and needs a fresh Turnstile token on every submit. A new review and every edit are `pending` (an approved one is hidden again) until a moderator approves it. Links are refused; texts are trimmed plain text within `/reviews/config`'s limits. Needs the site's `Origin` and `x-gamba-csrf: 1`. Limited to 5 an hour and 20 a day per network, 10 a day per account.","operationId":"submit","parameters":[{"description":"A site's slug, or `gambatracker`","in":"path","name":"target","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewSubmit"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewSubmitted"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`review.stars`, `review.title`, `review.body`, `review.pros`, `review.cons`, `review.name` (params `min`, `max`), `review.played_since`, `review.links`, `review.turnstile` or `body.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`reviews.closed`, `reviews.banned`, `review.edit_key` or `auth.csrf`"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`: no such site"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`review.exists`: this network already reviewed the site"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`review.turnstile_unavailable`"}},"summary":"Write or edit your review","tags":["Reviews"]}},"/reviews/{target}/mine":{"delete":{"description":"Deletes the caller's review of the target (the account's, or a guest's by `X-Review-Key`) with its votes, reports and reply. Needs the site's `Origin` and `x-gamba-csrf: 1`.","operationId":"remove","parameters":[{"description":"A site's slug, or `gambatracker`","in":"path","name":"target","required":true,"schema":{"type":"string"}},{"description":"A guest's edit key","in":"header","name":"X-Review-Key","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewOk"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`auth.csrf`"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`: no such site, or no review of yours"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Delete your review","tags":["Reviews"]},"get":{"description":"The caller's review of the target in any status (`pending` until a moderator approves it, `rejected` with its reason): the signed-in account's, or a guest's by the edit key in `X-Review-Key`. Never cached.","operationId":"mine","parameters":[{"description":"A site's slug, or `gambatracker`","in":"path","name":"target","required":true,"schema":{"type":"string"}},{"description":"A guest's edit key, from the first submit","in":"header","name":"X-Review-Key","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MyReviewResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`: no such site"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Your review","tags":["Reviews"]}},"/reviews/{target}/{id}/helpful":{"delete":{"operationId":"unvote","parameters":[{"description":"A site's slug, or `gambatracker`","in":"path","name":"target","required":true,"schema":{"type":"string"}},{"description":"The review","in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewVoted"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`reviews.signin`"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`reviews.banned` or `auth.csrf`"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`: no such approved review"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Take back a helpful vote","tags":["Reviews"]},"post":{"description":"One vote per account, or per network for guests; voting again changes nothing. Not on your own review. In `account` mode only signed-in accounts vote. Needs the site's `Origin` and `x-gamba-csrf: 1`. Limited to 120 an hour.","operationId":"vote","parameters":[{"description":"A site's slug, or `gambatracker`","in":"path","name":"target","required":true,"schema":{"type":"string"}},{"description":"The review","in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewVoted"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`reviews.signin`"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`reviews.banned` or `auth.csrf`"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`: no such approved review"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`review.own`"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Mark a review helpful","tags":["Reviews"]}},"/reviews/{target}/{id}/report":{"post":{"description":"Flags the review for the moderators; it stays visible until one decides. One report per account or network per review (repeats answer `ok` and change nothing). Needs the site's `Origin` and `x-gamba-csrf: 1`. Limited to 20 an hour.","operationId":"report","parameters":[{"description":"A site's slug, or `gambatracker`","in":"path","name":"target","required":true,"schema":{"type":"string"}},{"description":"The review","in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewReport"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewOk"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`report.note` or `body.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`reviews.banned` or `auth.csrf`"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`: no such approved review"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Report a review","tags":["Reviews"]}},"/rtp":{"get":{"description":"Observed RTP per slot, slot and casino, provider, casino or original, with a 95% interval and the z-score against the advertised RTP. Only all-bets feeds that pass the bias check count.","operationId":"board","parameters":[{"description":"Default `slot`; `slot` and `slot_casino` cover slots only.","in":"query","name":"scope","required":false,"schema":{"enum":["slot","slot_casino","provider","casino","original"],"type":"string"}},{"description":"Time window (default `24h`).","in":"query","name":"window","required":false,"schema":{"enum":["10m","1h","24h","7d","30d","90d","all"],"type":"string"}},{"description":"Casino slug.","in":"query","name":"casino","required":false,"schema":{"type":"string"}},{"description":"Provider slug.","in":"query","name":"provider","required":false,"schema":{"type":"string"}},{"description":"Default `n` (sample size).","in":"query","name":"sort","required":false,"schema":{"enum":["n","z","rtp"],"type":"string"}},{"description":"Default `desc`.","in":"query","name":"order","required":false,"schema":{"enum":["asc","desc"],"type":"string"}},{"description":"Rows with fewer bets are left out.","in":"query","name":"min_n","required":false,"schema":{"format":"int64","minimum":0,"type":"integer"}},{"description":"Rows per page, 1–200 (default 50).","in":"query","name":"limit","required":false,"schema":{"format":"int32","minimum":0,"type":"integer"}},{"description":"From an earlier page's position.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}},{"description":"`casino` or `case_site`: one category only (default both). A hybrid\ncase site (`CasinoRef.hybrid`) is in both.","in":"query","name":"category","required":false,"schema":{"description":"`case_site`: a CS2 skin and case-opening site, `casino` for everything else.\nA case site with `CasinoRef.hybrid` is in both.","enum":["casino","case_site"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RtpResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`scope.invalid`, `window.invalid`, `sort.invalid`, `order.invalid`, `min_n.invalid`, `limit.invalid`, `cursor.invalid` or `category.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"RTP board","tags":["RTP"]}},"/rtp/originals":{"get":{"description":"Each casino's own games (dice, limbo, crash, …) against their advertised RTP; crash and slide are measured from every round.","operationId":"originals","parameters":[{"description":"`24h`, `7d`, `30d`, `90d` or `all` (default `24h`); the live windows have no originals matrix.","in":"query","name":"window","required":false,"schema":{"enum":["24h","7d","30d","90d","all"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OriginalsMatrixResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`window.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Originals RTP matrix","tags":["RTP"]}},"/rtp/originals/{kind}":{"get":{"operationId":"original_kind","parameters":[{"description":"`dice`, `limbo`, `crash`, `plinko`, `mines`, …","in":"path","name":"kind","required":true,"schema":{"type":"string"}},{"description":"`24h`, `7d`, `30d`, `90d` or `all` (default `24h`); the live windows have no originals matrix.","in":"query","name":"window","required":false,"schema":{"enum":["24h","7d","30d","90d","all"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OriginalsKindResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`window.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`: not an original kind"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"One original game kind","tags":["RTP"]}},"/search":{"get":{"operationId":"search","parameters":[{"description":"At least 2 characters.","in":"query","name":"q","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`search.short`: under 2 characters"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Search","tags":["Meta"]}},"/sitemap":{"get":{"description":"The games, providers and players that have pages and when their figures last changed, for building a sitemap in one call.","operationId":"sitemap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitemapResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Pages beyond the fixed ones","tags":["Meta"]}},"/sports":{"get":{"operationId":"sports","parameters":[{"description":"Default `highrollers` (7 days); `parlays` (2+ legs, 7 days); `open` (unsettled, 30 days).","in":"query","name":"feed","required":false,"schema":{"enum":["highrollers","parlays","open"],"type":"string"}},{"description":"Casino slug.","in":"query","name":"casino","required":false,"schema":{"type":"string"}},{"description":"Bets, 1–200 (default 50).","in":"query","name":"limit","required":false,"schema":{"format":"int32","minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SportsResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`feed.invalid` or `limit.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Sports bets","tags":["Sports"]}},"/status":{"get":{"description":"Each casino feed's health, sample ratio and RTP trust, why the casino's wager estimate was held back if it was, and how far each chain scanner is behind.","operationId":"status","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Feed and chain status","tags":["Meta"]}},"/streamers":{"get":{"description":"Every active streamer with the live session, the casinos they play at and their biggest win of the last 30 days. Wins come from the sampled bet feeds of accounts matched by name or player id.","operationId":"list","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreamersResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Tracked streamers","tags":["Streamers"]}},"/streamers/live":{"get":{"description":"Live sessions, most viewers first, with the biggest win observed in each.","operationId":"live","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LiveStreamersResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Streamers live now","tags":["Streamers"]}},"/streamers/{slug}":{"get":{"description":"Channels, casino accounts, the latest 20 sessions, the 10 biggest wins and 30-day stats. Opted-out accounts aren't listed.","operationId":"profile","parameters":[{"description":"Streamer slug","in":"path","name":"slug","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreamerResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"One streamer","tags":["Streamers"]}},"/streamers/{slug}/sessions":{"get":{"operationId":"sessions","parameters":[{"description":"Streamer slug","in":"path","name":"slug","required":true,"schema":{"type":"string"}},{"description":"Sessions per page, 1–200 (default 50), newest first.","in":"query","name":"limit","required":false,"schema":{"format":"int32","minimum":0,"type":"integer"}},{"description":"`next` of the previous page.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreamerSessionsResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`limit.invalid`, `cursor.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"A streamer's sessions","tags":["Streamers"]}},"/streamers/{slug}/sessions/{id}":{"get":{"description":"The recap is `observed`: the bets the feeds showed, a lower bound of what was played. It updates while the session is live and is frozen once it ends.","operationId":"session","parameters":[{"description":"Streamer slug","in":"path","name":"slug","required":true,"schema":{"type":"string"}},{"description":"Session id","in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreamerSessionResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"One session and its recap","tags":["Streamers"]}},"/upgrades":{"get":{"description":"Upgrader and contract results (raw, kept 90 days): `live` (default, window `1h`) or `top` (wins only, by payout). Windows count from each site's tracking start.","operationId":"upgrades","parameters":[{"description":"`live` (default) or `top` (wins by payout).","in":"query","name":"feed","required":false,"schema":{"enum":["live","top"],"type":"string"}},{"description":"Time window (default `1h` for `live`, else `24h`).","in":"query","name":"window","required":false,"schema":{"enum":["10m","1h","24h","7d","30d","90d","all"],"type":"string"}},{"description":"Case site slug.","in":"query","name":"casino","required":false,"schema":{"type":"string"}},{"description":"Target item slug.","in":"query","name":"item","required":false,"schema":{"type":"string"}},{"in":"query","name":"sort","required":false,"schema":{"enum":["payout","multiplier","amount","ts"],"type":"string"}},{"description":"Rows per page, 1–200 (default 50).","in":"query","name":"limit","required":false,"schema":{"format":"int32","minimum":0,"type":"integer"}},{"description":"`next` of the previous page.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradesResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`feed.invalid`, `window.invalid`, `sort.invalid`, `limit.invalid` or `cursor.invalid`"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"description":"`not_found`: `casino` is not a case site"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Upgrades","tags":["Case sites"]}},"/ws":{"get":{"description":"`wss://gambatracker.com/api/ws`. Send a `WsClientMessage` (`{\"sub\": [topics]}` replaces your set, `{\"unsub\": [topics]}` drops some) and receive `WsFrame`s (`{ topic, data }`). Topics: `bets:live`, `bets:live:<casino>`, `bets:big` (payout ≥ $1 000, or ≥ 100x on ≥ $0.10), `online`, `rtp:<scope>`, `records`, `max_wins` (one `MaxWinHit` per frame, as in `GET /v1/max-wins`), `whales`, `races`, `sports`, `rounds`, `rounds:<casino>`, `jackpots`, `status`, `chat` and `chat:<casino>` (one `ChatMessage` per frame, as in `GET /v1/chat`); case sites: `drops`, `drops:<casino>`, `drops:big` (value ≥ $500, or ≥ 50x on ≥ $0.10), `battles`, `battles:<casino>`, `upgrades`, `upgrades:<casino>`. At most 50 topics and 4 KiB per message; the server pings every 30 s and drops a client that can't take a message within 5 s. The upgrade request counts as one request against your limits.","operationId":"handler","responses":{"101":{"description":"Switching Protocols; then `WsFrame` messages","headers":{"RateLimit-Limit":{"description":"Requests the bucket holds (the burst).","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"`<per minute>;w=60;burst=<burst>, <per day>;w=86400`","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests left in the bucket.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the bucket is full again.","schema":{"type":"integer"}},"X-Api-Tier":{"description":"`anonymous`, `free` or `paid`.","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Requests per UTC day.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Requests left today.","schema":{"type":"integer"}},"X-Quota-Reset":{"description":"Seconds until 00:00 UTC.","schema":{"type":"integer"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}},"summary":"Live WebSocket","tags":["Live"]}}},"security":[{},{"api_key":[]},{"bearer":[]}],"servers":[{"url":"https://gambatracker.com/api"}],"tags":[{"description":"The market overview and each casino's activity, flows, reserves and coverage.","name":"Casinos"},{"description":"Live, big-win, high-roller and lucky bet feeds. Every feed is a sample of what the casino publishes.","name":"Bets"},{"description":"Games and providers with their observed stats.","name":"Games"},{"description":"Observed RTP with confidence intervals, from the all-bets feeds only.","name":"RTP"},{"description":"Public players. Hidden and opted-out players have no page.","name":"Players"},{"description":"Monthly leaderboards.","name":"Leaderboards"},{"description":"Deposits, withdrawals, reserves and deposit statistics read from public blockchains, for the tracked wallets only.","name":"On-chain"},{"description":"Wager races, jackpots and records.","name":"Races & jackpots"},{"description":"High-roller and open sports bets.","name":"Sports"},{"description":"Crash and slide round history with the measured edge.","name":"Crash"},{"description":"CS2 skin and case-opening sites: drops, battles, upgrades, cases with published odds against observed returns, CS2 items and monthly leaderboards. Amounts are converted from each site's coin at its stored rate; item values are the site's own.","name":"Case sites"},{"description":"Kick and Twitch streamers, their sessions and their wins at the casinos they play on stream.","name":"Streamers"},{"description":"The WebSocket feed.","name":"Live"},{"description":"The casinos' public chats in one feed, moderated. Kept 6 hours at most, never searchable by player.","name":"Chat"},{"description":"Free API keys without an account, and the calling key's usage.","name":"Keys"},{"description":"Monthly reports built from what was collected, frozen once a month is over.","name":"Reports"},{"description":"The monthly report by email: double opt-in subscription and one-click unsubscribe.","name":"Newsletter"},{"description":"Visitors' 1 to 5 star reviews of the tracked sites and their feedback about gambatracker (target `gambatracker`). Only reviews a moderator approved are shown; ratings need 3 of them. One person's experience each, not gambatracker's assessment.","name":"Reviews"},{"description":"Daily articles written from the tracker's data and cited web sources.","name":"Blog"},{"description":"Health and coverage.","name":"Meta"}]}