LinkedIn People Search Scraper avatar

LinkedIn People Search Scraper

Pricing

from $15.00 / 1,000 matched profiles

Go to Apify Store
LinkedIn People Search Scraper

LinkedIn People Search Scraper

LinkedIn people search scraper with no login or cookies. Find profiles by job title, company and location. $0.015 per profile, charged only when the person's own headline confirms the title and their public profile confirms the current company. Other rows are free.

Pricing

from $15.00 / 1,000 matched profiles

Rating

0.0

(0)

Developer

Agnes Maina

Agnes Maina

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

a day ago

Last modified

Share

LinkedIn People Search Scraper: find profiles by job title and company, no login

Run on Apify

This LinkedIn people search scraper finds public LinkedIn profiles by job title, company and location, with no LinkedIn login and no cookies. You pay $0.015 per profile only when the person's own headline confirms the title and their public profile confirms the company as a current employer, plus $0.005 per run, and every other row is delivered free with the reason.

What you get

One row per person found. Every field below comes from the Actor's dataset schema.

  • fullName: name as shown on LinkedIn
  • headline: the person's own LinkedIn headline
  • location: location when Google shows it
  • profileUrl: public LinkedIn profile URL (null when Google hid the link and it could not be resolved)
  • isDecisionMaker: true for owner, partner, C level, VP or director
  • seniorityBand: owner, partner, cxo, vp, director, manager, senior, entry or unknown
  • department: function read from the headline, for example sales, finance or engineering
  • matchedTitle: the searched title the headline confirmed
  • matchedCompany: the searched company the headline names as current employer
  • verifiedEmployer: with strict match, the searched company the person's own profile data names as a current employer
  • profileEmployers: with strict match, every current employer the public profile lists
  • charged: true when this row was billed as a matched profile
  • reason: why the row was or was not billed
  • searchedTitles, searchedCompany, searchedLocation: the search that found the person
  • scrapedAt: when the row was collected, ISO 8601

Each run also writes a RUN_SUMMARY record to its key-value store.

What it does not return: email addresses, phone numbers, full work history, skills, education, private profiles, people Google does not index, or Sales Navigator data. Strict match checks the person's own public LinkedIn profile, not the employer, so several people can still list themselves as CTO of the same company.

