Person Enrichment โœ… LinkedIn + Web, Salary & Team Analysis avatar

Person Enrichment โœ… LinkedIn + Web, Salary & Team Analysis

Pricing

from $50.00 / 1,000 enriched profiles

Go to Apify Store
Person Enrichment โœ… LinkedIn + Web, Salary & Team Analysis

Person Enrichment โœ… LinkedIn + Web, Salary & Team Analysis

Turn public LinkedIn profiles into analyst-grade career records: deduplicated positions, employer facts, seniority, a salary estimate per role, normalized education, career stats, scholarly and patent records, plus free team analysis for 2 to 10 people. No cookies. $0.05 per profile, failures free.

Pricing

from $50.00 / 1,000 enriched profiles

Rating

0.0

(0)

Developer

Pvalyou

Pvalyou

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

a day ago

Last modified

Share

Turn any public LinkedIn profile URL into an analyst-grade career record. A scraper gives you what the person typed. This Actor gives you what an analyst would conclude: deduplicated and dated positions, employer facts, seniority and department classification, a salary estimate for every role, normalized education, career statistics, scholarly and patent records, and, for teams of two to ten people, a free relationship analysis of who worked with whom, where and for how long.

$0.05 per delivered profile, for venture and private-equity diligence, recruiting, sales intelligence and people-data pipelines. Where a raw LinkedIn profile scrape hands you the text of the page, this LinkedIn profile enrichment API hands you a career history that has been deduplicated, dated, classified and priced, with a salary estimate per role and a founding-team analysis on top.

It runs on the enrichment engine behind Pvalyou's venture intelligence platform, and it enriches any public profile on demand, whether or not the person has been enriched before. No LinkedIn login, no cookies, no account of yours is ever used.

  • โœ… One price, no add-ons. $0.05 per delivered profile. Failures cost nothing. Team analysis is free.
  • โœ… Outside sources, not only the profile. Bio pages, press, faculty pages, OpenAlex and ORCID scholarly records, patent records. The pages actually read are listed in the output.
  • โœ… Honest fields. Estimates are named as estimates and carry a confidence score. Anything deduced rather than stated is marked inferred. Empty keys are omitted, never returned as null.
  • โœ… Fast on repeat. A profile enriched in the last 90 days answers in under a second.

๐Ÿ“ฆ What data do you get?

๐Ÿ‘ค Name, headline, about, city, country, languages, skills๐Ÿงญ career_summary in one sentence and resource_areas (Tech, Product, Management, Business)
๐Ÿ’ผ Every position deduplicated, with clean start_date and end_date, is_current, tenure_years๐Ÿข Employer facts per position: industry, country, city, size range, prestige score, domain
๐ŸŽ–๏ธ seniority_level, department, employment_type, executive, founder and board flags๐Ÿ’ต estimated_salary_usd with salary_confidence for every paid role
๐ŸŽ“ Education with degree and major categories, school prestige level and domain๐Ÿ“œ Certifications, military service, projects, publications, courses, volunteering and honors when present
๐Ÿ“Š career_stats: years of experience, positions, employers, current roles, founder roles and exits, board seats, countries worked, longest tenure, MBA and PhD flags, estimated lifetime earnings๐Ÿ”ฌ researcher block from OpenAlex and ORCID: works, citations, h-index, top publications
๐Ÿ”Ž evidence: the outside pages and records read during a fresh enrichment๐Ÿท๏ธ Provenance on every entry: stated, normalized, estimated or inferred
๐Ÿ‘ฅ Team mode: pairwise shared employers and schools, overlap windows, manager and report detection, co-founder detection๐Ÿงฉ Team mode: resource coverage of the team, seniority mix, prior exits, countries, pairs with no shared history

โš–๏ธ A profile scrape next to this record

Same person, same position. The left column is what a LinkedIn profile scraper returns for that role. The right column is this Actor.

