LinkedIn Skills Scraper | No Cookies | from $2.996/1k avatar

LinkedIn Skills Scraper | No Cookies | from $2.996/1k

Pricing

from $3.00 / 1,000 profile founds

Go to Apify Store
LinkedIn Skills Scraper | No Cookies | from $2.996/1k

LinkedIn Skills Scraper | No Cookies | from $2.996/1k

LinkedIn skills scraper: give profile URLs, get education and work experience as clean arrays, plus skills when the profile lists them, with name, headline, title and company. No login or cookies. Pay per profile, misses free. Does not search people; use people-search. Free plan: 100 per run.

Pricing

from $3.00 / 1,000 profile founds

Rating

0.0

(0)

Developer

Open Enrich

Open Enrich

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

20 hours ago

Last modified

Share

Pay per result: $3.963/1k on the Free plan down to $2.996/1k on Gold. Free Apify plan: up to 100 per run, as many runs as your credit covers. Misses and notices are free.

This LinkedIn skills scraper returns education and work experience for the profiles on your list, plus skills when a profile lists them. Paste profile links and get one row per person: name, headline, current title and company, plus clean skills, education and experience arrays. In our small test (2026-10-13, 7 profiles returned) 3 listed skills, 6 listed education and all 7 listed experience. No LinkedIn account, no cookies, no ban risk. Export JSON or CSV, or call it from the API and MCP.

No login | Profile URL, short URL or bare slug | Skills (when listed) + education + experience arrays | Up to 1,000 profiles per run | JSON/CSV export

Not a scraper of linkedin.com. The actor never opens a LinkedIn page. Each row is read from a profile database by the profile address you supply. Not affiliated with LinkedIn.

See all actors by b2bdata


💳 Pricing and plans

Pay per result, see the Pricing tab. Normal Apify platform usage applies.

EventWhen it is chargedFree plan, per 1,000Gold plan, per 1,000
profileOne profile found with at least one of the lists you asked for, delivered as a row$3.963$3.052

On the Free plan the $5 monthly credit covers about 1,260 profiles. Bronze and Silver are in between ($3.646 and $3.369 per 1,000); Platinum and Diamond match Gold. Higher Apify plans only lower the price. There is no start fee.

Success-only billing

  • A profile that is not found is free.
  • A profile that exists but has none of the lists you asked for is free (listed in MISSES).
  • A failed lookup is free.
  • An input that is not a LinkedIn profile link is skipped and is free.
  • Empty runs and notices are free.

The free plan

Free Apify accounts get up to 100 inputs looked up per run, and as many runs as their Apify credit covers. Nothing is stored on our side. When a list is longer, the first 100 are looked up and one free notice row (reason: "free_plan_limit") says how many inputs were not looked up. Paid Apify plans have no per-run limit.

Keep a run small while you test

Set limit to 1 or 5, or set a spend cap in maxChargeUsd. The run stops as soon as the cap is reached.

⚖️ This vs. the alternatives

Public Store prices checked on 2026-10-13. Re-check before you decide: prices and field lists change.

ActorEventPrice per profile
This actor (Free plan / Gold plan)profile$0.003963 / $0.003052
b2bdata/linkedin-profile-by-urlprofile (flat row, no lists)from $0.003663
harvestapi/linkedin-profile-scraperprofile (flat, no plan tiers)$0.004
atomus/linkedin-profile-scraperprofile-enriched$0.006

Field count, measured on 2026-10-13 on three public profiles (non-empty top-level fields per row; empty values, zeros and false flags not counted): harvestapi/linkedin-profile-scraper returned 32, 33 and 35. This actor with include: ["all"] returned 46, 46 and 54. Three profiles is a small test, not a statistic.

