Confirm Domain — company name + phone → proven website avatar

Confirm Domain — company name + phone → proven website

Pricing

$5.00 / 1,000 confirmed domains

Go to Apify Store
Confirm Domain — company name + phone → proven website

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

Danilo Dzyuban

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

23 days ago

Last modified

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

confidenceWhat it meansCharged
confirmedThe phone from your record was found on the siteyes
likelyThe company name was found, the phone was notno
ambiguousLive candidate domains exist, none could be provenno
not_foundDNS answered, and no candidate domain existsno
check_failedDNS did not answer — the check did not happen, retryno

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.

MetricResult
Confirmations returned45 of 400 records
Matched the independent domain exactly42 of 45
Disagreed with it3 of 45
Coverage — records reaching confirmed11.3%
Throughput62 records/min
Proof source: tel: link / text / JSON-LD39 / 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_sync
print(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

  1. Candidates. The name is folded to ASCII (so Côté and Cote are 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.
  2. 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_found for everything, which is the worst possible failure: it looks like an answer.
  3. 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.
  4. 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 the tel: link is always real.
  5. Parked domains are rejected, not returned as matches. Squatters register the .net and .org spellings 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.