The Definitive Guide to Executive Searches: Automatically Find Qualified Candidates

Finding skilled employees at the C-suite level or similar is no easy feat; which is exactly why it's an incredibly lucrative problem to solve for executive search firms.

How lucrative?

Well, Korn Ferry, the world's biggest executive search firm reported an annual revenue of nearly 3 billion U.S. dollars in 2022. The other 4 largest executive-search firms (collectively known as SHREK) Spencer Stuart, Egon Zehnder, Russell Reynolds Associates, and Heidrick & Struggles all respectively post hundreds of millions of dollars in revenue yearly.

There's plenty of money to go around in the executive search industry, even by carving out a measly 1% of the market share.

Companies don't mind exchanging serious money with executive search firms in return for a qualified leader, because they know well it takes serious time and resources to find qualified candidates -- that's the reason they're outsourcing in the first place!

So, as an executive search (or HR tech) firm, to compete in 2023 and beyond and gain a real edge over your competition, you need to have the best processes; which includes automating most of the work for you.

To be specific, that requires:

  • Having a rich B2B dataset that contains millions of profiles of people and companies.
  • Having an easy-to-use medium like an API (application programming interface) to pull that data.
  • Being able to automate the majority of the candidate search process, so that you just need to worry about screening and closing the deal.

How is all of that possible?

I'm glad you asked.

First, you start with your B2B dataset

Sourcing candidates, particularly at the executive level, is all about finding a needle in a haystack.

That means everything must first start with rich, recent, and accurate B2B data.

You'll need a couple of data points, too:

  • Current job position
  • Past job position
  • Name
  • Company
  • Work/personal email
  • Phone number

That being said:

The number one source of B2B data in 2023 is singlehandedly LinkedIn. Most professionals keep their LinkedIn profile up to date, and publicly available.

The problem is LinkedIn doesn't exactly like to share its B2B data with companies like HR Tech companies. They know their data is valuable and charge a hefty premium for it. They also don't really give out API access.

LinkedIn offers Sales Navigator as a premium paid product, but it's pretty limited. It only allows you 2,500 results per search query.

It's also limited to just one LinkedIn profile, so you would need to license the entire team. Not ideal. The number one B2B data source doesn't like to give out its data.

Now that we've established LinkedIn makes it difficult to obtain B2B data at scale, it's time to present the solution to that problem...

Proxycurl API: Pull rich data about people and companies

Scraping LinkedIn is one of the many things we do here at Proxycurl.

(See: How To Bypass LinkedIn Search Limits in 2023)

It's not fun and it requires quite a sophisticated setup when it comes to crawlers, servers, IPs, accounts, and more.

Rather than investing time, energy, and money into building a web scraping or data scientist team, you can use our API to have access to millions of different executive-level people profiles instantly.

Today we'll primarily be using our Person Search Endpoint - which allows you to search for millions of LinkedIn profiles with various filtering parameters.

The Person Search Endpoint is powered by LinkDB, our LinkedIn dataset of 472,880,151 public LinkedIn profiles.

What kind of data points can you search for with Proxycurl?

Quite a few, in quite a few different ways.

You could search for things like:

  • C-suite executives
  • Senior sales roles
  • Senior marketing managers

But you could also search for something like:

  • Chief technical officer
  • Worked for PayPal
  • More than 10 years of experience

With our Person Search Endpoint, let me show you how:

Using our API to find candidates by job role

Let's say we're looking for a former software developer who has payment processing experience because our client is looking for a senior software developer to join their payment processing business.

If we load up PyCharm and use the following Python script:

import json, requests

headers = {'Authorization': 'Bearer ' + 'Your_API_Key_Here'}
api_endpoint = 'https://nubela.co/proxycurl/api/search/person/'
params = {
    'country': 'US',
    'past_company_linkedin_profile_url': 'https://www.linkedin.com/company/stripe',
    'enrich_profiles': 'enrich',
    'page_size': '10',
}
response = requests.get(api_endpoint, params=params, headers=headers)
result = response.json()
print(json.dumps(result, indent=2))

We receive a total_result_count of 3,203 candidates returned. These are all US-based individuals who have had the official Stripe LinkedIn company profile listed as a past source of employment.

However, these are not software developers. So let's narrow this down:

Filtering with previous job roles

import json, requests

headers = {'Authorization': 'Bearer ' + 'Your_API_Key_Here'}
api_endpoint = 'https://nubela.co/proxycurl/api/search/person/'
params = {
    'country': 'US',
    'past_company_linkedin_profile_url': 'https://www.linkedin.com/company/stripe',
    'enrich_profiles': 'enrich',
    'page_size': '10',
    'past_role_title':'(?i)software developer',
}
response = requests.get(api_endpoint, params=params, headers=headers)
result = response.json()
print(json.dumps(result, indent=2))

