Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/igaming-tools-providers-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: iGaming Tools Providers API
version: 1.0.0
description: 'Public REST API for iGaming data: slot providers, slots, news, jobs, sources.'
termsOfService: https://i-gaming.tools/terms/
contact:
name: iGaming Tools support
email: support@i-gaming.tools
url: https://i-gaming.tools/docs/
license:
name: Terms of Service
url: https://i-gaming.tools/terms/
servers:
- url: https://i-gaming.tools
tags:
- name: Providers
paths:
/api/v1/providers/:
get:
operationId: providers_list
description: 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.
summary: List slot providers
parameters:
- in: header
name: If-None-Match
schema:
type: string
description: 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.
- in: query
name: country
schema:
type: string
description: Country (exact, free-text)
- name: cursor
required: false
in: query
description: Opaque pagination cursor from a previous response's next/previous link.
schema:
type: string
- in: query
name: established_after
schema:
type: integer
description: Established in this year or later (inclusive).
- in: query
name: established_before
schema:
type: integer
description: Established strictly before this year (EXCLUSIVE — the named year is not included).
- in: query
name: has_news
schema:
type: boolean
description: Brands with news only
- name: ordering
required: false
in: query
description: Which field to use when ordering the results.
schema:
type: string
- name: page_size
required: false
in: query
description: 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.
schema:
type: integer
- in: query
name: search
schema:
type: string
description: Search by name and aliases
- in: query
name: updated_since
schema:
type: string
format: date-time
description: ISO-8601 datetime. Returns only records updated at or after this moment.
tags:
- Providers
security:
- TokenAuth: []
responses:
'200':
headers:
X-Sync-Timestamp:
$ref: '#/components/headers/XSyncTimestamp'
ETag:
$ref: '#/components/headers/ETag'
X-Quota-Free-Remaining:
$ref: '#/components/headers/XQuotaFreeRemaining'
X-Quota-Paid-Balance:
$ref: '#/components/headers/XQuotaPaidBalance'
X-Quota-Resets-At:
$ref: '#/components/headers/XQuotaResetsAt'
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedBrandShortList'
examples:
ListProviders:
value:
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
summary: List providers
description: Success.
'304':
headers:
X-Sync-Timestamp:
$ref: '#/components/headers/XSyncTimestamp'
ETag:
$ref: '#/components/headers/ETag'
description: Not Modified — the ETag in If-None-Match matched the current value. No body.
'401':
$ref: '#/components/responses/Err401'
'429':
$ref: '#/components/responses/Err429'
'402':
$ref: '#/components/responses/Err402'
'400':
$ref: '#/components/responses/Err400'
/api/v1/providers/{slug}/:
get:
operationId: providers_retrieve
description: '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.'
summary: Get provider detail
parameters:
- in: header
name: If-None-Match
schema:
type: string
description: 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.
- in: path
name: slug
schema:
type: string
required: true
tags:
- Providers
security:
- TokenAuth: []
responses:
'200':
headers:
ETag:
$ref: '#/components/headers/ETag'
X-Quota-Free-Remaining:
$ref: '#/components/headers/XQuotaFreeRemaining'
X-Quota-Paid-Balance:
$ref: '#/components/headers/XQuotaPaidBalance'
X-Quota-Resets-At:
$ref: '#/components/headers/XQuotaResetsAt'
content:
application/json:
schema:
$ref: '#/components/schemas/ProviderDetail'
examples:
ProviderDetail:
value:
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:sales@example.com
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'
summary: Provider detail
description: Success.
'304':
headers:
ETag:
$ref: '#/components/headers/ETag'
description: Not Modified — the ETag in If-None-Match matched the current value. No body.
'401':
$ref: '#/components/responses/Err401'
'429':
$ref: '#/components/responses/Err429'
'402':
$ref: '#/components/responses/Err402'
'404':
$ref: '#/components/responses/Err404'
/api/v1/providers/{slug}/demand/:
get:
operationId: providers_demand_retrieve
description: '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.'
summary: Search demand for this provider
parameters:
- in: header
name: If-None-Match
schema:
type: string
description: 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.
- in: path
name: slug
schema:
type: string
required: true
tags:
- Providers
security:
- TokenAuth: []
responses:
'200':
headers:
ETag:
$ref: '#/components/headers/ETag'
X-Quota-Free-Remaining:
$ref: '#/components/headers/XQuotaFreeRemaining'
X-Quota-Paid-Balance:
$ref: '#/components/headers/XQuotaPaidBalance'
X-Quota-Resets-At:
$ref: '#/components/headers/XQuotaResetsAt'
content:
application/json:
schema:
$ref: '#/components/schemas/ProviderDemand'
description: Success.
'304':
headers:
ETag:
$ref: '#/components/headers/ETag'
description: Not Modified — the ETag in If-None-Match matched the current value. No body.
'401':
$ref: '#/components/responses/Err401'
'429':
$ref: '#/components/responses/Err429'
'402':
$ref: '#/components/responses/Err402'
'404':
$ref: '#/components/responses/Err404'
/api/v1/providers/{slug}/jobs/:
get:
operationId: providers_jobs_list
description: 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.
summary: Job vacancies for this provider
parameters:
- in: header
name: If-None-Match
schema:
type: string
description: 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.
- in: query
name: city
schema:
type: string
description: City slug
- in: query
name: company
schema:
type: string
description: Company slug
- in: query
name: country
schema:
type: string
description: Location country ISO-2 (→ location_country)
- name: cursor
required: false
in: query
description: Opaque pagination cursor from a previous response's next/previous link.
schema:
type: string
- in: query
name: employment_type
schema:
type: string
enum:
- contract
- freelance
- full_time
- internship
- part_time
description: Employment type.
- in: query
name: igaming_segment
schema:
type: string
enum:
- affiliate
- casino
- esports
- game_studio
- lottery
- payment_provider
- platform_provider
- poker
- regulator
- sportsbook
description: iGaming segment.
- in: query
name: include_closed
schema:
type: boolean
description: false (default) = ACTIVE only; true = + CLOSED within window
- in: query
name: ordering
schema:
type: string
enum:
- -posted_at
- posted_at
description: 'Ordering (whitelist: posted_at, -posted_at; default -posted_at)'
- name: page_size
required: false
in: query
description: 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.
schema:
type: integer
- in: query
name: posted_after
schema:
type: string
format: date-time
description: Posted at >= this value (ISO 8601, inclusive).
- in: query
name: posted_before
schema:
type: string
format: date-time
description: Posted at < this value (ISO 8601, EXCLUSIVE — the named moment is not included).
- in: query
name: q
schema:
type: string
description: Text search by title (case-insensitive substring)
- in: query
name: remote_mode
schema:
type: string
enum:
- hybrid
- on_site
- remote
description: Remote mode.
- in: query
name: seniority
schema:
type: string
enum:
- c_level
- head
- junior
- lead
- mid
- senior
description: Seniority level.
- in: query
name: skills
schema:
type: array
items:
type: string
description: Skill slugs (OR semantics; repeatable parameter)
- in: path
name: slug
schema:
type: string
required: true
- in: query
name: source
schema:
type: string
enum:
- careers
- linkedin
description: Source.
- in: query
name: updated_since
schema:
type: string
format: date-time
description: '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.'
deprecated: true
tags:
- Providers
security:
- TokenAuth: []
responses:
'200':
headers:
X-Sync-Timestamp:
$ref: '#/components/headers/XSyncTimestamp'
ETag:
$ref: '#/components/headers/ETag'
X-Quota-Free-Remaining:
$ref: '#/components/headers/XQuotaFreeRemaining'
X-Quota-Paid-Balance:
$ref: '#/components/headers/XQuotaPaidBalance'
X-Quota-Resets-At:
$ref: '#/components/headers/XQuotaResetsAt'
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedJobsListList'
description: Success.
'304':
headers:
X-Sync-Timestamp:
$ref: '#/components/headers/XSyncTimestamp'
ETag:
$ref: '#/components/headers/ETag'
description: Not Modified — the ETag in If-None-Match matched the current value. No body.
'401':
$ref: '#/components/responses/Err401'
'429':
$ref: '#/components/responses/Err429'
'402':
$ref: '#/components/responses/Err402'
'400':
$ref: '#/components/responses/Err400'
'404':
$ref: '#/components/responses/Err404'
/api/v1/providers/{slug}/news/:
get:
operationId: providers_news_list
description: 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.
summary: News for this brand
parameters:
- in: header
name: If-None-Match
schema:
type: string
description: 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.
- name: cursor
required: false
in: query
description: Opaque pagination cursor from a previous response's next/previous link.
schema:
type: string
- in: query
name: host
schema:
type: string
description: Host FQDN
- in: query
name: language
schema:
type: string
description: Language code (ISO 639-1)
- name: page_size
required: false
in: query
description: 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.
schema:
type: integer
- in: query
name: published_after
schema:
type: string
format: date-time
description: Published at >= this value (ISO 8601, inclusive).
- in: query
name: published_before
schema:
type: string
format: date-time
description: Published at < this value (ISO 8601, EXCLUSIVE — the named moment is not included).
- in: path
name: slug
schema:
type: string
required: true
- in: query
name: updated_since
schema:
type: string
format: date-time
description: '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.'
deprecated: true
tags:
- Providers
security:
- TokenAuth: []
responses:
'200':
headers:
X-Sync-Timestamp:
$ref: '#/components/headers/XSyncTimestamp'
ETag:
$ref: '#/components/headers/ETag'
X-Quota-Free-Remaining:
$ref: '#/components/headers/XQuotaFreeRemaining'
X-Quota-Paid-Balance:
$ref: '#/components/headers/XQuotaPaidBalance'
X-Quota-Resets-At:
$ref: '#/components/headers/XQuotaResetsAt'
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedNewsArticleShortList'
description: Success.
'304':
headers:
X-Sync-Timestamp:
$ref: '#/components/headers/XSyncTimestamp'
ETag:
$ref: '#/components/headers/ETag'
description: Not Modified — the ETag in If-None-Match matched the current value. No body.
'401':
$ref: '#/components/responses/Err401'
'429':
$ref: '#/components/responses/Err429'
'402':
$ref: '#/components/responses/Err402'
'400':
$ref: '#/components/responses/Err400'
'404':
$ref: '#/components/responses/Err404'
/api/v1/providers/{slug}/slots/:
get:
operationId: providers_slots_list
description: 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).
summary: Slots for this provider
parameters:
- in: header
name: If-None-Match
schema:
type: string
description: 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.
- name: cursor
required: false
in: query
description: Opaque pagination cursor from a previous response's next/previous link.
schema:
type: string
- in: query
name: feature
schema:
type: string
description: Feature slug (exact match). A slot may carry several features.
- in: query
name: game_category
schema:
type: string
enum:
- crash
- instant_win
- live
- other
- scratch
- table
- unknown
- video_slot
description: 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).
- in: query
name: has_bonus_buy
schema:
type: string
description: '''true'' or ''false''. Any other value returns 400.'
- in: query
name: jackpot_type
schema:
type: string
enum:
- fixed
- none
- pooled
- progressive
- unknown
description: Jackpot type (none/fixed/progressive/pooled/unknown)
- in: query
name: max_win_max
schema:
type: integer
description: max_win <= this value (multiplier of stake, positive integer). Also filters GET /api/v1/demand/ — same catalogue filter.
- in: query
name: max_win_min
schema:
type: integer
description: max_win >= this value (multiplier of stake, positive integer). Also filters GET /api/v1/demand/ — same catalogue filter.
- in: query
name: mechanic
schema:
type: string
enum:
- cluster
- lines
- megaways
- scatter_pays
- variable_ways
- ways
description: Bet mechanic (lines/ways/cluster/megaways/scatter_pays)
- in: query
name: ordering
schema:
type: string
enum:
- -captured_at
- -release_date
- captured_at
- release_date
description: '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.'
- name: page_size
required: false
in: query
description: 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.
schema:
type: integer
- in: query
name: provider
schema:
type: string
description: Provider slug (exact match).
- in: query
name: released_after
schema:
type: string
format: date
description: ISO date (YYYY-MM-DD). release_date >= this value. Slots with release_date IS NULL are excluded. 400 on invalid format.
- in: query
name: released_before
schema:
type: string
format: date
description: 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.
- in: query
name: rtp_max
schema:
type: number
format: double
description: rtp_default <= this value (percent, decimal, e.g. 96.5). Also filters GET /api/v1/demand/ — same catalogue filter.
- in: query
name: rtp_min
schema:
type: number
format: double
description: rtp_default >= this value (percent, decimal, e.g. 96.5). Also filters GET /api/v1/demand/ — same catalogue filter.
- in: query
name: search
schema:
type: string
description: 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).
- in: query
name: series
schema:
type: string
description: Series slug (exact match). A slot belongs to at most one series.
- in: path
name: slug
schema:
type: string
required: true
- in: query
name: theme
schema:
type: string
description: Theme slug (exact match). A slot may carry several themes.
- in: query
name: updated_since
schema:
type: string
format: date-time
description: ISO-8601 datetime. Returns only records updated at or after this moment.
- in: query
name: volatility
schema:
type: string
enum:
- high
- low
- med_high
- med_low
- medium
- very_high
description: Volatility (low/med_low/medium/med_high/high/very_high)
tags:
- Providers
security:
- TokenAuth: []
responses:
'200':
headers:
X-Sync-Timestamp:
$ref: '#/components/headers/XSyncTimestamp'
ETag:
$ref: '#/components/headers/ETag'
X-Quota-Free-Remaining:
$ref: '#/components/headers/XQuotaFreeRemaining'
X-Quota-Paid-Balance:
$ref: '#/components/headers/XQuotaPaidBalance'
X-Quota-Resets-At:
$ref: '#/components/headers/XQuotaResetsAt'
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedSlotListItemList'
description: Success.
'304':
headers:
X-Sync-Timestamp:
$ref: '#/components/headers/XSyncTimestamp'
ETag:
$ref: '#/components/headers/ETag'
description: Not Modified — the ETag in If-None-Match matched the current value. No body.
'401':
$ref: '#/components/responses/Err401'
'429':
$ref: '#/components/responses/Err429'
'402':
$ref: '#/components/responses/Err402'
'400':
$ref: '#/components/responses/Err400'
'404':
$ref: '#/components/responses/Err404'
/api/v1/providers/{slug}/team/:
get:
operationId: providers_team_list
description: Key people we publish for this provider. NOT paginated (bounded ≤60). profile_url NOT included (PII). Returns {count, results[]} envelope. ETag/304 supported.
summary: Key team members for this provider
parameters:
- in: header
name: If-None-Match
schema:
type: string
description: 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.
- in: path
name: slug
schema:
type: string
required: true
tags:
- Providers
security:
- TokenAuth: []
responses:
'304':
headers:
ETag:
$ref: '#/components/headers/ETag'
description: Not Modified — the ETag in If-None-Match matched the current value. No body.
'200':
headers:
ETag:
$ref: '#/components/headers/ETag'
X-Quota-Free-Remaining:
$ref: '#/components/headers/XQuotaFreeRemaining'
X-Quota-Paid-Balance:
$ref: '#/components/headers/XQuotaPaidBalance'
X-Quota-Resets-At:
$ref: '#/components/headers/XQuotaResetsAt'
content:
application/json:
schema:
type: object
properties:
count:
type: integer
description: Total visible team members (≤60).
results:
type: array
items:
type: object
properties:
full_name:
type: string
headline:
type: string
seniority:
type: string
is_key:
type: boolean
location_text:
type: string
photo:
type:
- object
- 'null'
properties:
url:
type: string
format: uri
key:
type: string
version:
type: string
description: Success.
'401':
$ref: '#/components/responses/Err401'
'429':
$ref: '#/components/responses/Err429'
'402':
$ref: '#/components/responses/Err402'
'404':
$ref: '#/components/responses/Err404'
/api/v1/providers/ids/:
get:
operationId: providers_ids_list
description: 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.
summary: Reconcile — all public provider slugs
parameters:
- in: query
name: cursor
schema:
type: string
description: Opaque pagination cursor from a previous response's next/previous link.
- in: query
name: page_size
schema:
type: integer
minimum: 1
maximum: 100
default: 20
description: 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.
tags:
- Providers
security:
- TokenAuth: []
responses:
'200':
headers:
X-Sync-Timestamp:
$ref: '#/components/headers/XSyncTimestamp'
X-Quota-Free-Remaining:
$ref: '#/components/hea
# --- truncated at 32 KB (58 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/igaming-tools/refs/heads/main/openapi/igaming-tools-providers-api-openapi.yml