Phone Number Finder
Phone Number Finder on ApifyForge — Phone Number Finder looks up mobile, direct-dial, and company phone numbers for any list of people — no manual research, no subscription required. It runs a two-step waterfall: first it queries the People Data Labs (PDL) database of 3 billion+ person records, then falls back to scraping the company website if PDL returns nothing. The result is structured output with mobile numbers, direct dials, company lines, source labels, and confidence scores.
Maintenance Pulse
90/100Documentation
Phone Number Finder looks up mobile, direct-dial, and company phone numbers for any list of people — no manual research, no subscription required. It runs a two-step waterfall: first it queries the People Data Labs (PDL) database of 3 billion+ person records, then falls back to scraping the company website if PDL returns nothing. The result is structured output with mobile numbers, direct dials, company lines, source labels, and confidence scores.
Most teams spend hours building prospect phone lists manually or pay $0.80–$7.50 per lookup through tools like Clay, ZoomInfo, or Lusha. This actor returns the same PDL-sourced data at $0.03 per successful lookup, with website scraping included as a zero-cost fallback. Process a batch of 500 sales prospects for under $15.
What data can you extract?
| Data Point | Source | Example |
|---|---|---|
| 📱 Mobile phone | PDL database | +1 (415) 555-0182 |
| ☎ Direct dial | PDL database | +1 (212) 555-0394 |
| 🏢 Company phone | PDL / Website scrape | +44 20 7946 0312 |
| 📋 All phone numbers | PDL + Website (merged) | ["+14155550182", "+12125550394"] |
| 🔎 Phone source | System | pdl / website / not_found |
| 📊 Confidence score | System | high / medium / low |
| 👤 Full name | PDL database | Sarah Chen |
| 💼 Job title | PDL database | VP of Sales |
| 📧 Work email | PDL database | [email protected] |
| 🕐 Enriched at | System | 2026-03-23T14:22:11.000Z |
Why use Phone Number Finder?
Building a 200-person call list by hand means 15–30 seconds per lookup across LinkedIn, company websites, and Google — that is 1–2 hours of research that goes stale within weeks. Subscription tools charge per seat or per record regardless of whether they find anything.
This actor automates the entire process: submit a list of names, emails, domains, or company names; receive structured phone data in minutes. You only pay when a phone number is actually found. PDL provides personal mobile numbers matched to the individual — not just the general company line — which means higher connect rates on cold calls and lower bounce rates on SMS sequences.
- Scheduling — run weekly or monthly to refresh your prospect database as contacts change jobs
- API access — trigger lookups from Python, JavaScript, HubSpot workflows, or any HTTP client
- Proxy rotation — website scraping uses Apify's built-in infrastructure to avoid IP blocks at scale
- Monitoring — get Slack or email alerts when runs fail or spending limits are reached
- Integrations — push results directly to Zapier, Make, Google Sheets, or your CRM via webhooks
Features
- Waterfall lookup strategy — PDL enrichment runs first (individual-matched numbers, highest accuracy); website scraping activates automatically as a fallback when PDL returns nothing
- People Data Labs integration — queries the PDL Person Enrich API at
min_likelihood=6to filter weak matches; returnsmobile_phoneandphone_numbersarray from PDL's 3B+ record database - Six contact page paths scraped per domain — homepage,
/contact,/contact-us,/about,/about-us,/team— catching numbers across all common website structures - Fax number filtering — a 60-character context window around each regex match checks for
fax,facsimile,f:,fx:and removes fax lines from output - International phone regex — matches formats across North America, Europe, Asia-Pacific, and beyond; minimum 7-digit filter eliminates ZIP codes, years, and short numeric strings
- Automatic deduplication — digit-normalised dedup key (
\Dstripped) prevents the same number appearing twice in different formatted versions - Confidence scoring — three tiers:
high(PDL mobile number),medium(PDL direct dial or other PDL number),low(website-scraped only) - Phone type classification — output separates
mobilePhone,directDial, andcompanyPhonefor downstream routing (e.g., send SMS only to mobile numbers) - Pay-per-event pricing — the
Actor.charge()call fires only whenphoneSource !== 'not_found'; records with no phone found are free - Spending limit enforcement — the actor stops cleanly when your run budget is exhausted; partial results are flushed to the dataset before stopping
- Exponential backoff retry — up to 2 retries on network errors with
2^attempt × 1000msdelay; 429 rate limits trigger2^attempt × 2000msbackoff - PDL credit protection — 402 (out of credits) responses from PDL disable PDL for the remainder of the run rather than erroring; website scraping continues for remaining records
- Bring-your-own PDL key — optionally supply your own PDL API key for higher rate limits; a built-in key is used otherwise
- Optional person detail enrichment — set
includePersonDetails: trueto also returnfullName,jobTitle, andworkEmailfrom PDL alongside the phone data - Batch dataset writes — results are flushed in batches of 100 records to minimise API calls and maximise throughput
- Summary record — every run ends with a summary item containing total processed, phones found, not-found count, and whether PDL credits ran dry
Use cases for phone number finder
Sales prospecting and cold calling
Sales development reps and BDRs upload their target account lists with company domains or LinkedIn-sourced emails. The actor returns direct-dial and mobile numbers matched to the individual — not just the company switchboard. A list of 300 mid-market VP prospects can be enriched in under five minutes, ready for immediate sequencing in Outreach, Salesloft, or Apollo.
Marketing agency lead generation
Agencies building prospect databases for clients in B2B verticals use the batch input to process hundreds of target contacts per campaign. The website scraping fallback recovers phone data for SMB targets that PDL may not have indexed, ensuring coverage across the entire addressable market — not just Fortune 500 companies with deep data profiles.
Recruiting and talent sourcing
Recruiters who need to reach passive candidates by phone submit candidate names and employer domains. The actor returns personal mobile numbers from PDL, enabling direct outreach before a candidate is approached by competing firms. Combine includePersonDetails: true to get job title confirmation alongside the phone number.
Business development and partnership outreach
BD teams mapping potential integration partners or channel partners extract decision-maker phone numbers alongside company lines. Processing 50 target companies takes a few minutes and costs under $2, compared to hours of manual website research or $40–$375 at tool subscription rates.
CRM data enrichment
Operations teams with stale or incomplete CRM records submit their existing contact list (name + email is enough) to fill in missing phone fields. The actor echoes back the input identifiers alongside phone results, making it straightforward to match output rows back to CRM records for a bulk update.
Event and conference lead follow-up
After trade shows or conferences, teams with name-plus-company badge data run the actor to append phone numbers before calling leads while the event is still fresh. The two-step waterfall maximises hit rate: PDL handles well-indexed professionals, website scraping handles local businesses and SMBs.
How to find phone numbers for your prospects
- Prepare your list — create a JSON array of person objects. Each entry needs at least one of:
name+domain(e.g."name": "Marcus Webb", "domain": "deltaventures.io"), a workemail, orname+company. More identifiers improve match accuracy. - Configure options — leave
scrapeWebsitesenabled (it is on by default) for maximum coverage. EnableincludePersonDetailsif you also want job title and work email returned from PDL. - Run the actor — click "Start". A batch of 100 people typically completes in 3–5 minutes. The status bar updates in real time with found counts.
- Download results — open the Dataset tab and export as JSON, CSV, or Excel. Each row echoes the input identifiers plus all phone fields, making it easy to match back to your original list.
Input parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
persons | array | Yes | — | List of person objects to look up. Each must have name+domain, email, or name+company. |
pdlApiKey | string | No | built-in | Your People Data Labs API key. Omit to use the built-in key. Bring your own for higher rate limits. |
maxPersons | integer | No | 100 | Maximum number of persons to process. Range: 1–1000. |
scrapeWebsites | boolean | No | true | Scrape company website pages (homepage, /contact, /about, /team) when PDL finds nothing. |
includePersonDetails | boolean | No | false | Also return fullName, jobTitle, and workEmail from PDL in the output. |
Each person object supports these fields:
| Field | Type | Description |
|---|---|---|
name | string | Person's full name (e.g. "Sarah Chen") |
email | string | Work or personal email address |
company | string | Company name (e.g. "Pinnacle Industries") |
domain | string | Company website domain (e.g. "pinnacleind.com") |
Input examples
Standard sales prospect list:
{
"persons": [
{
"name": "Marcus Webb",
"email": "[email protected]",
"company": "Delta Ventures",
"domain": "deltaventures.io"
},
{
"name": "Sarah Chen",
"company": "Pinnacle Industries",
"domain": "pinnacleind.com"
}
],
"scrapeWebsites": true,
"includePersonDetails": false
}
CRM enrichment with person details:
{
"persons": [
{ "name": "Jordan Blake", "email": "[email protected]" },
{ "name": "Priya Nair", "email": "[email protected]" },
{ "name": "Tom Harrington", "email": "[email protected]" }
],
"scrapeWebsites": true,
"includePersonDetails": true,
"maxPersons": 1000
}
Domain-only company phone lookup:
{
"persons": [
{ "name": "Reception", "domain": "acmecorp.com" },
{ "name": "Reception", "domain": "betaindustries.com" },
{ "name": "Reception", "domain": "novaretail.co" }
],
"scrapeWebsites": true,
"includePersonDetails": false
}
Input tips
- More identifiers = better match — providing
name,email,company, anddomaintogether gives PDL the most signals to match against its database. Email alone is the single strongest identifier. - Use domains, not URLs — supply
"domain": "acmecorp.com"not"domain": "https://www.acmecorp.com/". The actor normalises both, but bare domains are cleaner. - Enable website scraping for SMBs — smaller companies are under-indexed in PDL. Website scraping is the primary source for local businesses, tradespeople, and companies under 50 employees.
- Set a spending limit — in Run options, set a maximum spend before starting a large batch. The actor stops cleanly and flushes results when the limit is reached.
- Batch in one run — submitting 500 persons in a single
personsarray is faster and cheaper than 500 separate runs.
Output example
{
"inputName": "Sarah Chen",
"inputEmail": "[email protected]",
"inputCompany": "Pinnacle Industries",
"inputDomain": "pinnacleind.com",
"mobilePhone": "+1 (415) 555-0182",
"directDial": "+1 (212) 555-0394",
"companyPhone": "+1 (650) 555-0271",
"allPhoneNumbers": [
"+1 (415) 555-0182",
"+1 (212) 555-0394",
"+1 (650) 555-0271"
],
"phoneSource": "pdl",
"fullName": "Sarah Chen",
"jobTitle": "VP of Sales",
"email": "[email protected]",
"enrichedAt": "2026-03-23T14:22:11.341Z",
"confidence": "high"
}
The final item in every dataset is a summary record:
{
"type": "summary",
"totalProcessed": 47,
"phonesFound": 34,
"notFound": 13,
"pdlOutOfCredits": false,
"spendingLimitReached": false,
"completedAt": "2026-03-23T14:28:03.217Z"
}
Output fields
| Field | Type | Description |
|---|---|---|
inputName | string | null | The name you provided |
inputEmail | string | null | The email you provided |
inputCompany | string | null | The company you provided |
inputDomain | string | null | The domain you provided |
mobilePhone | string | null | Personal mobile number from PDL (mobile_phone field) |
directDial | string | null | First non-mobile number from PDL; most likely a direct office line |
companyPhone | string | null | Second PDL number, or first website-scraped number when PDL returned nothing |
allPhoneNumbers | string[] | All unique phone numbers found across both sources |
phoneSource | string | pdl — matched in PDL database; website — scraped from website only; not_found — no phones found |
fullName | string | null | Full name from PDL (only when includePersonDetails: true) |
jobTitle | string | null | Current job title from PDL (only when includePersonDetails: true) |
email | string | null | Work email from PDL (only when includePersonDetails: true) |
enrichedAt | string | ISO 8601 timestamp of when this record was processed |
confidence | string | high — PDL mobile match; medium — PDL non-mobile match; low — website scrape only |
How much does it cost to find phone numbers?
Phone Number Finder uses pay-per-event pricing — you pay $0.03 per successful phone lookup. Records where no phone number is found are free. Platform compute costs are included.
| Scenario | Lookups | Cost per lookup | Total cost |
|---|---|---|---|
| Quick test | 1 | $0.03 | $0.03 |
| Small batch | 10 | $0.03 | $0.30 |
| Medium batch | 100 | $0.03 | $3.00 |
| Large batch | 500 | $0.03 | $15.00 |
| Enterprise | 1,000 | $0.03 | $30.00 |
You can set a maximum spending limit per run in the Run options panel to control costs. The actor stops and flushes results when your budget is reached — you are never charged more than you approve.
Compare this to Clay at $0.80–$7.50 per phone lookup (depending on credit tier), Lusha at $1.00+ per contact, or ZoomInfo at $150+/month for a seat licence. Most teams using Phone Number Finder spend $5–$20/month with no subscription commitment and no per-seat fees.
Find phone numbers using the API
Python
from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("ryanclinton/phone-number-finder").call(run_input={
"persons": [
{
"name": "Marcus Webb",
"email": "[email protected]",
"company": "Delta Ventures",
"domain": "deltaventures.io"
},
{
"name": "Sarah Chen",
"company": "Pinnacle Industries",
"domain": "pinnacleind.com"
}
],
"scrapeWebsites": True,
"includePersonDetails": True
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
if item.get("type") == "summary":
print(f"Summary: {item['phonesFound']} phones found out of {item['totalProcessed']}")
elif item.get("mobilePhone"):
print(f"{item['inputName']} — mobile: {item['mobilePhone']} | confidence: {item['confidence']}")
elif item.get("companyPhone"):
print(f"{item['inputName']} — company: {item['companyPhone']} | source: {item['phoneSource']}")
else:
print(f"{item['inputName']} — not found")
JavaScript
import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: "YOUR_API_TOKEN" });
const run = await client.actor("ryanclinton/phone-number-finder").call({
persons: [
{
name: "Marcus Webb",
email: "[email protected]",
company: "Delta Ventures",
domain: "deltaventures.io"
},
{
name: "Sarah Chen",
company: "Pinnacle Industries",
domain: "pinnacleind.com"
}
],
scrapeWebsites: true,
includePersonDetails: true
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const item of items) {
if (item.type === "summary") {
console.log(`Summary: ${item.phonesFound}/${item.totalProcessed} phones found`);
} else if (item.mobilePhone) {
console.log(`${item.inputName}: mobile=${item.mobilePhone}, confidence=${item.confidence}`);
} else if (item.companyPhone) {
console.log(`${item.inputName}: company=${item.companyPhone}, source=${item.phoneSource}`);
} else {
console.log(`${item.inputName}: not found`);
}
}
cURL
# Start the actor run
curl -X POST "https://api.apify.com/v2/acts/ryanclinton~phone-number-finder/runs?token=YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"persons": [
{
"name": "Marcus Webb",
"email": "[email protected]",
"company": "Delta Ventures",
"domain": "deltaventures.io"
}
],
"scrapeWebsites": true,
"includePersonDetails": true
}'
# Fetch results once the run completes (replace DATASET_ID from the run response)
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?token=YOUR_API_TOKEN&format=json"
How Phone Number Finder works
Step 1 — People Data Labs enrichment
The actor calls the PDL Person Enrich API (https://api.peopledatalabs.com/v5/person/enrich) with the identifiers you provide. Query parameters are built from whichever of name, email, company, and domain are present. The request includes min_likelihood=6 — PDL's internal match quality score from 0–10 — which filters out weak or ambiguous matches and returns only records PDL is reasonably confident belong to the same person.
PDL's response includes a mobile_phone field (the individual's personal mobile) and a phone_numbers array (all associated numbers). The actor maps mobile_phone to mobilePhone, the first non-mobile number to directDial, and the second non-mobile to companyPhone. Confidence is set to high if a mobile is returned, medium otherwise.
Step 2 — Website scraping fallback
When PDL returns no phones (or PDL credits are exhausted), the actor scrapes up to six pages of the company's website: the homepage, /contact, /contact-us, /about, /about-us, and /team. Each page is fetched with a 10-second timeout and a real browser User-Agent string.
Phone numbers are extracted using an international regex pattern that matches most global formats. Matches are then filtered through two additional steps: a digit-count check (minimum 7 digits, eliminating ZIP codes, years, and short numeric strings) and a fax context filter (a 60-character window around each match is checked for fax, facsimile, f:, fx:, and similar strings). Remaining numbers are deduplicated by normalised digit string before being assigned to companyPhone with low confidence.
Step 3 — Result assembly and output
If both PDL and website scraping find numbers, the actor merges them into allPhoneNumbers using the same digit-normalised dedup key, preserving the PDL numbers as primary classifications. The result object echoes all four input identifiers so output rows can be matched back to your input list without a separate join step.
The PPE charge fires after the result is assembled, but only when phoneSource !== 'not_found'. Batch flushing to the Apify Dataset happens every 100 records. A 200ms inter-person delay prevents rate-limiting on both the PDL API and target websites.
Error handling and resilience
Network failures use exponential backoff (up to 2 retries). PDL 402 errors (out of credits) disable PDL for the remainder of the run so website scraping continues uninterrupted. PDL 401/403 errors (bad API key) stop the run immediately with a clear error message. A 429 from any host triggers 2^attempt × 2000ms backoff before retrying. Invalid person queries (missing all required identifiers) are skipped with a warning rather than crashing the run.
Tips for best results
- Supply email as the primary identifier. Email is PDL's strongest single identifier. A name alone has high collision probability; name + email reduces false positives to near zero.
- Add domain whenever you have it. Even when you provide an email, supplying the domain as well gives PDL an additional signal to resolve ambiguous name-email combinations.
- Enable website scraping for SMB lists. Businesses under ~50 employees are often under-indexed in PDL. Website scraping is the primary phone source for local businesses, tradespeople, and regional companies.
- Use
includePersonDetails: truefor CRM enrichment. When running against an existing contact list, the job title and work email fields from PDL let you verify you matched the right person before importing. - Set a spending cap for large batches. Open the Run options before starting and set a maximum spend. At $0.03/lookup with ~70% typical hit rates, 1,000 contacts costs around $21 — set $25 as a ceiling with room for variance.
- Combine with email finding first. If you only have company domains, run Email Pattern Finder first to generate likely email addresses, then pass those emails into this actor for maximum PDL match rates.
- Pipe results into your CRM via webhook. Configure an Apify webhook to POST completed dataset items directly to your HubSpot, Salesforce, or Pipedrive API endpoint — no manual CSV import required.
- Schedule monthly refreshes. Phone numbers go stale as contacts change jobs. A monthly scheduled run on your active prospect list keeps numbers current without any manual effort.
Combine with other Apify actors
| Actor | How to combine |
|---|---|
| Email Pattern Finder | Generate likely email addresses from company domains first, then pass those emails into Phone Number Finder for higher PDL match rates |
| Website Contact Scraper | Scrape all contact info (emails, phones, socials) from a business website in one pass — use instead of Phone Number Finder when you need emails too |
| Google Maps Email Extractor | Extract local business leads from Google Maps, then enrich with phones using this actor for a complete call-ready prospect list |
| Waterfall Contact Enrichment | 10-step enrichment cascade for contacts where you need emails, phones, and LinkedIn — use when you need full profiles rather than phones alone |
| B2B Lead Gen Suite | Full pipeline from URL list to scored leads — Phone Number Finder slots in as the phone enrichment step post-qualification |
| Bulk Email Verifier | Verify the work emails returned by includePersonDetails: true before sending outreach |
| HubSpot Lead Pusher | Push enriched phone records directly into HubSpot contacts after a Phone Number Finder run completes |
Limitations
- PDL coverage is strongest for US and English-speaking markets. Phone number coverage for contacts in continental Europe, Asia, and Latin America is lower. Website scraping partially compensates but company sites in non-English languages may structure contact pages differently.
- PDL mobile numbers are not available for all profiles. PDL's
mobile_phonefield is populated for a subset of their database. Many matches will return a direct dial or company number but no mobile. Confidence will bemediumrather thanhighfor these records. - Website scraping returns company phones, not personal numbers. Numbers found via the website fallback are general company lines, not the individual's direct dial. Use these for initial company contact, not personal outreach.
- PDL match requires at least one strong identifier. Name alone (without domain, company, or email) will be rejected before the PDL query is sent. Incomplete person objects are skipped with a warning in the logs.
- No JavaScript rendering on website scraping. The website fallback uses plain HTTP fetch. Sites that load phone numbers via JavaScript after page load will not have those numbers captured. The Website Contact Scraper Pro handles JS-rendered sites.
- 10-second timeout per web page. Very slow websites may time out without returning phone data. The actor continues to the next person rather than hanging the run.
- Built-in PDL key has shared rate limits. For batches over 200 persons, bring your own PDL API key to avoid hitting shared rate limits mid-run.
- Phone numbers are not verified for active status. Numbers are returned as-found in PDL or on the website. Use a separate verification step before SMS campaigns where deliverability is critical.
Integrations
- Zapier — trigger a Phone Number Finder run when a new lead is added to a Google Sheet or CRM, then write the phone number back automatically
- Make — build multi-step scenarios: enrich a lead list, filter by
confidence: "high", then push mobile numbers to an SMS platform - Google Sheets — export completed phone datasets directly to Sheets for team review or further processing
- Apify API — call the actor programmatically from any language; pass dynamic person lists from your CRM or data pipeline
- Webhooks — fire a POST to your HubSpot or Salesforce endpoint the moment a run completes, with the full dataset payload
- LangChain / LlamaIndex — use the Apify Loader to feed phone-enriched contact records into an AI sales assistant or lead qualification agent
Troubleshooting
- Records coming back as
not_foundfor known contacts — This usually means PDL does not have a record for that individual, or the identifiers provided are too sparse for a confident match. Add more identifiers (especially email) and check that company names are spelled correctly. EnablescrapeWebsites: trueas a fallback. - PDL auth error in the logs — If you supplied a custom
pdlApiKeyand see a 401 or 403 error, the key is invalid or expired. RemovepdlApiKeyfrom the input to use the built-in key, or regenerate your key at the PDL dashboard. - Website scraping finding no numbers — Some company sites load phone numbers via client-side JavaScript rather than static HTML. The HTTP-based scraper cannot execute JavaScript. For these sites, consider the Website Contact Scraper Pro which uses a full browser.
- Run stopped early with
spendingLimitReached: truein summary — Your per-run spending cap was reached. Increase the limit in Run options, or split your list into smaller batches across multiple runs. - Slow run times for large batches — The 200ms inter-person delay and website scraping (up to six pages per domain when PDL misses) add up for large lists. Disable
scrapeWebsitesfor the fastest possible run when PDL coverage is sufficient for your use case.
Responsible use
- This actor only accesses publicly available contact information and the People Data Labs database, which aggregates data from public sources.
- Respect website terms of service and
robots.txtdirectives when website scraping is enabled. - Comply with GDPR, CCPA, CAN-SPAM, TCPA, and other applicable data protection laws when using phone numbers for outreach, especially for SMS and cold calling.
- Do not use extracted phone numbers for spam, robocalling, harassment, or unauthorized commercial contact.
- For guidance on web scraping legality, see Apify's guide.
FAQ
How many phone numbers can I look up in one run?
The default cap is 100 persons per run, configurable up to 1,000 via the maxPersons parameter. For larger batches, either increase maxPersons or split across multiple runs. There is no hard platform limit beyond what your spending cap allows.
How accurate are the phone numbers returned by Phone Number Finder?
PDL-sourced numbers (confidence high or medium) are drawn from their aggregated public database and are generally accurate for currently employed professionals. Mobile numbers from PDL have the highest individual match accuracy. Website-scraped numbers (confidence low) are correct as of the scrape date but are company lines rather than personal numbers.
Does Phone Number Finder return personal mobile numbers or just company switchboards?
Both. PDL's mobile_phone field is a personal mobile number matched to the individual. When PDL returns only a direct dial or the website fallback is used, you will get a company or direct office line rather than a personal mobile.
What identifiers does each person entry need?
Each person needs at least one of: email alone, name + domain, or name + company. Email is the strongest single identifier. Name alone is not accepted because it is too ambiguous for PDL to return a confident match.
How is Phone Number Finder different from Clay or Lusha? Clay charges $0.80–$7.50 per enrichment credit depending on your plan tier. Lusha charges $1.00+ per contact export. Both require monthly subscriptions. Phone Number Finder charges $0.03 per successful lookup with no subscription — you pay only when a number is found. The same PDL database underpins the lookup in both cases.
Can I bring my own People Data Labs API key?
Yes. Supply your PDL key in the pdlApiKey field. This is useful for teams with an existing PDL subscription who want higher rate limits or to use their own PDL credit allocation. If omitted, the built-in key is used at no extra charge.
What happens when PDL runs out of credits mid-run?
The actor detects the 402 response from PDL and disables PDL lookups for the rest of the run. Website scraping continues for remaining records, so you still get company phone numbers for contacts whose domains are present. The summary record includes a pdlOutOfCredits: true flag.
Is it legal to scrape phone numbers from websites? Scraping publicly available phone numbers from business websites is generally lawful in most jurisdictions. However, using those numbers for unsolicited commercial contact may be regulated by TCPA (US), PECR (UK), or GDPR (EU). Always ensure your outreach complies with applicable telemarketing and data protection laws. See Apify's scraping legality guide for more detail.
Can I schedule Phone Number Finder to run automatically? Yes. Use the Apify Scheduler to trigger runs on a daily, weekly, or custom cron schedule. This is useful for refreshing a prospect database monthly or monitoring new contacts added to a CRM.
How long does a typical run take?
A batch of 100 persons takes approximately 3–5 minutes with website scraping enabled. With scrapeWebsites: false, the same batch runs in under 2 minutes. Time scales roughly linearly with batch size and the proportion of contacts that require website fallback.
What does the confidence field mean, and how should I use it?
high means PDL returned a personal mobile number — the strongest match. medium means PDL returned a non-mobile number (direct dial or office line). low means the number came from website scraping only, with no individual-to-number match. For outreach prioritisation, route high confidence records to personalised SMS or direct calling sequences, and low confidence records to general company contact flows.
Can I use this actor with Make or Zapier? Yes. Both integrations are supported natively through the Apify platform. In Make, use the Apify "Run Actor" module to trigger a run with your person list and the "Watch Dataset Items" module to process results. In Zapier, the Apify integration lets you trigger runs and retrieve dataset items as part of multi-step zaps.
Help us improve
If you encounter issues, you can help us debug faster by enabling run sharing in your Apify account:
- Go to Account Settings > Privacy
- Enable Share runs with public Actor creators
This lets us see your run details when something goes wrong, so we can fix issues faster. Your data is only visible to the actor developer, not publicly.
Support
Found a bug or have a feature request? Open an issue in the Issues tab on this actor's page. For custom solutions or enterprise integrations, reach out through the Apify platform.
How it works
Configure
Set your parameters in the Apify Console or pass them via API.
Run
Click Start, trigger via API, webhook, or set up a schedule.
Get results
Download as JSON, CSV, or Excel. Integrate with 1,000+ apps.
Use cases
Sales Teams
Build targeted lead lists with verified contact data.
Marketing
Research competitors and identify outreach opportunities.
Data Teams
Automate data collection pipelines with scheduled runs.
Developers
Integrate via REST API or use as an MCP tool in AI workflows.
Related actors
GitHub Repository Search
Search GitHub repositories by keyword, language, topic, stars, forks. Sort by stars, forks, or recently updated. Returns metadata, topics, license, owner info, URLs. Free API, optional token for higher limits.
Weather Forecast Search
Get weather forecasts for any location worldwide using the free Open-Meteo API. Returns current conditions, daily and hourly forecasts with temperature, precipitation, wind, UV index, and more. No API key needed.
EUIPO EU Trademark Search
Search EU trademarks via official EUIPO database. Find registered and pending trademarks by name, Nice class, applicant, or status. Returns full trademark details and filing history.
Nominatim Address Geocoder
Geocode addresses to GPS coordinates and reverse geocode coordinates to addresses using OpenStreetMap Nominatim. Batch geocoding with rate limiting. Free, no API key needed.
Ready to try Phone Number Finder?
Start for free on Apify. No credit card required.
Open on Apify Store