FieldProfile scrapeThis Actor
Employer"companyName": "Uber", a logo URL, a LinkedIn company id"company": "Uber" plus industry (Technology, Information & Internet Platforms), country and city (United Kingdom, London), size (10000+), prestige score (90), branded_company: true
Title"position": "Senior Software Engineer, Payment Providers Platform"the same title plus department: "Engineering", seniority_level: "senior", employment_type: "Full-time", executive, founder and board flags
Dates"startDate": {"text": "Jul 2016"}, "endDate": {"text": "2017"}, "duration": "1 yr"start_date: "2016-07", end_date: "2017", tenure_years: 0.9, is_current: false, validated across sections
Salarynot availableestimated_salary_usd: 160000, salary_confidence: 75
Education"degree": "MsC", "period": "2003 - 2009", a school idschool name canonicalized, school_domain: "bme.hu", degree: "MSc", degree_category: "graduate", major_category: "stem", school_prestige_level: "Top University"
Whole career14 entries as typed, duplicates includeddeduplicated positions, a career summary, resource areas and 15 career statistics
Beyond the profilenothingbio pages, press, scholarly and patent records, listed in evidence
Failuressilent empty arraysexplicit, uncharged error items

โฌ‡๏ธ Input

Paste one or more profile URLs. Bare vanity slugs work too, and so do URLs with query strings, sub-paths or non-Latin slugs.

{
"profileUrls": [
"https://www.linkedin.com/in/satyanadella",
"gergelyorosz"
],
"mode": "enrich",
"forceRefresh": false
}
FieldWhat it does
profileUrlsOne or more LinkedIn profile URLs or slugs. Duplicates are collapsed.
modeenrich processes each profile on its own. team treats all URLs (2 to 10) as one team and adds the free relationship analysis.
forceRefreshRe-extract the profile even if we enriched it in the last 90 days.

Inputs that are not profiles (company pages, other sites, hashed member ids such as /in/ACoAAA...) are rejected before any paid step and appear as uncharged error items.

โฌ†๏ธ Output

One dataset item per profile. Every item carries type, input_url, status and charged, so the dataset is the complete record of what you paid for.

typestatusChargedContents
personokyes, $0.05the complete record under person
personpartialyes, $0.05a record the engine could only partly produce, plus a warning field that names what is missing. It is charged exactly like a complete one
personerrornothe profile could not be delivered: an error code and a message
errorerrornoan input rejected before any paid step, and in team mode a person the engine could not enrich
team_analysisok or partialnopairwise interactions and team scores, in team mode. partial here means the people were delivered and charged but the analysis over the group came back empty, and the item says so in warning

ok and partial are the two billable outcomes. Everything else is an uncharged item that says why.

partial is charged at the full $0.05. The engine has one partial path in enrich mode: the LinkedIn profile was fetched but both enrichment passes returned nothing, so the item is delivered with the fetch behind it and no career record on top. It always carries a warning sentence saying which part is missing. If your pipeline needs a complete record every time, filter on status == "ok" and treat partial as a retry with forceRefresh.

The error codes a buyer can receive are invalid_url (not a profile URL or vanity slug, or a hashed member id such as /in/ACoAAA...), profile_not_found (private, renamed or deleted), extraction_empty (the profile came back with nothing in it), upstream_busy (the engine was busy or unreachable) and internal.

A real record, abridged to one position and one degree. Your run's dataset holds the complete record, with every field that applies to the person.

