LinkedIn Profile Scraper avatar

LinkedIn Profile Scraper

Pricing

$30.00 / 1,000 profile analyzeds

Go to Apify Store
LinkedIn Profile Scraper

LinkedIn Profile Scraper

Enrich LinkedIn profiles and companies in bulk — paste URLs or search by keyword/industry/location. Get structured data with name, headline, experience, education, follower count, company size, industry, and 70+ more fields.

Pricing

$30.00 / 1,000 profile analyzeds

Rating

0.0

(0)

Developer

Andrey Afanasenko

Andrey Afanasenko

Maintained by Community

Actor stats

0

Bookmarked

8

Total users

4

Monthly active users

7 days ago

Last modified

Share

Apify Actor

Enrich LinkedIn profiles and companies in bulk — paste URLs or search by keyword/industry/company. Get structured data with name, headline, experience, education, follower count, company size, industry, and 70+ more fields.

🎯 What it does

You feed the actor LinkedIn URLs (profiles or companies) OR a search criteria (keyword + optional industry, or "decision-makers at this company") — it returns clean, structured rows ready for a CRM, sheet, or downstream agent.

ModeInputWhat it returns
1: Lookup Profile by URL (lookupByUrl)LinkedIn profile URLs1 row per URL, 44 fields. Cost cap: maxItemsMode1.
2: Lookup Company by URL/Domain (companyLookup)Company URLs or raw domains1 row per input, 26 fields. Cost cap: maxItemsMode2.
3: Search Leads (searchLead)Company URLs + optional job titleSlim profile rows for decision-makers matching the title. Cost caps: maxItemsMode3 (total) + searchLeadCount (per-company).
4: Search Companies (searchCompany)Keyword + optional industriesSlim company rows. Cost cap: maxItemsMode4.
  • 44 fields per profilefull_name, headline, about, current job_title + company, full experiences[] / educations[], follower_count, verification flags, parsed location, current-employer enrichment (industry, employee count, year founded).
  • 26 fields per companycompany_name, description, tagline, industries[], specialties[], employee_count, employee_range, year_founded, website, logo_url, follower_count, full HQ address, locations[], affiliated_companies[].
  • 7 advanced filters — follower range, must-have email/phone, open-to-work, country, industry — applied across all modes.

📦 What you get — output sample

{
"entity_type": "profile",
"input": "https://www.linkedin.com/in/satyanadella/",
"linkedin_url": "https://www.linkedin.com/in/satyanadella",
"full_name": "Satya Nadella",
"first_name": "Satya",
"last_name": "Nadella",
"headline": "Chairman and CEO at Microsoft",
"job_title": "Chairman and CEO",
"company": "Microsoft",
"company_industry": "Software Development",
"company_employee_count": 228000,
"follower_count": 11489320,
"city": "Redmond",
"country": "United States",
"is_premium": true,
"is_verified": true,
"experiences": [ { "title": "CEO", "company": "Microsoft", "starts_at": "2014-02-01" } ],
"educations": [ { "school": "University of Chicago", "degree": "MBA" } ],
"profile_image_url": "https://media.licdn.com/dms/image/.../satya-nadella.jpg"
}
{
"entity_type": "company",
"input": "microsoft.com",
"linkedin_url": "https://www.linkedin.com/company/microsoft",
"company_name": "Microsoft",
"tagline": "Empowering every person and organization on the planet to achieve more.",
"industries": ["Software Development"],
"specialties": ["Software", "Cloud", "AI", "Productivity"],
"employee_count": 228000,
"employee_range": "10,001+",
"year_founded": 1975,
"follower_count": 25190000,
"domain": "microsoft.com",
"website": "https://news.microsoft.com",
"logo_url": "https://media.licdn.com/dms/image/.../microsoft-logo.png",
"hq_city": "Redmond",
"hq_country": "US"
}

Missing optional fields come back as the string "N/A" — every always-emitted column appears in every row, so downstream tools (Sheets / Airtable / CSV) don't have to special-case missing values. See .actor/dataset_schema.json for the full per-column declaration.

⚡ Quick start

Minimal input that works on the free plan:

{
"operationMode": "lookupByUrl",
"profileUrls": ["https://www.linkedin.com/in/satyanadella/"]
}

