API Reference

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. 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 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 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 — an igfc_… 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_as tells 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_found for 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>. Use https. 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.

GET /v1/companies/resolve
Authorization
string
Query
string

Opaque public handle (igfc_…).

string

Casino URL or host. Reduced to its registrable domain, then matched to the licensee and brand-owner Companies. IP/junk → 400 invalid_domain.

string

Company page URL (path /company/<slug>, https). Query, fragment and trailing slash are ignored.

string

Exact legal company name

string

Optional paid sections: firmographics, people. Repeat include[] for both.

integer

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

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

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.

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

GET /v1/companies/firmographics
Authorization
string
Query
string

Opaque Company ref; the demo key accepts only this sample.

string

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.

string

HTTPS company page URL with path /company/<slug>.

string

Exact regulator-filed legal name.

integer

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.

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

Optional Company sector. Use the same value when requesting a quote.

string

Licensing jurisdiction, country name or ISO code: mga, Malta or MT. The response query shows normalized filters.

string
string
string

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.

string

Observed site language (ar) or currency (USD), independent from the geo country filter.

boolean
string

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

string

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.


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.

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.

string

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.

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,
        "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.

GET /v1/companies/people
Authorization
string
Query
string

Opaque Company ref; the demo key accepts only this sample.

string

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.

string

HTTPS company page URL with path /company/<slug>.

string

Exact regulator-filed legal name.

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

integer

Contacts in one answer: 10 when absent, 100 at most. Billing is per contact returned.

string

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

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

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.

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

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