{
"type": "person", "input_url": "https://www.linkedin.com/in/gergelyorosz", "status": "ok", "charged": true,
"person": {
"linkedin_slug": "gergelyorosz", "first_name": "Gergely", "last_name": "Orosz",
"headline": "Writing The Pragmatic Engineer, the #1 software engineering newsletter on Substack.",
"city": "Amsterdam", "country": "Netherlands", "languages": ["Hungarian", "English"],
"career_summary": "22.8 years of experience across 14 positions at 12 employers, currently Author, The Pragmatic Engineer at The Pragmatic Engineer, founded 2 companies, MSc in Computer Science from Budapest University of Technology and Economics",
"resource_areas": ["Tech", "Management"],
"experience": [{
"company": "Uber", "company_industry": "Technology, Information & Internet Platforms",
"company_country": "United Kingdom", "company_city": "London", "company_size_range": "10000+",
"company_prestige_score": 90, "branded_company": true,
"title": "Senior Software Engineer, Payment Providers Platform", "department": "Engineering",
"seniority_level": "senior", "employment_type": "Full-time",
"is_executive": false, "is_founder_role": false, "is_board_member": false,
"start_date": "2016-07", "end_date": "2017", "is_current": false, "tenure_years": 0.9,
"estimated_salary_usd": 160000, "salary_confidence": 75, "inferred": false
}],
"education": [{
"school": "Budapest University of Technology and Economics", "school_domain": "bme.hu",
"school_prestige_level": "Top University", "degree": "MSc", "degree_category": "graduate",
"major": "Computer Science", "major_category": "stem", "specialization_level": "Specialized Major",
"country": "Hungary", "start_date": "2003", "end_date": "2009", "estimated_dates": false, "inferred": false
}],
"projects": ["Skype for Xbox One - Oct 2012 - Present", "AdRotator - Oct 2011 - Present"], "courses": ["Certified Scrum Master"],
"career_stats": {
"years_of_experience": 22.8, "num_positions": 14, "num_employers": 12, "num_degrees": 1,
"num_current_roles": 1, "num_executive_roles": 2, "num_founder_roles": 2, "num_founder_exits": 0,
"countries_worked": ["Hungary", "Netherlands", "United Kingdom", "United States"],
"longest_tenure_years": 5.0, "has_mba": false, "has_phd": false,
"estimated_lifetime_earnings_usd": 1920000
},
"enrichment_basis": "real_rows", "from_cache": true
}
}

Export the dataset as JSON, CSV, Excel or XML, or read it through the Apify API.

๐Ÿ‘ฅ Team mode (free analysis)

Give two to ten profile URLs with "mode": "team". Each person is enriched and charged exactly as in enrich mode. The Actor enriches five profiles at a time, so a team of ten fresh profiles is two waves, and then adds one uncharged team_analysis item:

{
"type": "team_analysis", "charged": false,
"team_analysis": {
"interactions": [{
"person_1": "chen-goldberg", "person_2": "dan-ostrosky", "shared_place": "Voyager Labs",
"interaction_type": "work", "timing": "prior",
"description": "Both worked at Voyager Labs, Chen as a Production Operation Architect and Dan as a Software Engineer, overlapping from June 2016 to December 2017.",
"overlap_start": "2016-06", "overlap_end": "2017-12", "overlap_duration_years": 1.5,
"is_manager_employee": false, "co_founded_org": false, "seniority_gap": "senior-junior"
}],
"team_scores": {
"prior_shared_history_years": 10.04, "n_pairs_with_history": 2, "n_pairs_total": 3,
"complementarity_score": 7, "team_fit_score": 72,
"cohesion_summary": "Two of the three pairs share substantial prior working history, including an 8+ year co-founding relationship.",
"resource_coverage": {"covered": ["Tech", "Management"], "missing": ["Product", "Business"], "broad_team": false},
"team_mix": {"n_people": 3, "n_with_executive_roles": 2, "n_with_founder_exits": 1, "countries": ["Israel"], "pairs_without_shared_history": [["etai", "chen-goldberg"]]}
}
}
}

Use it for founding-team diligence, hiring panels, partner vetting, or mapping who already knows whom inside a target account.

A person the engine could not enrich inside a team comes back as an uncharged error item with that person's profile URL, and the rest of the team is still delivered and charged.

Team mode can end the run, enrich mode never does. A team of fewer than two or more than ten unique profiles fails the run with the count it received, and so does a team analysis the API could not produce. Nothing is charged in either case, and the failing input is in the run's status message. Enrich mode is the opposite: a profile it cannot deliver becomes an uncharged error item and the run carries on to the next profile, so a bad URL in a list of 200 never costs you the run.

๐Ÿ’ฐ How much does it cost?

EventPriceWhen
Profile delivered (enrich mode or team mode, fresh or cached, status ok or partial)$0.05once per profile
Actor start$0.00005once per run
Team relationship analysisfree
Invalid input, profile not found, empty profile, vendor busyfree

