Person Enrichment Lookup
Pricing
Pay per usage
Person Enrichment Lookup
Pricing
Pay per usage
Rating
0.0
(0)
Developer
ryan clinton
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 hours ago
Last modified
Categories
Share
Person Data Enrichment
B2B contact enrichment powered by People Data Labs — the same data source behind Clay's most-used enrichment action, at $0.03 per person versus Clay's $0.22–$5.63. Provide a list of names, emails, or LinkedIn URLs and get back verified work emails, job titles, seniority levels, phone numbers, company info, social profiles, and location data. No subscription required. Pay only for successful matches.
This actor calls the PDL Person Enrich API as the primary match method, then automatically falls back to PDL's Elasticsearch-based Person Search API when the direct lookup yields no result. Both paths produce the same clean output schema, with a matchConfidence score (0–10) so you always know how certain the match is. Batch up to 1,000 people in a single run, download as JSON or CSV, and plug into your CRM without manual cleanup.
What data can you extract?
| Data Point | Source | Example |
|---|---|---|
| 📧 Work email | PDL verified | m.okonkwo@pinnaclegroup.com |
| 📧 Personal email | PDL verified | michael.okonkwo@gmail.com |
| 👤 Full name | PDL canonical | Michael Okonkwo |
| 💼 Job title | PDL current | VP of Engineering |
| 📊 Seniority level | PDL normalised | vp |
| 🏢 Department | PDL job sub-role | software |
| 🏢 Company name | PDL current employer | Pinnacle Group |
| 🌐 Company domain | PDL verified | pinnaclegroup.com |
| 🏭 Company industry | PDL SIC mapping | information technology |
| 👥 Company size | PDL band | 1001-5000 |
| 🔗 LinkedIn URL | PDL social graph | linkedin.com/in/mokonkwo |
| 🐦 Twitter URL | PDL social graph | twitter.com/mokonkwo |
| 💻 GitHub URL | PDL social graph | github.com/mokonkwo |
| 📍 Location | PDL geo | San Francisco, California, US |
| 📞 Phone / Mobile | PDL verified | +1-415-555-0182 |
| 🎓 Education (optional) | PDL academic | UC Berkeley — B.S. Computer Science |
| 📋 Work history (optional) | PDL experience | Google → Stripe → Pinnacle Group |
| 🛠️ Skills (optional) | PDL profile | ["Python", "Kubernetes", "AWS"] |
| 🎯 Match confidence | PDL likelihood score | 8 (scale 0–10) |
Why use Person Enrichment Lookup?
Manual person research takes 5–15 minutes per contact: LinkedIn search, company lookup, guessing email formats, cross-checking data sources. For a list of 200 people, that is 20–50 hours of work that still produces patchy results.
Clay automates this same workflow, but prices PDL enrichment at $0.22–$5.63 per person depending on your plan tier. Apollo charges $99–$249/month for similar data. ZoomInfo starts at $15,000/year. This actor uses the same PDL database and charges $0.03 per successfully enriched person — no subscription, no monthly minimum, no wasted spend on lookups that return nothing.
- Scheduling — run daily, weekly, or custom intervals to keep CRM data fresh as people change roles
- API access — trigger enrichment runs from Python, JavaScript, or any HTTP client with a single API call
- Proxy rotation — Apify's built-in infrastructure handles outbound requests reliably at scale
- Monitoring — get Slack or email alerts when runs fail or when match rates drop unexpectedly
- Integrations — connect output directly to Zapier, Make, HubSpot, Google Sheets, or webhooks
Features
- Dual-API matching strategy — tries PDL Person Enrich (exact lookup by email/LinkedIn/name) first, then falls back to PDL Person Search (Elasticsearch DSL with
mustclauses onfirst_name,last_name,job_company_name,job_company_website) to maximise match rate - Identifier flexibility — accepts any combination of name, email, company name, domain, and LinkedIn URL; more identifiers produce higher match confidence
- Minimum likelihood filter — queries PDL with
min_likelihood=2andrequired=nameto avoid low-confidence junk matches polluting your dataset - Seniority normalisation — maps PDL's raw
job_title_levelsarray to a single canonical value using a priority ladder:c_suite → vp → director → manager → senior → entry → training - Email type separation — splits PDL's typed emails array into distinct
email(work) andpersonalEmailfields, usingwork/professionaltype flags - Rate-limit resilience — respects PDL's 200ms inter-request cadence and automatically retries once on HTTP 429 with a 2-second pause before failing gracefully
- Spending limit awareness — checks Apify's
eventChargeLimitReachedflag after each successful enrichment and stops cleanly without losing already-pushed data - Partial result safety — flushes output to the Apify dataset in batches of 100, so a mid-run failure never loses completed records
- Configurable payload size — work history, education, and skills are disabled by default and enabled individually to keep payloads lean for high-volume runs
- Input echo — every output row includes
inputName,inputEmail,inputCompany,inputDomainso you can join enriched results back to your original list without manual matching - Not-found rows — unmatched people produce a
source: "not_found"row with nulls rather than being silently dropped, keeping your row count consistent - Custom API key support — bring your own PDL API key (free tier: 100 calls/month from PDL directly) or use the built-in shared key; BYOK removes the shared rate limit ceiling
Use cases for person enrichment lookup
Sales prospecting and SDR list building
SDRs and BDRs often receive account lists with only company names and contact names — no emails, no titles, no direct dial numbers. Run this actor against your target list before any outreach sequence starts. Get verified work emails, job titles, and seniority levels back in minutes, then filter to decision-makers (VP and above) before importing to your sales engagement platform.
Marketing agency lead generation
Agencies building prospect databases for clients need enriched contacts at volume. Feed this actor a CSV of names from LinkedIn Sales Navigator exports or event attendee lists. The dual-API fallback strategy catches contacts that PDL's direct enrich misses, raising effective match rates by 15–25% over single-endpoint approaches.
Recruiting and talent sourcing
Recruiters with candidate names but no contact details can enrich a shortlist in one run. The optional includeWorkHistory flag surfaces full career timelines — useful for quickly assessing trajectory without opening each LinkedIn profile manually. Enable includeSkills to match candidates to open role requirements programmatically.
CRM data enrichment and hygiene
Stale CRM records where contacts have changed jobs are a constant problem. Export your contact list, run it through this actor, and compare jobTitle and companyName against your stored values. Records where enriched company data diverges from CRM data flag contacts who have likely moved on. Combine with HubSpot Lead Pusher to write updates back automatically.
B2B lead scoring and qualification
Raw contact lists need context to be useful. After enrichment, use seniority to score contacts by decision-making authority, companySize to filter by ideal customer profile, and companyIndustry to segment by vertical. Pipe the enriched output into B2B Lead Qualifier for a 0–100 composite score built from 30+ signals.
Research and due diligence
Analysts investigating company leadership, founders, or board members need structured data fast. Batch enrichment of key individuals at a target company surfaces their career history, education, and professional networks. The matchConfidence score tells you when to trust the result and when to verify manually.
How to enrich person data
-
Enter your person list — Click the
personsfield and paste a JSON array. Each object needs at minimum anameplus one ofcompany,domain, oremail. Example:[{"name": "Sarah Chen", "company": "Acme Corp", "domain": "acmecorp.com"}]. More identifiers per person means higher match confidence. -
Configure optional fields — Toggle on
includeWorkHistory,includeEducation, orincludeSkillsif you need the richer data. Leave them off for faster, smaller-payload runs. SetmaxPersonsto cap spend if you are testing a large list. -
Run the actor — Click "Start" and wait. Processing runs at 5 people per second (200ms between PDL API calls). A list of 100 people typically completes in 25–35 seconds. A list of 1,000 completes in under 10 minutes.
-
Download results — Go to the Dataset tab, then export as JSON, CSV, or Excel. Filter the export to exclude
source: "not_found"rows if you only want matched records. Join back to your original list using theinputEmailorinputNamecolumns.
Input parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
persons | array | Yes | — | Array of person objects to enrich. Each object: name, email, company, domain, linkedinUrl (all optional, but at least one identity signal required) |
pdlApiKey | string | No | Built-in | Your PDL API key. Built-in key covers up to 100 lookups/month. Bring your own key for higher volume |
maxPersons | integer | No | 100 | Maximum persons to process in one run (1–1,000). Safety cap to prevent accidental over-billing |
includeWorkHistory | boolean | No | false | Include full job history array in output. Each entry: company, title, startDate, endDate |
includeEducation | boolean | No | false | Include education history (school, degree, field of study) in output |
includeSkills | boolean | No | false | Include skills array from PDL profile in output |
Input examples
Enrich by name and company (most common):
{"persons": [{ "name": "Sarah Chen", "company": "Acme Corp", "domain": "acmecorp.com" },{ "name": "James Okafor", "company": "Beta Industries", "domain": "betaindustries.io" },{ "name": "Priya Nair", "company": "Vertex Solutions" }],"maxPersons": 100}
Enrich by email with full profile data:
{"persons": [{ "email": "s.chen@acmecorp.com" },{ "email": "james.okafor@betaindustries.io" },{ "linkedinUrl": "https://www.linkedin.com/in/priya-nair-vertex" }],"includeWorkHistory": true,"includeEducation": true,"includeSkills": true,"maxPersons": 50}
Quick test — single person:
{"persons": [{ "name": "Jan Curn", "company": "Apify", "domain": "apify.com" }],"maxPersons": 1}
Input tips
- More identifiers improve match accuracy — providing
name + company + domaintogether is significantly more reliable thannamealone; email or LinkedIn URL give the highest confidence matches - Use domain alongside company name — the actor passes the domain as both
websiteand a fallbackcompanyparameter to PDL, which increases match rate for companies with non-obvious names - Set
maxPersonswhen testing — start with 5–10 to verify output quality before processing your full list; you only pay for successful enrichments - Batch in one run — processing 500 people in one run is faster and cheaper than 500 individual runs due to Apify platform overhead
- Leave optional fields off for large batches —
includeWorkHistoryandincludeSkillsadd significant payload size; only enable them when you need that data specifically
Output example
{"inputName": "Sarah Chen","inputEmail": null,"inputCompany": "Acme Corp","inputDomain": "acmecorp.com","fullName": "Sarah Chen","firstName": "Sarah","lastName": "Chen","email": "s.chen@acmecorp.com","personalEmail": "sarah.chen.personal@gmail.com","phone": "+1-415-555-0147","mobilePhone": "+1-415-555-0147","jobTitle": "Head of Product Marketing","jobTitleRole": "marketing","seniority": "director","department": "product marketing","companyName": "Acme Corp","companyDomain": "acmecorp.com","companyIndustry": "software / saas","companySize": "501-1000","companyLinkedinUrl": "https://www.linkedin.com/company/acme-corp","linkedinUrl": "https://www.linkedin.com/in/sarahchen-pm","twitterUrl": "https://twitter.com/sarahchenpm","githubUrl": null,"facebookUrl": null,"location": "San Francisco, California, United States","city": "San Francisco","state": "California","country": "United States","workHistory": [{ "company": "Stripe", "title": "Senior Product Marketing Manager", "startDate": "2019-03", "endDate": "2022-01" },{ "company": "Salesforce", "title": "Product Marketing Manager", "startDate": "2016-07", "endDate": "2019-02" }],"education": [{ "school": "University of California Berkeley", "degree": "B.S.", "field": "Marketing" }],"skills": ["go-to-market strategy", "product launches", "demand generation", "salesforce", "hubspot"],"pdlId": "qEnOZ98lib6NRxLIWAk0Vg_0000","matchConfidence": 8,"enrichedAt": "2026-03-23T14:22:11.403Z","source": "pdl_enrich"}
Output fields
| Field | Type | Description |
|---|---|---|
inputName | string|null | Name from input (for join-back) |
inputEmail | string|null | Email from input (for join-back) |
inputCompany | string|null | Company from input (for join-back) |
inputDomain | string|null | Domain from input (for join-back) |
fullName | string|null | PDL canonical full name |
firstName | string|null | First name |
lastName | string|null | Last name |
email | string|null | Work/professional email |
personalEmail | string|null | Personal email (if PDL has it) |
phone | string|null | Primary phone number |
mobilePhone | string|null | Mobile phone if separately listed |
jobTitle | string|null | Current job title |
jobTitleRole | string|null | Broad role category (e.g. engineering, sales) |
seniority | string|null | Normalised seniority: c_suite, vp, director, manager, senior, entry |
department | string|null | Department/sub-role (e.g. product marketing, software) |
companyName | string|null | Current employer name |
companyDomain | string|null | Current employer website domain |
companyIndustry | string|null | Industry classification |
companySize | string|null | Employee count band (e.g. 501-1000) |
companyLinkedinUrl | string|null | Company LinkedIn page URL |
linkedinUrl | string|null | Person's LinkedIn profile URL |
twitterUrl | string|null | Twitter/X profile URL |
githubUrl | string|null | GitHub profile URL |
facebookUrl | string|null | Facebook profile URL |
location | string|null | Full location string |
city | string|null | City |
state | string|null | State or region |
country | string|null | Country |
workHistory[] | array|null | Past jobs (enabled via includeWorkHistory) |
workHistory[].company | string | Employer name |
workHistory[].title | string | Job title held |
workHistory[].startDate | string|null | Start date (YYYY-MM) |
workHistory[].endDate | string|null | End date (YYYY-MM), null if current |
education[] | array|null | Education records (enabled via includeEducation) |
education[].school | string | Institution name |
education[].degree | string|null | Degree type (e.g. B.S., MBA) |
education[].field | string|null | Field of study |
skills | array|null | Skills list (enabled via includeSkills) |
pdlId | string|null | PDL internal person ID (stable unique identifier) |
matchConfidence | number|null | PDL likelihood score 0–10 (10 = exact match) |
enrichedAt | string | ISO 8601 timestamp of enrichment |
source | string | pdl_enrich, pdl_search, or not_found |
How much does it cost to enrich person data?
Person Enrichment Lookup uses pay-per-event pricing — you pay $0.03 per successfully enriched person. People who return no match (source: "not_found") are not charged. Platform compute costs are included.
| Scenario | People processed | Match rate (typical) | People enriched | Total cost |
|---|---|---|---|---|
| Quick test | 10 | 80% | ~8 | ~$0.24 |
| Small batch | 50 | 80% | ~40 | ~$1.20 |
| Medium batch | 200 | 80% | ~160 | ~$4.80 |
| Large batch | 500 | 80% | ~400 | ~$12.00 |
| Enterprise batch | 1,000 | 80% | ~800 | ~$24.00 |
You can set a maximum spending limit per run to control costs. The actor stops cleanly when your budget is reached, and all already-enriched records are saved to the dataset before the run ends.
Compare this to Clay at $0.22–$5.63 per PDL enrichment depending on plan, or Apollo at $99–$249/month for a contact database. Most users running 500–1,000 enrichments per month spend $15–$25 with no subscription commitment. Apify's free tier also includes $5 of monthly credits, covering roughly 166 enrichments at no cost.
Person enrichment using the API
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("ryanclinton/person-enrichment-lookup").call(run_input={"persons": [{"name": "Sarah Chen", "company": "Acme Corp", "domain": "acmecorp.com"},{"name": "James Okafor", "company": "Beta Industries"},{"email": "priya.nair@vertexsolutions.com"},],"maxPersons": 100,"includeWorkHistory": False,"includeEducation": False,"includeSkills": False,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():if item.get("source") != "not_found":print(f"{item['fullName']} | {item['jobTitle']} @ {item['companyName']} | {item['email']} | confidence: {item['matchConfidence']}")
JavaScript
import { ApifyClient } from "apify-client";const client = new ApifyClient({ token: "YOUR_API_TOKEN" });const run = await client.actor("ryanclinton/person-enrichment-lookup").call({persons: [{ name: "Sarah Chen", company: "Acme Corp", domain: "acmecorp.com" },{ name: "James Okafor", company: "Beta Industries" },{ email: "priya.nair@vertexsolutions.com" },],maxPersons: 100,includeWorkHistory: false,includeEducation: false,includeSkills: false,});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const item of items) {if (item.source !== "not_found") {console.log(`${item.fullName} | ${item.jobTitle} @ ${item.companyName} | ${item.email} | confidence: ${item.matchConfidence}`);}}
cURL
# Start the actor runcurl -X POST "https://api.apify.com/v2/acts/ryanclinton~person-enrichment-lookup/runs?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"persons": [{"name": "Sarah Chen", "company": "Acme Corp", "domain": "acmecorp.com"},{"email": "james.okafor@betaindustries.io"}],"maxPersons": 100}'# Fetch results (replace DATASET_ID from the run response above)curl "https://api.apify.com/v2/datasets/DATASET_ID/items?token=YOUR_API_TOKEN&format=json"
How Person Enrichment Lookup works
Phase 1 — Identifier assembly and PDL Enrich call
The actor builds a PDL Enrich API query from every available identifier on the person object. Email maps to email, LinkedIn URL to profile, name is split on whitespace into first_name + last_name, company maps to company, and domain maps to website. When no company name is present but a domain is, the domain is passed as both website and company to maximise PDL's fuzzy matching surface. The request requires at minimum one of: email, linkedinUrl, or name. The query always includes min_likelihood=2 and required=name to suppress spurious matches. A 30-second timeout is enforced via AbortController. HTTP 429 responses trigger one automatic retry after a 2-second pause before the request is marked as failed.
Phase 2 — PDL Search fallback
When the Enrich endpoint returns HTTP 404 (no match in PDL's direct lookup index), and the input includes both a name and a company or domain, the actor constructs an Elasticsearch DSL query against PDL's Person Search endpoint. The query uses bool.must clauses matching first_name, last_name, and either job_company_name or job_company_website (using a term filter for domain, a match clause for company name). Only the top-ranked result (size: 1) is returned. This fallback path catches people whose PDL record cannot be hit by exact identifier match but who are findable by name-and-employer combination.
Phase 3 — Data transformation and normalisation
The raw PDL profile goes through a set of deterministic transforms before being written to the dataset. Seniority is normalised from job_title_levels[] using a fixed priority ladder (c_suite takes precedence over vp, which takes precedence over director, and so on). Emails are typed: addresses with type=work or type=professional become email; addresses with type=personal become personalEmail; all other typed emails fall back to the work slot. Work history entries are mapped from PDL's experience[] structure, filtering out entries with neither company nor title. Education entries filter to records with a school name. The pdlId field carries PDL's stable internal person identifier, useful for deduplication across multiple enrichment runs.
Phase 4 — Charging and output
PPE charging fires only after a record is confirmed as source !== "not_found" and after the data has been pushed to the Apify dataset — ensuring you never pay for a charge where the data was not saved. The actor monitors chargeResult.eventChargeLimitReached after every charge event and stops cleanly if your spending limit is reached. Completed records are flushed to the dataset in batches of 100. A summary record is always written as the final dataset entry, regardless of whether the run completed fully or was stopped by a spending limit or credit exhaustion.
Tips for best results
-
Provide email when you have it. Email is PDL's highest-confidence identifier. A lookup by email alone typically returns
matchConfidenceof 8–10, versus 5–7 for name + company alone. -
Include the company domain alongside the company name. The actor passes domain as both
websiteand a fallbackcompanyparameter. This catches PDL records where the company name is stored differently than you have it (e.g. "Acme" vs "Acme Corp" vs "Acme Corporation"). -
Filter output by
matchConfidencebefore importing to CRM. Scores of 6 and above are generally reliable. Scores of 2–4 from the Search fallback path should be manually verified before sending outreach. -
Use
sourceto understand your match rate. After a run, count records bysourcevalue:pdl_enrich(best),pdl_search(good, fallback),not_found(no match). A highnot_foundrate often means input names need cleaning or the people are not in PDL's database (common for very small companies). -
For large batches, set
maxPersonsto a safe cap. If you have 5,000 names but are unsure of match rate, run 100 first to gauge quality and match rate before committing to the full list. -
Combine with Email Pattern Finder for un-enrichable contacts. When PDL returns
not_found, you can still derive a probable work email by running the domain through Email Pattern Finder to get the company's email naming convention (e.g.{first}.{last}@domain.com). -
Schedule weekly runs to catch job changes. People change roles every 18–24 months on average. A weekly enrichment run against your active CRM contacts will surface
companyNameorjobTitlechanges that indicate a contact has moved on. -
Bring your own PDL API key for enterprise volume. The built-in key is shared and subject to PDL's free-tier limits. A PDL paid account starts at $98/month and provides significantly higher call limits if you are running thousands of lookups daily.
Combine with other Apify actors
| Actor | How to combine |
|---|---|
| Website Contact Scraper | Scrape a company website to find employee names and partial emails, then enrich each person here for complete profiles |
| Google Maps Email Extractor | Extract business owner contacts from Google Maps, then enrich each contact with job title and seniority via this actor |
| Email Pattern Finder | For contacts this actor returns as not_found, use Email Pattern Finder to derive a probable email from the company domain |
| Bulk Email Verifier | Verify the email field returned by enrichment before sending outreach — confirms MX record and SMTP deliverability |
| B2B Lead Qualifier | Pipe enriched records into the qualifier to score each contact 0–100 from seniority, company size, industry, and 27 other signals |
| HubSpot Lead Pusher | Write enriched contacts directly into HubSpot with mapped field names |
| Waterfall Contact Enrichment | Use as the PDL step in a 10-source waterfall cascade to maximise total enrichment coverage |
Limitations
- PDL database coverage — PDL covers approximately 3 billion professional profiles, but match rates vary by region and company size. Expect 70–85% match rates for US/UK professionals at companies with 50+ employees. Rates drop to 40–60% for freelancers, very small businesses, and professionals in markets where LinkedIn adoption is low.
- No JavaScript rendering — this actor makes direct HTTP calls to the PDL API and does not scrape websites. If you need to extract contact details from JavaScript-rendered company pages before enriching, use Website Contact Scraper Pro first.
- Data freshness — PDL refreshes its database on a rolling basis, but profiles may lag behind real-world job changes by 2–6 months.
matchConfidencedoes not reflect recency, only identity match certainty. - 1,000 persons per run maximum — the
maxPersonscap is enforced at 1,000. For larger lists, split into multiple runs or use the API to queue batches. - Built-in API key limit — the shared built-in PDL key covers a limited number of lookups per month across all users of the actor. For reliable high-volume use, bring your own PDL API key.
- No bulk-lookup discount — PDL charges per API call regardless of batch size on the calling side. This actor's pricing reflects per-enriched-person charges.
- Seniority for non-English titles — PDL's
job_title_levelsnormalisation is less reliable for job titles in non-English languages. The seniority field may be null for some international profiles. - Phone number availability — PDL has phone data for roughly 20–30% of profiles. The
phoneandmobilePhonefields will be null for the majority of enriched contacts.
Integrations
- Zapier — trigger enrichment runs from a Zap when new contacts are added to a spreadsheet or CRM, then route enriched records to any Zapier-connected app
- Make — build enrichment automations that run on a schedule or in response to form submissions, webhooks, or CRM events
- Google Sheets — export enriched contact lists directly to a Sheet for team review or import into marketing tools
- Apify API — trigger runs programmatically from your own backend, CRM integration scripts, or data pipeline
- Webhooks — post enriched dataset results to your CRM or data warehouse endpoint immediately when a run completes
- LangChain / LlamaIndex — use enriched person data as structured context for AI sales agents, automated outreach writers, or research assistants
Troubleshooting
-
High
not_foundrate despite correct names — verify your company names match how PDL stores them. "Meta" versus "Facebook" or "Alphabet" versus "Google" can cause misses on the Search fallback path. Try adding the domain (domain: "meta.com") alongside the company name to give PDL a domain-based match path. -
matchConfidenceis low (2–4) on returned records — low scores typically come from the PDL Search fallback path. These are fuzzy matches on name + employer. Always filter output bymatchConfidence >= 5before importing to CRM or sending outreach. Low-confidence records should be manually verified. -
Run stops early with "PDL API credits exhausted" in the status — this means the built-in API key has hit its monthly limit. Either wait for the calendar month to reset, or add your own PDL API key in the
pdlApiKeyfield. PDL's free tier provides 100 API calls/month per account atpeopledatalabs.com. -
Run stops with "Spending limit reached" — your Apify run budget cap was hit. This is by design. Increase your spending limit in the actor run settings, or process a smaller batch. All records enriched before the limit was reached are saved in the dataset.
-
Email field is null but personalEmail has a value — PDL has a personal email on file but no verified work email. You can use Email Pattern Finder on the person's company domain to derive the likely work email format.
Responsible use
- This actor only queries the People Data Labs API using data you provide. It does not scrape any websites or access private systems.
- PDL's data is aggregated from public professional sources including LinkedIn, company websites, and professional directories.
- Comply with GDPR, CAN-SPAM, CASL, and other applicable data protection laws when using enriched contact data for outreach.
- Do not use enriched data for spam, harassment, profiling without lawful basis, or any purpose that violates the terms of service of the platforms from which the underlying data originates.
- For guidance on the legal framework around B2B contact data, see Apify's guide on web scraping legality.
FAQ
How many people can I enrich in one run with Person Enrichment Lookup?
Up to 1,000 persons per run. Set maxPersons in your input to control the limit. For lists larger than 1,000, split into multiple runs or use the Apify API to queue batches sequentially.
What identifiers does person enrichment require?
Each person needs at minimum one of: email address, LinkedIn URL, or full name. For name-only records, at least one of company or domain is required to enable the Search fallback. More identifiers produce higher matchConfidence scores.
How accurate is person enrichment from PDL?
PDL's direct Enrich endpoint (email or LinkedIn-based lookups) consistently returns matchConfidence of 8–10. Name + company searches via the fallback path return 5–7. Match rates vary by region: 75–85% for US/UK enterprise contacts, 40–65% for other markets. The matchConfidence score on every record tells you how much to trust each match.
How long does a typical person enrichment run take? The actor enforces a 200ms delay between PDL API calls to respect rate limits. A batch of 100 people completes in approximately 30 seconds. A batch of 1,000 completes in 4–8 minutes depending on how many Search fallback calls are needed.
Does person enrichment work for people outside the United States? Yes, PDL has global coverage, but match rates are higher for professionals in markets with strong LinkedIn adoption (US, UK, Canada, Australia, Western Europe). Match rates are lower for professionals in markets where LinkedIn is less dominant.
How is Person Enrichment Lookup different from Clay? Both use the People Data Labs API as a data source. Clay charges $0.22–$5.63 per PDL enrichment depending on your subscription tier, plus a monthly platform fee. This actor charges $0.03 per successfully enriched person with no subscription. You only pay for matches, not misses. The actor also provides a Search fallback path that Clay's PDL action does not expose, improving match rates for name + company inputs.
How is this different from Apollo or ZoomInfo? Apollo ($99–$249/month) and ZoomInfo ($15,000+/year) are full sales intelligence platforms. This actor is a single-purpose enrichment tool that uses PDL's independent B2B database. It costs less per lookup, requires no subscription, and outputs clean structured JSON that maps directly into any CRM or data pipeline. It does not replace the prospecting search features of Apollo or ZoomInfo.
Can I use my own People Data Labs API key?
Yes. Add your PDL API key to the pdlApiKey field. The built-in key is shared and subject to PDL's free-tier rate limits. Bringing your own key removes that ceiling. PDL's free tier provides 100 API calls/month; paid plans start at $98/month.
Is person enrichment legal? PDL aggregates data from public professional sources. Querying PDL's API to enrich business contact data for legitimate B2B purposes is generally lawful. You must comply with applicable data protection regulations (GDPR, CAN-SPAM, CASL) in how you use the enriched data. For detailed guidance see Apify's legal guide.
What happens if a person is not found in PDL?
The actor records a result row with source: "not_found" and null values for all enriched fields. You are not charged for not-found records. The row is still written to the dataset so your row count matches your input list, making join-back straightforward.
Can I schedule person enrichment to run automatically? Yes. Use Apify's built-in scheduler to run enrichment on a daily, weekly, or custom cron schedule. This is useful for refreshing CRM contact data on a recurring basis to catch job changes.
Can I combine person enrichment with other actors in an automated pipeline? Yes. The most common pipeline is: scrape company websites with Website Contact Scraper → enrich contacts here → verify emails with Bulk Email Verifier → push to HubSpot with HubSpot Lead Pusher. You can connect these steps via Apify webhooks or Make/Zapier automations.
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.