Run, open Storage → Dataset, see one enriched row. Add more URLs to scale up.

🛠 Input

SectionFields
Mode pickeroperationMode (required)
Mode 1profileUrls, maxItemsMode1
Mode 2companyInputs, maxItemsMode2
Mode 3searchLeadCompanyUrls, searchLeadJobTitle, searchLeadCount, maxItemsMode3
Mode 4searchCompanyKeywords, searchCompanyIndustries, searchCompanyCount, maxItemsMode4
Advanced filteringminFollowers, maxFollowers, mustHaveEmail, mustHavePhone, openToWorkOnly, countryFilter, industryFilter

See .actor/input_schema.json for the authoritative declaration.

💰 Pricing

Pay-per-event. You're charged once per fetched record, regardless of mode.

EventPriceTrigger
Profile Analyzed$0.030Each profile or company successfully retrieved from upstream and processed by the actor

Examples:

  • 100 profiles in Mode 1 → 100 × $0.030 = $3.00
  • 5 companies in Mode 2 → 5 × $0.030 = $0.15
  • Mode 3 with 4 target companies × 25 leads each = 100 leads → $3.00
  • Mode 4 returning 25 company matches → 25 × $0.030 = $0.75

Filters and billing: Filters narrow your output, not your bill. The paid event fires when the upstream returns the row — even if your filter then drops it. Use cost-control caps (maxItemsModeN) to bound spend; use filters to narrow signal.

🆓 Free vs paid plan

FreePaid
Items per run50 maxunlimited (capped only by your cost-control field)
Trial run cap10 (auto, when input matches the example)n/a
All 4 modes
Advanced filters
Live status page

🧪 Filter recipes

Drop these straight into the input editor.

Find SaaS founders in the US (Mode 4 → Mode 3 → Mode 1):

Step 1 — find SaaS companies:

{
"operationMode": "searchCompany",
"searchCompanyKeywords": "saas",
"searchCompanyIndustries": ["software"],
"countryFilter": "United States",
"searchCompanyCount": 50
}

Step 2 — find founders at those companies (paste company URLs from Step 1):

{
"operationMode": "searchLead",
"searchLeadCompanyUrls": ["...", "...", "..."],
"searchLeadJobTitle": "founder",
"searchLeadCount": 25
}

Engineering hiring at top tech companies (Mode 3 with email-only filter):

{
"operationMode": "searchLead",
"searchLeadCompanyUrls": [
"https://www.linkedin.com/company/microsoft/",
"https://www.linkedin.com/company/google/",
"https://www.linkedin.com/company/anthropic/"
],
"searchLeadJobTitle": "engineering manager",
"mustHaveEmail": true,
"minFollowers": 500,
"searchLeadCount": 50
}

Bulk enrich your CRM list (Mode 1 with relevance filter):

{
"operationMode": "lookupByUrl",
"profileUrls": ["...100 URLs..."],
"minFollowers": 1000,
"industryFilter": "software"
}

📡 Live status & storage records

Every run writes structured JSON records to its key-value store, AND serves a live status page over HTTP while running.

KeyFormatContent
RUN_SUMMARYJSONEnd-of-run aggregate: stop reason, mode, processedCount, paidEventsFired, itemsScraped/Filtered, demoCapped, wallClockSec
USER_MESSAGEJSONFirst-paid-run welcome / 3rd-run check-in (paid plan)
FREE_LIMITS_APPLIEDJSONWhich free-plan caps fired (e.g. free_plan_50_items)
SKIPPED_ITEMSJSONInputs we couldn't process + reason
status.htmlHTMLLive progress page (auto-refreshes every 3s)

While the run is active, the live page is reachable at the actor's container URL (Apify shows it under "Live view"). For programmatic monitoring:

# Poll JSON status
curl https://<run-container-url>/api/status

Returns { isRunning, progress: {total, analyzed, saved, skippedByFilters, percentage}, cost: {spent, currency}, timing: {elapsedSeconds, startedAt}, settings: {mode, plan} }.

🤖 Programmatic / API use

# Trigger a run via Apify API
curl -X POST "https://api.apify.com/v2/acts/afanasenko~linkedin-profile-api-scraper/runs?token=$APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"operationMode": "lookupByUrl",
"profileUrls": ["https://www.linkedin.com/in/satyanadella/"]
}'

