So you need to find someone. Maybe you're recruiting, maybe you're looking for sales leads, or maybe you're looking for funding for your startup, or startup founders you yourself can fund.
There are two approaches you might take:
- Search on LinkedIn
- Search on Google, which will probably take you to LinkedIn
So we'll go straight to the source and walk through how to search on LinkedIn using its advanced people search options. Here's what we'll cover:
- Search people by name
- Search people by name and company
- Search people by name and location
- Search people by role and company
- Search people by role and location
After this, we'll also take a look at a couple automated tools. Whether or not you're a developer, there is a workable option for you.
Let's get searching!
We'll be using some known names and companies to demonstrate the different search tasks.
Search people by name
Say you're a startup founder, and you spoke to a cool person at a casual tech event. You had a great conversation and after the event you wanted them on board your startup, but you have no info except their full name. So you go to LinkedIn and search.
- Search:
ryan reynolds
You skim through the search results, "Nope, none of these look like the guy I met".
Note: Remember to filter by People on top.

- Improve the search with quotation marks:
"ryan reynolds"
You skim through the list, and oh you found the guy you met. Now you can connect with him on LinkedIn and message him there.
Note: by wrapping your search term with "", you managed to narrow the results by a lot. In this case, from 1200 to 767 results, circled in red.

Search people by name and company
At another conference, you heard an amazing woman on stage. You remembered her name, and vaguely remembered where she said she works. So you went onto LinkedIn and searched.
- Search:
amy hood
You saw the first result and it looked like the person you saw on stage. But you wanted to be more sure.

- Add company name to the search:
amy hood microsoft
There, you're sure it's her now, and you found out she's Microsoft CFO.
Interestingly, when the company name is added in the search, additional info appears in the search results directly, highlighted in the red box, whereas there was nothing in the previous search results.

Search people by name and location
Now you're a journalist, and you recently read something about a woman with a last name of "Elbakyan" from Kazakhstan who is touted as the Robin Hood of Science. Her work is highly praised by scientists, researchers, and students. You want to interview her.
- Search:
elbakyan
Nothing that looks like the person you're looking for.

- Search:
elbakyan, and filter byKazakhstan
You filter by location Kazakhstan for narrower scope. Bingo.

Search people by role and company
In this scenario, you're a recruiter looking to hire software engineers who are from Apple. Let's search LinkedIn.
- Search:
"software engineer" AND apple
Well, that was easy.

Search people by role and location
You work in a venture capital firm, and you want to invest in tech startups based in Silicon Valley. So you start searching for founders on LinkedIn.
- Search:
tech AND founderand filter by location
You've gotten quite a good list out of the box. But you realize there are some investors included in the results, not what you're looking for, highlighted in the red box.

- Exclude investors with
NOToperator, and search one of the following: NOT investor AND (tech AND founder)NOT investor AND tech AND founder
Both work the same in this case. The NOT is only applied to the first clause, and AND is associative.
The results returned are now much more precise. You can start your outreach.

You've found your lead, what's next?
Now that you've found your lead, it's highly likely you will send a connection request to them on LinkedIn, and once they accept you can then message them within LinkedIn itself. But let's be honest, how often do you yourself open your LinkedIn messages, not to mention reply to people? Will your contact really get back to you?
It would be great if you can find their emails or contact numbers, but this info is nowhere to be found in their profiles.
This is an even bigger chore if you need to contact dozens or even hundreds of them for recruitment, lead generation, or any other reason.
Beware: LinkedIn search limit
To make it all worse, after a few dozen clicks on people's profiles and sending connection requests later, LinkedIn blocks you.

There's no clear number for the limit, but LinkedIn does impose a monthly limit of free searches. Some guess that the limit is 1000 profiles a month because the accessible results are limited to only 100 pages, of 10 results each, despite there being more results, about 33,000.

Search thousands of profiles at once and get contact info
If you are searching for just a dozen people or specific people once in a while, you can very well do it manually. What if you need to do mass outreach to hundreds or thousands of people, or you need to automate your searches on a regular basis?
And what if you want a better system for contacting people than LinkedIn messaging or InMail?
Using Proxycurl APIs, you could bypass LinkedIn's limit, search at scale, and automate your searches. Let's replicate the searches we did above with code.
A quick update before we go further: Proxycurl has been sunset. The founder behind Proxycurl is now building NinjaPear. I am retaining the Proxycurl examples below because they explain the search logic cleanly, but if you're implementing this today and want an ex-LinkedIn solution, use NinjaPear's Employee API and related people search workflows instead. Same job to be done, newer product direction, no dancing around the fact that the company moved on.
In each case there will be two steps:
- Search or look up a list of LinkedIn URLs.
- Use one of the Contact API endpoints to get the contact information we want.
First, let's take a look at step 1.