⚡ Why this LinkedIn skills scraper?

  • Three lists in one row. skills, education and experience come back as arrays you can filter, not as one blob of text.
  • You pay only when the lists have content. A row is charged when at least one list you asked for (include) has content. Ask for skills only and a profile that lists no skills costs nothing. Ask for all three (the default) and a profile with education or experience but no skills is still charged.
  • Counts for filtering. skillsCount, educationCount and experienceCount sit next to the arrays, so a spreadsheet filter works without opening them.
  • Same input as the flat actor. Need only the cheap flat row (name, title, company)? Use b2bdata/linkedin-profile-by-url instead.

➕ What you can add

Beyond the three default lists, include takes opt-in sections. They are returned only when you request them and the profile has them; empty ones are left out. They are never charged separately: the price stays one profile event, decided only by skills, education and experience.

  • about: the About text.

  • certifications, languages, honors (honors and awards), projects, publications, patents, interests, articles, groups: arrays of entries with the fields the profile has.

  • recommendations: array of recommendation texts.

  • profileDetails: industry, followersCount, profileImageUrl, backgroundImageUrl. The image URLs expire, so download the images soon after the run if you need them.

  • volunteer (as volunteerExperience), organizations, courses, testScores: arrays of entries.

  • location: city, state, stateFullName, countryFullName, countryIso3.

  • links: githubUrl, twitterUrl, facebookUrl, websiteUrl (URLs only; the LinkedIn link is already profileUrl).

  • currentJob: currentCompanyLinkedinId, currentCompanyLogoUrl (expiring URL), currentJobStartDate, currentJobDescription, currentJobLocation, currentEmploymentType, currentJobFunction, currentSeniority, jobTitleNormalized.

  • analytics: seniorityLevel, isDecisionMaker, averageTenureYears, certificationsCount, languagesCount, companiesCount, highestDegree (first education entry), and the booleans hasWorkEmail, hasPersonalEmail, hasPhone. The addresses and numbers themselves are never returned.

  • network: relatedProfiles (up to 10 of url, name, headline, location), similarNames, activities.

  • quality: dataQualityPublicExperienceAvailable, sectionsIncluded.

  • all: every section and group above.

Example: { "items": ["https://www.linkedin.com/in/satyanadella"], "include": ["skills", "education", "experience", "about", "certifications", "profileDetails"] }

Entry shapes for these sections are passed through as found; we have only checked a few of them on a small number of profiles, so treat the field names inside certifications, languages, honors, publications, patents, interests and groups as best-effort.

🎯 Use cases for an education scraper

  • Recruiting shortlists. Turn candidate links into a table of schools, degrees and skills.
  • Skills matching. Check which people on a list list a given skill, with a filter on skills.
  • CRM enrichment. Add education and work history to contacts you already hold.
  • Research. Study career paths and schooling across a group of public profiles.

🔗 Pipeline guide: from a name to a deep profile

[1] linkedin-person-search / linkedin-people-search -> profile links
[2] linkedin-skills-scraper (this actor) -> skills, education, experience
[3] email-phone-finder -> work email and phone

🚀 Quick start

1. One profile, all lists

{ "items": ["https://www.linkedin.com/in/satyanadella"], "limit": 1 }

2. A list in mixed formats, skills only

{ "items": ["https://www.linkedin.com/in/satyanadella", "linkedin.com/in/jeffweiner08", "reidhoffman"], "include": ["skills"] }

3. A bigger batch with a spend cap and audit view

{ "items": ["…up to 1000 links…"], "limit": 0, "maxChargeUsd": 5, "includeAudit": true }

⚙️ Inputs

KeyTypeDefaultNotes
itemsstring[]requiredProfile URL, linkedin.com/in/slug or bare slug. Duplicates collapse. At most 1,000 per run; more is rejected and nothing is charged.
limitinteger25Max rows pushed. 0 = all items. Above 1,000 is rejected, not clamped.
includestring[]skills, education, experienceAny of skills, education, experience plus the opt-in extras about, certifications, languages, honors, projects, publications, patents, recommendations, interests, articles, groups, profileDetails, volunteer, organizations, courses, testScores, and the groups location, links, currentJob, analytics, network, quality. all returns everything.
includeAuditbooleanfalseAdds audit (requestId, unitsCharged, latencyMs, inputRaw, inputCanonical).
maxChargeUsdnumber0Hidden. Stops the run when this much has been charged. 0 = no cap.
sourceTagstringnoneHidden. Copied onto every row and the run summary.

