demand

Search-demand cut

Single parametrized endpoint over the market-demand cut (slot × country search-volume aggregate). The volume_12m figure is a SUM over a rolling 12-month window shared by every row in the response (not the latest month) — see meta.window and meta.coverage.pairs_at_frontier_pct for how complete the current month's collection is. coverage=our own catalogue, not the wider market (meta.coverage.basis). The response schema is a oneOf over four envelopes, one per axis family, and meta.by tells you which one you received: by='slot' carries per-market detail, by='slot_global' aggregates a slot across markets, by='country' is one market per row, and the remaining axes share a keyed shape. See the examples for each. The newest month in the response is the latest month whose collection is complete; a month that is still being collected is not shown.

get/api/v1/demand/

Request

  • Base URL: https://i-gaming.tools
  • URL: https://i-gaming.tools/api/v1/demand/
  • Auth: API key in header Authorization

Query parameters

by'country' | 'feature' | 'game_category' | 'mechanic' | 'provider' | 'slot' | 'slot_global' | 'theme'

Cut axis; the shape of each result item is decided by this parameter alone. 'slot' (default) is one slot in ONE market and requires ?country=; 'slot_global' is one slot aggregated across every tracked market and does not require one; passing ?country= there simply narrows the aggregate. 'country' is one market; 'provider', 'theme', 'feature', 'mechanic' and 'game_category' share one shape keyed by the axis value. Any other value → 400. 'theme'/'feature' are overlapping axes (a slot with multiple themes counts in each) — see response meta.overlapping.

countrystring

2-letter ISO country code (case-insensitive, normalized to upper-case). REQUIRED when by='slot', because that axis reports one slot in one market and its per-market fields are undefined without one — use by='slot_global' for a worldwide ranking instead. Optional for every other axis, where omitting it aggregates across all tracked markets. Invalid format → 400.

coverageboolean

false suppresses meta.coverage entirely — the coverage aggregates are not computed at all, rather than computed and discarded. Omitted or true follows the default rule: meta.coverage is populated on the first page of a cursor traversal (previous == null) and null on subsequent pages. Any other value returns 400.

cursorstring

Opaque pagination cursor from a previous response's next/previous link.

featurestring

Feature slug (exact match). Non-existent slug → empty results, not 400.

game_category'crash' | 'instant_win' | 'live' | 'other' | 'scratch' | 'table' | 'unknown' | 'video_slot'

Game category filter (catalogue). One of: unknown, video_slot, crash, instant_win, scratch, live, table, other. Not to be confused with ?by=game_category (cut axis) — both can be combined.

has_bonus_buystring

'true' or 'false'. Any other value returns 400.

jackpot_type'fixed' | 'none' | 'pooled' | 'progressive' | 'unknown'

Jackpot type (none/fixed/progressive/pooled/unknown)

max_win_maxinteger

max_win <= this value (multiplier of stake, positive integer). Also filters GET /api/v1/demand/ — same catalogue filter.

max_win_mininteger

max_win >= this value (multiplier of stake, positive integer). Also filters GET /api/v1/demand/ — same catalogue filter.

mechanic'cluster' | 'lines' | 'megaways' | 'scatter_pays' | 'variable_ways' | 'ways'

Bet mechanic (catalogue filter). One of: lines, ways, cluster, megaways, scatter_pays. Not to be confused with ?by=mechanic (cut axis) — both can be combined.

ordering'-volume_12m' | 'volume_12m'

Whitelist: '-volume_12m' (default, highest demand first) or 'volume_12m' (lowest first). Any other value → 400.

page_sizeinteger

Number of results per page. Default 20, maximum 100 — same limits as the rest of the public API. An operator-configured limit may lower the maximum.

providerstring

Provider slug (exact match). Non-existent slug → empty results, not 400. Not to be confused with ?by=provider (cut axis) — both can be combined.

released_afterstring date

ISO date (YYYY-MM-DD). release_date >= this value. Slots with release_date IS NULL are excluded. 400 on invalid format.

released_beforestring date

ISO date (YYYY-MM-DD). release_date <= this value — INCLUSIVE, the named day is part of the range. Note that ?published_before, ?posted_before and ?established_before on other endpoints are EXCLUSIVE. Slots with release_date IS NULL are excluded. 400 on invalid format.

rtp_maxnumber double

rtp_default <= this value (percent, decimal, e.g. 96.5). Also filters GET /api/v1/demand/ — same catalogue filter.

rtp_minnumber double

rtp_default >= this value (percent, decimal, e.g. 96.5). Also filters GET /api/v1/demand/ — same catalogue filter.

searchstring

Case-insensitive substring search over slot name + aliases. Empty/whitespace-only value is a no-op (does not narrow results). Soft-clipped to 100 characters (not a 400).

seriesstring

Series slug (exact match). A slot belongs to at most one series.

themestring

Theme slug (exact match). Non-existent slug → empty results, not 400.

volatility'high' | 'low' | 'med_high' | 'med_low' | 'medium' | 'very_high'

Volatility (low/med_low/medium/med_high/high/very_high)

Response

Success.

OR
OR
OR

Example response

{
  "results": [
    {
      "last_seen": {
        "month": "2026-06"
      }
    }
  ]
}

Changes

No recorded changes to this operation across all 1 revision of this API.