CRMs collect years of contacts from forms, imports, events and integrations. Many are personal addresses, disposable inboxes or typos, and they distort pipeline reports, lead scoring and email deliverability.
What to add to every contact (or company)
| Property | From | Use |
|---|---|---|
| Email category | category |
Segment: business, personal, education, government… |
| Disposable / relay | is_disposable, is_relay |
Suppress from sequences and reporting |
| Invalid | category: "invalid" |
Remove or fix: the domain can’t receive mail |
| Typo suggestion | did_you_mean |
Queue for correction |
| Suite | workspace.*.detected, other_suite |
Segment and route by stack |
| Microsoft tenant | workspace.microsoft_365.tenant_id |
Account matching; integration readiness |
Do it in batches, by domain
Most contacts share domains. De-duplicate to domains first, check those, then join back:
import os
from collections import defaultdict
import requests
contacts = load_contacts() # [{"id": ..., "email": ...}, ...]
by_domain = defaultdict(list)
for c in contacts:
by_domain[c["email"].rsplit("@", 1)[-1].lower()].append(c)
domains = list(by_domain)
headers = {"Authorization": f"Bearer {os.environ['IBE_API_KEY']}"}
for i in range(0, len(domains), 100):
chunk = domains[i:i + 100]
r = requests.post(
"https://api.isbusinessemail.com/v1/check/batch",
json={"items": chunk},
headers=headers,
timeout=30,
)
r.raise_for_status()
for result in r.json()["results"]:
for c in by_domain[result["domain"]]:
update_contact(c["id"], {
"email_category": result["category"],
"uses_microsoft_365": result["workspace"]["microsoft_365"]["detected"],
"uses_google_workspace": result["workspace"]["google_workspace"]["detected"],
})
A domain check costs one check, however many contacts share it. Thousands of contacts often reduce to a fraction as many domains.
Mind your daily quota (100 checks on a new account). Spread a large back-fill over a few days, or ask for higher limits. Rate-limit handling is in Rate limits.
Keep it clean
- Check new contacts as they arrive, with a Zapier, Make, n8n or HubSpot workflow.
- Re-check domains every few months; verdicts improve, and companies change providers.
- Address-level flags (role account,
+tag, exact-address blocklist) need an email check rather than a domain check. Use those for the contacts you’re about to email.
What this isn’t
We classify domains; we don’t verify that each mailbox exists. Before a large send, use a deliverability verification service as well; see alternatives for how the two differ.
Related: Batch checks · B2B lead qualification