LinkedIn Profile Scraper With Company Enrichment avatar

LinkedIn Profile Scraper With Company Enrichment

Pricing

Pay per usage

Go to Apify Store
LinkedIn Profile Scraper With Company Enrichment

LinkedIn Profile Scraper With Company Enrichment

LinkedIn Profile Scraper extracts data from any public LinkedIn profile. Capture names, titles, experience, education, skills, contact info, and activity details. Ideal for recruitment, lead generation, research, and workflows needing structured professional profile data.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

API Empire

API Empire

Maintained by Community

Actor stats

0

Bookmarked

49

Total users

9

Monthly active users

8 days ago

Last modified

Share

LinkedIn Profile Scraper — Extract Profiles, Leads & Company Data

LinkedIn Profile Scraper With Company Enrichment turns a list of public LinkedIn profile URLs into three outputs per run: the full profile, a flat sales-ready lead block, and firmographics for the person's current employer — industry, size, website, headquarters, founding year. No login, no cookies. Every response comes back as typed, normalized JSON — no HTML, no selectors, no parsing step before it reaches a CRM or an LLM prompt. After reading this, you'll know which fields you get and how to filter them to the leads you want.

What is LinkedIn Profile Scraper With Company Enrichment?

LinkedIn Profile Scraper With Company Enrichment is an Apify Actor that scrapes public LinkedIn profile pages — no LinkedIn account, login, or cookies required — and layers two enrichment features on top: current-employer firmographic lookup and a flat, CRM-ready lead block with a rule-based seniority classification. It is built for firmographic enrichment, not contact scraping — LinkedIn does not expose email or phone numbers to logged-out visitors, so this Actor never returns or fabricates them.

  • Scrape full public profiles: name, headline, location, followers, connections, about, experience, education, projects, recommendations, activity, and articles
  • Enrich each profile's current employer with company firmographics (industry, size, employee count, website, HQ, founding year)
  • Build a flat leadProfile block with derived seniority and a parsed connections count
  • Filter results by seniority, industry, location, or presence of a current employer
  • Export results as JSON, CSV, or Excel directly from the Apify dataset — no proxy management required

What data does LinkedIn Profile Scraper With Company Enrichment collect?

The Actor returns three distinct data blocks per profile — the base profile, a flat lead block, and (optionally) employer firmographics:

Data TypeKey FieldsJSON Field Names
Profile dataname, location, followers, connections, about, experience, educationname, location, followers, connections, about, experience, education
Lead profile (flat block)current title, current company, seniority level, connections countleadProfile.currentTitle, leadProfile.currentCompany, leadProfile.seniorityLevel, leadProfile.connectionsCount
Company enrichment (firmographics)industry, company size, employee count, website, headquarters, foundedcompanyEnrichment.industry, companyEnrichment.companySize, companyEnrichment.employeeCount, companyEnrichment.website, companyEnrichment.headquarters, companyEnrichment.founded
Profile sub-sectionsprojects, recommendations, similar profilesprojects, recommendations, similarProfiles

Need more LinkedIn data?

If you need the reverse workflow — starting from a company instead of a person — LinkedIn Company Employees Scraper pulls employee lists directly from a company page or search keywords. If you need contact-level detail beyond firmographics, LinkedIn B2B Emails Scraper: Key Decision Maker Contacts finds and scores decision-makers with extracted emails via SERP search. Both are separate Actors built for the steps upstream and downstream of this one.

How does LinkedIn Profile Scraper differ from the official LinkedIn API?

LinkedIn's official APIs (Marketing, Talent, and partner-scoped developer products) require an approved partnership application before any call can be made, and even then they expose only the data tied to your own authenticated scope — not arbitrary public profiles or arbitrary companies' firmographics. LinkedIn Profile Scraper With Company Enrichment works directly against public profile and company pages, with no approval process.

FeatureLinkedIn's Official APILinkedIn Profile Scraper
Access modelPartner-approval application requiredProvide public profile URLs, no approval
Scope of accessible profilesLimited to your authenticated member/partner scopeAny public /in/ profile page
Company firmographicsNot exposed for arbitrary companies without partnershipParsed directly from the public company page
Setup timeApplication and review process before first callRun with a list of URLs
Entity coverageLimited to the specific approved product (Marketing, Talent, etc.)Profile + lead block + company enrichment in one run
Output consistencyVaries by partner program and product versionStable, typed JSON schema

If you already hold an approved LinkedIn partner integration for your specific use case, the official API is the compliant, supported path. If you need enrichment on arbitrary public profiles and companies without going through partner approval, this Actor is the practical option.

Why do developers and teams scrape LinkedIn?

For sales and business development teams

