Providers

GET /api/v1/providers/ Auth required

List slot providers

Cursor-paginated list of public slot providers. Supports ?updated_since for incremental sync and ETag/304. X-Sync-Timestamp response header for next-sync cursor. Use /providers/ids/ for tombstone reconcile.

Parameters

Name In Type Required Description Example
If-None-Match header string optional Opaque ETag value from a previous response to this same endpoint. When it matches the current ETag, the server returns 304 Not Modified with no body instead of re-sending the full payload.
country query string optional Country (exact, free-text)
cursor query string optional Opaque pagination cursor from a previous response's next/previous link.
established_after query integer optional Established in this year or later (inclusive).
established_before query integer optional Established strictly before this year (EXCLUSIVE — the named year is not included).
has_news query boolean optional Brands with news only
ordering query string optional Which field to use when ordering the results.
page_size query integer optional 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.
search query string optional Search by name and aliases
updated_since query string(date-time) optional ISO-8601 datetime. Returns only records updated at or after this moment.
curl \
  -H "Authorization: Token <YOUR_TOKEN>" \
  "https://i-gaming.tools/api/v1/providers/"
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://i-gaming.tools/api/v1/providers/');
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/providers/", {
  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/providers/", headers=headers)

print(response.json())

Response fields

next string(uri) | null Absolute URL of the next page, or null on the last page.
previous string(uri) | null Absolute URL of the previous page, or null on the first page.
results array[object]
Example response
{
  "next": "https://i-gaming.tools/api/v1/providers/?cursor=cD00ODY%3D",
  "previous": "https://i-gaming.tools/api/v1/providers/?cursor=cj0xJnA9NDg3",
  "results": [
    {
      "slug": "example-provider",
      "kind": "slot_provider",
      "name": "Example Provider",
      "aliases": [
        "Example"
      ],
      "hosts_count": 3,
      "news_count": 42
    }
  ]
}
GET /api/v1/providers/ids/ Auth required

Reconcile — all public provider slugs

Cursor-paginated list of ALL public provider slugs for tombstone diff. Results are plain strings, not objects. Decrements quota once per request. X-Sync-Timestamp included in response header.

Parameters

Name In Type Required Description Example
cursor query string optional Opaque pagination cursor from a previous response's next/previous link.
page_size query integer optional 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.
curl \
  -H "Authorization: Token <YOUR_TOKEN>" \
  "https://i-gaming.tools/api/v1/providers/ids/"
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://i-gaming.tools/api/v1/providers/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/providers/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/providers/ids/", headers=headers)

print(response.json())

Response fields

next string(uri) | null
previous string(uri) | null
results array[string]
GET /api/v1/providers/{slug}/ Auth required

Get provider detail

Full provider profile: firmographics, assets (logo), company block (hq/offices/licenses/contacts), counts (slots/jobs/news/team/has_demand), HATEOAS links to sub-resources. ETag/304 via If-None-Match.

Parameters

Name In Type Required Description Example
If-None-Match header string optional Opaque ETag value from a previous response to this same endpoint. When it matches the current ETag, the server returns 304 Not Modified with no body instead of re-sending the full payload.
slug path string required
curl \
  -H "Authorization: Token <YOUR_TOKEN>" \
  "https://i-gaming.tools/api/v1/providers/{slug}/"
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://i-gaming.tools/api/v1/providers/{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/providers/{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/providers/{slug}/", headers=headers)

print(response.json())

Response fields

