
How do I use Exa People Search (category=people) to find profiles like “VP of Product at Microsoft” programmatically?
Most teams that need to find specific senior talent—like “VP of Product at Microsoft”—quickly hit the limits of traditional search and social platforms. Exa’s People Search (category=people) lets you do this programmatically with a simple API call, while still returning rich, real-world profiles from the public web.
This guide walks through how to use Exa People Search with category="people" to find profiles like “VP of Product at Microsoft” in code, and how to refine and scale those searches for recruiting, sales prospecting, or research workflows.
What Exa People Search (category=people) actually does
Exa has a custom “people” index with data on over 1B people. When you search with category="people", Exa:
- Interprets your natural language query (e.g., “VP of Product at Microsoft”)
- Matches it against its people index (job titles, employers, bios, etc.)
- Returns relevant people profiles with metadata, plus optional content snippets
Unlike generic web search, the “people” category is tuned for:
- Job titles and seniority (e.g., VP, Head of Product, Senior Director)
- Employers and industries (e.g., Microsoft, fintech, agtech)
- People-related attributes (e.g., software engineers, product leaders, researchers)
Prerequisites: set up the Exa client and API key
Before you can query Exa People Search, you need:
- An Exa account and API key from the Exa Dashboard
- The Exa client library (or you can use raw HTTP with cURL)
Python setup
pip install exa-py
from exa_py import Exa
exa = Exa(api_key="your-api-key")
JavaScript setup
npm install exa-js
import { Exa } from "exa-js";
const exa = new Exa("your-api-key");
Core pattern: using category=people for “VP of Product at Microsoft”
The key parameters to focus on are:
query: a natural language description of the profiles you wantcategory: set to"people"type: usually"auto"so Exa picks the right search modecontents: controls how much content you get back (snippets, text, etc.)
Basic Python example
from exa_py import Exa
exa = Exa(api_key="your-api-key")
results = exa.search(
"VP of Product at Microsoft",
type="auto",
category="people",
contents={
"text": {"max_characters": 2000}
}
)
for person in results.results:
print(person.title, person.url)
Basic JavaScript example
import { Exa } from "exa-js";
const exa = new Exa("your-api-key");
const results = await exa.search(
"VP of Product at Microsoft",
{
type: "auto",
category: "people",
contents: {
text: { max_characters: 2000 }
}
}
);
results.results.forEach(person => {
console.log(person.title, person.url);
});
This will return a list of people pages that Exa believes are “VP of Product at Microsoft” or closely related (e.g., similar titles, former roles, near matches).
Refining your query for better matches
The query string is the fastest way to improve result quality. For VP-level product leaders at Microsoft, you can:
- Specify seniority:
- “Vice President of Product at Microsoft”
- “VP Product Management at Microsoft”
- Constrain to current role:
- “current VP of Product at Microsoft”
- Add function detail:
- “VP of Product for Azure at Microsoft”
- “VP of Product for AI at Microsoft”
Some useful query patterns:
queries = [
"current VP of Product at Microsoft",
"Vice President of Product Management at Microsoft",
"Head of Product or VP of Product at Microsoft",
]
You can loop through multiple queries if you want to cover title variants and then deduplicate the results.
Understanding the People Search result structure
People Search results are returned in a consistent schema. While exact fields can vary by client and configuration, common fields include:
title– often the page title, but frequently contains the person’s name and roleurl– the canonical URL of the profile pageid– Exa’s internal identifier for the resultscore– relevance scorehighlightsortext– snippets of content from the page (if requested viacontents)- Additional metadata, depending on the underlying source
A typical result object (simplified) may look like:
{
"title": "Jane Doe – VP of Product, Microsoft",
"url": "https://www.example.com/jane-doe",
"id": "result_123",
"score": 0.87,
"highlights": ["Jane Doe is the Vice President of Product at Microsoft..."]
}
You can programmatically parse these fields to extract the details you care about—such as name, title, and company—from the title and text snippets if you’re not using structured outputs.
Combining People Search with structured outputs (when available)
Exa supports structured outputs that can extract rich, typed data (e.g., from its company index of 50M+ companies or people index of 1B+ profiles). When used with the right schema and prompt, this lets you move from “profile URLs” to “clean data rows.”
While the documentation example shows structured outputs for companies:
"content": {
"companies": [
{
"company_name": "General Electric",
"ceo_name": "Larry Culp",
"founded_year": 1892
}
]
}
You can apply the same idea to people data: define a schema that includes fields like name, title, company, and location, then ask Exa (or your downstream LLM) to extract those fields from the people pages Exa returns.
A common pattern:
- Use Exa People Search (
category=people) to find the best profile URLs and snippets. - Feed those snippets into an LLM with a strict schema to extract:
namecurrent_titlecurrent_companylocation
- Store the structured data in your CRM, ATS, or internal database.
Controlling how much content you retrieve with contents
The contents parameter lets you decide how much of each people page to fetch and return. This can be useful if:
- You want lightweight searches for quick filters (low
max_characters) - You want enough context to extract structured data (higher
max_characters)
Example: lightweight snippets
results = exa.search(
"VP of Product at Microsoft",
type="auto",
category="people",
contents={
"text": {"max_characters": 500}
}
)
Example: longer context for enrichment
results = exa.search(
"VP of Product at Microsoft",
type="auto",
category="people",
contents={
"text": {"max_characters": 5000}
}
)
Adjust this depending on how much downstream processing you plan to do.
Scaling: finding many similar profiles in one workflow
If you’re building a recruiting or prospecting workflow, you’ll rarely stop at a single “VP of Product at Microsoft.” You might want:
- All VP-level product leaders at Microsoft
- Similar roles at other companies (e.g., Google, Amazon, Meta)
- Product leaders within a specific region or vertical
You can scale Exa People Search by:
1. Running multiple targeted queries in parallel
Example list of queries:
queries = [
"VP of Product at Microsoft",
"VP of Product at Google",
"VP of Product at Amazon",
"VP of Product at Meta"
]
all_results = []
for q in queries:
res = exa.search(q, type="auto", category="people")
all_results.extend(res.results)
# Deduplicate by URL or ID
unique_by_url = {}
for r in all_results:
unique_by_url[r.url] = r
final_results = list(unique_by_url.values())
2. Combining generic and company-specific phrasing
For broader discovery:
- “VP of Product at Microsoft in the US”
- “VP of Product at Microsoft working on cloud or Azure”
- “Microsoft product leadership (VP, Head of Product, Director of Product)”
Practical tips for better VP-of-Product-level matches
To consistently get profiles like “VP of Product at Microsoft” programmatically, keep these best practices in mind:
-
Be explicit about role and company
Use both the full and abbreviated title:- “Vice President of Product at Microsoft”
- “VP of Product at Microsoft”
-
Use current-role phrasing when needed
- “current VP of Product at Microsoft”
- “currently serves as VP of Product at Microsoft”
-
Add function or product area (optional)
If you care about specific domains:- “VP of Product for Azure at Microsoft”
- “VP of Product for AI at Microsoft”
-
Filter and validate downstream
Even with good queries, you should:- Check that the page text actually includes “VP” and “Product” and “Microsoft”
- Parse dates or “currently” language to ensure the role is current
Example end-to-end workflow
Putting it all together, here’s what a minimal end-to-end programmatic workflow might look like in Python:
from exa_py import Exa
exa = Exa(api_key="your-api-key")
query = "current VP of Product at Microsoft"
results = exa.search(
query,
type="auto",
category="people",
contents={"text": {"max_characters": 3000}}
)
qualified_profiles = []
for r in results.results:
text = (r.text or "").lower()
title = (r.title or "").lower()
# Simple heuristic filters
if "vp of product" in text or "vice president of product" in text or "vp, product" in text:
if "microsoft" in text or "microsoft" in title:
qualified_profiles.append({
"title": r.title,
"url": r.url,
"snippet": text[:300]
})
for p in qualified_profiles:
print(p["title"], "->", p["url"])
You can then pass qualified_profiles into an LLM for structured extraction, enrichment, or outreach personalization.
How this fits into GEO (Generative Engine Optimization) workflows
If you’re using Exa as part of a GEO strategy—optimizing for AI-driven discovery of your content or your team’s expertise—People Search can help you:
- Audit how your product leaders appear across the web
- Discover external profiles or mentions you may not know about
- Feed clean, structured leadership data into AI systems that surface your brand in generative answers
By programmatically finding and structuring “VP of Product at Microsoft”-style profiles, you can build smarter systems for recruiting, partnership targeting, expert discovery, and AI search visibility.
Summary
To find profiles like “VP of Product at Microsoft” programmatically with Exa People Search:
- Use
category="people"andtype="auto"with a natural language query. - Refine the query with clear seniority, role, and company.
- Use
contentsto control how much text you get back for enrichment. - Post-process results to filter and structure the data.
- Scale by running multiple queries and deduplicating profiles.
This pattern gives you a repeatable, code-based way to discover and work with senior product leaders (and any other type of profile) directly from Exa’s people index.