Sales teams use this Actor to enrich a raw list of prospect profile URLs with firmographics before outreach — pulling companyEnrichment.industry, companyEnrichment.companySize, and companyEnrichment.employeeCount to prioritize accounts that match an ideal customer profile. The leadProfile.seniorityLevel field combined with the bySeniority filter lets a rep drop a 500-URL prospect list down to only VPs and Directors before it ever reaches a CRM, so the enrichment and qualification step happens once, upstream of the outreach sequence, instead of being repeated manually for every individual lead a rep looks at.

For recruiters and talent sourcing teams

Recruiters feed candidate profile URLs in and get back experience, education, and the derived leadProfile.currentTitle and seniorityLevel alongside the candidate's current employer's industry and companySize — useful for gauging whether a candidate's professional background and current company match a target hiring profile before a sourcer ever reaches out. The requireCurrentCompany filter drops profiles with no detectable current employer, such as students or people between roles, keeping a sourcing list focused on candidates who are presently employed and reachable through a known company today.

For revenue operations and account research

RevOps teams and market analysts use companyEnrichment to build a firmographic picture of who works where across an entire account list — headquarters, founded, and companySize feed account-scoring models directly, without running a separate company-lookup tool afterward or reconciling two different datasets by hand. Because company pages are de-duplicated and cached across a single run through maxCompanyFetches, the same employer isn't re-fetched for every individual employee found on a shared account list, which keeps a large batch of related profiles efficient to enrich in a single pass.

For AI engineers and agent builders

Because every field comes back as typed JSON — leadProfile, companyEnrichment, and the raw experience/education arrays — it can be passed directly into an LLM prompt or an agent tool call without a scraping or HTML-parsing step anywhere in the loop. An agent building a lead-qualification pipeline can call this Actor, read leadProfile.seniorityLevel and companyEnrichment.industry straight out of the JSON response, and route the record to the next tool call or into a vector store for later retrieval-augmented generation lookups.

How to scrape LinkedIn (step by step)

  1. Open LinkedIn Profile Scraper With Company Enrichment on its Apify Store listing — no LinkedIn account is required to run it.
  2. Provide input — paste one or more public LinkedIn profile URLs into profileUrls, one per line (vanity /in/handle or URN /in/ACoAA… links both work).
  3. Configure enrichment and filters — toggle companyEnrichment and includeLeadProfile, and set bySeniority, byIndustry, locationContains, or requireCurrentCompany to narrow the result set.
  4. Start the run — the Actor allocates a proxy (RESIDENTIAL recommended for LinkedIn) and fetches each profile with automatic retries and fallbacks.
  5. Download results as JSON, CSV, or Excel from the Apify dataset, or pull them via the API.

What to do when LinkedIn changes its structure

The Actor is actively maintained, and the output schema stays stable — field names and types don't change on your end even when LinkedIn's page markup does. If a page-structure change breaks extraction for a section, that section falls back to null/empty rather than breaking the whole row or the run.

⬇️ Input

All 17 parameters are optional — none are required to start a run.

ParameterRequiredTypeDescriptionExample Value
profileUrlsNoarrayPublic LinkedIn profile links to enrich (vanity or URN URLs), one per line.["https://www.linkedin.com/in/williamhgates/"]
companyEnrichmentNobooleanAdds a companyEnrichment block resolved from the employer's public company page. Default true.true
maxCompanyFetchesNointegerCap on distinct company pages fetched per run; dedupe means repeats are free. 0 = unlimited. Default 0.25
includeLeadProfileNobooleanAdds a flat leadProfile block with CRM-ready fields and derived seniority. Default true.true
bySeniorityNoarrayKeep only profiles whose derived seniority matches (substring match). Empty = keep all.["VP", "Director"]
byIndustryNoarrayKeep only profiles whose enriched company industry contains one of these terms. Requires companyEnrichment on.["software"]
requireCurrentCompanyNobooleanDrop profiles with no detectable current employer. Default false.false
locationContainsNoarrayKeep only profiles whose location contains one of these terms.["United States"]
includeSimilarProfilesNobooleanInclude the "People also viewed" similar-profiles list. Default true.true
includeProjectsNobooleanInclude the Projects section. Default true.true
includeRecommendationsNobooleanInclude written recommendations from other members. Default true.true
scrapingApiUrlTemplateNostringOptional 3rd-party scraping-API URL template with a literal {url} placeholder, used if direct fetch and proxy attempts fail."https://api.scraperapi.com/?api_key=YOUR_KEY&url={url}"
useWaybackSnapshotNobooleanIf LinkedIn blocks and no scraping API succeeds, look up an existing Wayback Machine snapshot. Default true.true
useWaybackSavePageNowNobooleanIf no snapshot exists, trigger Wayback Save Page Now to create one (slow, rate-limited). Default true.true
maxRetriesNointegerMax direct-fetch attempts per page before falling back (min 1, max 15). Default 5.5
requestTimeoutSecsNointegerPer-request timeout in seconds (min 5, max 180). Default 30.30
proxyConfigurationNoobjectApify Proxy (RESIDENTIAL recommended for LinkedIn) or custom proxy URLs.{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}