slug string
kind string | null Brand kind code string.
name string
aliases array[string]
tagline string
about_html string Sanitized provider bio (HTML). Never raw text.
firmographics object Identity attributes of the provider. Empty strings when unknown.
verified_at string(date-time) | null
updated_at string(date-time)
assets object Provider assets. logo is null when none is on file or storage is unavailable.
company object Company block: headquarters, offices, licences and public contacts.
counts object How much of each sub-resource this provider has.
hosts array[object] Public web hosts operated by this provider.
Example response
{
  "slug": "example-provider",
  "kind": "slot_provider",
  "name": "Example Provider",
  "aliases": [
    "Example"
  ],
  "about_html": "<p>Example Provider builds video slots.</p>",
  "firmographics": {
    "country": "MT",
    "jurisdiction": "Malta",
    "established": 2015,
    "authority_for": "",
    "statutory_authority": ""
  },
  "assets": {
    "logo": {
      "url": "https://cdn.i-gaming.tools/brands/example-provider.png",
      "key": "brands/example-provider.png",
      "version": "brands/example-provider.png"
    }
  },
  "company": {
    "hq": {
      "label": "Head office",
      "city": "Sliema",
      "country": "MT"
    },
    "offices": [
      {
        "label": "Studio",
        "city": "Kyiv",
        "country": "UA",
        "sort_order": 1
      }
    ],
    "licenses": [
      {
        "authority": "MGA",
        "license_ref": "MGA/B2B/000/0000",
        "jurisdiction": "Malta",
        "status": "active",
        "sort_order": 0
      }
    ],
    "contacts": [
      {
        "kind": "email",
        "label": "Sales",
        "value": "mailto:[email protected]"
      }
    ]
  },
  "counts": {
    "slots": 128,
    "jobs": 4,
    "news": 42,
    "team": 11,
    "has_demand": true
  },
  "links": {
    "slots": "/api/v1/providers/example-provider/slots/",
    "demand": "/api/v1/providers/example-provider/demand/",
    "jobs": "/api/v1/providers/example-provider/jobs/",
    "news": "/api/v1/providers/example-provider/news/",
    "team": "/api/v1/providers/example-provider/team/"
  },
  "hosts": [
    {
      "host": "example-provider.com",
      "display_name": "Example Provider"
    }
  ],
  "verified_at": "2026-07-01T10:00:00Z",
  "updated_at": "2026-08-01T09:30:00Z"
}
GET /api/v1/providers/{slug}/demand/ Auth required

Search demand for this provider

Provider demand snapshot: computed_at, provider-level metrics, top_slots. Empty snapshot → 200 with nulls/empty (not 404). PUBLISHED-ONLY for top_slots. The monthly series is returned as `provider.series_24m` and is fixed at 24 trailing months — this endpoint takes no `?months=` parameter, unlike GET /api/v1/slots/{slug}/demand/ which accepts 1..60 or "all". The window is part of the field name, so widening it would require a new field rather than a new parameter.

Parameters

Name In Type Required Description Example
If-None-Match header string optional Opaque ETag value from a previous response to this same endpoint. When it matches the current ETag, the server returns 304 Not Modified with no body instead of re-sending the full payload.
slug path string required
curl \
  -H "Authorization: Token <YOUR_TOKEN>" \
  "https://i-gaming.tools/api/v1/providers/{slug}/demand/"
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://i-gaming.tools/api/v1/providers/{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/providers/{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/providers/{slug}/demand/", headers=headers)

print(response.json())

Response fields

computed_at string(date-time) | null
provider object
top_slots array[object]
GET /api/v1/providers/{slug}/jobs/ Auth required

Job vacancies for this provider

Brand-scoped cursor-paginated job listings, attributed to this brand. The filters of GET /api/v1/jobs/, including ?include_closed, work here too. Supports ?updated_since and ETag/304.

Parameters