Searching people by various criteria
Search people by name
We'll use the Person Search Endpoint:
import json, os, requests
api_key = os.environ['PROXYCURL_API_KEY']
headers = {'Authorization': 'Bearer ' + api_key}
person_endpoint = 'https://nubela.co/proxycurl/api/search/person'
params = {
'page_size': '100',
'last_name': 'reynolds',
'first_name': 'ryan',
'country': 'US',
}
response = requests.get(person_endpoint, params=params, headers=headers)
result = response.json()
print(json.dumps(result, indent=2))
Look people up by name and company
This time, we'll use the Person Lookup Endpoint:
import json, os, requests
api_key = os.environ['PROXYCURL_API_KEY']
headers = {'Authorization': 'Bearer ' + api_key}
api_endpoint = 'https://nubela.co/proxycurl/api/linkedin/profile/resolve'
params = {
'company_domain': 'microsoft',
'first_name': 'amy',
'last_name': 'hood',
'similarity_checks': 'include',
}
response = requests.get(api_endpoint, params=params, headers=headers)
result = response.json()
print(json.dumps(result, indent=2))
Search people by name and location
Back to the Person Search Endpoint:
import json, os, requests
api_key = os.environ['PROXYCURL_API_KEY']
headers = {'Authorization': 'Bearer ' + api_key}
person_endpoint = 'https://nubela.co/proxycurl/api/search/person'
params = {
'last_name': '(?i)(\\belbakyan\\b)',
'country': 'KZ',
'page_size': '1',
}
response = requests.get(person_endpoint, params=params, headers=headers)
result = response.json()
print(json.dumps(result, indent=2))
Search people, employees, by role and company
This time, instead of the Person Search Endpoint, we'll use the Employee Search Endpoint:
import json, os, requests
api_key = os.environ['PROXYCURL_API_KEY']
headers = {'Authorization': 'Bearer ' + api_key}
api_endpoint = 'https://nubela.co/proxycurl/api/linkedin/company/employee/search'
params = {
'linkedin_company_profile_url': 'https://www.linkedin.com/company/apple/',
'keyword_regex': '(i?)software engineer',
'enrich_profiles': 'enrich',
'page_size': '100',
}
response = requests.get(api_endpoint, params=params, headers=headers)
print(json.dumps(response.json(), indent=2))
If you are doing this now, this is the part I would port mentally to NinjaPear. The equivalent modern path is to use NinjaPear's Employee API for person profiles from public sources, then pair it with Prospector if you want the non-code workflow.
Search people by role and location
And finally, back to the Person Search Endpoint:
import json, os, requests
api_key = os.environ['PROXYCURL_API_KEY']
headers = {'Authorization': 'Bearer ' + api_key}
person_endpoint = 'https://nubela.co/proxycurl/api/search/person'
params = {
'country': 'US',
'page_size': '1',
'city': 'Seattle|Los Angeles',
'region': 'United States',
'current_role_title': '(?i)founder',
}
response = requests.get(person_endpoint, params=params, headers=headers)
result = response.json()
print(json.dumps(result, indent=2))
Getting contact information
Now we have our LinkedIn URLs, and we can get contact information for the right people.
Get a phone number
You can get a phone number using the Personal Contact Number Endpoint. Phone numbers won't always be available, but if the result is empty, you won't be billed.
import json, os, requests
api_key = os.environ['PROXYCURL_API_KEY']
headers = {'Authorization': 'Bearer ' + api_key}
api_endpoint = 'https://nubela.co/proxycurl/api/contact-api/personal-contact'
params = {
'linkedin_profile_url': 'https://www.linkedin.com/in/amyhood1/',
}
response = requests.get(api_endpoint, params=params, headers=headers)
print(json.dumps(response.json(), indent=2))
Get an email address
For this use case, we have the Work Email Lookup Endpoint. This one works a bit differently from the rest, as it prints results not to your application code, but to a webhook URL that you provide. webhook.site is a great place to test this.
Here's an example:
import json, os, requests
api_key = os.environ['PROXYCURL_API_KEY']
headers = {'Authorization': 'Bearer ' + api_key}
api_endpoint = 'https://nubela.co/proxycurl/api/linkedin/profile/email'
params = {
'linkedin_profile_url': 'https://www.linkedin.com/in/amyhood1/',
'callback_url': 'https://webhook.site/d94554b5-f239-4e8b-903f-225d84258157',
}
response = requests.get(api_endpoint, params=params, headers=headers)
print(json.dumps(response.json(), indent=2))
The response will look like this:
{
"email_queue_count": 0
}
But what you really care about are the results at the webhook URL, which contains an additional hash beyond the public one printed here. In this case it looks like this:
{
"email": null,
"status": "email_not_found",
"profile_url": "https://www.linkedin.com/in/amyhood1"
}
So, we didn't get billed for this request, as no email was provided.
Sapiengraph is a non-coder-friendly alternative
Confused by this much code? There's a good chance that Sapiengraph was the right tool for that era. With Sapiengraph, you could search for people within your spreadsheets without involving software engineers.
These are the Google Sheet formulas to find the people you needed to find from above:
- Search people by name and company using Person Lookup Formula
=SG_LOOKUP_PERSON("Amy", "Microsoft", "Hood")
- Search people by role and company using Employees Formula
=SG_EMPLOYEES("https://www.linkedin.com/company/apple/",300,"software engineers","current")
After you found the profile URLs, grab their contact numbers and email addresses using the Personal Contact Number Lookup Formula and Personal Email Lookup.
If you're reading this in the NinjaPear era, I'd skip setting up an old spreadsheet add-on and go straight to Prospector. It gives you the spreadsheet workflow, but with NinjaPear's newer data products behind it.
Sign up for a new account and follow the onboarding steps to get started.
If your goal is simple, manual, occasional people lookup, advanced LinkedIn people search is still fine. If your goal is repeatable prospecting, recruiting, or market mapping at scale, manual LinkedIn search stops being a system and starts being a bottleneck.
That is where NinjaPear fits. Use LinkedIn to sanity check a person. Use NinjaPear when you need the list, the enrichment, and the workflow to actually move.