Skip to main content
Thirdwatchthirdwatch
Companies & leads

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.

Editorial illustration for companies & leads
Jul 21, 2026 · 2 min read · 305 words
View the Apify 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