LinkedIn Profile Scraper with Public Contacts
Pricing
from $10.00 / 1,000 results
LinkedIn Profile Scraper with Public Contacts
Extract structured public LinkedIn profile data, including names, headlines, work history, education, follower counts, websites, and contact matches from About, headlines, work descriptions, and email links. Matches include source context; ownership and deliverability are not verified.
Pricing
from $10.00 / 1,000 results
Rating
0.0
(0)
Developer
Rush
Maintained by CommunityActor stats
1
Bookmarked
57
Total users
7
Monthly active users
13 days ago
Last modified
Categories
Share
Turn public LinkedIn profile URLs into structured profile records. Results can include names, headlines, work experience, education, follower counts, websites, and contact matches found in supported public profile fields.
Contact matches include their source and nearby context. They are not verified for ownership, consent, recency, or deliverability.
What you get
Each usable profile link the run reaches produces one result row with a clear retrieval status. A run that stops early, shortly before its time limit or at your spending limit, lists the profiles it did not reach in its run summary.
| Field | Description |
|---|---|
firstName, lastName, fullName | Name shown on the profile. First and last name take the first word as the first name and leave out credentials after a comma (“Jane Doe, MBA”, “Jane Doe, REALTOR®” and “Jane Doe, Realtor” give Jane, Doe); a credential after the last name without a comma, written in capitals or a common degree such as PhD, leaves only the last name empty (“Jane Doe MBA” gives Jane); both stay empty when the first name would be a guess, for example for “Smith, John”, “Smith Jr”, “Dr Jane Doe”, “Jane Doe (she/her)”, a name with a business word such as “Realty” or “LLC”, Realtor without a comma (“Jane Doe Realtor”, “Jane Doe REALTOR®”), or a Chinese, Japanese or Korean name; a business name without such a word can be read as a person’s name |
headline, about | Profile headline and About text when available |
location, city, country | Returned location, a confidently separated city, and a two-letter country code when identifiable |
profilePictureUrl | Profile photo URL when identified; generic platform artwork is excluded |
linkedinBadge | Creator or Top Voice label when returned; this is not identity verification |
followerCount, connectionCount | Counts from the returned profile; compact follower labels are normalized to numbers, while non-exact connection labels such as 500+ remain empty |
experiences[] | Returned roles with organization, dates, location, description, and employment-status evidence |
experiencesTruncated | true when the returned content indicates that more work history may exist |
currentCompany, currentTitle, currentCompanyLinkedinUrl | Current role when explicitly identified; otherwise the most recently listed role. When job titles are not public, only the company the profile shows is filled |
educations[] | Returned schools, degrees, fields of study, and dates |
emails[], phones[] | Contact matches with source and context |
email, phone | First contact match for convenient export |
websites[] | Unique website and email links present in supported profile content |
inputUrl, linkedinUrl, publicIdentifier, urn | Input and profile identifiers |
extractionWarnings | Readable notes when the public profile was incomplete; empty when nothing was missing |
succeeded, error, extractedAt | Retrieval status, failure reason when applicable, and output time |
Reading employment status
isCurrent is evidence-based:
isCurrent: truemeans the role was explicitly marked as current.isCurrent: falsewith anendedOnvalue means an end date was shown.isCurrent: falsewithendedOn: nullmeans no current marker or end date was available. It does not prove that the role has ended.
When a profile shows less in public
Many LinkedIn members show only part of their profile to visitors who are not signed in. The row keeps everything that was visible, says what was missing in extractionWarnings, and sets experiencesTruncated to true when the work history may be incomplete:
| Note | What it means |
|---|---|
this profile shows its full work history only to signed-in LinkedIn members | Job titles and dates are hidden; the name, location, current company, schools and a shortened About usually remain |
the About text was shortened in the public view | The About text ends where the public profile cuts it |
this is a limited public view — most fields may be empty | Very little of the profile is public |
LinkedIn returned a shortened public view — work history was not included | The public page came back without the roles, their titles and dates |
work history was not present in the returned public content | The public page had no work history section: the member may list none, or the view hides it |
education was not present in the returned public content | The public page had no education section: the member may list none, or the view hides it |
Sample output
This example is the actor's output for a public profile captured on 2026-09-30, trimmed for length: the real row lists every visible role and school (5 roles and 3 schools here), and every role carries all of its keys, including location, durationMonths and description (null when LinkedIn shows none). Public values can change after capture.
Input:
{"profileUrls": ["https://www.linkedin.com/in/satyanadella"]}
Output:
{"inputUrl": "https://www.linkedin.com/in/satyanadella","linkedinUrl": "https://www.linkedin.com/in/satyanadella","publicIdentifier": "satyanadella","urn": "urn:li:member:19186432","succeeded": true,"error": null,"extractionWarnings": [],"firstName": "Satya","lastName": "Nadella","fullName": "Satya Nadella","headline": "Chairman and CEO at Microsoft","about": "As chairman and CEO of Microsoft, I define my mission and that of my company as empowering every person and every organization on the planet to achieve more.","location": "Redmond, Washington, United States","city": "Redmond","country": "US","linkedinBadge": "Creator, Top Voice","followerCount": 12194326,"connectionCount": null,"experiences": [{"title": "Chairman and CEO","company": "Microsoft","companyLinkedinUrl": "https://www.linkedin.com/company/microsoft","location": "Greater Seattle Area","startedOn": "2014-02","endedOn": null,"isCurrent": true},{"title": "Board Member","company": "Starbucks","companyLinkedinUrl": "https://www.linkedin.com/company/starbucks","startedOn": "2017","endedOn": "2024","isCurrent": false}],"experiencesTruncated": false,"currentCompany": "Microsoft","currentTitle": "Chairman and CEO","educations": [{"school": "Manipal Institute of Technology, Manipal","degree": "Bachelor’s Degree","field": "Electrical Engineering","startedOn": null,"endedOn": null},{"school": "University of Wisconsin-Milwaukee","degree": "Master’s Degree","field": "Computer Science","startedOn": null,"endedOn": null}],"websites": ["https://snscratchpad.com/"],"emails": [],"email": null,"phones": [],"phone": null}
The saved profile produced no email or phone match. The actor does not infer contacts when supported fields contain none.
An email match includes reviewable evidence:
{"email": "jane.doe@acme.test","source": "about","sourceContext": "…Reach me at jane.doe@acme.test for introductions…","isObfuscated": false}
The address above is fictional and shows the layout only: addresses on reserved test domains, such as .test and example.com, are never returned.
Run summary
A run that ends on its own also saves a short summary: one that finishes its list, stops early before its time limit or at your spending or result limit, or fails because no profile could be extracted. Open it from the run's Output tab (Run summary), or read the key-value store record OUTPUT. Illustrative values:
{"complete": false,"stoppedBy": ["timeLimit"],"entries": 4,"profiles": 3,"extracted": 1,"couldNotBeRetrieved": 0,"notStarted": 2,"notStartedUrls": ["https://www.linkedin.com/in/profile-handle-2","https://www.linkedin.com/in/profile-handle-3"],"skipped": 1,"skippedEntries": [{ "position": 4, "entry": "https://www.linkedin.com/company/example" }]}
completeisfalsewhen some profile links have no result row;notStartedUrlslists them in list order, as entered (without surrounding spaces; of equivalent links, the first one entered).stoppedBysays why they were not started, and is empty when the run is complete. For a Succeeded run,timeLimitmeans resurrect the run to continue with them;resultOrSpendingLimitmeans start a new run with just the links innotStartedUrlsand a higher limit, not the whole list again. When both appear, start a new run with just those links, a higher limit and a longer timeout. After a run that failed because no profile could be extracted, follow its status message instead.skippedEntrieslists each entry that was not a usable profile link, with its position in your list (a repeated entry once, at its first position). Skipped entries never get a row, socompletespeaks for the usable links only.entriescounts the entries in your list, repeats included:entries=profiles+skipped+ the repeated and equivalent links that were merged into them.- If you start runs from code or an integration: when the run Succeeded, read the summary rather than counting rows. When
stoppedByis just["timeLimit"], resurrect the run and act on nothing else yet: the resurrected run's summary repeats the skipped entries and the counts. Otherwise the run's work has ended: act onstoppedBy, and once per run, correct and resend anyskippedEntriesand retry the rows withsucceeded: falseyou want to try again. Repeated links are processed once and skipped entries have no row, so a complete run can have fewer rows than your list has entries. A Succeeded run always has its own summary; if one cannot be saved, the run ends Failed and says so. - A profile that could not be retrieved counts as done: it has a result row, like an extracted profile, with
succeeded: falseand the reason inerror, and a resurrect does not try it again. To try some again, start a new run later with just those links, once the run's work has ended; each try adds a new result row. The status message that ends the run's work says so, once, and names a new run with just the corrected entries for any that were skipped; a message that advises a resurrect leaves this to the message after it. - When a run Failed or was Aborted, follow its status message. When it says "Resurrect this run", a resurrect continues where the run stopped: a resurrected run checks which profiles already have a result row and does not start them again. After a stop because profiles could not be retrieved, resurrect later rather than at once: a resurrect right away may stop the same way, and each resurrect counts as a new run start. When it says "start a new run", do that, with the change or the links it names (a message never says both): when the cause is in your list or the run's limits (for example, when no entry is a profile link or the limits do not cover a single profile), a resurrect would end the same way. When the message says neither (for example, the run ran out of memory, or was aborted without time to stop itself), resurrect it: a resurrect does not start a profile that already has a result row.
- A run that fails because no profile could be extracted also saves a summary: start a new run later with just the links that could not be retrieved, plus any in
notStartedUrls. A resurrect does not try again a link that already has a row. - A run stopped by the time limit itself (Timed out) has no closing message, and a summary it holds is not one to act on (the time limit can land just after a summary is saved): resurrect it later to continue.
Input
Provide public LinkedIn profile URLs, up to 1,000 per run:
{"profileUrls": ["https://www.linkedin.com/in/williamhgates","https://www.linkedin.com/in/satyanadella"]}
- Standard and country-prefixed links (for example
br.linkedin.com) are accepted, as are links to a profile's sub-pages such as/details/experience/. Tracking parameters and trailing slashes are cleaned automatically, and equivalent links to the same profile are processed once. - An entry that is not a public profile link is skipped and named by its position in your list, in the run log and in the run's final status message (whether the run finishes or stops early). The run stops only when no entry can be used.
- Sales Navigator links, links that contain a LinkedIn member ID, private profile access, and non-profile LinkedIn URLs are not supported.
Contact and completeness notes
Email matches can come from the returned About text, headline, work descriptions, or email links. Phone matches can come from the returned About text, headline, or work descriptions. The actor does not generate addresses from name-and-domain patterns or use third-party contact databases.
A phone number written with its country code (such as +1) is returned in international format (+14155552671), and rawText keeps it as written. One written without it is returned only when a word such as Phone, Mobile or Tel marks it and the profile shows a country; numbers with no such word are left out, because order, invoice and ID numbers look the same. The country code is then taken from the profile's country, and rawText keeps the number exactly as it was written. An address or number cut off where the public view shortens the About text is left out rather than returned incomplete. An email address is returned only when it stands apart from the text around it (one written straight after a Chinese, Japanese, Korean or Thai word still counts): one joined to a word with no space (such as Founder|jane@… or email=jane@…), one that is part of a link (such as https://name@site%E2%80%A6) and a social handle written with two @ signs (such as @jane@mastodon.social) are left out rather than returned in part.
A successful row means the returned profile identity matched the requested URL. It does not guarantee that every field was publicly available. Check experiencesTruncated and extractionWarnings before treating a result as complete.
The actor does not return skills, languages, certifications, publications, recommendations, projects, identity-verification status, or company-page details such as industry and company size.
FAQ
Why is email or phone empty?
No contact detail was found in the parts of the profile that are returned. The most common reason is the public view: when the row's notes say the About text was shortened, contact details in the hidden part are not available, and one cut off at the end is left out rather than returned incomplete. A phone number written without its country code also needs a word such as Phone or Mobile next to it (see the contact notes above). An empty field does not prove that the person has no public contact details elsewhere.
Why are job titles empty for many profiles?
Many members show their work history only to signed-in LinkedIn members. The actor returns what is public — usually the name, location, current company, schools and a shortened About — and says so in extractionWarnings.
Why are some profile fields empty?
Visible fields vary across public profiles. When the public profile was incomplete, the row says so in experiencesTruncated and extractionWarnings.
Why was one of my entries skipped?
It was not a public LinkedIn profile link — for example a company page, a Sales Navigator link, a link with extra text or punctuation around it (such as a period at the end of a sentence), or text that is not a link. The run log names it by its position in your list and repeats what was entered, with invisible characters copied along with the link shown as spaces; the final status message gives the position. When more than five entries are skipped, the first five are named and the rest are counted. Correct the entry and start a new run with only the corrected entries: running the whole list again would extract, and charge, the profiles already done a second time. Once the run needs no resurrect, its status message says the same; when the run stopped before starting any profile and says to start a new run, it asks you to correct the entry in your list first.
What happens when a run gets close to its time limit?
About two minutes before the run's time limit (halfway through, for a timeout under four minutes), the actor stops starting new profiles and lets the ones in progress finish. The final status message says how many profiles were not started, and the run summary lists them; they are not requested and add no results. To continue with them, resurrect the run: it starts only those profiles and adds their rows to the same dataset, after the rows already saved. If the run also stopped at your result or spending limit, the status message says to start a new run with just those links and a higher limit instead. If you import the dataset again, take only the rows whose inputUrl you have not imported yet. Each resurrect has the run's full time limit again and counts as a new run start; a long list can need more than one. For a long list, you can also raise the run's timeout before you start. With a timeout of only a few minutes, a profile that is slow to load can still be cut off by the time limit.
Does isCurrent: false always mean a past role?
No. Treat it as a confirmed past role only when endedOn contains a date. If endedOn is also empty, the status is unknown.
Responsible use
You are responsible for complying with applicable terms of service, data-protection laws, contractual obligations, and the rules of your jurisdiction. Review contact evidence and confirm that your intended use is lawful and appropriate.
Public profile availability and visible fields can vary by profile, request, location, and time. LinkedIn is a registered trademark of LinkedIn Corporation. This actor is not affiliated with, endorsed by, or sponsored by LinkedIn.
More actors by futurizerush
Browse the catalogue: apify.com/futurizerush
LinkedIn Profile Scraper, LinkedIn Profile Data, LinkedIn Email Extractor, Public Contact Info, Lead Generation, LinkedIn Profile Dataset, Public Profile Data, B2B Sales Data, Recruiter Tool, Claude Code, OpenClaw, Gemini, Antigravity, Codex, ChatGPT