Try it in 30 seconds

  1. Open the Actor page in the Apify Store and click Try for free.
  2. Paste the job titles you sell to or hire for, one per line, for example VP of Sales and Head of Sales.
  3. Paste the companies on your list, as names (Stripe) or LinkedIn company URLs (https://www.linkedin.com/company/stripe/).
  4. Click Start. When the run finishes, open the Profiles table or download JSON, CSV or Excel.

Every Apify account gets $5 of free platform credit each month, which covers the start fee plus more than 300 confirmed profiles at this price.

Why you only pay for confirmed matches

A Google search for CFOs at a company also returns finance analysts, former CFOs, assistants and people at other companies with a similar name. Most people search tools bill every one of those rows. This Actor reads each person's own headline and bills only the rows that prove the match. The rest are still delivered, free, with the reason.

[
{ "headline": "Chief Financial Officer, Asana", "matchedTitle": "CFO", "matchedCompany": "Asana", "charged": true, "reason": "title and current company confirmed in own headline" },
{ "headline": "Chief Financial Officer at Linear Controls", "matchedTitle": null, "charged": false, "reason": "current company not confirmed" },
{ "headline": "Executive Business Partner to CTO @ Vercel", "matchedTitle": null, "charged": false, "reason": "title not in own headline" },
{ "headline": "Head of Stock Administration at Asana", "matchedTitle": null, "charged": false, "reason": "title not in own headline" }
]

These are real headlines from a test run. A match needs the company in the employer spot for that title, as in "CFO at Stripe", "CFO | Stripe" or "Stripe CFO". So "CMO @ G2 || Advisor || Zoom" is not billed as Zoom's CMO, a name Google cut off with "..." is not trusted, and past or support roles such as "ex-Stripe", "Retired CFO" or "Assistant to the CFO" never count.

A headline can still say anything. With strict match (on by default) the Actor also opens the person's public profile before charging and bills only when the profile is readable and LinkedIn's own profile data lists a company you searched as a current employer. In a test run, four of six rows whose headline said "Chief Executive Officer at Stripe" or "at Asana" were days-old profiles that LinkedIn does not show publicly. Strict match delivers those free with the reason profile is not publicly readable, so the match is not verified.

Titles match their common forms, so a CFO search also finds "Chief Financial Officer", and a "VP of Sales" search also finds "Vice President, Sales" and "SVP of Sales".

How it works

job titles + companies + locations
|
v
Google search of public LinkedIn profiles
|
v
name, headline, location and profile URL for each person
|
v
charge bar: title and current company in the same part of the person's own headline
|
+--> not confirmed --> delivered free, with the reason
|
v
strict match: the public profile is readable and names the company as a current employer
|
+--> confirmed --> Matched profile (charged)
|
+--> not confirmed --> delivered free, with the reason

Example output

One full record from a real run.

{
"fullName": "Patrick Collison",
"headline": "Stripe CEO",
"location": "",
"profileUrl": "https://www.linkedin.com/in/patrickcollison/",
"isDecisionMaker": true,
"seniorityBand": "cxo",
"department": "executive",
"matchedTitle": "CEO",
"matchedCompany": "Stripe",
"verifiedEmployer": "Stripe",
"profileEmployers": ["Stripe", "Arc Institute"],
"charged": true,
"reason": "title in own headline, current employer confirmed on profile",
"searchedTitles": ["CEO", "CFO"],
"searchedCompany": "Stripe",
"searchedLocation": null,
"scrapedAt": "2026-09-23T22:44:25.660Z"
}

Pricing

Pay per event. No subscription, no monthly rental.

EventPriceYou pay when
Actor start$0.005once per run
Matched profile$0.015a person's own headline confirms a title you searched, and their public profile confirms the company you searched as a current employer
Any other row$0delivered with charged: false and a reason

Worked example: a run that returns 100 confirmed profiles costs 100 x $0.015 + $0.005 = $1.505. If the same run also delivered 60 rows that did not confirm, those 60 cost nothing. That is $15 per 1,000 matched profiles.

How this compares

Store data pulled on 2026-09-30 for the most used LinkedIn people search and profile search Actors. Prices are each Actor's current published pricing on the free plan.

ActorTotal usersPrice per resultLogin or cookies required?Charges for non-matching rows?Confirmation check
This Actor2$0.015 per confirmed profile + $0.005 per runNoNo, delivered free with a reasonTitle in own headline, current employer on public profile
harvestapi/linkedin-profile-search45,728$0.10 per search page of up to 25 short profiles; $0.004 per full profileNo ("No cookies or account required")Every page and profile returned is billednot stated
powerai/linkedin-peoples-search-scraper3,970$0.00999 per dataset item + $0.09 actor startnot statedEvery dataset item is billednot stated
memo23/linkedin-people-search2,530$0.006 per profile found + $0.005 actor startNo ("no login")Every profile returned is billednot stated

Per row, the others are cheaper. The difference is what a row means. If half of what a broad search returns is the wrong person, a $0.006 row is really $0.012 per right person, and you still have to filter the list yourself. Here the filter runs first and you pay only for rows that passed it.

Input

{
"titles": ["CFO", "VP of Finance"],
"companies": ["Asana", "https://www.linkedin.com/company/stripe/"],
"locations": ["United States"],
"maxResults": 200,
"strictMatch": true
}
FieldTypeDefaultDescription
titlesarrayrequiredJob titles to find, 1 to 30, for example VP of Sales or Head of Marketing
companiesarrayUp to 200 company names or LinkedIn company URLs. A URL is read by its URL name, so use it only when that name is the company name, as in linkedin.com/company/stripe. When set, the company must be the current employer for the title in the headline. Past employers and service providers do not count
locationsarrayUp to 20 cities, regions or countries to narrow the search, for example San Francisco or Germany
maxResultsinteger50Stop after this many profiles are delivered, matched or not, 1 to 2,000. Only matched profiles are charged
strictMatchbooleantrueOpen each headline-matched profile and charge only when it is public and lists a searched company as a current employer. Set false to charge on the headline alone

Use cases

  • Outbound lists. Take a target account list, find the VP of Sales and Head of Sales at each company, and send only the charged rows to your sequencer.
  • Recruiting. Find CTOs and VPs of Engineering at companies in one city, and skip the people whose headline says "ex-".
  • Account-based marketing. Map the CFO, CMO and Head of Operations at each named account before a campaign.
  • CRM enrichment. For each company in your CRM, look up one title and write back the matched profile URL and seniority band.
  • Investor research. Find the founders, CEOs and CFOs at a portfolio or a pipeline of companies.

Integrations

Apify API

This runs the Actor and returns the dataset in the same request.

curl -X POST \
"https://api.apify.com/v2/acts/agnes.developer.queen~linkedin-people-search-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "titles": ["CMO"], "companies": ["Figma"], "maxResults": 20 }'

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("agnes.developer.queen/linkedin-people-search-scraper").call(
run_input={"titles": ["VP of Sales"], "companies": ["Stripe"], "maxResults": 50}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
if row["charged"]:
print(row["fullName"], row["matchedTitle"], row["profileUrl"])

Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('agnes.developer.queen/linkedin-people-search-scraper').call({
titles: ['Head of Marketing'],
companies: ['HubSpot'],
maxResults: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((row) => row.charged));

Make, n8n and Zapier

Use the Apify app or node in Make, n8n or Zapier, pick "Run Actor", choose agnes.developer.queen/linkedin-people-search-scraper and map your titles and companies into the input. The same call works from Clay with an HTTP column. Apify webhooks can post to your workflow when a run finishes.

MCP server

The Apify MCP server lets AI assistants and MCP clients call this Actor as a tool:

https://mcp.apify.com/?tools=agnes.developer.queen/linkedin-people-search-scraper

Ask for the CFO and the VP of Finance at a list of companies. The assistant should read matchedTitle, matchedCompany and profileUrl, and skip rows where charged is false.

FAQ

The Actor reads public pages only: public Google results and public LinkedIn profiles. It never logs in and never touches data behind a login. You are responsible for how you use the data, including compliance with LinkedIn's terms of service and the privacy laws that apply in your jurisdiction, such as GDPR or CCPA. If you are unsure, ask a lawyer before you run outreach on the results.

Does it need my LinkedIn cookies or account?

No. There is no LinkedIn login and no cookies, so your own LinkedIn account is never at risk.

Why was a row not charged?

Its headline or public profile did not prove the match. The reason field says which part was missing: the title, the current company, a past or support role, or a profile LinkedIn does not show publicly. Free rows are still yours to use.

Is the match verified?

With strict match, yes against the person's own public profile: the Actor opens it and charges only when the profile is public and its employer data names the company you searched. It is not verified with the company itself, and division leaders can still list "CTO" at the parent company. With strictMatch false, the Actor bills on the headline alone.

How many profiles per run?

Up to 2,000, set with maxResults. That limit counts every delivered row, matched or not. How many confirmed profiles you get depends on how many people at each company show the title in their public headline. Large companies return more; small companies may return only a few.

Why is strict match slower?

Each headline-matched row costs one extra page fetch, about a second. Rows that miss the headline bar are not fetched.

Can I search by title only, without companies?

Yes. Leave companies empty. A row then bills when the person's own headline contains the title and, with strict match, the public profile is readable.

Can I schedule it?

Yes. Save your input as an Apify task and add a schedule, for example weekly, to catch people who changed jobs or updated their headline. Pair it with a webhook to push new rows to your CRM.

Does it return emails or phone numbers?

No. It returns the person's name, headline, location, seniority, department and LinkedIn URL. Use an email finder on the matched rows if you need contact details.

How much does a test run cost?

A run is $0.005 to start plus $0.015 for each confirmed profile. A 10-profile test with two confirmed matches costs $0.035, well inside the $5 free monthly credit.

Support

Found a bug or a wrong charge? Open an issue on the Issues tab of the Store page with the run ID. Docs and examples: github.com/agnesthedeveloper/linkedin-people-search-scraper.