That is $50 per 1,000 profiles, plus $0.00005 for the run itself, so 1,000 profiles in one run is $50.00005 in total. Compared with a raw profile scrape at $4 to $10 per 1,000, you are paying for the enrichment, not the scrape: the outside sources, the normalization, the classification, the salary estimates and the team analysis. There are no add-ons and no separate charge for team mode.

โฑ๏ธ How long does a run take?

A fresh profile takes 4 to 6 minutes: the engine reads the profile, searches the web for the person, reads the pages worth reading, checks scholarly and patent records and then runs the enrichment models. The engine's own deadline is 860 seconds, so a fresh profile is never still running after 14 minutes: past that it comes back as an uncharged error item. A profile enriched in the last 90 days answers in under a second.

Enrich mode runs one profile at a time, so ten fresh profiles take 40 minutes to an hour. Team mode runs five at a time, so a team of ten fresh profiles is two waves, 8 to 12 minutes, and the relationship analysis on top of that is seconds, because by then every person in the team is enriched.

Start the run and read the dataset when it finishes, or set a webhook.

๐ŸŽฏ Use cases

  • ๐Ÿฆ Venture and private-equity diligence. Founding-team background, prior shared history and team coverage in one call.
  • ๐Ÿง‘โ€๐Ÿ’ผ Recruiting. Real seniority, tenure and salary context instead of keyword matching.
  • ๐Ÿ“ˆ Sales intelligence. Career trajectories and org relationships for multi-threading into an account.
  • ๐Ÿ”ฌ People analytics and research. Normalized, classified career data at scale, with provenance on every entry.
  • ๐Ÿค– AI agents. Structured, consistent JSON that an agent can reason over, with an MCP-ready Actor interface.

๐Ÿ”Œ API and integrations

Run the Actor from the Apify Console, from the Apify API, from the Python or JavaScript client, from the Apify MCP server, or from Make, Zapier and n8n through the Apify integrations.