Example JSON input

{
"profileUrls": [
"https://www.linkedin.com/in/williamhgates/"
],
"companyEnrichment": true,
"maxCompanyFetches": 25,
"includeLeadProfile": true,
"bySeniority": [],
"byIndustry": [],
"requireCurrentCompany": false,
"locationContains": [],
"includeSimilarProfiles": true,
"includeProjects": true,
"includeRecommendations": true,
"scrapingApiUrlTemplate": "",
"useWaybackSnapshot": true,
"useWaybackSavePageNow": true,
"maxRetries": 5,
"requestTimeoutSecs": 30,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

The most common input mistake is setting byIndustry without leaving companyEnrichment on — the industry filter reads from companyEnrichment.industry, so with enrichment off every profile is dropped rather than filtered.

⬆️ Output

Results are pushed to the Apify dataset as typed, normalized JSON — one row per profile — and can be exported as JSON, CSV, or Excel. The Actor returns three structurally distinct blocks per row: the base profile, the flat lead block, and (when enabled) company firmographics.

Scraped profile data

{
"success": true,
"partial": false,
"name": "Jane Doe",
"image": "https://media.licdn.com/dms/image/.../profile-displayphoto/...",
"location": "Boston, Massachusetts",
"followers": 9000,
"connections": "500+ connections",
"about": "VP of Engineering building robotics platforms for logistics.",
"recentPosts": [],
"experience": [
{
"@type": "Organization",
"name": "Acme Robotics",
"url": "https://www.linkedin.com/company/acme/",
"location": "Boston, Massachusetts",
"member": { "@type": "OrganizationRole", "description": "VP of Engineering" }
}
],
"articles": [],
"activity": [],
"education": [
{
"@type": "EducationalOrganization",
"name": "Massachusetts Institute of Technology",
"url": "https://www.linkedin.com/school/mit/",
"member": { "@type": "OrganizationRole", "startDate": "2005", "endDate": "2009" }
}
],
"publications": [],
"projects": [],
"recommendations": [],
"similarProfiles": [],
"scrapedAt": "2026-07-25T12:00:00Z"
}

Lead profile (flat CRM block)

{
"currentTitle": "VP of Engineering",
"currentCompany": "Acme Robotics",
"companyUrl": "https://www.linkedin.com/company/acme/",
"location": "Boston, Massachusetts",
"seniorityLevel": "VP",
"connectionsCount": 500,
"followersCount": 9000
}

Company enrichment (firmographics)

{
"companyName": "Acme Robotics",
"companyUrl": "https://www.linkedin.com/company/acme/",
"industry": "Robotics Engineering",
"companySize": "501-1,000 employees",
"employeeCountMin": 501,
"employeeCountMax": 1000,
"employeeCount": 842,
"website": "https://www.acmerobotics.com",
"headquarters": {
"city": "Boston",
"state": "Massachusetts",
"country": "US",
"postalCode": null,
"street": null
},
"founded": 2009,
"specialties": ["Robotics", "Automation", "AI"],
"companyLogo": "https://media.licdn.com/dms/image/.../company-logo_400_400/...",
"companyDescription": "Robotics and automation platforms for logistics operations.",
"companyFollowerCount": 12345,
"success": true
}

Any field that is genuinely unavailable is returned as null — never a faked value. Email and phone are intentionally never present, since LinkedIn does not expose them to logged-out requests.

How many results can you scrape with LinkedIn Profile Scraper With Company Enrichment?

There is no hard cap on the number of profile URLs you can list in profileUrls — the input schema does not restrict array length. Because the input is a fixed URL list rather than a search query, there's no pagination to configure; every URL you provide is processed. Company page fetches are separately capped by maxCompanyFetches (0 = unlimited), and repeated employers within the same run are de-duplicated so they don't count twice against that cap. Profiles are processed one at a time within a run rather than in parallel, so a very large URL list takes proportionally longer than a small one — there is no published benchmark for run duration, since it depends on proxy conditions and how many fallbacks (Wayback, custom scraping API) get triggered along the way.

Integrate LinkedIn Profile Scraper With Company Enrichment and automate your workflow

LinkedIn Profile Scraper With Company Enrichment works with any language or tool that can send an HTTP request.

REST API integration

import requests
TOKEN = "YOUR_APIFY_TOKEN"
ACTOR = "PUBLISHER_USERNAME~linkedin-profile-scraper-with-company-enrichment" # from the Actor's store URL
url = f"https://api.apify.com/v2/acts/{ACTOR}/run-sync-get-dataset-items?token={TOKEN}"
payload = {"profileUrls": ["https://www.linkedin.com/in/williamhgates/"]}
resp = requests.post(url, json=payload, timeout=180)
resp.raise_for_status()
for row in resp.json():
print(row["name"], row.get("leadProfile", {}).get("seniorityLevel"))

Works in Python, Node.js, Go, Ruby, cURL.

MCP for AI agents

The Actor is reachable through Apify's hosted MCP server. Add it to an MCP-compatible client (Claude, Cursor, and others) by registering https://mcp.apify.com and selecting this Actor via its tools query parameter (e.g. ?tools=PUBLISHER_USERNAME/linkedin-profile-scraper-with-company-enrichment, using the publisher username from the Actor's store URL), or run it locally with npx -y @apify/actors-mcp-server and an APIFY_TOKEN.