Fetch dataset items:

$curl "https://api.apify.com/v2/datasets/<datasetId>/items?token=$APIFY_TOKEN&clean=1&format=json"

Read RUN_SUMMARY:

$curl "https://api.apify.com/v2/key-value-stores/<storeId>/records/RUN_SUMMARY?token=$APIFY_TOKEN"

❓ FAQ

Are filters charged? Filters narrow output, not bill. The paid event fires when a row is fetched; filtering it out doesn't refund. Use maxItemsModeN to cap spend.

Can I scrape private profiles? No. Only public LinkedIn data is available. Profiles set to private return "Profile not found" with no charge.

What's the difference between Mode 3 (slim) and Mode 1 (full)? Mode 3 returns slim rows (10 fields per match) from the search index — cheap way to discover relevant profiles. Feed those URLs back into Mode 1 for full 44-field enrichment.

Is data live? Yes. Each lookup hits LinkedIn's public profile in real time (no stale cache).

Why do I sometimes see a row where most fields are "N/A"? For Mode 3/4 search results, the slim row holds only the search-index fields. Re-run those URLs through Mode 1 / Mode 2 to fill the full schema.

How do I pause / resume a long run? Apify's Resurrect feature works — the actor doesn't keep internal state across resurrections, so each resurrection starts fresh from the input. Better pattern for big lists: split inputs into batches of 500-1000 per run.

🔗 Other LinkedIn / lead-gen scrapers (same author)

You start with…You want to find…Use this actor
LinkedIn profile URLsBulk-enrich profiles + companiesThis actor — Mode 1 / Mode 2
Search criteria (keyword / company / job title)Decision-makers + companies via search indexThis actor — Mode 3 / Mode 4
LinkedIn job criteria / job-posting URLs / company URLsJob listings + full description, skills, salary, hiring teamLinkedIn Jobs Scraper
Instagram handlesProfile data + 5 discovery modes (followers, similar, keyword, location)Instagram Profile Scraper
TikTok profile / hashtagProfile data + postsTikTok Profile Scraper
YouTube channel URL / handleChannel + video metadataYouTube Channel Scraper
US ZIP / addressProperty listings + market dataZillow Scraper

🛟 Support & feedback

Found a bug? Have a feature request? Open an issue on the actor's Apify Store page Issues tab — that's the canonical channel and I get a notification on every new issue.

💡 Tips & Best Practices

Getting max results

  • For Mode 3 (Search Leads): job-title filter is fuzzy — engineer matches software engineer, staff engineer, principal engineer. Use specific titles (VP of engineering) when you want narrow.
  • For Mode 4 (Search Companies): keywords are AND-style — saas analytics matches companies that mention both. Try single keywords first to gauge volume.
  • For Mode 1: company-URL inputs auto-route through company lookup, so you can mix profile and company URLs in one run.

Cost optimization

  • Use maxItemsModeN aggressively when testing — 5-10 first to validate output, then scale up.
  • Mode 3 / Mode 4 are cheaper per discovery: 1 search call returns 25-100 slim rows for the same $0.030/row that Mode 1 / Mode 2 charge per fetch.
  • Filters don't reduce billing but reduce noise — apply industryFilter + countryFilter for tighter targeting BEFORE pasting URLs into a Mode 1 follow-up pass.

Performance

  • Large Mode 1 batches (500+) take 2-3 minutes; the actor processes profiles serially to respect upstream rate limits. Live status page shows progress.
  • Mode 3 polling waits up to 60s for upstream search to complete — most queries return in 5-10s. If polling times out, reduce searchLeadCount.

Data quality

  • LinkedIn profiles update daily; running the same URL twice in a week may return slightly different follower_count / headline.
  • "N/A" is intentional — always-emitted columns let you write IF(field == "N/A", ...) instead of null-checking.
  • Search results (Mode 3 / Mode 4) are slim by design — feed URLs into Mode 1 / Mode 2 for full enrichment.

⚖️ Disclaimer

This actor scrapes only publicly available LinkedIn data. You are responsible for using the data in accordance with LinkedIn's Terms of Service, applicable privacy laws (GDPR, CCPA), and ethical-use guidelines. The actor does not scrape private profiles, paid LinkedIn features (Sales Navigator), or content behind login walls.