Unknown fields are rejected with a message ("remove unsupported fields: x") so a typo never returns unrelated results.

📤 Output: LinkedIn education history and skills

Example row (keys as returned in our 2026-10-13 test runs; values are illustrative; skills appears only when the profile lists skills):

{
"profileUrl": "https://www.linkedin.com/in/example-person",
"slug": "example-person",
"fullName": "Example Person",
"headline": "CTO at Example Corp",
"jobTitle": "CTO",
"seniority": "cxo",
"company": "Example Corp",
"location": "Berlin, Germany",
"country": "DE",
"startYear": 2020,
"tenureYears": 5,
"totalExperienceYears": 14,
"connections": 500,
"updatedAt": "2026-10-13T09:00:00.000Z",
"skillsCount": 2,
"skills": ["Distributed Systems", "Go"],
"educationCount": 1,
"education": [{ "school": "Example University", "startYear": 2006, "endYear": 2010 }],
"experienceCount": 1,
"experience": [{ "title": "CTO", "company": "Example Corp", "startDate": "2020-03", "current": true, "location": "Berlin, Germany" }],
"sourceTag": "my-campaign",
"inputQuery": "https://www.linkedin.com/in/example-person",
"scrapedAt": "2026-10-13T10:00:00.000Z"
}
KeyTypeNotes
profileUrlstringCanonical profile link.
slugstringProfile slug.
fullNamestringFull name.
firstNamestringFirst name.
lastNamestringLast name.
headlinestringProfile headline.
jobTitlestringCurrent job title.
companystringCurrent company.
senioritystringcxo, vp, director, manager, founder or other.
departmentstringConditional: only when the profile has a job function.
locationstringFree-text location.
countrystringISO-2 country code.
startYearnumberStart year of the current role.
tenureYearsnumberYears in the current role.
totalExperienceYearsnumberTotal years of experience.
connectionsnumberConnections count (LinkedIn caps it at 500).
updatedAtstringWhen the source record was last updated.
skillsCountintegerNumber of skills; shown when skills is requested, 0 when the profile lists none.
skillsstring[]Skill names. Present only when the profile lists skills.
educationCountintegerNumber of education entries; shown when education is requested.
educationobject[]school, startYear, endYear; degree, fieldOfStudy, grade, activities and description only when the profile has them.
experienceCountintegerNumber of jobs; shown when experience is requested.
experienceobject[]title, company, startDate, current, location; endDate, employmentType and description only when present.
aboutstringOnly when requested and present.
certifications, languages, honors, projects, publications, patents, interests, articles, groupsobject[] or string[]Only when requested and present.
recommendationsstring[]Only when requested and present.
industry, followersCount, profileImageUrl, backgroundImageUrlstring / integerOnly with profileDetails, when present. Image URLs expire.
volunteerExperience, organizations, courses, testScoresobject[]Only when requested and present.
city, state, stateFullName, countryFullName, countryIso3stringOnly with location, when present.
githubUrl, twitterUrl, facebookUrl, websiteUrlstringOnly with links, when present.
currentCompanyLinkedinId, currentCompanyLogoUrl, currentJobStartDate, currentJobDescription, currentJobLocation, jobTitleNormalizedstringOnly with currentJob, when present. The logo URL expires.
currentEmploymentType, currentJobFunction, currentSenioritystring[]Only with currentJob, when present.
seniorityLevel, highestDegreestringOnly with analytics, when present.
isDecisionMaker, hasWorkEmail, hasPersonalEmail, hasPhonebooleanOnly with analytics. They say whether the source has the data; no address or number is returned.
averageTenureYears, certificationsCount, languagesCount, companiesCountnumberOnly with analytics.
relatedProfiles, similarNames, activitiesobject[] / string[]Only with network, when present.
dataQualityPublicExperienceAvailable, sectionsIncludedboolean / string[]Only with quality.
sourceTagstringEcho of your sourceTag input, when set.
inputQuerystringThe line you supplied.
scrapedAtstringISO time the row was produced.
auditobjectOnly with includeAudit.

