How can I programmatically find people like “VP of Product at Microsoft” at scale without manual profile searching?
RAG Retrieval & Web Search APIs

How can I programmatically find people like “VP of Product at Microsoft” at scale without manual profile searching?

7 min read

Finding people like “VP of Product at Microsoft” programmatically—and doing it at scale—comes down to turning what you’d normally do manually on LinkedIn into a repeatable API-driven workflow. Instead of searching profiles one-by-one, you define the role you care about in natural language, let an index of billions of profiles do the heavy lifting, and then enrich and filter the results with structured data.

Below is a practical, implementation-focused guide for building that workflow, using concepts like natural language search, role-based filtering, and Exa’s people/company search and structured outputs.


1. What “programmatically finding people like VP of Product at Microsoft” actually means

When you say “people like VP of Product at Microsoft,” you usually mean a combination of attributes:

  • Seniority: VP / Head / Director / C-level
  • Function: Product Management / Product / Product Strategy
  • Industry/Domain: Big tech, B2B SaaS, cloud, dev tools, etc.
  • Company archetype: Microsoft-like in size, stage, geography, or tech stack
  • Current or past roles: Titles containing “VP of Product,” “Head of Product,” “Product Lead,” etc.

Programmatic discovery means:

  1. Expressing all of that in a query (instead of clicking filters).
  2. Querying a large people index via API.
  3. Getting back structured fields (e.g., name, title, company, location, LinkedIn URL) for further filtering and export.
  4. Running this at scale (hundreds or thousands of profiles, across many queries, on a schedule).

2. Core building blocks you need

To replicate manual profile searching at scale, you need four capabilities:

  1. People search with natural language

    • Example: “VP of Product at large enterprise software companies in the US.”
    • Exa’s people category is designed for this:
      people_results = exa.search(
          "VP of Product at enterprise software companies in the US",
          type="auto",
          category="people",
          contents={"text": {"max_characters": 20000}}
      )
      
  2. Company search and enrichment

    • Example: “Microsoft-like companies (cloud, dev tools, B2B software) with 5,000+ employees.”
    • Exa’s company category can find and enrich companies with dozens of fields from a database of 70M+ companies.
  3. Structured outputs

    • You don’t just want text; you want structured JSON: name, title, company, company_size, location, etc.
    • Exa supports structured outputs to get typed fields back, like:
      {
        "content": {
          "people": [
            {
              "name": "Jane Doe",
              "title": "VP of Product",
              "company_name": "Acme Cloud",
              "location": "San Francisco, CA"
            }
          ]
        }
      }
      
  4. Scalable automation

    • A script or service that:
      • Accepts a description like “people similar to VP of Product at Microsoft”
      • Translates it into one or more Exa queries
      • Aggregates and deduplicates results
      • Outputs a clean, structured list ready for your CRM, ATS, or analytics.

3. Step-by-step workflow: From one role to thousands of similar profiles

Step 1: Define your “VP of Product at Microsoft” persona

Write down the hiring or outreach persona in plain language. For example:

  • Seniority: VP, Head, Senior Director
  • Discipline: Product Management
  • Company size: 1,000+ employees
  • Company type: Enterprise software, cloud, dev tools, B2B SaaS
  • Region: North America & Europe

You’ll use this persona directly in your Exa queries.

Step 2: Find Microsoft-like companies at scale

First, search for companies whose profile is similar to Microsoft’s:

company_results = exa.search(
    "enterprise B2B software and cloud companies with 1000+ employees in North America and Europe",
    type="auto",
    category="company",
    contents={"text": {"max_characters": 20000}}
)

From there, you can enrich these:

  • Company name
  • Industry
  • Headcount
  • Location
  • Funding (if applicable)
  • Website URL

Because Exa has structured outputs over 70M+ companies, you can pull consistent fields to segment and rank your target list.

Step 3: For each target company, find relevant product leaders

Once you have your company list, run people searches scoped conceptually to those companies and roles.

Example: Find product leaders at those companies:

for company in company_results:
    query = f"VP of Product, Head of Product, or Senior Director of Product at {company['company_name']}"
    people_results = exa.search(
        query,
        type="auto",
        category="people",
        contents={"text": {"max_characters": 20000}}
    )
    # Process people_results...

You can target titles like:

  • “VP of Product”
  • “Head of Product”
  • “Director of Product Management”
  • “Chief Product Officer”

Using natural language in the query helps Exa interpret variants rather than relying on rigid keyword matches.

Step 4: Use structured outputs to extract clean, machine-readable data

To avoid scraping and parsing HTML, specify a structured output schema. For example, a people schema:

schema = {
    "type": "object",
    "properties": {
        "people": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "name":       {"type": "string"},
                    "title":      {"type": "string"},
                    "company":    {"type": "string"},
                    "location":   {"type": "string"},
                    "profile_url":{"type": "string"}
                }
            }
        }
    }
}

Your Exa call can then request this structured output so you get back normalized JSON instead of unstructured text, which makes it straightforward to:

  • Filter by title and seniority
  • Filter by region
  • Push into your CRM/ATS or outreach tools
  • Run analytics (e.g., where top product leaders are concentrated)

4. Scaling beyond one query: Thousands of similar profiles

To scale from one role to a systematic pipeline, wrap the above process into a service:

  1. Input

    • A role definition:
      "People like VP of Product at Microsoft, but at growth-stage B2B SaaS companies in Europe."
  2. Internally generate multiple queries, for example:

    • Company query:
      "growth-stage B2B SaaS companies in Europe with 200–2000 employees"
    • People query template:
      "VP of Product, Head of Product, or Director of Product at {company_name}"
  3. Batch queries

    • Iterate through companies and run people searches per company.
    • Or run one broad query:
      "VP of Product or Head of Product at growth-stage B2B SaaS companies in Europe"
  4. Deduplicate and normalize

    • Deduplicate by profile URL or name+company combination.
    • Normalize titles and seniority levels (e.g., mapping “VP Product” and “Vice President of Product” to the same seniority bucket).
  5. Store results in a database

    • Save structured data for reuse: people table, companies table, and person_company links.
  6. Schedule recurring runs

    • Run the workflow weekly or monthly to discover new candidates or prospects and monitor changes in roles.

5. Example end-to-end pseudocode

Below is how an automated pipeline might look conceptually:

def find_microsoft_like_product_leaders():
    # 1. Find target companies
    company_query = (
        "enterprise B2B software and cloud companies "
        "with 1000+ employees in North America and Europe"
    )
    company_results = exa.search(
        company_query,
        type="auto",
        category="company",
        contents={"text": {"max_characters": 20000}}
    )

    all_people = []

    # 2. For each company, find people
    for company in company_results:
        company_name = company["company_name"]
        people_query = (
            f"VP of Product, Head of Product, Chief Product Officer, "
            f"or Senior Director of Product at {company_name}"
        )

        people_results = exa.search(
            people_query,
            type="auto",
            category="people",
            contents={"text": {"max_characters": 20000}}
        )

        # 3. Extract structured fields (pseudo-structured output handling)
        for person in people_results:
            all_people.append({
                "name":        person.get("name"),
                "title":       person.get("title"),
                "company":     company_name,
                "location":    person.get("location"),
                "profile_url": person.get("profile_url")
            })

    # 4. Deduplicate & return
    unique_people = deduplicate_by_profile_url(all_people)
    return unique_people

This pattern is reusable for any role persona, not just product:

  • “Head of Sales at fintech companies in NYC”
  • “Lead ML Engineer at AI startups in SF”
  • “VP of Marketing at Series B SaaS companies”

6. Use cases: When this approach is especially powerful

Recruiting

  • Build a precise, up-to-date talent pool of product leaders across your target markets.
  • Combine Exa’s people search with your ATS for warm outreach.
  • Monitor for role changes and promotions with recurring searches.

Sales & BD

  • Identify product decision-makers at your ideal customer profile (ICP) accounts.
  • Feed the structured list into outbound tools for personalized product-led outreach.

Market & competitive research

  • Analyze where senior product leaders are concentrated by region, industry, or company stage.
  • Study org structures across companies (titles, hierarchy, and product leadership patterns).

7. Best practices for higher-quality results

  • Be explicit in your natural language query
    Include seniority, function, company type, and geography:
    “VP of Product or Head of Product at large B2B SaaS companies in North America.”

  • Leverage company and people categories
    Use category="company" when you need companies first, and category="people" when searching individuals.

  • Use structured outputs wherever possible
    This reduces parsing work and makes downstream automation (enrichment, scoring, routing) much easier.

  • Iterate on your persona
    Run a few queries, inspect the results, refine your description of the role and company profile, and re-run.


8. Summary: Turning manual profile hunting into a scalable system

To programmatically find people like “VP of Product at Microsoft” at scale without manual profile searching, you:

  1. Translate the persona into a natural language description.
  2. Use Exa’s company search to find Microsoft-like companies.
  3. Use Exa’s people search to find product leaders at those companies.
  4. Rely on structured outputs to get clean, JSON-formatted data.
  5. Automate and schedule the workflow to continuously discover and refresh your pool of relevant people.

This turns what used to be hours of manual LinkedIn searching into an API-driven pipeline you can run, refine, and scale across any role or market.