I received back 3 results, all being past Stripe software developers:

One of those prospects, as shown above, worked specifically on Radar, Stripe's fraud prevention mechanism.

It only took us 30 seconds and a bit of Python to find our first high-quality candidate with our API

Not bad.

By the way, if you're interested in why that account was returned despite using the past_role_title parameter, even though he's currently employed at Stripe, it's because he said he originally quit in August 2021.

This time, let's find people who previously worked for a company like Stripe:

Filtering by job start date

If we add current_role_before 2019-20-30, we would see a candidate like this returned:

Changing the job role title can return different results

Now let's remove current_role_before and alter past_role_title as follows:

import json, requests

headers = {'Authorization': 'Bearer ' + 'Your_API_Key_Here'}
api_endpoint = 'https://nubela.co/proxycurl/api/search/person/'
params = {
    'country': 'US',
    'past_company_linkedin_profile_url': 'https://www.linkedin.com/company/stripe',
    'enrich_profiles': 'enrich',
    'page_size': '10',
    'past_role_title':'(?i)software engineer',
}
response = requests.get(api_endpoint, params=params, headers=headers)
result = response.json()
print(json.dumps(result, indent=2))

I received a total_result_count of 886 for (?i)software engineer as a past job title instead of (?i)software developer. Nice.

You can filter without relying on LinkedIn company profiles, too

Next, let's try removing past_company_linkedin_profile_url from our parameters and changing past_role_title back to (?)software developer:

9,775 results are returned:

Of course, consisting of various profiles like this:

If we change past_role_title back to (?)software engineer again, without Stripe, we can see 9,745 results returned:

Finding high-level executive candidates with Proxycurl

Now, let's say that the same payment processing startup from earlier wants you to find them a CTO instead of a software developer.

If we use the following Python code:

import json, requests

headers = {'Authorization': 'Bearer ' + 'Your_API_Key_Here'}
api_endpoint = 'https://nubela.co/proxycurl/api/search/person/'
params = {
    'country': 'US',
    'enrich_profiles': 'enrich',
    'page_size': '10',
    'current_role_title':'(?i)chief technical officer',
}
response = requests.get(api_endpoint, params=params, headers=headers)
result = response.json()
print(json.dumps(result, indent=2))

1,928 results of LinkedIn profiles are returned that look like this:

However, the CTO at an immunotherapy company is not exactly an ideal prospect for a payment processing company.

Filtering by multiple past company names and start date

Let's try the following parameters instead:

import json, requests

headers = {'Authorization': 'Bearer ' + 'Your_API_Key_Here'}
api_endpoint = 'https://nubela.co/proxycurl/api/search/person/'
params = {
    'country': 'US',
    'enrich_profiles': 'enrich',
    'page_size': '10',
    'current_role_title':'(?i)software engineer',
    'past_company_name':'Stripe|PayPal',
    'current_role_before':'2013-08-29',
}
response = requests.get(api_endpoint, params=params, headers=headers)
result = response.json()
print(json.dumps(result, indent=2))

Now I received 42 results of prospects like the following:

Clearly, someone who has been working as a software engineer for longer than 10 years and has previously worked for Stripe or Paypal has enough chops to at least reach out to and potentially begin the screening process.

Since we're using past_company_name instead of a LinkedIn company URL, I would like to note that if any past company name contained the word "Stripe" in it, it would also included since we didn't use the LinkedIn company URL specifically.

Filtering based on industry