Name In Type Required Description Example
If-None-Match header string optional Opaque ETag value from a previous response to this same endpoint. When it matches the current ETag, the server returns 304 Not Modified with no body instead of re-sending the full payload.
city query string optional City slug
company query string optional Company slug
country query string optional Location country ISO-2 (→ location_country)
cursor query string optional Opaque pagination cursor from a previous response's next/previous link.
employment_type query string optional Employment type. Allowed: contract · freelance · full_time · internship · part_time
igaming_segment query string optional iGaming segment. Allowed: affiliate · casino · esports · game_studio · lottery · payment_provider · platform_provider · poker · regulator · sportsbook
include_closed query boolean optional false (default) = ACTIVE only; true = + CLOSED within window
ordering query string optional Ordering (whitelist: posted_at, -posted_at; default -posted_at) Allowed: -posted_at · posted_at
page_size query integer optional 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.
posted_after query string(date-time) optional Posted at >= this value (ISO 8601, inclusive).
posted_before query string(date-time) optional Posted at < this value (ISO 8601, EXCLUSIVE — the named moment is not included).
q query string optional Text search by title (case-insensitive substring)
remote_mode query string optional Remote mode. Allowed: hybrid · on_site · remote
seniority query string optional Seniority level. Allowed: c_level · head · junior · lead · mid · senior
skills query array[string] optional Skill slugs (OR semantics; repeatable parameter)
slug path string required
source query string optional Source. Allowed: careers · linkedin
updated_since query string(date-time) optional DEPRECATED on brand-scoped endpoints. Here it filters by publication date, not by when the record last changed, so a delta silently omits items edited after publication — an article corrected long after it was published, or a vacancy that has since closed. Use the root listing with ?brand_slug= instead: GET /api/v1/news/?brand_slug=<slug>&updated_since=… or GET /api/v1/jobs/?brand_slug=<slug>&updated_since=…&include_closed=true, both of which filter and order by the last change. This parameter keeps its current behaviour so that traversals already in progress are not invalidated.
curl \
  -H "Authorization: Token <YOUR_TOKEN>" \
  "https://i-gaming.tools/api/v1/providers/{slug}/jobs/"
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://i-gaming.tools/api/v1/providers/{slug}/jobs/');
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/providers/{slug}/jobs/", {
  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/providers/{slug}/jobs/", headers=headers)

print(response.json())

Response fields

next string(uri) | null Absolute URL of the next page, or null on the last page.
previous string(uri) | null Absolute URL of the previous page, or null on the first page.
results array[object]
GET /api/v1/providers/{slug}/news/ Auth required

News for this brand

Cursor-paginated news articles attributed to this brand. Supports ?updated_since for incremental sync and ETag/304. X-Sync-Timestamp response header for next-sync cursor.

Parameters

Name In Type Required Description Example
If-None-Match header string optional Opaque ETag value from a previous response to this same endpoint. When it matches the current ETag, the server returns 304 Not Modified with no body instead of re-sending the full payload.
cursor query string optional Opaque pagination cursor from a previous response's next/previous link.
host query string optional Host FQDN
language query string optional Language code (ISO 639-1)
page_size query integer optional 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.
published_after query string(date-time) optional Published at >= this value (ISO 8601, inclusive).
published_before query string(date-time) optional Published at < this value (ISO 8601, EXCLUSIVE — the named moment is not included).
slug path string required
updated_since query string(date-time) optional DEPRECATED on brand-scoped endpoints. Here it filters by publication date, not by when the record last changed, so a delta silently omits items edited after publication — an article corrected long after it was published, or a vacancy that has since closed. Use the root listing with ?brand_slug= instead: GET /api/v1/news/?brand_slug=<slug>&updated_since=… or GET /api/v1/jobs/?brand_slug=<slug>&updated_since=…&include_closed=true, both of which filter and order by the last change. This parameter keeps its current behaviour so that traversals already in progress are not invalidated.
curl \
  -H "Authorization: Token <YOUR_TOKEN>" \
  "https://i-gaming.tools/api/v1/providers/{slug}/news/"
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://i-gaming.tools/api/v1/providers/{slug}/news/');
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/providers/{slug}/news/", {
  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/providers/{slug}/news/", headers=headers)

print(response.json())

Response fields

next string(uri) | null Absolute URL of the next page, or null on the last page.
previous string(uri) | null Absolute URL of the previous page, or null on the first page.
results array[object]
GET /api/v1/providers/{slug}/slots/ Auth required

Slots for this provider

Brand-scoped cursor-paginated slot listing. ?provider= is pinned to this brand; the catalogue filters and ?ordering= of GET /api/v1/slots/ work here as they do there. Supports ?updated_since and ETag/304. Items carry volume_12m/trend (per-slot search-demand aggregate).

Parameters

