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. A resolve request with max_age_days can refresh included data and wait up to 240 seconds. Configure clients to allow at least 300 seconds for these requests. 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 a natural identifier or an opaque company_ref to the Company profile. Returns the supported customer profile: licenses, Domains, enumerated payment methods, and content suppliers. Charged per profile successfully returned (companies_resolve_profile). Pass include[]=firmographics explicitly for paid, exact-Domain operating-organization data.
Provide exactly one of these, or an opaque company_ref:
company_ref— authoritative and exclusive; anigfc_…handle from a prior response.license_number(+ optionaljurisdiction) — a bare ambiguous number returns409 ambiguous_license_number(charge 0).domain— a casino URL or host; canonicalized to its registrable domain, then resolved to licensee Companies plus the brand owner, each tagged inmatched_as. IP/junk →400 invalid_domain; a valid domain absent from our data →404 not_found.legal_entity— exact regulator-filed legal name match. Trade names, platforms, domains, and unknown subjects do not match it.name— exact published subject or brand name; collisions returnmatches[]candidates (charge 0).
When more than one natural identifier is supplied, precedence is license_number → domain → legal_entity → name.
Every profile includes subject_kind: legal_entity, trade_name, platform, domain, or unknown. legal_entity is null unless the source filed a legal entity. Use name or company_ref to resolve non-legal subjects.
See Company API for the supported resolve and search field contracts.
GET /companies/resolve
COST 3 credits / profile returned
Resolve a natural identifier or an opaque company_ref to the Company profile(s). Charged per profile successfully returned.
/v1/companies/resolve
Authorization
Query
Opaque public handle (igfc_…). Authoritative and exclusive.
License number; pair with jurisdiction when a bare number is ambiguous.
mga, ukgc, curacao, anjouan
Casino URL or host. Canonicalized to its registrable domain, then resolved to licensee + brand-owner Companies. IP/junk → 400 invalid_domain.
Exact legal company name
Exact company or brand name
Sections to add. Pass firmographics explicitly for the paid firmographics section, billed per Domain.
Exact eligible Domain selector (igfd_…). Omit to enrich every eligible Domain when firmographics is requested.
Refresh Domain firmographics older than N days; 0 forces refresh.
When true (the server default), return the latest complete success after a transient refresh failure.
Hard cost ceiling. Rejected (402) before any data is returned if exceeded.
Example response200
{
"success": true,
"data": {
"resolved_by": "company_ref",
"ignored_inputs": {},
"input_company_ref": "igfc_3uSBTwEXnRo1rfvmRs6fgdMr",
"resolved_company_ref": "igfc_3uSBTwEXnRo1rfvmRs6fgdMr",
"ref_status": "active",
"companies": [
{
"company_ref": "igfc_3uSBTwEXnRo1rfvmRs6fgdMr",
"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"
}
}
}
When firmographics is requested, the response field is always a FirmographicsResult[]. A domain_ref selects exactly one related Domain; omitting it returns every eligible Domain. Before any data is fetched, the max_credits check covers the base profiles plus every candidate Domain. Each available fresh, cached, or stale Domain result uses the configured rate below; unavailable results cost zero optional credits. See Company API: Paid Domain-scoped firmographics for the full response and what happens when a refresh fails.
Cost: 12 credits / delivered Domain result
curl -H "X-API-Key: igf_demo_9457cf242d0c43404fb69b8273d7f4371716682a12c74e3c3274fd8957ebeae7" \
"https://api.igamingfinder.com/v1/companies/resolve?name=Stake"
import requests
r = requests.get(
"https://api.igamingfinder.com/v1/companies/resolve",
headers={"X-API-Key": "igf_demo_9457cf242d0c43404fb69b8273d7f4371716682a12c74e3c3274fd8957ebeae7"},
params={"name": "Stake"},
)
print(r.json())
Errors:
| Status | Meaning |
|---|---|
| 400 | invalid_domain — the domain input is not a valid registrable domain (IP/junk) |
| 404 | not_found — no Company matches the identifier |
| 409 | ambiguous_license_number or conflicting_lookup_input (charge 0) |
GET /companies/search/preview
Free anti-surprise preview — total match count, counts per filter value, per-page_size cost estimates, and a tiny redacted sample. No paid data, no charge. 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, per-page_size cost estimates, and a tiny redacted sample. 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
mga, ukgc, curacao, anjouan
Registrable domain; applied as an exact filter (canonicalized). IP/junk → 400 invalid_domain.
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.
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, 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.
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.
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,
"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.
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/:company_ref/people
Return decision-maker contacts for a resolved Company. This is separate from GET /companies/resolve: base Company profiles describe the organization, while people contacts are an optional add-on whose cost scales with contacts returned.
GET /companies/:company_ref/people
COST 9 credits / contact returned
Return decision-maker contacts for a resolved Company. Charged per contact returned.
/v1/companies/:company_ref/people
Authorization
Query
Company ref. The public demo key only accepts this stable demo ref.
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. How many people on file each glossary role would return, as `role_counts`; no source is called and nothing is charged. A company with nobody on file answers `available: false, reason: not_cached`. Each delivered contact carries the `role_key` it answers to.
Contacts requested. Billing is per contact returned.
Serve stored data if it is younger than N days; 0 always fetches fresh data from the source.
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. 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 read stored data and 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.
A ready prospect list's JSON result is a closed object with these sections:
| Section | Shape |
|---|---|
schema_version |
Integer, currently 1 |
request_interpretation |
journey and summary |
executive_summary |
Prospect-list-level summary text |
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) and brands |
target_accounts[].key_contacts |
At least one contact per target: contact_ref, name, nullable role, nullable professional_profile_url, and contact_channels with verified email addresses only |
The ready prospect list CSV is a flattened target/contact view with exactly 12 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, professional_profile_url, verified_emails.
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, 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 |