If we use our industries parameter, we can specify specific industries to look for (here's the list again).

For example, let's use the banking industry like so:

import json, requests

headers = {'Authorization': 'Bearer ' + 'Your_API_Key_Here'}
api_endpoint = 'https://nubela.co/proxycurl/api/search/person/'
params = {
    'country': 'US',
    'enrich_profiles': 'enrich',
    'page_size': '10',
    'current_role_title':'(?i)software engineer',
    'industries':'banking',
    'current_role_before':'2013-08-29',
}
response = requests.get(api_endpoint, params=params, headers=headers)
result = response.json()
print(json.dumps(result, indent=2))

This time I received 114 different results:

With the candidates having LinkedIn profiles similar to the following:

Let's take that same example from above and apply it to a senior sales position, but get a little bit more specific this time.

Finding a senior sales representative

Okay, we have a client that's a digital advertising agency seeking a senior sales executive, and it's based out of Los Angeles, so they have to be located there.

Given the scenario above, here's what we could use:

import json, requests

headers = {'Authorization': 'Bearer ' + 'Your_API_Key_Here'}
api_endpoint = 'https://nubela.co/proxycurl/api/search/person/'
params = {
    'country': 'US',
    'enrich_profiles': 'enrich',
    'page_size': '10',
    'current_role_title':'(?i)senior sales executive',
    'city':'los angeles',
}
response = requests.get(api_endpoint, params=params, headers=headers)
result = response.json()
print(json.dumps(result, indent=2))

It returns 43 results like this:

Really qualified candidate there that almost instantly completes half the screening process and certainly makes your job as an HR search firm easier.

Finding a senior marketing manager

Let's say this time we're recruiting for a United States remote healthcare startup.

They're looking for a senior marketing manager, but they want a data-driven one, so they'd like them to have a computer science degree, and they'd prefer healthcare experience.

We can search for that. Let me show you how:

import json, requests

headers = {'Authorization': 'Bearer ' + 'Your_API_Key_Here'}
api_endpoint = 'https://nubela.co/proxycurl/api/search/person/'
params = {
    'country': 'US',
    'enrich_profiles': 'enrich',
    'page_size': '10',
    'current_role_title':'(?i)senior marketing manager',
    'education_field_of_study':'(?i)computer science'
    'industries':'hospital & health care',
}
response = requests.get(api_endpoint, params=params, headers=headers)
result = response.json()
print(json.dumps(result, indent=2))

We received back a grand total of two results back, but it doesn't matter, because we've already seriously screened the candidates generated.

Senior marketing manager and health care experience, check.

Computer science degree, check.

It's that easy.

Are you seeing how powerful this can be at scale and how much time this can shave off the executive search process yet?

By this point, you know how to find several qualified candidates regardless of position, role, country, city, education, or industry.

However, with the above Search API examples, you'll only get their LinkedIn profile URL, as well as a detailed summary of all of the information on it (because we were using the enrich parameter).

So, that means we still need to take their LinkedIn profile URL and fetch a personal email address (not work email) to contact them.

Finding personal emails

It's extremely simple to find personal emails with our Personal Email Lookup Endpoint.

We can use:

  • A Twitter (or X) profile URL.
  • A Facebook profile URL.
  • A LinkedIn profile URL.

You can also validate the emails with our API to ensure it's a functional email address (so you don't risk your own email deliverability).

Here's an example of using a LinkedIn profile to find a personal email address:

import json, requests