Fields with no value are left out of the row. Fields you might see only when present: department, skills, degree, fieldOfStudy, grade, activities, employmentType.

Other records in the run: a free_plan_limit notice row on the free plan when a list is longer than 100 (type: "notice", never charged), the key-value records MISSES, RUN_SUMMARY and errors-linkedin-skills-scraper.

What is NOT returned

🛡️ Reliable results

If a record is outdated, a person has moved or a list is wrong, report it in the Issues tab with the run link. Every report is reviewed and resolved case by case.

Not every person lists skills or schools. In our small test (2026-10-13, 7 profiles returned, so treat it as a rough guide) 3 listed skills, 6 listed education and all 7 listed experience. A profile with none of the lists you asked for is not charged and appears in MISSES with the reason no_requested_sections.

🤖 For AI agents (MCP)

Run through the Apify MCP server. Prompt to copy:

"Use b2bdata/linkedin-skills-scraper with items=["https://www.linkedin.com/in/satyanadella"] and limit=5 and return fullName, skills and education."

  • Input contract: items required; everything else optional. limit: 1 returns one row for a well-known profile.
  • Output contract: one dataset row per found profile; same input twice gives the same rows.
  • Cost per call: one profile event per delivered row. Nothing for misses, errors or notices.
  • Chaining: feed the links from linkedin-person-search; pass results to email-phone-finder.

🔌 Integrations: send results anywhere

Fetch results over the Apify API, add a webhook on run success, or connect through n8n, Make, Zapier, Google Sheets, Clay (HTTP API), Airtable, HubSpot or Salesforce. Map skills to a multi-select and education to a text or JSON field.

🕐 Schedule examples

  • Weekly refresh of a candidate list: schedule the run every Monday with the same items.
  • Monthly CRM top-up: schedule a run with maxChargeUsd set to your monthly budget.
  • b2bdata/linkedin-profile-by-url — the cheap flat row (name, title, company, tenure) when you do not need the lists.
  • b2bdata/linkedin-person-search — find the profile link from a name.
  • b2bdata/linkedin-people-search — find people by title, company and location.
  • b2bdata/email-phone-finder — add a work email and phone to the people you found.

❓ FAQ

How do I scrape LinkedIn skills from profile URL links? Paste the profile links in items and set include to ["skills"]. Each charged row has a skills array of names; profiles that list no skills are skipped and not charged.

Can I get a LinkedIn skills list from profile URL links without logging in? Yes. No account or cookies are needed and nothing is opened on linkedin.com.

Can I get skills and education from LinkedIn profile without login? Yes. Leave include empty to get skills, education and experience in one row, with no account and no cookies.

How do I extract LinkedIn education history bulk, up to 1,000 links? Put the links in items. Each row has an education array with school, degree, field and years. Export as CSV from the dataset.

How do I run a LinkedIn profile education and skills export to a spreadsheet? Export the dataset as CSV or JSON, or send it to Google Sheets, Airtable or Clay. Use skillsCount and educationCount for filters.

Do I pay when a profile has no skills? It depends on include. With include set to ["skills"], a profile without skills is not charged. With the default (skills, education and experience), a profile is charged when any one of the three has content, so a profile with education but no skills is charged.

🛟 Support

Use the Issues tab for questions, wrong data or feature requests. We answer within 48 h.

See CHANGELOG.md for changes.

This actor is not affiliated with, endorsed by, or sponsored by LinkedIn. LinkedIn is a trademark of its owner.