Name In Type Required Description Example
If-None-Match header string optional Opaque ETag value from a previous response to this same endpoint. When it matches the current ETag, the server returns 304 Not Modified with no body instead of re-sending the full payload.
cursor query string optional Opaque pagination cursor from a previous response's next/previous link.
feature query string optional Feature slug (exact match). A slot may carry several features.
game_category query string optional Game category, exact match. 400 on any value outside the enum. Also filters GET /api/v1/demand/, where it doubles as a cut axis (?by=game_category). Allowed: crash · instant_win · live · other · scratch · table · unknown · video_slot
has_bonus_buy query string optional 'true' or 'false'. Any other value returns 400.
jackpot_type query string optional Jackpot type (none/fixed/progressive/pooled/unknown) Allowed: fixed · none · pooled · progressive · unknown
max_win_max query integer optional max_win <= this value (multiplier of stake, positive integer). Also filters GET /api/v1/demand/ — same catalogue filter.
max_win_min query integer optional max_win >= this value (multiplier of stake, positive integer). Also filters GET /api/v1/demand/ — same catalogue filter.
mechanic query string optional Bet mechanic (lines/ways/cluster/megaways/scatter_pays) Allowed: cluster · lines · megaways · scatter_pays · variable_ways · ways
ordering query string optional Whitelist: '-release_date' (newest first) 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'. '-captured_at' (most recently captured from a live demo first) or 'captured_at' (oldest/never-captured first) — matches the public listing's default order. Any other value → 400. Ignored when ?updated_since is present (sync order wins). Note on backward paging: cursor position is derived from the sort field alone, so walking back with `previous` through the trailing block of items that share the same sort value (those with no release date, or never captured) can skip entries. Forward paging with `next` is always complete, and neither ?updated_since sync nor the /ids/ reconcile is affected. Walk forward when you need the full set. Allowed: -captured_at · -release_date · captured_at · release_date
page_size query integer optional 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.
provider query string optional Provider slug (exact match).
released_after query string(date) 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(date) optional 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_max query number(double) optional rtp_default <= this value (percent, decimal, e.g. 96.5). Also filters GET /api/v1/demand/ — same catalogue filter.
rtp_min query number(double) optional rtp_default >= this value (percent, decimal, e.g. 96.5). Also filters GET /api/v1/demand/ — same catalogue filter.
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).
series query string optional Series slug (exact match). A slot belongs to at most one series.
slug path string required
theme query string optional Theme slug (exact match). A slot may carry several themes.
updated_since query string(date-time) optional ISO-8601 datetime. Returns only records updated at or after this moment.
volatility query string optional Volatility (low/med_low/medium/med_high/high/very_high) Allowed: high · low · med_high · med_low · medium · very_high
curl \
  -H "Authorization: Token <YOUR_TOKEN>" \
  "https://i-gaming.tools/api/v1/providers/{slug}/slots/"
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://i-gaming.tools/api/v1/providers/{slug}/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/providers/{slug}/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/providers/{slug}/slots/", headers=headers)

print(response.json())

Response fields

next string(uri) | null Absolute URL of the next page, or null on the last page.
previous string(uri) | null Absolute URL of the previous page, or null on the first page.
results array[object]
GET /api/v1/providers/{slug}/team/ Auth required

Key team members for this provider

Key people we publish for this provider. NOT paginated (bounded ≤60). profile_url NOT included (PII). Returns {count, results[]} envelope. ETag/304 supported.

Parameters

Name In Type Required Description Example
If-None-Match header string optional Opaque ETag value from a previous response to this same endpoint. When it matches the current ETag, the server returns 304 Not Modified with no body instead of re-sending the full payload.
slug path string required
curl \
  -H "Authorization: Token <YOUR_TOKEN>" \
  "https://i-gaming.tools/api/v1/providers/{slug}/team/"
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://i-gaming.tools/api/v1/providers/{slug}/team/');
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/providers/{slug}/team/", {
  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/providers/{slug}/team/", headers=headers)

print(response.json())

Response fields

full_name string
headline string
seniority string
is_key boolean
location_text string
photo object | null