headers = {'Authorization': 'Bearer ' + 'Your_API_Key_Here}
api_endpoint = 'https://nubela.co/proxycurl/api/contact-api/personal-email'
params = {
    'linkedin_profile_url': 'https://linkedin.com/in/steven-goh-6738131b',
    'email_validation': 'include',
    'page_size': '0',
}
response = requests.get(api_endpoint, params=params, headers=headers)
result = response.json()
print(json.dumps(result, indent=2))                     

Providing we have it available, we'll validate and return it back to you.

You can then of course load it up in whatever email outreach software you use to start the recruiting and screening process.

Next, let me show you how you can also find a personal phone contact number:

Looking up phone numbers with a LinkedIn profile

Using our Personal Contact Number Lookup Endpoint, you can look for phone numbers with the same social media profile URLs as our Personal Email Lookup Endpoint.

  • LinkedIn
  • Facebook
  • Twitter

It's very easy, just use the following Python script:

import json, requests

headers = {'Authorization': 'Bearer ' + 'Your_API_Key_Here'}
api_endpoint = 'https://nubela.co/proxycurl/api/contact-api/personal-contact'
params = {
    'linkedin_profile_url': 'https://linkedin.com/in/steven-goh-6738131b',
    'page_size': '0',
}
response = requests.get(api_endpoint, params=params, headers=headers)
result = response.json()
print(json.dumps(result, indent=2))

If we have one on file, or we're able to scrape it, we'll return their number.

Neat, huh?

So you've learned:

  • How to automatically sift through millions of different candidates with detailed qualifiers.
  • How to obtain a candidate's personal email.
  • How to obtain a candidate's personal phone number.

Now you have the data

Earlier I said it all starts with a rich B2B dataset. With Proxycurl, now you have it.

There are several different ways an executive search (or HR tech) firm could use Proxycurl.

One of those simply using Python like the examples shown above and building a candidate list that way.

The other is using our API (and LinkDB as a data foundation) and building an in-house application that works exactly however you'd like it to, for whatever purpose you'd like to use it for.

Either way: You won't have to worry about any web scraping, or obtaining the data. You just have to take action on the rich data provided to you.

Put it to use however you'd like

We encourage you to use our API and the rich data we provide about people and companies in your application.

We'll put zero limits to how you use our API - feel free to build whatever application you'd like with Proxycurl.

On something like an executive search, you could use our API to build a candidate list. Then, reach out to one of said qualified prospects on that candidate list, and convince him to come to the company you're working for.

Encompassing a full-service executive headhunt and recruitment agency, for instance.

Or, you could instead automate everything and operate as more of a SaaS rather than an agency, using our API as a data foundation. Entirely up to you.

You could even use Proxycurl to build your own prospecting lists for reaching out to executive search clients...

Using our Company Search Endpoint to generate your own leads

Let me show you a quick example of how to use our Company Search Endpoint to find your own leads:

import json, requests

headers = {'Authorization': 'Bearer ' + 'Your_API_Key_Here'}
api_endpoint = 'https://nubela.co/proxycurl/api/search/company'
params = {
    'enrich_profiles': 'enrich',
    'page_size': '10',
    'funding_raised_after': '2022-12-30',
    'funding_amount_min': '1000000',
    'employee_count_min': '100',
    'country': 'us',
}
response = requests.get(api_endpoint, params=params, headers=headers)
result = response.json()
print(json.dumps(result, indent=2))

That would find LinkedIn company profiles that:

  • Had funding raised recently (2022-12-30), so they're likely expanding and would be hiring.
  • Minimum funding amount of 1,000,000.
  • Minimum employee count of 100, so you know they're an established company worth investing your energy into.
  • Based in the US.

Like this:

This is only going to return the LinkedIn company profile. Let's go further.

Listing LinkedIn company employees by role

We could also further qualify those roles by filtering by role titles like co-founder, founder, CTO, COO, or CEO using our Employee Listing Endpoint.

Here's an example of CEO:

import json, requests

headers = {'Authorization': 'Bearer ' + 'Your_API_Key_Here'}
api_endpoint = 'https://nubela.co/proxycurl/api/linkedin/company/employees/'
params = {
    'url': 'https://www.linkedin.com/company/humaneinc',
    'country': 'us',
    'enrich_profiles': 'enrich',
    'role_search': 'CEO',
    'page_size': '10',
    'employment_status': 'current',
    'resolve_numeric_id': 'false',
}
response = requests.get(api_endpoint, params=params, headers=headers)
result = response.json()
print(json.dumps(result, indent=2))

Of course, using our enrich_profiles parameter, so it'd pull additional information from whoever matches that role's LinkedIn profile.

I'm not going to put it in the blog post, but it did indeed pull the CEO/co-founder for Humane, so you could go directly to the source and offer your recruiting services to the CEO of a recently funded AI startup.

Let's take it another step further.

Looking up a work email with a LinkedIn profile

Previously I showed you how to find a personal email, as that's likely what you want to use for an executive search. This is different.

With the following example, we're using the Work Email Lookup Endpoint from our Contact API, which returns the information back to a webhook if provided.

In this case, I used webhook.site:

import json, requests

headers = {'Authorization': 'Bearer ' + 'Your_API_Key_Here'}
api_endpoint = 'https://nubela.co/proxycurl/api/linkedin/profile/email'
params = {
    'linkedin_profile_url': 'https://www.linkedin.com/in/williamhgates',
    'callback_url': 'https://webhook.site/your-webhook',
}
response = requests.get(api_endpoint, params=params, headers=headers)
result = response.json()
print(json.dumps(result, indent=2))

That returns back this:

You could also use the Personal Email Lookup Endpoint mentioned above to pull a contact email for whichever decision maker you looked up as another point of contact.

Wow! That's a lot covered. Pretty easy using Proxycurl to source your data on people and companies, huh?

I'm sure by now you're grasping some of the power of our API, which brings us to the next part of this article...

The part where I ask you to:

Create your Proxycurl account today

It's entirely free to sign up for our API, but we use a credit system that varies based on the action you're trying to do.

Detailed pricing information is available for our API here.

To get started: $10 can get you 100 credits, and those don't expire (special enterprise/bulk rates available).

The following API endpoints are entirely free:

For example, Using our Disposable Email Address Check Endpoint, you could check all of the emails used for your prospecting lists.

It's as simple as feeding our Disposable Email Check Endpoint your emails you want to check as follows:

import json, requests

headers = {'Authorization': 'Bearer ' + 'Your_API_Key_Here'}
api_endpoint = 'https://nubela.co/proxycurl/api/disposable-email'
params = {
    'email': 'colton@nubela.co',
}
response = requests.get(api_endpoint, params=params, headers=headers)
result = response.json()
print(json.dumps(result, indent=2))      

And then you'll be returned if the email is a free email (not business) or a disposable email entirely (junk).

It's safe to say

Our API is incredibly powerful -- admittedly biased, but I think you'll come to agree after you've given us a try.

Acquiring rich B2B data about people and companies as an executive recruitment firm is the hard part, once you have it, you can build (and automate) a lot of different aspects of your business; making your job much easier, and giving you a true edge.

Click here to create your Proxycurl account for free today.

If you have any questions about LinkDB, our API, or anything else, feel free to reach out to us at "hello@nubela.co".