iGaming Finder

Base URL

All API requests use:

text
https://api.igamingfinder.com/api/v1/igaming

Authenticate with X-API-Key or Authorization: Bearer header. See Authentication.

The core surface 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 authoritative 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.

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

Consume qualified Company events by regulatory license regime. V1 requires kind=licensed_market_entry and a market such as ukgc or anjouan. occurred_at comes only from the regulator's authoritative issued_at; import-time first_seen_at never qualifies an entry.

The base row exposes the regulatory Licensee, complete normalized authorized domains, evidence, and quality. It does not infer an operating organization. Omitted firmographics and contacts coverage is not_requested; explicitly requested V1 compositions return HTTP 200 with not_available, reason composition_not_yet_available, and zero optional charge.

Each delivered Signal row costs one credit. Every new request bills delivered rows again; retain next_cursor to poll incrementally. Only an exact replay with the same Idempotency-Key and request parameters avoids a second debit. Use a fresh Idempotency-Key for every cursor page because changing after changes the request identity.

Pagination is cursor-only: page may only be 1; pass the previous next_cursor as after for subsequent pages. Cursors are bound to kind, market, and occurrence-date filters, so reusing one with different row filters returns invalid_cursor. An empty poll preserves the supplied cursor as a resumable position rather than returning null as an EOF sentinel. With after, total is the number of matching rows remaining after that cursor, not the market's lifetime total.

domains[], contacts_limit, and max_age_days are validated request controls reserved for the unavailable V1 compositions. They are echoed in query but trigger no supplier call or optional charge until those compositions become available.

GET /signals

COST 1 credit / Signal returned

Qualified licensed-market-entry Signals by regulatory license regime. Charged per delivered row.

GET /api/v1/igaming/signals
Authorization
string
Query
string
string
integer
integer

Whole-request cost ceiling.

Example response200
{
  "success": true,
  "data": {
    "query": { "kind": "licensed_market_entry", "market": "anjouan" },
    "total": 1,
    "signals": [{
      "signal_ref": "igfs_example",
      "kind": "licensed_market_entry",
      "quality": { "coverage": {
        "licenses": { "status": "included" },
        "authorized_domains": { "status": "included" },
        "firmographics": { "status": "not_requested" },
        "contacts": { "status": "not_requested" }
      }}
    }],
    "billing": { "credits_charged": 1, "breakdown": [
      { "key": "signal.base", "units": 1, "credits_per_unit": 1, "credits_charged": 1 }
    ]}
  }
}
bash
curl -H "X-API-Key: igf_demo_9457cf242d0c43404fb69b8273d7f4371716682a12c74e3c3274fd8957ebeae7" \
  -H "Idempotency-Key: YOUR_REQUEST_KEY" \
  "https://api.igamingfinder.com/api/v1/igaming/signals?kind=licensed_market_entry&market=anjouan&page_size=5&max_credits=5"

Coverage uses exactly licenses, authorized_domains, firmographics, and contacts, with statuses included, available, not_available, or not_requested.

GET /companies/resolve

Resolve a natural identifier or an opaque company_ref to the authoritative Company profile. Returns the full nested profile: licenses, Domains, enumerated payment methods and game providers, and provenance. 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 legal company name match.
  • name — exact company or brand name; collisions return matches[] candidates (charge 0).

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

GET /companies/resolve

COST 3 credits / profile returned

Resolve a natural identifier or an opaque company_ref to the authoritative Company profile(s). Charged per profile successfully returned.

GET /api/v1/igaming/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

