Find Public Local Business Phone Numbers at Scale
Extract public phone numbers from local business websites, normalize them, and preserve source evidence for lead operations.

Phone extraction looks simple until websites mix formatted numbers, click-to-call links, WhatsApp contacts, and branch-specific pages. The goal is a usable list with evidence, not the largest possible pile of digit strings.
Feed business domains to the Google Maps Contact Enricher:
{
"websites": [
"https://example-plumber.com",
"https://example-dentist.com"
],
"maxPagesPerSite": 3,
"concurrency": 5,
"onlyWithContact": true
}The crawler checks the homepage and likely contact/about pages, then returns phones, primary_phone, contact_pages, and other public contact fields.
Normalize after extraction
Store the raw value and a normalized value. Formatting should not destroy country-code information.
import phonenumbers
def normalize_phone(raw, default_region):
try:
parsed = phonenumbers.parse(raw, default_region)
if not phonenumbers.is_possible_number(parsed):
return None
return phonenumbers.format_number(
parsed, phonenumbers.PhoneNumberFormat.E164
)
except phonenumbers.NumberParseException:
return NoneInfer the default region from the Maps address, not the website's top-level domain. A .com site may serve one city or many countries.
Filter obvious false positives
Reject numbers embedded in scripts, tracking IDs, and order references. Prefer tel: links and numbers near words such as call, phone, booking, or contact. Retain the source page so operations can inspect an edge case.
Before calling, apply consent and do-not-call rules for the relevant jurisdiction. Public availability is not blanket permission for automated outreach. A narrow, relevant B2B workflow is safer and usually performs better than volume dialing.
Keep contact_pages and the original business URL beside every normalized number. When two branches share a domain, use the page context and Maps address to avoid assigning the head-office line to every location. Recheck stale records before a campaign rather than treating one crawl as a permanent directory.
Measure coverage explicitly: websites attempted, sites reached, sites with at least one phone, invalid candidates rejected, and rows requiring regional review. That separates source availability from extraction quality and gives operations a clear reason when a business has no usable number.
Frequently asked questions
Can the Actor identify mobile versus landline numbers?
It extracts and normalizes published numbers but does not guarantee line type. Use a telecom lookup service if line classification is required.
Why keep more than one number?
A business may publish separate sales, booking, support, and branch numbers. Keeping the array avoids discarding useful context.
Related
100 free credits, no credit card.
About 30 real searches. Add the MCP to Claude or Cursor in two minutes.