Confirm Domain — company name + phone → proven website
Pricing
$5.00 / 1,000 confirmed domains
Confirm Domain — company name + phone → proven website
Returns a company's domain only when the phone number from your record is found on the page — and hands back the page URL and the sentence it was found in. No proof, no charge.
Pricing
$5.00 / 1,000 confirmed domains
Rating
0.0
(0)
Developer
Danilo Dzyuban
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
23 days ago
Last modified
Categories
Share
Confirm Domain
Most enrichment APIs guess. This one proves.
You send a company name and its phone number. You get back the domain — but only when that phone number was actually found on the site, together with the page it was found on and the sentence it appeared in. If there is no proof, there is no charge.
{"input_name": "Midfield Dental Center","domain": "midfielddentalcenter.com","confidence": "confirmed","confirmed_by": "phone_tel_link","evidence": "…Call our office today at (205) 923-6828 to schedule your visit…","evidence_url": "https://midfielddentalcenter.com/contact","candidates_tested": 24,"candidates_alive": 3,"alternatives": ["midfielddental.com"],"billable": true}
Why this exists
Clearbit's Name-to-Domain API was shut down for new users on 30 April 2025. What replaced it scores candidates by how similar a string looks to a company name. That is a guess, and a guess is expensive downstream: you email the wrong domain, and you pay for it with your sending reputation, not with the $0.005 the lookup cost.
A phone number is a harder anchor than a name. smilecentre.ca tells you nothing
about whether it belongs to Dr. Smith Dentistry. The number printed on that site does.
Four outcomes, and you only pay for one
confidence | What it means | Charged |
|---|---|---|
confirmed | The phone from your record was found on the site | yes |
likely | The company name was found, the phone was not | no |
ambiguous | Live candidate domains exist, none could be proven | no |
not_found | DNS answered, and no candidate domain exists | no |
check_failed | DNS did not answer — the check did not happen, retry | no |
The last two used to be one outcome. They are not the same thing, and conflating them is how a tool reports an answer it never obtained.
confirmed_by tells you how it was proven: phone_tel_link (a tel: link),
phone_jsonld (schema.org markup), or phone_text (visible page text).
Measured, not claimed
Benchmark of 11 August 2026. 400 US and Canadian dental practices. Ground truth
is the website tag from OpenStreetMap — an independent source, not this tool's own
output.
| Metric | Result |
|---|---|
| Confirmations returned | 45 of 400 records |
| Matched the independent domain exactly | 42 of 45 |
| Disagreed with it | 3 of 45 |
Coverage — records reaching confirmed | 11.3% |
| Throughput | 62 records/min |
Proof source: tel: link / text / JSON-LD | 39 / 4 / 2 |
Three things you would find yourself, so they are here:
An earlier pilot on 60 records looked much better — 18 of 19 correct, 31.7%
coverage — and it was misleading. Sixty records do not generate enough load to
break anything. At 400 the DNS stage was answering roughly 9,600 queries, began
timing out, and the tool reported "no such domain" for records whose domains were
alive. That is fixed (see check_failed above), but the honest numbers are the ones
in the table, not the pilot's.
All three disagreements are the same case, and it is arguable. Bischoff Family
Dentistry resolves to belmontdentistry.com; Riley Farm Dental to
valleyfamilydentalpractice.com. These are practices whose own domain now redirects
to the one that absorbed or renamed them — the phone matched, the returned domain is
where the site actually lives, and the volunteer-maintained OSM tag holds the older
name. They are counted as errors above anyway, because we cannot prove that reading
for every case.
Coverage is one record in nine. Practices named after a person routinely sit on
an unrelated domain — Kim L. Peters, DMD on northdeandental.com, King Dental on
drkingdentistry.com. No name-based method reaches those, this one included. This is
an addition to your enrichment stack, not a replacement for it: you pay for the
fraction that can be proven, and nothing for the rest.
Usage
As an Apify Actor
{"records": [{ "name": "Midfield Dental Center", "phone": "+1-205-923-6828", "country": "US" },{ "name": "Grand River Dental", "phone": "+1-519-624-8001", "country": "CA" }],"httpConcurrency": 24}
Billing is pay-per-event, and there is exactly one event: domain-confirmed.
As a library
from core import confirm_syncprint(confirm_sync("Midfield Dental Center", "+1-205-923-6828", "US"))
As a batch tool
$python3 cli.py --in targets.jsonl --out confirmed.jsonl --country CA --only-confirmed
Accepts JSONL or CSV; column names name/firm/company and phone/telephone
are all recognised.
How it works
- Candidates. The name is folded to ASCII (so
CôtéandCoteare one thing), stripped of legal and industry filler, and expanded into up to eight slug forms — full, core, hyphenated, core+industry tail, initials — crossed with the TLDs that country actually uses. - DNS first. All candidates for the whole batch go out in one pass as raw UDP to
four public resolvers, ~20,000 checks per minute. The system resolver serialises
these requests — measured at 157/min, and worse on more threads. If UDP port 53
is unreachable — common in cloud runners and sandboxes, and observed live after
sustained querying — it falls back to DNS-over-HTTPS automatically. Without that
fallback the tool would silently return
not_foundfor everything, which is the worst possible failure: it looks like an answer. - HTTP second, only on survivors. Roughly one candidate in thirteen exists, so the expensive step runs on a small fraction. Home page first, then contact pages.
- Proof. The number is matched on its last 10 digits, so formatting is irrelevant.
It is looked for in
tel:links and schema.org markup before visible text — that single change is what took coverage from 15% to 32%, because on many sites the visible number is an image while thetel:link is always real. - Parked domains are rejected, not returned as matches. Squatters register the
.netand.orgspellings of a name and serve a 150-character page containing that name — so a page is only treated as real above 400 characters of text, and the domain's own words are struck from the text before the name is looked for. Otherwise a parking page "confirms" every company whose name it was built from.
Limits, stated up front
- A record with no phone number can never be better than
likely. - Sites begin rate-limiting above roughly 30 parallel requests; the default is 24, and during the benchmark hosts stopped answering after sustained runs.
- Only the first ~300 KB of each page is read. Contact details are never below that.
- This tool reads public web pages at ordinary browser rates and identifies itself in its User-Agent. It works with businesses and their websites, not with individuals.
License
MIT.