LinkedIn Profile Enrichment: Salary Estimate, Career, Team avatar

LinkedIn Profile Enrichment: Salary Estimate, Career, Team

Pricing

from $20.00 / 1,000 enriched profiles

Go to Apify Store
LinkedIn Profile Enrichment: Salary Estimate, Career, Team

LinkedIn Profile Enrichment: Salary Estimate, Career, Team

Turn public LinkedIn profile URLs into analyst-grade career records: deduplicated positions, employer facts, seniority, a salary estimate per role, education, career stats, scholarly and patent records, plus team analysis for 2 to 10 people. No cookies. $0.03 a profile, $0.02 on higher Apify plans.

Pricing

from $20.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

16 hours ago

Last modified

Share

Person Enrichment ✅ LinkedIn + Web, Salary & Team Analysis Actor

Person enrichment from LinkedIn and the web: paste public LinkedIn profile URLs and get one analyst-grade career record per person in your dataset. The input comes prefilled with a profile, so the easiest way to try it is to click Start. 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 team analysis of who worked with whom, where and for how long.

$0.03 per delivered profile, $0.025 on Silver and $0.02 on Gold plans, 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 per profile, no add-ons. $0.03 per delivered profile, less on Silver and Gold plans. 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

▶️ How to enrich a LinkedIn profile in 5 steps

  1. Open this Actor in the Apify Console. The input comes prefilled with one profile.
  2. Put one or more LinkedIn profile URLs or vanity slugs in profileUrls.
  3. Pick a mode: enrich for each person on their own, or team for two to ten people with the free team analysis. Turn on forceRefresh only to re-extract a profile enriched in the last 90 days.
  4. Click Start. A profile enriched in the last 90 days answers in under a second, and a fresh one takes several minutes.
  5. Download the records from the run's dataset as JSON, CSV or Excel, or read them through the Apify API. To repeat the run on a timetable, add a schedule, and to be told when a run finishes, add a webhook.

⬇️ 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, the profile pricethe complete record under person
personpartialyes, the profile pricea 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 the full profile price. 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.03 on Free and Bronze, less on Silver and Goldonce per profile
Actor start$0.00005once per run
Team relationship analysisfree
Invalid input, profile not found, empty profile, vendor busyfree

Silver and Gold plans pay less per profile, automatically:

PlanPrice per profile
Free and Bronze$0.03
Silver$0.025
Gold$0.02

Platinum and Diamond plans pay the Gold price.

That is $30 per 1,000 profiles on Free and Bronze, $25 on Silver and $20 on Gold, plus $0.00005 for the run itself, so 1,000 profiles in one run on the Free or Bronze plan is $30.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.

You can try the Actor on the Apify free plan, which includes monthly platform usage credit and needs no credit card.

⏱️ How long does a run take?

A fresh profile takes about 8 to 11 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 1,740 seconds, so a fresh profile is never still running after 29 minutes: past that it comes back as an uncharged error item. A profile enriched in the last 90 days answers in under a second.

Both modes run five profiles at a time, so ten fresh profiles are two waves, about 16 to 22 minutes. In team mode 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. Schedule runs over a list of profiles, and set a webhook on run completion to pull the records into your CRM or warehouse.

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: about 8 to 11 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 profile price, 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

  • Both modes run five profiles at a time. Team mode takes 2 to 10 unique profiles, outside which the run fails without charging.
  • A fresh enrichment has a 1,740 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: once it is reached the Actor starts no further profile, and a profile still in progress at that moment is neither delivered nor charged.

🔗 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 update (2026-09-11) Lower prices with Silver and Gold discounts: $0.03 per profile on Free and Bronze, $0.025 on Silver, $0.02 on Gold, Platinum and Diamond. README: the status badge replaces the title line, a five-step how-to, a price table per plan and a note on the free plan.
  • 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.