LinkedIn Profile Scraper With Company Enrichment
Pricing
Pay per usage
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
Maintained by CommunityActor stats
0
Bookmarked
49
Total users
9
Monthly active users
8 days ago
Last modified
Categories
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
leadProfileblock 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 Type | Key Fields | JSON Field Names |
|---|---|---|
| Profile data | name, location, followers, connections, about, experience, education | name, location, followers, connections, about, experience, education |
| Lead profile (flat block) | current title, current company, seniority level, connections count | leadProfile.currentTitle, leadProfile.currentCompany, leadProfile.seniorityLevel, leadProfile.connectionsCount |
| Company enrichment (firmographics) | industry, company size, employee count, website, headquarters, founded | companyEnrichment.industry, companyEnrichment.companySize, companyEnrichment.employeeCount, companyEnrichment.website, companyEnrichment.headquarters, companyEnrichment.founded |
| Profile sub-sections | projects, recommendations, similar profiles | projects, 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.
| Feature | LinkedIn's Official API | LinkedIn Profile Scraper |
|---|---|---|
| Access model | Partner-approval application required | Provide public profile URLs, no approval |
| Scope of accessible profiles | Limited to your authenticated member/partner scope | Any public /in/ profile page |
| Company firmographics | Not exposed for arbitrary companies without partnership | Parsed directly from the public company page |
| Setup time | Application and review process before first call | Run with a list of URLs |
| Entity coverage | Limited to the specific approved product (Marketing, Talent, etc.) | Profile + lead block + company enrichment in one run |
| Output consistency | Varies by partner program and product version | Stable, 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)
- Open LinkedIn Profile Scraper With Company Enrichment on its Apify Store listing — no LinkedIn account is required to run it.
- Provide input — paste one or more public LinkedIn profile URLs into
profileUrls, one per line (vanity/in/handleor URN/in/ACoAA…links both work). - Configure enrichment and filters — toggle
companyEnrichmentandincludeLeadProfile, and setbySeniority,byIndustry,locationContains, orrequireCurrentCompanyto narrow the result set. - Start the run — the Actor allocates a proxy (RESIDENTIAL recommended for LinkedIn) and fetches each profile with automatic retries and fallbacks.
- 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.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
profileUrls | No | array | Public LinkedIn profile links to enrich (vanity or URN URLs), one per line. | ["https://www.linkedin.com/in/williamhgates/"] |
companyEnrichment | No | boolean | Adds a companyEnrichment block resolved from the employer's public company page. Default true. | true |
maxCompanyFetches | No | integer | Cap on distinct company pages fetched per run; dedupe means repeats are free. 0 = unlimited. Default 0. | 25 |
includeLeadProfile | No | boolean | Adds a flat leadProfile block with CRM-ready fields and derived seniority. Default true. | true |
bySeniority | No | array | Keep only profiles whose derived seniority matches (substring match). Empty = keep all. | ["VP", "Director"] |
byIndustry | No | array | Keep only profiles whose enriched company industry contains one of these terms. Requires companyEnrichment on. | ["software"] |
requireCurrentCompany | No | boolean | Drop profiles with no detectable current employer. Default false. | false |
locationContains | No | array | Keep only profiles whose location contains one of these terms. | ["United States"] |
includeSimilarProfiles | No | boolean | Include the "People also viewed" similar-profiles list. Default true. | true |
includeProjects | No | boolean | Include the Projects section. Default true. | true |
includeRecommendations | No | boolean | Include written recommendations from other members. Default true. | true |
scrapingApiUrlTemplate | No | string | Optional 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}" |
useWaybackSnapshot | No | boolean | If LinkedIn blocks and no scraping API succeeds, look up an existing Wayback Machine snapshot. Default true. | true |
useWaybackSavePageNow | No | boolean | If no snapshot exists, trigger Wayback Save Page Now to create one (slow, rate-limited). Default true. | true |
maxRetries | No | integer | Max direct-fetch attempts per page before falling back (min 1, max 15). Default 5. | 5 |
requestTimeoutSecs | No | integer | Per-request timeout in seconds (min 5, max 180). Default 30. | 30 |
proxyConfiguration | No | object | Apify 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 requestsTOKEN = "YOUR_APIFY_TOKEN"ACTOR = "PUBLISHER_USERNAME~linkedin-profile-scraper-with-company-enrichment" # from the Actor's store URLurl = 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.
Is it legal to scrape LinkedIn?
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.