Batch domain check
POST /v1/check/batch resolves up to 100 domains in one request, so a
KYB sweep or affiliate-list audit is one round trip instead of N. 200
merchants = 2 calls, not 200.
Authenticated (the single GET /v1/check stays keyless); domains only.
Request
Section titled “Request”curl -s -X POST https://api.igregulator.io/v1/check/batch \ -H "Authorization: Bearer $IGREGULATOR_KEY" \ -H "Content-Type: application/json" \ -d '{"domains":["bet365.com","www.virginbet.com","casino.com"]}'Response
Section titled “Response”checked_jurisdictions is returned once at the top (it’s the same for
every row — keeps the payload lean). Each result mirrors the single-check
shape: match, confidence, and match_absence_reason on a miss.
{ "count": 3, "checked_jurisdictions": ["AN", "CW", "KH", "MGA", "TGC", "UKGC"], "results": [ { "query": { "domain": "bet365.com" }, "match": { "operator": "Hillside (UK Sports) ENC", "...": "…" }, "confidence": "high" }, { "query": { "domain": "www.virginbet.com" }, "match": { "operator": "Virgin Bet Limited", "domain_association": "white_label", "...": "…" }, "confidence": "high" }, { "query": { "domain": "casino.com" }, "match": null, "confidence": "low", "match_absence_reason": "generic_term" } ]}Partial success
Section titled “Partial success”A malformed hostname doesn’t fail the batch — that row comes back with an
error and match: null, and every other domain still resolves:
{ "query": { "domain": "not a domain" }, "match": null, "confidence": "none", "error": "invalid_hostname" }Limits & semantics
Section titled “Limits & semantics”- Max 100 domains per request; paginate beyond.
- Domains are resolved with bounded concurrency server-side — order of
resultsfollows the order you sent. - Counts as one request against your plan quota today.
- Each result uses the same matching as
GET /v1/check(exact host → eTLD+1 → fuzzy), sowww/apex variants resolve identically.
Clients
Section titled “Clients”import requests
r = requests.post( "https://api.igregulator.io/v1/check/batch", headers={"Authorization": f"Bearer {KEY}"}, json={"domains": domains[:100]},)for row in r.json()["results"]: m = row["match"] if m and row["confidence"] in ("high", "medium"): verdict = f"{m['operator']} ({m['status']})" elif row.get("error"): verdict = f"invalid: {row['error']}" else: verdict = f"no match ({row.get('match_absence_reason')})" print(row["query"]["domain"], "→", verdict)const res = await fetch('https://api.igregulator.io/v1/check/batch', { method: 'POST', headers: { Authorization: `Bearer ${KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ domains: domains.slice(0, 100) }),});const { results } = await res.json();for (const row of results) { if (row.match && ['high', 'medium'].includes(row.confidence)) { console.log(row.query.domain, '→', row.match.operator, row.match.status); } else { console.log(row.query.domain, '→', row.error ?? `no match (${row.match_absence_reason})`); }}