Slots

GET /api/v1/slots/ Auth required

List public slots

Cursor-paginated list of published slots. Default order: -created_at. With ?updated_since: order switches to (updated_at, id) ASC for forward-sync. With ?ordering=-release_date|release_date: order switches to release-date mode. Use /slots/ids/ for tombstone reconcile (removed slots do not appear in deltas). ETag/304 support via If-None-Match.

Parameters

Name In Type Required Description Example
cursor query string optional The pagination cursor value.
ordering query string optional Whitelist: '-release_date' (newest first, default within this mode) or 'release_date' (oldest first). Slots with release_date IS NULL sort to the end for '-release_date' and to the start for 'release_date'. Any other value → 400. Ignored when ?updated_since is present (sync order wins). Reverse traversal via `previous` through the trailing NULL-release_date group may skip items — walk forward (`next`) for a complete set.
page_size query integer optional Number of results to return per page.
released_after query string optional ISO date (YYYY-MM-DD). release_date >= this value. Slots with release_date IS NULL are excluded. 400 on invalid format.
released_before query string optional ISO date (YYYY-MM-DD). release_date <= this value. Slots with release_date IS NULL are excluded. 400 on invalid format.
search query string optional 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).
updated_since query string optional ISO-8601 datetime. Returns only slots whose content changed at or after this moment. When present, results are ordered by (updated_at, id) ASC — forward through time. Without this param the default order (-created_at, -id) is preserved. 400 on invalid format. Known limitation: cross-object renames (provider/studio/series name changes) do NOT appear in this delta — use /slots/ids/ for tombstone reconcile.
curl \
  -H "Authorization: Token <YOUR_TOKEN>" \
  "https://i-gaming.tools/api/v1/slots/"
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://i-gaming.tools/api/v1/slots/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Token <YOUR_TOKEN>']);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
const response = await fetch("https://i-gaming.tools/api/v1/slots/", {
  method: "GET",
  headers: {
  "Authorization": "Token <YOUR_TOKEN>"
}
});
const data = await response.json();
console.log(data);
import requests

headers = {
    "Authorization": "Token <YOUR_TOKEN>"
}
response = requests.get("https://i-gaming.tools/api/v1/slots/", headers=headers)

print(response.json())

Response fields

next string(uri) | null
previous string(uri) | null
results array[object]
Example response
{
  "next": "http://api.example.org/accounts/?cursor=cD00ODY%3D\"",
  "previous": "http://api.example.org/accounts/?cursor=cj0xJnA9NDg3",
  "results": [
    [
      {
        "slug": "example-slot-title",
        "name": "Example Slot Title",
        "is_public": true,
        "brand": {
          "slug": "example-provider",
          "name": "Example Provider",
          "kind": "slot_provider"
        },
        "updated_at": "2026-01-15T12:00:00Z"
      }
    ]
  ]
}
GET /api/v1/slots/ids/ Auth required

Reconcile — all public slot slugs

Cursor-paginated list of ALL public slot slugs for tombstone diff. Results are plain strings, not objects. Decrements quota once per request. REQUIRED for unpublish/compliance detection: ?updated_since delta does NOT include removed slots. Compare this set with local DB and tombstone missing slugs. X-Sync-Timestamp is included in the response header.

curl \
  -H "Authorization: Token <YOUR_TOKEN>" \
  "https://i-gaming.tools/api/v1/slots/ids/"
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://i-gaming.tools/api/v1/slots/ids/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Token <YOUR_TOKEN>']);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
const response = await fetch("https://i-gaming.tools/api/v1/slots/ids/", {
  method: "GET",
  headers: {
  "Authorization": "Token <YOUR_TOKEN>"
}
});
const data = await response.json();
console.log(data);
import requests

headers = {
    "Authorization": "Token <YOUR_TOKEN>"
}
response = requests.get("https://i-gaming.tools/api/v1/slots/ids/", headers=headers)

print(response.json())
GET /api/v1/slots/{slug}/ Auth required

Get slot detail

Full slot profile: data (RTP/volatility/layout/mechanics), spec_sheet (symbols/modes/palette/accessibility), assets (screenshots/icon). ETag/304: pass If-None-Match to skip heavy prefetch on unchanged content.

Parameters

Name In Type Required Description Example
slug path string required URL-friendly unique identifier of the slot.
curl \
  -H "Authorization: Token <YOUR_TOKEN>" \
  "https://i-gaming.tools/api/v1/slots/{slug}/"
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://i-gaming.tools/api/v1/slots/{slug}/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Token <YOUR_TOKEN>']);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
const response = await fetch("https://i-gaming.tools/api/v1/slots/{slug}/", {
  method: "GET",
  headers: {
  "Authorization": "Token <YOUR_TOKEN>"
}
});
const data = await response.json();
console.log(data);
import requests

headers = {
    "Authorization": "Token <YOUR_TOKEN>"
}
response = requests.get("https://i-gaming.tools/api/v1/slots/{slug}/", headers=headers)

print(response.json())

Response fields

data object Rig-curated verified structured data block (whitelist §5.2).
spec_sheet object Unverified block: raw OCR dump (§5.2, §7 slots_s4.md). source — constant 'extracted, unverified'. raw — as-is or null. updated_at — SlotTechInfo.filled_at (last-write, auto_now). spec_sheet.raw is NOT written to logs/Sentry (§7).
assets object Media assets: screenshots (with key/version), logo, palette, demo embed info.
Example response
{
  "slug": "example-slot-title",
  "name": "Example Slot Title",
  "is_public": true,
  "brand": {
    "slug": "example-provider",
    "name": "Example Provider",
    "kind": "slot_provider"
  },
  "data": {
    "rtp_pct": 96.5,
    "volatility": "high",
    "max_win_multiplier": 5000,
    "paylines": 20
  },
  "spec_sheet": {
    "symbols": [],
    "modes": [],
    "palette": []
  },
  "assets": {
    "icon": null,
    "screenshots": []
  }
}
GET /api/v1/slots/{slug}/demand/ Auth required

Slot demand snapshot

Per-slot search-demand aggregate: volume_12m/prev_12m/yoy_pct/trend + 24-point sparkline, derived read-side from ProviderDemandSnapshot.payload. Graceful nulls when the provider has no demand snapshot yet. ETag/304 via If-None-Match (seed=computed_at, mirrors provider /demand/).

Parameters

Name In Type Required Description Example
slug path string required
curl \
  -H "Authorization: Token <YOUR_TOKEN>" \
  "https://i-gaming.tools/api/v1/slots/{slug}/demand/"
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://i-gaming.tools/api/v1/slots/{slug}/demand/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Token <YOUR_TOKEN>']);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
const response = await fetch("https://i-gaming.tools/api/v1/slots/{slug}/demand/", {
  method: "GET",
  headers: {
  "Authorization": "Token <YOUR_TOKEN>"
}
});
const data = await response.json();
console.log(data);
import requests

headers = {
    "Authorization": "Token <YOUR_TOKEN>"
}
response = requests.get("https://i-gaming.tools/api/v1/slots/{slug}/demand/", headers=headers)

print(response.json())

Response fields

computed_at string(date-time) | null
volume_12m integer | null
prev_12m integer | null
yoy_pct number(double) | null
trend string
sparkline array[integer]
months array[string]
totals array[integer]
markets array[object]