from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("pvalyou/linkedin-person-enrichment").call(run_input={
"profileUrls": ["https://www.linkedin.com/in/satyanadella"],
"mode": "enrich",
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["type"], item.get("charged"), item.get("person", {}).get("career_summary"))

๐Ÿ”Ž How the enrichment works

  1. The public profile is extracted through established extraction providers. No login, no cookies.
  2. The engine searches the open web for the person, and a source-selection model picks the pages worth reading: company bios, faculty pages, press, conference pages.
  3. Those pages are read. Scholarly databases (OpenAlex, ORCID) and patent records are checked.
  4. The enrichment models normalize, deduplicate, date, classify and price every entry, with the outside evidence in hand.
  5. A profile enriched in the last 90 days answers from that enrichment in under a second, and forceRefresh re-runs the whole pass at the same price.

Every value falls into one of four provenance levels:

  • Stated. Taken from the person's own profile: employers, titles, degrees, dates.
  • Normalized or classified. A stated fact cleaned and categorized: canonical school names, department, major_category, seniority_level.
  • Estimated. A quantity the profile never states, computed and named as such: estimated_salary_usd always ships with salary_confidence, guessed education years carry estimated_dates: true.
  • Inferred. An entry whose existence is deduced rather than listed, for example a practicing physician implies an MD. These rows carry "inferred": true, are excluded from career_stats, and can be filtered out with one line.

๐Ÿ” Data, licences and privacy

  • Public professional information only. The profile is extracted through established extraction providers, with no login, no cookies and no account of yours. Private profiles are not accessed and no authentication is bypassed.
  • No contact details. No email addresses, no phone numbers, no home addresses. This Actor does not harvest them and does not return them.
  • Outside sources are public pages. Company bio pages, press, faculty and conference pages, OpenAlex and ORCID scholarly records and patent records. The pages actually read are listed in evidence on the record.
  • Pass-through to your dataset. The record lands in your own Apify dataset under your account's retention settings. The enrichment itself is kept on our side so that the same profile answers in under a second for 90 days, and forceRefresh re-runs the whole pass at the same price. Operational logs keep the input, the mode, timing and the billing outcome, which is what running and billing the service needs.
  • Personal data. A career record is personal data under laws such as the GDPR. Use it only where you have a lawful basis and in line with the laws of your jurisdiction. It must not be used for unlawful surveillance, harassment, employment discrimination, or credit or insurance eligibility decisions. This is not a consumer report and we are not a consumer reporting agency.
  • Removal. A person can ask to be removed through the Issues tab on this page, with the profile URL. Removals are honored within 30 days.

โ“ FAQ

How fresh is the data?

A profile enriched in the last 90 days answers from that enrichment. Pass forceRefresh: true to re-extract regardless, at the same price.

What if a profile is private, renamed or deleted?

You get an uncharged error item with profile_not_found.

Why did my run take minutes rather than seconds?

Because the profile was new and the full enrichment ran: 4 to 6 minutes of reading the profile, searching the web for the person, reading the pages worth reading and running the models. A profile enriched in the last 90 days answers in under a second. Start the run and read the dataset when it finishes.

What does status: partial mean, and is it charged?

It means the LinkedIn profile was fetched but the enrichment passes over it returned nothing, so the item arrives without the career record on top. It is charged the full $0.05, exactly like a complete record, and it always carries a warning sentence saying what is missing. In team mode a partial on the team_analysis item means the opposite way round: every person was delivered and charged, and only the analysis over the group came back empty. If your pipeline needs a complete record every time, filter on status == "ok" and retry the partial with forceRefresh: true.

Where do the salary figures come from?

They are model estimates from role, seniority, employer, location and year, each with a confidence score. They are not payroll data.

Can I get emails or phone numbers?

No. This Actor deliberately does not harvest contact details.

Can I use it for founding-team due diligence?

That is what team mode is for. Give two to ten profile URLs, and on top of the individual career records you get pairwise shared employers and schools, overlap windows, manager and report detection, co-founder detection, resource coverage and a team fit score. The analysis costs nothing beyond the per-profile price.

The Actor processes publicly available professional information, the kind a person publishes on their own public profile, retrieved through established extraction providers. It does not access private profiles, log in as a user or bypass authentication. Some public data is still personal data under laws such as the GDPR, so use it only where you have a legitimate reason, and in line with the laws of your jurisdiction. The Actor must not be used for unlawful surveillance, harassment, employment discrimination, or credit or insurance eligibility decisions. It is not a consumer reporting agency and provides no consumer reports.

Can a person ask to be removed?

Yes. Open an issue on this page with the profile URL. Removals are honored within 30 days.

Can I use it as an API?

Yes. Every Actor on Apify is callable through the API, the clients and the MCP server. See the snippet above.

๐Ÿ“ Limits

  • Enrich mode runs one profile at a time. Team mode runs five at a time and takes 2 to 10 unique profiles, outside which the run fails without charging.
  • A fresh enrichment has an 860 second deadline in the engine. Past it the profile comes back as an uncharged error item rather than hanging the run.
  • Duplicate inputs are collapsed by profile slug. Company pages, other sites and hashed member ids (/in/ACoAAA...) are rejected before any paid step.
  • No contact details, ever: no email addresses, no phone numbers, no home addresses.
  • Salary figures, lifetime earnings and prestige scores are model estimates with a confidence score, never payroll or employer-reported data.
  • Empty keys are omitted from the record rather than returned as null, so a CSV export has the columns the person actually has.
  • The run's spending limit is honoured: the Actor stops before the next profile once it is reached.

๐Ÿ”— Works well with

The people and the company are two halves of the same question: Company Enrichment API for the firmographics, classification and funding of the employer, Company Registry Lookup to confirm the company a founder names is registered and active, Patent Lookup for the patents an inventor is named on, Job Postings for what their company is hiring for right now, and Website Liveness Check for whether the startup on their profile still has a live site.

๐Ÿ’ฌ Support and feedback

Found a profile that came back wrong, or a field you need? Open an issue on this Actor's page. The engine improves from real cases, and a report with the profile URL and what you expected is the fastest way to a fix.

๐Ÿ“ Changelog

  • 0.1 First public release: enrich and team modes, deduplicated and dated positions with employer facts, seniority and department classification, a salary estimate per role, normalized education, career statistics, scholarly and patent records, and a free relationship analysis for teams of two to ten.