Phone Number Decoder API
Pricing
Pay per event
Phone Number Decoder API
Find every business phone for any domain. Classifies by country (NANP CA/US disambiguated), line type (landline / mobile / toll-free), purpose label (sales / support / billing / press / office / fax), and confidence tier. 31 countries.
Pricing
Pay per event
Rating
0.0
(0)
Developer
SR
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Phone Number Decoder API — find every business phone for any domain
A phone number lookup API that takes a domain and returns every business phone Google has indexed, classified by country (US vs CA disambiguated via NANP area code), line type (landline / mobile / toll-free), purpose label (sales / support / billing / press / office / fax / general), and confidence tier. Covers 31 countries (full EU + UK + US + CA) with country-specific local-format regex packs for the 17 most common.
This is the missing layer between scraping every company's contact page (which fails on the 80% of pages that render numbers as images or JS) and paying for a B2B contact-data vendor (CARFAX-style pricing, $$$). Three orthogonal Google queries per domain — directory listings, the brand's own contact page, and customer-service brand mentions — fan out in parallel, then a multi-pass regex pipeline extracts and normalizes every phone to E.164 form.
What you get
- E.164 normalization — every phone in canonical
+CCNNNNNNNNNform, regardless of how it was rendered in the source ((0)20 224 2424,020-224-2424,+31202242424all collapse to one record) - Country resolution — ISO 2-letter country code, with NANP CA/US disambiguation via 52 known Canadian area codes (
+1 416 ...correctly taggedCA,+1 805 ...staysUS) - Line-type classification —
landline,mobile,toll_free, orunknownbased on per-country mobile/toll-free prefix lookup - Purpose label inference —
sales,support,billing,press,office,fax, orgeneralfrom a 200-char text-context window with multilingual keyword matching (EN/NL/DE/FR/ES/IT/SE/PL) - URL-path fallback —
/support,/klantenservice,/kundenservice,/contact-uspaths automatically labelled when text context is empty - Source attribution — every URL where the number was surfaced, deduplicated
- Confidence tier —
highfor multi-source confirmation,mediumfor single-source,lowfor likely-personal mobile (single-source mobile withlabel=general) - IT canonicalization —
+39 0775 770011and+39 775 770011correctly dedup to one record while preserving the leading 0 in the displayed form
Why use a phone number lookup instead of scraping pages
Contact-page scraping is fragile. About 30% of business contact pages render phones as images (anti-scrape defence). Another 20% load phones via JavaScript that fires after a page-view event. About 10% fragment phones across regional subsidiary pages that don't link back to the parent domain. A naive scraper that just curls the homepage misses most of the signal.
Google has already indexed the same data from business directories (KvK, BBB, Trustpilot, Yelp, Google Business Profile), local newspapers, partner vendor pages, and the brand's own SEO-friendly pages. This actor harvests all of it in 3 parallel SERP queries per domain. The fan-out gives a 3-5× improvement over single-query approaches — empirically validated.
Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
domain | string | yes | hema.nl | Bare host like coolblue.nl or patagonia.com. No scheme, no path |
country | string | no | nl | ISO 2-letter country hint. Drives which local-format regex pack fires for numbers without +CC |
language | string | no | nl | Google UI language (hl) |
filter_personal | boolean | no | true | When true, single-source mobile + label=general gets demoted to confidence=low and flagged |
hits | boolean | no | false | Include raw SERP results per route in the output |
Output
One dataset item per unique phone. Example for domain=hema.nl, country=nl:
{"domain": "hema.nl","country_hint": "nl","phone": "+31203114411","raw": "020 311 4411","country": "NL","type": "landline","label": "support","sources": ["https://www.hema.nl/klantenservice","https://www.trustpilot.com/review/hema.nl"],"source_count": 2,"confidence": "high","warning": null,"phone_rank": 1,"total_results": 28,"duration_seconds": 0.34,"errors": []}
Multi-phone domains return multiple items. A large brand can yield 7-14 phones across multiple countries when multi-country directory listings surface alongside the brand's own contact page.
Use cases
Outbound sales prospecting. When the SDR has a TAM list of 5000 NL/BE/DE company domains, calling this actor per domain returns the canonical sales/support line plus the office HQ number. The label=sales keyword match across EN/NL/DE/FR helps target the right inbox; the type=landline filter excludes likely personal mobiles. Pair with filter_personal=true to auto-flag the inevitable founder-mobile leaks that appear in business directories.
Compliance and KYC verification. When an onboarding form has a "what's your business phone?" field, the actor lets you verify the customer-supplied number matches at least one Google-indexed source for their domain. A confidence-high match across 2+ public sources is a strong signal; a confidence-low single-source mobile is a flag for additional checks.
Multi-country brand intelligence. Querying domain=ikea.com&country=nl discovers NL, BE, LU, and US toll-free lines in a single call. The country dispatch table covers 31 countries including all EU + UK + NANP. For multinationals with regional subsidiary phones, the actor surfaces every country's office line as a separate dataset item with the resolved country code.
Reputation monitoring and customer service routing. For a brand monitoring tool that wants to know which support line customers actually call, the label=support filter combined with source_count ranking surfaces the line that appears across the most directory listings — usually the canonical customer-facing number, not the unstaffed corporate switchboard. The confidence=high tier means 2+ independent retailers confirmed it.
How it compares
| Source | Coverage | Output | Auth |
|---|---|---|---|
| Contact-page scraping | ~30-40% of domains (fails on image/JS-rendered pages) | Single page only; no cross-source dedup | None |
| B2B vendor (ZoomInfo, Lusha, Cognism) | Comprehensive | Spec sheet per contact, with email | Paid subscription per credit |
| Google Knowledge Panel | Whatever Google chose to surface | One number per brand | None, but limited |
| This actor | 31-country regex; 3 parallel SERP routes | 4-14 phones per brand with country/type/label/source attribution | None |
This actor is for when you need MULTIPLE phones per domain with classification, not for when you need a single "official" number (use the brand's own contact page directly for that). For email + LinkedIn enrichment, a paid B2B vendor still wins.
Pricing
Pay-per-event — one charge per phone successfully extracted. A multi-phone brand that returns 8 dataset items charges 8 events. A run with no matches charges nothing. The actor-start fee is a token charge to cover Apify compute overhead.
Limits and gotchas
- APAC, ME, LATAM, AF not covered. The 31-country dispatch covers EU + UK + US + CA. Phones with
+CCoutside that set still parse via Pass 1 (international regex) but thecountryfield comes back as?. Add toCOUNTRY_INFOwhen business need arises. - Personal mobiles in directories. Setting
filter_personal=falsekeeps them atmediumconfidence instead of demoting tolow. Default behavior flags single-source mobile + label=general as likely personal. - NANP CA/US disambiguation is area-code based. All 52 known Canadian area codes (as of the 2026 NANPA registry) are checked. New area codes added by Canada are rare (a few per decade); update the
CANADIAN_AREA_CODESset when they appear. - Captcha retries are per-route, not global. Each of the 3 SERP routes retries once independently. If 2 routes succeed and 1 captcha-blocks, you still get most of the signal — the
errorsarray reports the failing route. - IT leading-0 canonicalization is asymmetric.
+39 0775 770011and+39 775 770011collapse to one dedup key, but the displayedphonefield always retains the leading 0 (correct for IT fixed-line). Every other EU country drops the national-prefix 0 in international form. - Toll-free without
+1. US toll-free numbers shown as8XX-NNN-NNNN(no country code) only catch via the local-format US regex whencountry=usis passed. Without the hint, they parse but get tagged generically. ?country signals an unknown CC. If you see?in production, the international regex matched a+CCnot in the dispatch table. Add the country code toCOUNTRY_INFOto enable resolution.
FAQ
Can I look up phone numbers without an API key? Yes. This actor calls Google's public index through a private SERP gateway. You don't pass any directory credentials, no B2B vendor subscription, no Google Business Profile access. Just the domain.
How does the actor handle Canadian vs US numbers? Both use NANP (+1), so the country code alone doesn't disambiguate. The actor checks the first 3 digits of the local portion against a 52-entry set of known Canadian area codes (NANPA 2026 registry). Match → country=CA. No match → defaults to US. Caribbean NANP states (Bahamas, Jamaica) currently fall through as US by default; extend the lookup if granular disambiguation matters.
What's the difference between confidence tiers? high = 2+ independent SERP results surfaced the same phone. medium = 1 source surfaced it. low = filtered down from medium because it's a mobile number, single-source, with no purpose context — almost always a personal number leaked into a business directory. Pass filter_personal=false to keep those at medium.
Why are there 3 parallel SERP queries? Each query has a distinct purpose: Route 1 (-site:domain) finds third-party directory listings that index the brand. Route 2 (site:domain) finds the brand's own contact page. Route 3 (broad brand query) catches Knowledge Panel and GMB-surfaced numbers. Empirically the 3-route fan-out yields 3-5× more phones per domain than a single query.
Can the actor find phones for any domain? NL/BE/DE/FR/UK domains hit ~95% of the time with 3-10 phones each. Nordics (SE/NO/DK/FI) ~80%. CA/US ~90% — requires the leading +1 or canonical 10-digit format. APAC/MENA/LATAM coverage is limited; without +CC the international regex passes but country may resolve to ?.
Related Actors
- VIN Decoder — decode any 17-character VIN into year/make/model + recalls + safety
- ISBN Decoder — find every edition of a book from title + author
- Backlinks Checker — domain link profile and per-link records