Automation platforms (n8n, Make)

In Make, the official Apify app's "Run an Actor" module can trigger a run with your profileUrls list, and "Get Dataset Items" pulls the enriched rows into the rest of the scenario — for example, writing leadProfile fields straight into a Google Sheet or CRM module. In n8n, the officially verified Apify node runs the Actor and retrieves the resulting dataset items as part of a larger workflow, such as feeding companyEnrichment fields into a lead-scoring step.

Scraping publicly accessible LinkedIn profile and company pages is generally legal; LinkedIn Profile Scraper With Company Enrichment only returns data that is visible on a public page without logging in — it never accesses private, login-gated, or authwall content. Because profile data (name, title, employer, connections) is personal data, storing or using it, especially in bulk and for commercial purposes, can fall under GDPR (if you handle EU residents' data) or CCPA (for California residents), which govern lawful basis, retention, and downstream use rather than the act of scraping itself. Consult legal counsel for commercial use cases involving bulk personal data.

Frequently asked questions

Does LinkedIn Profile Scraper With Company Enrichment work without a LinkedIn account?

Yes. It fetches public profile and company pages directly, with no login, session cookies, or LinkedIn account required.

How often is the scraped data updated?

Each run performs a live fetch of the profile and company pages at request time — nothing is served from a stale internal cache. The one exception is the Wayback Machine fallback path: if a direct or proxied fetch is blocked, the Actor can fall back to an archived snapshot, which reflects the page as it existed when that snapshot was captured, not the current moment.

What happens if a profile has been deleted, made private, or returns no usable data?

The Actor logs the failure reason and moves on without creating a dataset row for that URL, so you are not charged for profiles it cannot retrieve. If a page loads but only partial sections parse (for example, JSON-LD is missing but OpenGraph tags are present), the row is still saved with partial: true and the unavailable sections left empty.

Can I scrape private or restricted LinkedIn profiles?

No. Only publicly accessible profile and company pages are returned. Profiles behind LinkedIn's authwall, or company pages that fail to resolve publicly, come back empty or are skipped — the Actor never attempts to log in or bypass an authwall.

Does LinkedIn Profile Scraper With Company Enrichment work for AI agent workflows and LLM pipelines?

Yes. It's callable as an HTTP endpoint by any agent framework, and it's reachable through Apify's hosted MCP server for MCP-compatible clients. Every response is typed JSON — leadProfile and companyEnrichment blocks included — so there's no parsing step before passing a record to an LLM.

How does LinkedIn Profile Scraper With Company Enrichment handle LinkedIn's anti-bot system?

It rotates desktop user agents per request, retries with exponential backoff and jitter, and automatically escalates to a RESIDENTIAL Apify Proxy session when it detects a block (HTTP 999 and similar) or an authwall redirect. If every direct and proxied attempt still fails, it can fall back to a user-supplied 3rd-party scraping API template, then to Wayback Machine snapshots.

Does LinkedIn Profile Scraper With Company Enrichment return data in a format LLMs can use directly?

Yes. Output is typed, normalized JSON with stable field names — no HTML, no selectors, no parsing. Pass a row directly into an LLM context window, index it into a vector store, or route it through an agent tool call.

Can I use LinkedIn Profile Scraper With Company Enrichment without managing proxies?

Yes. By default it uses Apify Proxy with the RESIDENTIAL group, and automatically activates residential fallback if the initial proxy configuration is blocked — you don't need to source or rotate proxies yourself.

What happens when LinkedIn changes its structure or blocks the scraper?

The Actor is maintained, and its output schema stays stable — field names and types don't change on your end. When a specific page section stops parsing, that section degrades to null/empty in the row rather than failing the whole run.

Your feedback

Found a bug, a field that's missing, or a page layout this Actor doesn't handle well? We want to know. Reach out through the Actor's Issues tab on the Apify Store listing or the API-Empire support channel so it can be fixed in a future version.