API Reference
Base URL
All API requests use:
https://api.igamingfinder.com/v1
Authenticate with X-API-Key or Authorization: Bearer header. See Authentication.
Most reads return immediately. Domain resolve with observation includes may wait up to 240 seconds for a site check; configure clients to allow at least 300 seconds for these requests. Company paid sections use the exact Company page and do not support max_age_days or allow_stale_on_error. See Request deadlines.
The main part of the API is the Company API: a Company is the customer-facing unit — any operator, supplier, studio, aggregator, platform, or PSP. There are two jobs:
- Resolve (
GET /companies/resolve) — you know an identifier; get the Company profile. - Search (
GET /companies/search, preview withGET /companies/search/preview) — you have criteria; get ranked candidates.
See the Company API guide for the full model, billing, and company_ref lifecycle. See Data Availability for where each dataset is available, coverage, freshness, and what a missing value means.
Alongside it is the Domain verdict API, keyed by a casino domain rather than an operator: GET /domains/resolve ("is this URL legit?" → licensed/blocklisted/mixed/no_record) and GET /domains/search (the set of domains by verdict/geo/time). It answers for blocklist-only domains that have no Company, and pivots into the Company API via company_ref.
GET /signals/market-entries
Use this endpoint to see operator changes on one market's official register. Each row has the same signal_ref and content as in GET /signals/register-changes. Only rows that the register lists as operators are included.
V1 requires role=operator and a market such as ukgc or anjouan. Supported row controls are occurred_from, occurred_to, page_size, and the returned after cursor.
Each returned Signal costs one credit. Use a fresh Idempotency-Key for each cursor page. A cursor from the old market-entry feed does not work here: the API returns legacy_cursor_not_supported; start the poll again without after.
GET /signals/market-entries
COST 1 credit / Signal returned
Operator-only market-entry Signal view. Charged per returned Signal.
/v1/signals/market-entries
Authorization
Query
Whole-request cost ceiling.
Example response200
{"success":true,"data":{"query":{"jurisdiction":"anjouan","event_type":[]},"total":0,"signals":[],"billing":{"credits_charged":0}}}
curl -H "X-API-Key: igf_demo_9457cf242d0c43404fb69b8273d7f4371716682a12c74e3c3274fd8957ebeae7" \
-H "Idempotency-Key: YOUR_REQUEST_KEY" \
"https://api.igamingfinder.com/v1/signals/market-entries?role=operator&market=anjouan&page_size=5&max_credits=5"
GET /signals/platform-sites
Poll sites first observed on one platform. Pass role=operator and platform (a platform key or common name such as digitain); the platform selects which sites you get and is not a Signal type. Each row has the platform, domain, Company, and the date IGF first saw the site on that platform. That date is not when the operator moved to the platform.
Each delivered row costs one credit. Pagination is cursor-only; platform cursors use their own signature and never invalidate existing market-entry cursors.
GET /signals/platform-sites
COST 1 credit / Signal returned
Operator sites first observed on one platform. Charged per delivered row.
/v1/signals/platform-sites
Authorization
Query
Whole-request cost ceiling.
Example response200
{"success":true,"data":{"query":{"role":"operator","platform":"digitain"},"total":0,"signals":[],"billing":{"credits_charged":0}}}
curl -H "X-API-Key: igf_demo_9457cf242d0c43404fb69b8273d7f4371716682a12c74e3c3274fd8957ebeae7" \
-H "Idempotency-Key: YOUR_REQUEST_KEY" \
"https://api.igamingfinder.com/v1/signals/platform-sites?role=operator&platform=digitain&page_size=5&max_credits=5"
GET /signals/register-changes
Poll changes published on official gambling registers. jurisdiction is required and accepts every monitored register jurisdiction. Filter by exact published_legal_name, source_stream_key, event_type, and occurrence dates. Published license numbers are nullable. Register membership never implies a grant or revocation unless the source explicitly publishes a revoked status.
event_type takes one value or several. event_type=revoked and event_type[]=revoked&event_type[]=added_to_register are both valid; omit it for every available type. The expiry_date_passed event is not available and is rejected. The echoed query.event_type is always the list the query ran with, so one value reads back as a one-element list.
Each delivered row costs one credit. Pagination uses a cursor bound to the register filters. The response query.published_legal_name echoes the exact name applied to the request and cursor.
GET /signals/register-changes
COST 1 credit / Signal returned
Changes published on official gambling registers. Charged per delivered row.
/v1/signals/register-changes
Authorization
Query
Optional exact published-name filter within the jurisdiction.
Example response200
{"success":true,"data":{"query":{"jurisdiction":"philippines"},"total":0,"signals":[],"billing":{"credits_charged":0}}}
curl -H "X-API-Key: igf_demo_9457cf242d0c43404fb69b8273d7f4371716682a12c74e3c3274fd8957ebeae7" \
-H "Idempotency-Key: YOUR_REQUEST_KEY" \
"https://api.igamingfinder.com/v1/signals/register-changes?jurisdiction=philippines&page_size=5"
GET /companies/resolve
Resolve one identifier to one Company profile. The profile has licenses, Domains, enumerated payment methods, and content suppliers. Charged per profile successfully returned (companies_resolve_profile). Pass include[]=firmographics or include[]=people for the paid sections, or request either section independently with the same identifier at GET /companies/firmographics or GET /companies/people.
Send exactly one of these identifiers:
company_ref— anigfc_…handle from a prior response.domain— a casino URL or host. Base resolve reduces it to its registrable domain, then matches licensee Companies and the brand owner;matched_astells which (licensee,brand_owner, or both). When neither holds the domain, it matches the Company whose own website it is (site_owner). IP/junk →400 invalid_domain; a valid domain absent from our catalogue →404 company_not_foundfor the base profile. Paid includes on resolve by domain return 409 at zero credits; call people or firmographics with the domain instead. Those standalone calls use the main company page of the domain.page_url— a company page URL with the path/company/<slug>. Usehttps. The query, the fragment, and a trailing slash are ignored. See Resolve by company page URL.legal_entity— exact regulator-filed legal name, case ignored. Trade names, platforms, domains, and unknown subjects do not match it.
No identifier returns 400 missing_identifier. Two or more return 400 one_identifier. Resolve does not take a licence number: resolve the licence with GET /licenses/resolve, then pass its company_ref.
Resolve returns one Company or refuses at 0 credits; it never returns a list. When an identifier names several Companies, the answer is 409 ambiguous_company with candidate_count and next_action: search?q=<value> for legal_entity, search?related=<value> for company_ref, domain, and page_url. Search names with q; name is not a Company identifier. next_action.preview_href previews that search free. A paid include on one Company holding several standing pages also refuses at zero credits, reporting the actual page count and search?related=<company_ref>; an explicit page_url returns that exact page even when the Company holds others. See Company Resolve Errors.
A profile does not include the company page URL. The company page URL is part of firmographics: firmographics.page_url. Base profile resolution does not require a page, but paid includes require one exact page.
Every profile includes subject_kind: legal_entity, trade_name, platform, domain, or unknown. legal_entity is null unless the source filed a legal entity. Search non-legal names with companies/search?q=<name>, then resolve with the returned identifier.
See Company API for the supported resolve and search field contracts.
GET /companies/resolve
COST 3 credits / profile returned
Resolve one identifier to one Company profile. Send exactly one identifier; clear domain before you fill another one. Charged per profile successfully returned.
/v1/companies/resolve
Authorization
Query
Opaque public handle (igfc_…).
Casino URL or host. Reduced to its registrable domain, then matched to the licensee and brand-owner Companies. IP/junk → 400 invalid_domain.
Company page URL (path /company/<slug>, https). Query, fragment and trailing slash are ignored.
Exact legal company name
Optional paid sections: firmographics, people. Repeat include[] for both.
Hard cost ceiling. Rejected (402) before any data is returned if exceeded.
Example response200
{
"success": true,
"data": {
"resolved_by": "company_ref",
"input_company_ref": "igfc_5Voo7KfFd7fd13DvcqsojSBJ",
"resolved_company_ref": "igfc_5Voo7KfFd7fd13DvcqsojSBJ",
"ref_status": "active",
"companies": [
{
"company_ref": "igfc_5Voo7KfFd7fd13DvcqsojSBJ",
"company_name": "Medium Rare N.V.",
"legal_entity": "Medium Rare N.V.",
"subject_kind": "legal_entity",
"role": ["operator"],
"matched_as": [],
"domains": [
{ "domain_ref": "igfd_9mT7…", "domain": "stake.com", "inferred_geo": null }
],
"licenses": [
{ "jurisdiction": "curacao", "license_number": "…", "status": "active",
"license_type": "…", "authorized_domains": [
{ "domain_ref": "igfd_9mT7…", "domain": "stake.com", "inferred_geo": null }
] }
],
"payment_methods": ["Bitcoin", "Visa"],
"payment_categories": ["crypto", "card"],
"supplier_brands": ["Evolution"],
"affiliate_program": true,
"geo_hints": ["en"],
"data_completeness": 0.82
}
],
"billing": {
"returned_count": 1,
"credits_per_profile": 3,
"credits_charged": 3,
"billing_reason": "company_profile_delivered"
}
}
}
Requested firmographics is one flat operating-organization object (or null when unavailable), not a per-Domain array. Requested people is an array of contacts (empty when unavailable), with the same contact fields as standalone data.people; both optional fields appear on data.companies[0]. Domain resolve keeps its catalogue meaning. Paid includes on resolve by domain return 409 at zero credits; call people or firmographics with the domain instead. Standalone people and firmographics by domain use the main company page of the domain. A paid include by ref/legal entity on a catalogue Company with no held page returns 409 company_page_required asking for a user-supplied page_url. Available firmographics cost 12 credits, available contacts 9 credits per contact, and unavailable sections cost zero optional credits. See Company API for billing and freshness.
Cost: 12 credits / delivered company
curl -H "X-API-Key: igf_demo_9457cf242d0c43404fb69b8273d7f4371716682a12c74e3c3274fd8957ebeae7" \
"https://api.igamingfinder.com/v1/companies/resolve?company_ref=igfc_5Voo7KfFd7fd13DvcqsojSBJ"
import requests
r = requests.get(
"https://api.igamingfinder.com/v1/companies/resolve",
headers={"X-API-Key": "igf_demo_9457cf242d0c43404fb69b8273d7f4371716682a12c74e3c3274fd8957ebeae7"},
params={"company_ref": "igfc_5Voo7KfFd7fd13DvcqsojSBJ"},
)
print(r.json())
Errors:
| Status | Meaning |
|---|---|
| 400 | missing_identifier — no identifier was sent |
| 400 | unsupported_identifier — name is search text; search with q and use a returned identifier |
| 400 | one_identifier — more than one identifier was sent |
| 400 | invalid_domain — the domain input is not a valid registrable domain (IP/junk) |
| 400 | invalid_include — unsupported include[] or role without include[]=people |
| 400 | unsupported_enrichment_option — domain_ref, max_age_days or allow_stale_on_error on a Company paid-section request |
| 404 | company_not_found — no Company/page matches, including an unknown company_ref; company_ref_not_found belongs to related search, not this route |
| 409 | ambiguous_company — several Companies, several held pages when paid includes are requested, for a catalogue Company; candidate_count distinguishes known Company/page counts and next_action offers candidate search when appropriate |
| 409 | company_page_required — paid section requested for a catalogue Company with no standing page; supply its page_url, not a related search |
| 422 | invalid_page_url — page_url is not a company page URL |
| 503 | company_page_unavailable — the company page cannot be read now; try again |
These errors charge 0 credits.
GET /companies/firmographics
Send exactly one of company_ref, domain, page_url, or legal_entity. Recommended: find the company with search, then send its page_url. data.firmographics is one flat firmographics object, or null when unavailable, for every identifier. With domain, the main company page of the domain is used. When the main page is not known, the call returns zero-charge 409 ambiguous_company with the number of pages that name the domain and search?related=<domain> to list them. No prior purchased Company profile is required; domain_ref is unsupported (400 unsupported_enrichment_option). An explicit page_url chooses that exact page, including when its catalogue Company holds 2+ pages. A domain that no company page names, a confirmed shared platform domain, or an overly broad domain returns zero-charge 404 company_page_not_found. Several catalogue Companies selected by another identifier still produce 409 with a candidate search. For a catalogue Company with 2+ standing pages, ref/legal-entity paid lookup returns zero-charge 409 with the actual page count and search?related=<company_ref>; with no held page, it returns zero-charge 409 company_page_required and instructs a direct page_url. No match returns 404 company_not_found. max_age_days and allow_stale_on_error are unsupported.
curl -G -H "X-API-Key: igf_demo_9457cf242d0c43404fb69b8273d7f4371716682a12c74e3c3274fd8957ebeae7" \
-H "Idempotency-Key: $(uuidgen)" \
--data-urlencode "company_ref=igfc_5Voo7KfFd7fd13DvcqsojSBJ" \
--data-urlencode "max_credits=12" \
"https://api.igamingfinder.com/v1/companies/firmographics"
An available object charges 12 credits; null charges zero optional credits. This does not create a catalogue Company or identity. max_age_days and allow_stale_on_error return 400 unsupported_enrichment_option. The response never copies or recharges the Company profile. Reuse the same Idempotency-Key and identical query for a charge-free replay without another source read.
GET /companies/firmographics
COST 12 credits / delivered company
Firmographics for one Company, selected by exactly one identifier. 12 credits if available; zero if unavailable.
/v1/companies/firmographics
Authorization
Query
Opaque Company ref; the demo key accepts only this sample.
Casino URL or host. Uses the main company page of the domain; refused at zero credits when the main page is not known. Recommended: search, then page_url.
HTTPS company page URL with path /company/<slug>.
Exact regulator-filed legal name.
Hard ceiling; 12 credits required for an available result.
Example response200
{"success":true,"data":{"firmographics":{"name":"Demo Company","description":null,"industry":"Gambling Facilities and Casinos","company_size":[201,500],"employee_count":500,"founded_year":2017,"headquarters":{"city":"Limassol","region":null,"country":"Cyprus","postal_code":null},"website":"https://example.com","page_url":null},"billing":{"returned_count":1,"credits_per_firmographics_result":12,"credits_charged":0,"billing_reason":"demo_key_limited_response"},"simulated":true,"credits_charged":0}}
Cost: 12 credits / delivered company
GET /companies/search/preview
Free anti-surprise preview — total match count, counts per filter value, and per-page_size cost estimates. No paid data, no charge. Company names (sample) are returned only to the signed-in Home dashboard; an API, CLI or MCP call gets sample: [], and paid rows start at row 1. Run it before companies/search to size the result and cost.
GET /companies/search/preview
COST 0 credits / request
Free anti-surprise preview — total match count, counts per filter value and per-page_size cost estimates. Company names only on the Home dashboard. No paid data.
/v1/companies/search/preview
Authorization
Query
Free-text query
operator, aggregator, platform_provider, payment_provider, game_studio, affiliate_software, affiliate_media, other_supplier, unknown
Optional Company sector. Use the same value when requesting a quote.
Licensing jurisdiction, country name or ISO code: mga, Malta or MT. The response query shows normalized filters.
Country relation by ISO-2 code or name (PE or Peru), case-insensitive: licensing, incorporation, headquarters, site region or a currency assigned to one country.
Observed site language (ar) or currency (USD), independent from the geo country filter.
Registrable domain; applied as an exact filter (canonicalized). IP/junk → 400 invalid_domain.
One company_ref, company page URL or domain. Counts the related organizations. Clear every other field first: related combines only with page, page_size and max_credits.
When matches exist, next_action.href is a ready paid-search URL with the same public filters, at most 10 rows, and max_credits set to the quoted cost of that call. It is null when nothing matches.
With related, the preview counts the related organizations and prices them. See Related organizations.
GET /companies/search
Paid ranked discovery results. A result can name a legal entity, trade name, platform, domain, or unknown subject. Every row includes subject_kind; legal_entity is null unless the source filed one. Rows carry payment/provider categories and counts, never the enumerated value lists, nested licenses, or full domain mappings (those are resolve-only). Charged per row successfully returned (companies_search_result); page_size × credits_per_result is the maximum, guarded by max_credits.
Each hit currently has company_ref, company_name, subject_kind, legal_entity, role, primary_domain, domains_sample, domain_count, jurisdictions, license_statuses, license_count, payment_categories, payment_method_count, supplier_brand_count, conference_count, platform_present, affiliate_program_present, geo_hints, data_completeness, last_observed_at, last_updated_at, rank, score, matched_fields, highlight, firmographics_available, and contacts_available.
conference_count is the number of conferences the company was seen exhibiting at, counted per dated event — SiGMA Malta 2026 and SiGMA Rome 2026 are two, and two stands at one show are one. It reads 0 rather than going missing when we have seen the company at none.
GET /companies/search
COST 1 credit / result returned
Paid ranked discovery rows. Charged per row successfully returned (page_size × credits_per_result is the maximum), guarded by max_credits.
/v1/companies/search
Authorization
Query
False means no reviewed platform is published, not that the Company has no platform.
Registrable domain; applied as an exact filter (canonicalized). IP/junk → 400 invalid_domain.
One company_ref, company page URL or domain. Lists the related organizations, one row per company page. Clear every other filter first: related combines only with page, page_size and max_credits.
Rows per page (max 100). You are charged per row returned.
Hard cost ceiling for this pull.
Example response200
{
"success": true,
"data": {
"query": { "payment_category": "crypto", "jurisdiction": "anjouan" },
"total": 33,
"page": 1,
"page_size": 20,
"hits": [
{
"company_ref": "igfc_7Qz…",
"company_name": "Medium Rare N.V.",
"legal_entity": "Medium Rare N.V.",
"subject_kind": "legal_entity",
"role": ["operator"],
"primary_domain": { "domain_ref": null, "domain": "stake.com", "inferred_geo": null },
"domains_sample": [
{ "domain_ref": null, "domain": "stake.com", "inferred_geo": null }
],
"domain_count": 1,
"jurisdictions": ["anjouan"],
"license_statuses": ["active"],
"license_count": 1,
"payment_categories": ["crypto", "card"],
"payment_method_count": 2,
"supplier_brand_count": 1,
"conference_count": 2,
"platform_present": true,
"affiliate_program_present": true,
"geo_hints": ["en"],
"data_completeness": 0.82,
"last_observed_at": "2026-08-24T10:30:00Z",
"last_updated_at": "2026-08-24T10:35:00Z",
"rank": 1
}
],
"billing": {
"returned_count": 20,
"credits_per_result": 1,
"credits_charged": 20,
"page_size": 20,
"billing_reason": "search_rows_delivered"
}
}
}
Take any company_ref from a search row and pass it back to GET /companies/resolve for the full nested profile.
related=<value> lists the organizations related to one company_ref, company page URL, or domain. Each row is one company page with page_url, name, headcount, relation, and company_ref. Rows are charged at the same price as other search rows. related combines only with page, page_size, and max_credits. See Related organizations.
The playground above shows the common filters; companies/search also accepts license_status, payment_method, affiliate_program, and geo. subject_kind is descriptive output, not a filter. License search does not expose it. See Filters for the full set.
GET /companies/people
Return data.people as an array of decision-maker contacts, independently of a previously purchased profile. Recommended: find the company with search, then send its page_url. With domain, the main company page of the domain is used; each contact names its page_url and, when a catalogue Company holds the page, that holder's company_ref. When the main page is not known, the call returns zero-charge 409 ambiguous_company with the number of pages that name the domain and search?related=<domain> to list them. Send exactly one of company_ref, domain, page_url, or legal_entity; domain_ref is unsupported. An explicit page_url reads that exact page even when its catalogue Company holds others. No match is 404 company_not_found; several Companies return zero-charge 409 ambiguous_company with a candidate search. A catalogue Company holding 2+ standing pages returns zero-charge 409 with the actual page count and search?related=<company_ref>; one with no held page returns zero-charge 409 company_page_required, instructing a user-supplied page_url. A domain that no company page names, a confirmed shared platform domain, or an overly broad domain returns zero-charge 404 company_page_not_found. Base profiles include people only on include[]=people. The contact objects are identical in standalone data.people and included data.companies[0].people: full_name, role, role_key, headline, location, profile_url, summary, skills, connections, followers, personal_emails. The standalone response additionally includes availability/reason, role counts, total and billing. total is the number of people the company page lists. It is not the number of contacts that match role; it is null when people are unavailable. Each returned contact costs 9 credits; empty/unavailable arrays cost zero optional credits.
One answer holds up to page_size contacts: 10 when absent, 100 at most. When more contacts are left, the answer has next_cursor and next_action.href. Send next_cursor as after with the same other parameters to get the next contacts, and repeat until next_cursor is null. Only null means the end: an answer can hold fewer than page_size contacts and still have a cursor. With role, the walk delivers every person of the page who matches. Each call is charged for the contacts it returns; max_credits and Idempotency-Key apply to each call. A cursor works only with the same API key, company page and role, and it stays valid until the people of the page change. A cursor that is no longer valid returns 400 invalid_cursor at zero credits; start again without after. returned is the number of contacts in the answer. deliverable is the number of people of the page that this endpoint can deliver, before any role filter. When it is lower than total, the other people of the page are not available, and a walk without role ends after deliverable contacts.
GET /companies/people
COST 9 credits / contact returned
Return decision-maker contacts using exactly one Company identifier. Charged per contact returned.
/v1/companies/people
Authorization
Query
Opaque Company ref; the demo key accepts only this sample.
Casino URL or host. Uses the main company page of the domain; refused at zero credits when the main page is not known. Recommended: search, then page_url.
HTTPS company page URL with path /company/<slug>.
Exact regulator-filed legal name.
Optional role filter: a glossary key from GET /people/roles (ceo, cto, compliance, payments, affiliates, marketing_leads, product_leads, decision_makers), or free text. Combine terms with OR.
Free role counts and total instead of delivered contacts. Nothing is charged. A company that cannot be matched answers `available: false, reason: not_resolved`, and a failed read answers `reason: provider_error`; neither means the company has no people. Each delivered contact carries its `role_key`.
Contacts in one answer: 10 when absent, 100 at most. Billing is per contact returned.
`next_cursor` of the answer before, with the same other parameters. Returns the next contacts.
role accepts two kinds of term. A glossary key — published by GET /people/roles — is a named, measured filter: role=compliance matches the titles we measured as compliance owners and excludes the spellings that only look like them. Anything else is free text and matches as a substring. Terms combine with OR (or commas): role=cto OR trader returns the union.
GET /people/roles
The role glossary the role filter accepts. Free, uncharged, and cacheable for a day: a caller who cannot read the vocabulary guesses at it, and a guessed role costs a paid people request that returns nobody.
Each row carries the key, one sentence of meaning, two classifications (seniority, function), the spellings it matches (synonyms), and the coverage it was measured at — how many people matched by job title and how many by headline alone.
The job title decides the match: the headline is read only for the people who carry no title at all, and a headline role is dropped when every company written after a role in that headline belongs to somebody else. A headline that names no company still counts. The coverage counts were measured before that rule, on 2026-09-12. Exclusions apply to the field that matched, which is why role=ceo does not return a "Vice President Human Resources".
Role glossary keys
| Field | Meaning |
|---|---|
key |
The value to pass as role |
seniority |
c_level, founder_owner, vp, head, director, lead, manager, ic or any |
function |
The business function the key belongs to, or any |
synonyms |
The spellings the key matches |
coverage |
title, headline_only and measured_at for the corpus we measured |
curl -H "X-API-Key: $IGF_API_KEY" \
"https://api.igamingfinder.com/v1/people/roles"
GET /people/roles
COST Free
The published role glossary the people `role` filter accepts. Free.
/v1/people/roles
Authorization
Example response200
{
"data": {
"roles": [
{
"key": "compliance",
"description": "Compliance, AML/KYC, responsible gambling, regulatory affairs and legal counsel.",
"seniority": "any",
"function": "compliance_risk",
"synonyms": ["compliance", "mlro", "aml", "kyc", "regulatory", "head of legal"],
"coverage": { "title": 508, "headline_only": 328, "measured_at": "2026-09-12" }
}
]
}
}
GET /licenses/resolve
Resolve a licence by natural key (jurisdiction + license_number) or by opaque license_ref. Returns the authoritative licence profile plus the issuing Company's company_ref for immediate pivot into GET /companies/resolve.
GET /licenses/resolve
COST 3 credits / profile returned
Resolve a licence by its natural key or license_ref to the authoritative licence profile. Charged per profile successfully returned.
/v1/licenses/resolve
Authorization
Query
Opaque public handle (igfl_…). Authoritative and exclusive.
Licence number; pair with jurisdiction when a bare number is ambiguous.
mga, ukgc, curacao, anjouan
Hard cost ceiling. Rejected before any paid data is returned if exceeded.
GET /licenses/search/preview
Free anti-surprise preview for licence discovery. Returns total count, counts per filter value, per-page cost estimates, and a tiny redacted sample. Exact-domain samples may include domain_match_basis (regulator_published, site_corroborated, or both); the key is omitted otherwise. No paid data or private evidence.
GET /licenses/search/preview
COST 0 credits / request
Preview License search count and cost before pulling paid rows.
/v1/licenses/search/preview
Authorization
Query
Full-text query (licence number, company name, jurisdiction, type).
GET /licenses/search
Ranked licence discovery rows. An exact domain query may add domain_match_basis (regulator_published, site_corroborated, or both); the key is omitted for non-domain hits. Rows are thin: they carry the license_ref, issuing company_ref, filter fields, and counts, never authorized domains or private evidence; use GET /licenses/resolve for the authoritative licence profile.
GET /licenses/search
COST 1 credit / result returned
Ranked licence discovery rows. Charged per row returned.
/v1/licenses/search
Authorization
Query
Full-text query (licence number, company name, jurisdiction, type).
Rows per page (capped at 100).
Hard cost ceiling for this pull.
GET /domains/resolve
The trust front door. Give a casino domain, get its verdict — licensed (a regulator's register licences it), blocklisted (a regulator's blocklist flags it as illegal), mixed (both — licensed in one jurisdiction and blocklisted in another), or no_record (we hold no regulator record; not the same as "unlicensed"). Answers for any domain, including blocklist-only domains that have no Company. The base verdict costs 1 credit.
The response carries two per-jurisdiction lists — licensed_by[] (regulators that licence it, with license_number) and blocked_by[] (regulators that blocklist it) — plus, when the domain links to a licensed operator, an opaque company_ref to pivot into GET /companies/resolve.
Domain include catalog
The closed include[] catalog is licenses, payment_methods, supplier_brands, affiliate_programs, geo, related_domains, operator_launch_profile, logos, and platform_history. Unknown values return 400 before charging.
The response data root has domain, verdict, licensed_by, blocked_by, company, billing, and observations. When at least one observation include is requested, the observations object contains domain, domain_normalized, status, last_enriched_at, company (name, legal_entity_name, country) or null, brand (name, slug) or null, enrichment_run (status, completed_at) or null, and meta (freshness_age_seconds, served_from_cache, billable, observed_at, generated_at). Requested include sections also live inside observations.
| Include | Supported customer shape |
|---|---|
licenses |
Array of jurisdiction, license_number, status, source_url (the public register entry), first_seen_at, last_seen_at, last_confirmed_at |
payment_methods |
Array of normalized_name, category, first_seen_at, last_seen_at, last_confirmed_at |
supplier_brands |
Array of normalized_provider_name, first_seen_at, last_seen_at, last_confirmed_at |
affiliate_programs |
Array of program_url, first_seen_at, last_seen_at, last_confirmed_at |
geo |
Object with languages, currencies, geo_hints, first_seen_at, last_seen_at, last_confirmed_at; null when no observation is published |
related_domains |
Array of related_domain_normalized, relationship, first_seen_at, last_seen_at, last_confirmed_at |
operator_launch_profile |
Operator Launch Profile object documented below |
logos |
Array of variant, theme, format, width, height, url, source, current, first_seen_at, superseded_at. Source is business_profile, website or catalog; this domain response retains history, unlike the current choices in logo search. |
platform_history |
Array of platform, from, to, and observations periods documented below |
An empty observation array or geo: null means unknown or not observed in current coverage. It is not proof that the fact is absent. How we observed a fact — the collection method, confidence, observation status, our source URL — is not published.
Platform history
Pass include[]=platform_history for the platform a site runs on, as contiguous periods rather than a log of our visits: platform, from, to (null while it is still running), and observations — how many readings stand behind that period. Newest first. It costs nothing beyond the base verdict: it reads what we have already recorded and crawls nothing.
Altenar since 2026-06-03, 10 observations
Digitain 2026-05-01 to 2026-05-28, 4 observations
Periods are ordered by when we saw the page, never by when we wrote the row. When we read old pages again, they keep their original date, so a better parser never looks like a site changing platform. The observation count is there because a period backed by one reading and one backed by twenty are not equally strong, and only you can judge which you need.
A platform appears here only once a person has reviewed the vendor as a platform, so absence means "not established", not "not there". GET /domains/search carries the boolean platform_present if you only need to know whether asking is worth it.
Operator Launch Profile
Pass include[]=operator_launch_profile to add fresh registration, DNS, rendered web presence, launch state, the legal names published on the site, public website emails, related domains and coverage around the base verdict. A profile is available only when the domain has one unambiguous regulatory Operator context and observed domain evidence. The evidence behind those facts — evidence references, source URLs, confidence, reason codes and observation status — is not published.
Launch status means:
| Status | Meaning |
|---|---|
pre_launch |
Licensed Operator context, resolving DNS, and observed parked-site evidence |
launching |
Bounded web evidence shows launch activity but not enough rendered product evidence for live |
live |
Rendered product evidence was observed |
unknown |
Evidence is insufficient, blocked, or failed; a 403 or geo block never becomes pre_launch |
Registration identity, the regulatory Licensee, the owner, operator or billing company named on the website, the Brand, and technical clusters are kept separate. Shared registrar, DNS, CDN, MX, nameserver, IP, hosting, or redirects never prove ownership; technical relationships return ownership_claimed: false. Raw HTML, screenshots and the files we store stay private.
An available profile adds 5 credits to the 1-credit verdict, charged atomically as one 6-credit delivery. If the profile is unavailable, the endpoint still returns HTTP 200 with availability: not_available and an explicit reason, charges only the 1-credit verdict, and omits the optional charge. Set max_credits=6 to reject an unexpectedly larger request before delivery.
max_age_days sets how old the requested include[] data may be (0 always checks the site again; 7 accepts evidence at most seven days old). A new check of the site can start only for an observation include (licenses, payment_methods, supplier_brands, affiliate_programs, geo, or related_domains) or for an eligible operator_launch_profile request. logos and platform_history never start a check. When you combine it with observation sections, the whole-request max_credits check includes the standard domain refresh charge as well as the delivered verdict and profile, before any data is fetched. The refresh charge is settled separately, later; the verdict and profile are charged together at delivery. A new request charges delivered data again. Send a new Idempotency-Key for each new request; only an exact replay with the same key and the same parameters is free. Reusing a key with changed parameters returns 409 idempotency_key_reused.
curl -H "X-API-Key: igf_demo_9457cf242d0c43404fb69b8273d7f4371716682a12c74e3c3274fd8957ebeae7" \
-H "Idempotency-Key: YOUR_FRESH_REQUEST_KEY" \
"https://api.igamingfinder.com/v1/domains/resolve?domain=ncc.bet&include[]=operator_launch_profile&max_age_days=7&max_credits=6"
GET /domains/resolve
COST 1 credit / verdict returned
Resolve a casino domain to its trust verdict and optionally add an Operator Launch Profile with data no older than you choose.
/v1/domains/resolve
Authorization
Query
Casino URL or host (required). Canonicalized to its registrable domain. IP/junk → 400 invalid_domain.
Extra sections, including operator_launch_profile.
Maximum evidence age. 0 always checks the site again.
Whole-request ceiling. Rejected (402) before any data or charge if exceeded.
Example response200
{
"data": {
"domain": "ncc.bet",
"verdict": "licensed",
"licensed_by": [{ "geo": "anjouan", "license_number": "ALSI-202606035-FI2" }],
"blocked_by": [],
"observations": {
"operator_launch_profile": {
"availability": "available",
"reason": null,
"domain": "ncc.bet",
"regulatory_context": {
"market": "anjouan",
"license_number": "ALSI-202606035-FI2",
"licensee": { "company_ref": "igfc_example", "legal_name": "Luminex Synergy Collective Ltd" },
"authorized_domain": true
},
"launch": { "status": "live", "observed_at": "2026-07-12T15:21:21Z" },
"quality": { "source_count": 3 }
}
},
"billing": {
"credits_charged": 6,
"breakdown": [
{ "key": "domain.verdict", "units": 1, "credits_per_unit": 1, "credits_charged": 1 },
{ "key": "domain.operator_launch_profile", "units": 1, "credits_per_unit": 5, "credits_charged": 5 }
]
}
}
}
GET /domains/search
Bulk discovery of domains — the set of domains matching a verdict/geo/time filter (e.g. the whole Poland blocklist for a screening system, or "what got blocklisted since a date"). Rows are thin (verdict and both regulator lists, no company); pivot into GET /domains/resolve for the company_ref. Paginated; charged per row returned (domains_search_result) — an empty page is free.
Filters: verdict (blocklisted / licensed / mixed, required); geo (a regulator for blocklisted domains, a jurisdiction code for licensed domains); since / until (blocklist first_seen_at window — the newly-blocklisted feed); dropped_before (blocklist last_seen_at cutoff — the dropped-off feed); payment_category (card / crypto / ewallet / bank_transfer / open_banking / local_apm) — sites we currently observe taking that rail, which combines with any verdict; platform — sites whose most recent reading names that platform.
platform matches the site's latest reading, not every reading it ever had, so a site that migrated answers under the platform it runs on today and not the one it left. A name nobody has reviewed as a platform is a 400, never an empty page — "no site runs that" and "you spelled it wrong" are not answers you should have to tell apart. Every row also carries platform_present, a boolean saying whether a platform is known for that site; the name itself lives in GET /domains/resolve.
Note what payment_category narrows to: sites in the enriched catalogue where we have seen that rail. A site missing from the result either does not take it or has never been enriched, and the response cannot tell you which — absence of an observation is not evidence of absence of the rail. Use it to find sites that do take a rail, not to prove one does not.
GET /domains/search
COST 1 credit / result returned
The set of domains matching a verdict/geo/time filter, paginated. Charged per row returned; empty page is free.
/v1/domains/search
Authorization
Query
blocklisted | licensed | mixed (required).
Regulator (e.g. poland) for blocklisted/mixed, or a jurisdiction code (e.g. ukgc) for licensed.
ISO time; blocklist first_seen_at >= since (newly-blocklisted feed).
ISO time; blocklist last_seen_at < value (dropped-off feed).
card | crypto | ewallet | bank_transfer | open_banking | local_apm — sites currently observed taking that rail.
Rows per page (capped at 1000).
Hard cost ceiling for this pull.
Example response200
{
"data": {
"domains": [
{ "domain": "casino-x.pl", "verdict": "blocklisted", "licensed_by": [], "blocked_by": [{ "geo": "poland" }] }
],
"page": 1, "per_page": 100, "total": 25910,
"billing": { "returned_count": 1, "credits_per_result": 1, "credits_charged": 1, "page_size": 100 }
}
}
GET /logos/search
Find a logo by the name of a brand, supplier, game or payment method.
Free. That is deliberate rather than generous: a logo is distribution — you embed ours on your page and it shows the data exists — so a charge per lookup would work against the point of publishing them.
Rows carry logo identity and image choices: name, kind, slug, domain, role, logo_url, logos. No licence, company record ID or statement about who runs what. Search matches logo identity only; image choices come from our logo catalogue.
kind and domain are how the image endpoint addresses a card — img.igamingfinder.com/{domain}, or img.igamingfinder.com/{kind}/{slug} where the card has no host. Neither says the firm owns that host: a mark taken from a site is keyed by that site, so the name on the card and the host beside it can belong to different companies.
role is the only thing the card says about the firm, and it appears only where something evidenced it. It uses the public role vocabulary, and unlike company search it is an empty array — never ["unknown"] — when we hold no role for the card.
logo_url remains the default image. logos lists available current alternatives, each with url, source, variant, theme and format. Choose an alternative's URL to embed that specific stored image. Source categories are business_profile (Business profile), website (Website) and catalog (Catalog). These labels describe the source category, not a guarantee that a mark is official. Upstream provider names and source URLs are not included. Withdrawn and rejected images are not offered as current alternatives.
Queries need at least three characters, at most ten rows come back, there is no paging, and a total above ten comes back as found: 10 with found_capped: true rather than an exact count. That shapes the endpoint around "do you have this one?" rather than "list everything you have" — it raises the cost of walking the catalogue rather than preventing it. The only rate limit in force today is the shared per-IP one on /v1.
| Parameter | Meaning |
|---|---|
q |
Required name fragment, three characters or more |
kind |
Optional: operator_brand, company, supplier_brand, payment_method, game |
curl -H "X-API-Key: $IGF_API_KEY" \
"https://api.igamingfinder.com/v1/logos/search?q=pragmatic&kind=supplier_brand"
A subject with no logo yet is still returned, with logo_url: null and logos: [] — that is how you learn the brand is known and the mark is pending, instead of getting silence.
GET /logos/search
COST Free
Find a logo by name. Identity rows only; free.
/v1/logos/search
Authorization
Query
Name fragment, at least 3 characters. Shorter is rejected — this endpoint confirms a name, it does not list the catalogue.
operator_brand | company | supplier_brand | payment_method | game
Example response200
{
"data": {
"results": [
{
"name": "Pragmatic Play",
"kind": "supplier_brand",
"slug": "pragmatic-play",
"domain": "pragmaticplay.com",
"role": ["game_studio"],
"logo_url": "https://logos.igamingfinder.com/logos/supplier_brand/pragmatic-play/9f2c1ab4d5e60718.svg",
"logos": [
{
"url": "https://logos.igamingfinder.com/logos/supplier_brand/pragmatic-play/9f2c1ab4d5e60718.svg",
"source": "website",
"variant": "mark",
"theme": "neutral",
"format": "svg"
}
]
}
],
"found": 1,
"found_capped": false
}
}
The image itself is not served from this API. It lives at img.igamingfinder.com/{domain} or img.igamingfinder.com/{kind}/{slug}, needs no key, and answers with a redirect to the stored file — or a monogram when we hold no logo, so an <img> in your page never breaks. Add ?fallback=404 if you would rather branch yourself.
Prospect lists
Create a prospect list request through the public request form or the authenticated Dashboard form at /prospect-lists/new. The API is read-only: it can list, show, and download existing prospect lists; it cannot create a request.
All three retrieval operations cost zero credits. A requested or preparing prospect list returns metadata while its result stays hidden. CSV is available only when the prospect list is ready. A prospect list carries only data you can verify: accounts, their organizations, licences and brands, and named contacts. iGaming Finder does not send messages.
The web workspace shows target accounts, not staff editorial analysis. The JSON and CSV likewise exclude the internal request interpretation and executive summary.
A ready prospect list is a curated shortlist. Before an exact person is unlocked, its JSON and CSV expose each contact's name and role only; the professional profile URL, email, and profile fields are withheld. A ready prospect list's JSON result is a closed object with these sections:
| Section | Shape |
|---|---|
schema_version |
Integer, currently 1 |
target_accounts |
Up to 100 targets with target_ref, name, nullable website, candidate_organizations (name, role), key_contacts, and, when known, licences (jurisdiction, licence_number, nullable licence_type), brands and company_page_url (the company's page) |
target_accounts[].key_contacts |
At least one contact per target: opaque contact_ref, name, and nullable role. Exact identity, email, and profile fields are not part of the list contract. |
linked_contact_count is null before the list is ready; on a ready list it counts named contacts with a stored exact person-profile URL or signed Rinjani person locator. It is not a count of verified or available profiles. Zero means there is no exact-person lookup path in this delivery; contacts remain name-only research leads. A lookup checks that the returned person's name matches the selected contact before charging credits. Saving a name-only contact as a Prospect does not add a paid profile.
The ready prospect list CSV is a flattened target/contact view with exactly 10 columns and one row per contact. Cells that hold several values separate them with a line break:
prospect_list_ref, target_ref, account_name, website, organizations, licences, brands, contact_ref, contact_name, contact_role.
GET /prospect-lists
List the authenticated Client's requested, preparing, and ready prospect lists. Filter with status or cadence; use the opaque next_cursor as after for the next page.
GET /prospect-lists
COST Included with your prospect lists
List your prospect lists. The shared demo key is restricted; use your own API key to see your prospect lists.
/v1/prospect-lists
Authorization
Query
requested | preparing | ready
one_time | weekly | continuous
Opaque next_cursor from the previous page.
Prospect lists per page (maximum 50).
Cost: Included with your prospect lists
curl -H "X-API-Key: igf_demo_9457cf242d0c43404fb69b8273d7f4371716682a12c74e3c3274fd8957ebeae7" \
"https://api.igamingfinder.com/v1/prospect-lists?status=ready&page_size=20"
GET /prospect-lists/:prospect_list_ref
Show one of your prospect lists. Before ready, result, ready_at, target_account_count, linked_contact_count, and download_path are null.
GET /prospect-lists/:prospect_list_ref
COST Included with your prospect lists
Show one of your prospect lists. The shared demo key is restricted; use your own API key to see your prospect lists.
/v1/prospect-lists/:prospect_list_ref
Authorization
Query
Opaque reference for a prospect list owned by the authenticated Client.
Cost: Included with your prospect lists
curl -H "X-API-Key: igf_demo_9457cf242d0c43404fb69b8273d7f4371716682a12c74e3c3274fd8957ebeae7" \
https://api.igamingfinder.com/v1/prospect-lists/igfpl_example
GET /prospect-lists/:prospect_list_ref/download
Download a ready prospect list as CSV. Requested and preparing prospect lists return 409 prospect_list_not_ready; unknown, cancelled, and other-Client refs return 404.
GET /prospect-lists/:prospect_list_ref/download
COST Included with your prospect lists
Download one of your ready prospect lists. The shared demo key is restricted; use your own API key to see your prospect lists.
/v1/prospect-lists/:prospect_list_ref/download
Authorization
Query
Opaque reference for a ready prospect list owned by the authenticated Client.
Cost: Included with your prospect lists
curl -H "X-API-Key: igf_demo_9457cf242d0c43404fb69b8273d7f4371716682a12c74e3c3274fd8957ebeae7" \
-O https://api.igamingfinder.com/v1/prospect-lists/igfpl_example/download
GET /account
Get your current plan and credit usage.
Cost: 0 credits / request
curl -H "X-API-Key: igf_demo_9457cf242d0c43404fb69b8273d7f4371716682a12c74e3c3274fd8957ebeae7" \
https://api.igamingfinder.com/v1/account
Response:
{
"success": true,
"data": {
"plan": "starter",
"credits_granted": 2500,
"credits_used": 120,
"credits_reserved": 10,
"available_credits": 2370
}
}
[!NOTE] Credits are a prepaid balance:
credits_grantedaccrues when your plan starts or renews and never expires — there is no monthly reset.credits_granted: nullmeans no quota is enforced (used only for our own accounts). Plan credit allowances are listed on the pricing page.
The signed-in Account usage view is separate from GET /account. It shows requested_at, endpoint, status, credits, duration_ms, filtered request_params, settlement_status, source, client_version, mcp_tool_name, connector_session_id, mcp_client_name, and mcp_client_version. Customer rows remove stored domain and host. The overview defaults to 10 rows per page and caps per_page at 50; the compact usage list is limited to 50 recent rows. Request parameters use server-side secret filtering and become { "_truncated": true } when the stored JSON would exceed 8,192 bytes. No retention period is stated here.
POST /exports
Create a bulk export of filtered Domain data as CSV or JSON. JSON output is one array, not a line-delimited stream. Every export stops at 10,000 rows. A credit-limited export can complete with only the rows affordable at execution time, so compare total_rows with the number of rows you expected. Completed files expire after 24 hours.
A non-empty CSV has exactly four columns: domain_normalized, company_name, status, last_enriched_at; an empty CSV result currently produces a zero-byte file. fields[] affects JSON includes only and does not change CSV columns.
Request body:
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
filters |
object | no | {} |
Domain export filters: jurisdiction, payment_category, supplier_brand, exclude_provider, exclude_payment (category), has_affiliate, geo_hint, and ISO-8601 enriched_after. These are not the Company search filter vocabulary; unknown keys are currently ignored. |
export_format |
string | no | "csv" |
"csv" or "json" |
fields[] |
string[] | no | [] |
Domain include sections for JSON output only; ignored by the fixed CSV writer |
Cost: Variable (number of results × the matching resolve price)
curl -X POST -H "X-API-Key: igf_demo_9457cf242d0c43404fb69b8273d7f4371716682a12c74e3c3274fd8957ebeae7" \
-H "Content-Type: application/json" \
-d '{"filters": {"jurisdiction": "MGA"}, "export_format": "csv"}' \
https://api.igamingfinder.com/v1/exports
import requests
r = requests.post(
"https://api.igamingfinder.com/v1/exports",
headers={
"X-API-Key": "igf_demo_9457cf242d0c43404fb69b8273d7f4371716682a12c74e3c3274fd8957ebeae7",
"Content-Type": "application/json",
},
json={
"filters": {"jurisdiction": "MGA"},
"export_format": "csv",
},
)
print(r.json())
Response (202):
{
"success": true,
"message": "Export queued",
"data": {
"export_id": 123,
"poll_url": "/v1/exports/123"
}
}
GET /exports/:id
Poll export status.
Path parameters:
| Name | Type | Required | Description |
|---|---|---|---|
id |
integer | yes | Export ID |
GET /exports/:id
COST 0 credits / request
Poll export status. The demo key uses a stable simulated export id.
/v1/exports/:id
Authorization
Query
Stable demo export id.
Cost: 0 credits / request
curl -H "X-API-Key: igf_demo_9457cf242d0c43404fb69b8273d7f4371716682a12c74e3c3274fd8957ebeae7" \
https://api.igamingfinder.com/v1/exports/123
Response (completed):
{
"success": true,
"data": {
"id": 123,
"status": "completed",
"format": "csv",
"download_url": "/v1/exports/123/download",
"total_rows": 5000,
"credits_used": 50,
"expires_at": "2026-05-10T10:30:00Z"
}
}
GET /exports/:id/download
Download a completed export file.
GET /exports/:id/download
COST 0 credits / request
Download a completed export file. The demo key returns a tiny deterministic CSV.
/v1/exports/:id/download
Authorization
Query
Stable demo export id.
Cost: 0 credits / request
curl -H "X-API-Key: igf_demo_9457cf242d0c43404fb69b8273d7f4371716682a12c74e3c3274fd8957ebeae7" \
-O https://api.igamingfinder.com/v1/exports/123/download
Returns the file as an attachment with Content-Disposition: attachment. JSON downloads contain one JSON array. A non-empty CSV contains only domain_normalized, company_name, status, and last_enriched_at; an empty CSV result currently produces a zero-byte file. The maximum is 10,000 rows; credit-limited exports can complete partially; completed files expire after 24 hours.
Errors:
| Status | Meaning |
|---|---|
| 404 | Export not found, still pending, or file expired |