Closed include catalog. Pass firmographics explicitly for the paid Domain-scoped composition.

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 payload 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.",
        "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"],
        "game_providers": ["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 intentionally fans out across every eligible Domain. The preflight max_credits check covers the base profiles plus every candidate Domain before acquisition starts. 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 stale-fallback contract.

Cost: 12 credits / delivered Domain result

bash
curl -H "X-API-Key: igf_demo_9457cf242d0c43404fb69b8273d7f4371716682a12c74e3c3274fd8957ebeae7" \
  "https://api.igamingfinder.com/api/v1/igaming/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, allowlisted facet counts, per-page_size cost estimates, and a tiny redacted sample. No paid payload, 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, allowlisted facet counts, per-page_size cost estimates, and a tiny redacted sample. No paid payload.

GET /api/v1/igaming/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

string

mga, ukgc, curacao, anjouan

string
string
string
boolean
string

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


Paid ranked discovery rows. Search rows are thin discovery candidates — they 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.

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 /api/v1/igaming/companies/search
Authorization
string
Query
string
string
string
string
string
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.",
        "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,
        "game_provider_count": 1,
        "affiliate_program_present": true,
        "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. 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 /api/v1/igaming/companies/:company_ref/people
Authorization
string
Query
string

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

string

Optional role search, e.g. payments, compliance, affiliate, marketing.

integer

Contacts requested. Billing is per contact returned.

integer

Freshness knob (ADR-0050). Serve owned-store cache if younger than N days; 0 forces a fresh pull from the source.


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 /api/v1/igaming/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 payload if exceeded.


GET /licenses/search/preview

Free anti-surprise preview for licence discovery. Returns total count, allowlisted facets, per-page cost estimates, and a tiny redacted sample. No paid payload.

GET /licenses/search/preview

COST 0 credits / request

Preview License search count, facets, and cost before pulling paid rows.

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

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

string
string
string
string

Ranked licence discovery rows. Rows are thin: they carry the license_ref, issuing company_ref, facets, and counts; 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 /api/v1/igaming/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 both per-jurisdiction axes — 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.

Operator Launch Profile

Pass include[]=operator_launch_profile to compose fresh registration, DNS, rendered web presence, launch state, legal claims, public website emails, related-domain evidence, quality, coverage, and opaque evidence references around the base verdict. A profile is available only when the domain has one unambiguous regulatory Operator context and observed domain evidence.

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, regulatory Licensee, website owner/operator/billing claims, Brand, and technical clusters are separate source-labelled planes. Shared registrar, DNS, CDN, MX, nameserver, IP, hosting, or redirects never prove ownership; technical relationships return ownership_claimed: false. Public evidence references are stable opaque handles. Raw HTML, screenshots, artifact URLs, and storage paths remain private.

An available profile adds 5 credits to the 1-credit verdict, charged atomically as one 6-credit delivery. If the composition 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 applies the freshness gate inside resolve (0 forces capture; 7 accepts evidence at most seven days old). When it is combined with raw observation facets, the whole-request max_credits check includes the standard domain-enrichment reservation as well as the delivered verdict/profile, before any acquisition starts. The enrichment reservation keeps its own asynchronous settlement record; the verdict/profile remains one aggregate synchronous delivery. A new non-idempotent request charges delivered data again. Send a fresh Idempotency-Key for each new request; only an exact same-key/same-parameter replay 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/api/v1/igaming/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 compose a freshness-gated Operator Launch Profile.

GET /api/v1/igaming/domains/resolve
Authorization
string
Query
string

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

string

Additive facets or the operator_launch_profile composition.

integer

Maximum evidence age. 0 forces fresh capture.

integer

Whole-request ceiling. Rejected (402) before any payload 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", "confidence": "high", "reasons": ["licensed_domain", "product_site_rendered", "legal_pages_present"] },
        "quality": { "confidence": "high", "source_count": 3, "warnings": ["operator_differs_from_licensee"] }
      }
    },
    "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 on the domain axis — 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 + both axes, 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 the black axis, a jurisdiction code for the white axis); since / until (blocklist first_seen_at window — the newly-blocklisted feed); dropped_before (blocklist last_seen_at cutoff — the dropped-off feed).

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 /api/v1/igaming/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).

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

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/api/v1/igaming/account

Response:

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

[!NOTE] Credits are an upfront ledger: 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 (internal accounts). Plan credit allowances are listed on the pricing page.


POST /exports

Create a bulk export of filtered Company/domain data as CSV or JSONL.

Request body:

Name Type Required Default Description
filters object no {} Company search/export filters such as jurisdiction, payment category, provider, affiliate presence, geography, and freshness. See Company Filters.
export_format string no "csv" "csv" or "json"
fields[] string[] no all Specific sections to include

Cost: Variable (based on result count)

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/api/v1/igaming/exports

Response (202):

json
{
  "success": true,
  "message": "Export queued",
  "data": {
    "export_id": 123,
    "poll_url": "/api/v1/igaming/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 /api/v1/igaming/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/api/v1/igaming/exports/123

Response (completed):

json
{
  "success": true,
  "data": {
    "id": 123,
    "status": "completed",
    "format": "csv",
    "download_url": "/api/v1/igaming/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 /api/v1/igaming/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/api/v1/igaming/exports/123/download

Returns the file as an attachment with Content-Disposition: attachment.

Errors:

Status Meaning
404 Export not found, still pending, or file expired