Skip to content

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.

Terminal window
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"]}'

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

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" }
  • Max 100 domains per request; paginate beyond.
  • Domains are resolved with bounded concurrency server-side — order of results follows 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), so www/apex variants resolve identically.
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})`);
}
}