Skip to main content
Thirdwatchthirdwatch
Business & local data

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.

Jul 21, 2026 · 2 min read · 307 words
See the scraper →

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 None

Infer 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

Try it yourself

100 free credits, no credit card.

About 30 real searches. Add the MCP to Claude or Cursor in two minutes.