Base URL

All API requests use:

text
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 with GET /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.

GET /v1/signals/market-entries
Authorization
string
Query
string
string
integer
integer

Whole-request cost ceiling.

Example response200
{"success":true,"data":{"query":{"jurisdiction":"anjouan","event_type":[]},"total":0,"signals":[],"billing":{"credits_charged":0}}}
bash
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.

GET /v1/signals/platform-sites
Authorization
string
Query
string
string
integer
integer

Whole-request cost ceiling.

Example response200
{"success":true,"data":{"query":{"role":"operator","platform":"digitain"},"total":0,"signals":[],"billing":{"credits_charged":0}}}
bash
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.

GET /v1/signals/register-changes
Authorization
string
Query
string
string

Optional exact published-name filter within the jurisdiction.

integer
Example response200
{"success":true,"data":{"query":{"jurisdiction":"philippines"},"total":0,"signals":[],"billing":{"credits_charged":0}}}
bash
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; an igfc_… handle from a prior response.
  • license_number (+ optional jurisdiction) — a bare ambiguous number returns 409 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 in matched_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 return matches[] candidates (charge 0).

When more than one natural identifier is supplied, precedence is license_numberdomainlegal_entityname.

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.

GET /v1/companies/resolve
Authorization
string
Query
string

Opaque public handle (igfc_…). Authoritative and exclusive.

string

License number; pair with jurisdiction when a bare number is ambiguous.

string

mga, ukgc, curacao, anjouan

string

Casino URL or host. Canonicalized to its registrable domain, then resolved to licensee + brand-owner Companies. IP/junk → 400 invalid_domain.

string

Exact legal company name

string

Exact company or brand name

string

Sections to add. Pass firmographics explicitly for the paid firmographics section, billed per Domain.

string

Exact eligible Domain selector (igfd_…). Omit to enrich every eligible Domain when firmographics is requested.

integer

Refresh Domain firmographics older than N days; 0 forces refresh.

boolean

When true (the server default), return the latest complete success after a transient refresh failure.

integer

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

bash
curl -H "X-API-Key: igf_demo_9457cf242d0c43404fb69b8273d7f4371716682a12c74e3c3274fd8957ebeae7" \
  "https://api.igamingfinder.com/v1/companies/resolve?name=Stake"

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.

GET /v1/companies/search/preview
Authorization
string
Query
string

Free-text query

string

operator, aggregator, platform_provider, payment_provider, game_studio, affiliate_software, affiliate_media, other_supplier, unknown

string

mga, ukgc, curacao, anjouan

string
string
string
boolean
string

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.


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.

GET /v1/companies/search
Authorization
string
Query
string
string
string
string
string
string
string
boolean

False means no reviewed platform is published, not that the Company has no platform.

string

Registrable domain; applied as an exact filter (canonicalized). IP/junk → 400 invalid_domain.

integer
integer

Rows per page (max 100). You are charged per row returned.

integer

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.

GET /v1/companies/:company_ref/people
Authorization
string
Query
string

Company ref. The public demo key only accepts this stable demo ref.

string

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.

boolean

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.

integer

Contacts requested. Billing is per contact returned.

integer

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
bash
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.

GET /v1/people/roles
Authorization
string
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.

GET /v1/licenses/resolve
Authorization
string
Query
string

Opaque public handle (igfl_…). Authoritative and exclusive.

string

Licence number; pair with jurisdiction when a bare number is ambiguous.

string

mga, ukgc, curacao, anjouan

integer

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.

GET /v1/licenses/search/preview
Authorization
string
Query
string

Full-text query (licence number, company name, jurisdiction, type).

string
string
string
string

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.

GET /v1/licenses/search
Authorization
string
Query
string

Full-text query (licence number, company name, jurisdiction, type).

string
string
string
string
integer

Rows per page (capped at 100).

integer

Hard cost ceiling for this pull.


GET /domains/resolve

The trust front door. Give a casino domain, get its verdictlicensed (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.

text
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.

bash
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.

GET /v1/domains/resolve
Authorization
string
Query
string

Casino URL or host (required). Canonicalized to its registrable domain. IP/junk → 400 invalid_domain.

string

Extra sections, including operator_launch_profile.

integer

Maximum evidence age. 0 always checks the site again.

integer

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 }
      ]
    }
  }
}

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.

GET /v1/domains/search
Authorization
string
Query
string

blocklisted | licensed | mixed (required).

string

Regulator (e.g. poland) for blocklisted/mixed, or a jurisdiction code (e.g. ukgc) for licensed.

string

ISO time; blocklist first_seen_at >= since (newly-blocklisted feed).

string

ISO time; blocklist last_seen_at < value (dropped-off feed).

string

card | crypto | ewallet | bank_transfer | open_banking | local_apm — sites currently observed taking that rail.

integer

Rows per page (capped at 1000).

integer

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 }
  }
}

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
bash
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.

GET /v1/logos/search
Authorization
string
Query
string

Name fragment, at least 3 characters. Shorter is rejected — this endpoint confirms a name, it does not list the catalogue.

string

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.

GET /v1/prospect-lists
Authorization
string
Query
string

requested | preparing | ready

string

one_time | weekly | continuous

string

Opaque next_cursor from the previous page.

integer

Prospect lists per page (maximum 50).

Cost: Included with your prospect lists

bash
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.

GET /v1/prospect-lists/:prospect_list_ref
Authorization
string
Query
string

Opaque reference for a prospect list owned by the authenticated Client.

Cost: Included with your prospect lists

bash
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.

GET /v1/prospect-lists/:prospect_list_ref/download
Authorization
string
Query
string

Opaque reference for a ready prospect list owned by the authenticated Client.

Cost: Included with your prospect lists

bash
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

bash
curl -H "X-API-Key: igf_demo_9457cf242d0c43404fb69b8273d7f4371716682a12c74e3c3274fd8957ebeae7" \
  https://api.igamingfinder.com/v1/account

Response:

json
{
  "success": true,
  "data": {
    "plan": "starter",
    "credits_granted": 2500,
    "credits_used": 120,
    "credits_reserved": 10,
    "available_credits": 2370
  }
}

[!NOTE] Credits are a prepaid balance: credits_granted accrues when your plan starts or renews and never expires — there is no monthly reset. credits_granted: null means 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)

bash
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

Response (202):

json
{
  "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.

GET /v1/exports/:id
Authorization
string
Query
string

Stable demo export id.

Cost: 0 credits / request

bash
curl -H "X-API-Key: igf_demo_9457cf242d0c43404fb69b8273d7f4371716682a12c74e3c3274fd8957ebeae7" \
  https://api.igamingfinder.com/v1/exports/123

Response (completed):

json
{
  "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.

GET /v1/exports/:id/download
Authorization
string
Query
string

Stable demo export id.

Cost: 0 credits / request

bash
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