Authentication
Every request authenticates with an API key. Create one from the dashboard, then send it as an x-api-key header (or Authorization: Bearer). Keys are prefixed ps_live_… and are shown only once.
x-api-key: YOUR_API_KEYNew to the API? Sign up for a key. The free trial includes 50 credits at 5 requests/min.
Plans: Trial (50 credits, 5/min) · HeroHunt API Starter (1400 credits, 15/min) · HeroHunt API Pro (3500 credits, 30/min).
Official SDKs
Use the typed Python SDK, the Node / MCP package, or call the REST endpoints directly.
pip install herohunt
# then
from herohunt import HeroHunt
client = HeroHunt() # reads HEROHUNT_API_KEY
result = client.people_search.search(
"Senior React engineers in Berlin with TypeScript",
max_results=50,
enrich=True,
)npx -y herohunt-mcp
# or point any MCP client at the hosted server:
# https://api.herohunt.ai/api/v1/mcpPeople Search
/searchSearch
Search across LinkedIn, GitHub, and StackOverflow using natural language. Returns matching profiles with relevance scores. A new search charges 1 credit per reserved slot up front (min(maxResults, availableCredits), default maxResults = 100). Pagination of the same searchId is free. With enrich: true, add +1 credit per successfully enriched LinkedIn profile on the current page.
x-api-key headerquerystringrequiredNatural language query describing the ideal candidate. Ignored when searchId is provided.
searchIdstringoptionalID from a previous search. Use with page to paginate. No base credits are charged — the maxResults reservation was already billed on the creation call. If enrich is true, +1 credit per successfully enriched LinkedIn profile on that page.
filtersobjectoptionalStructured filters: locations, platforms (linkedin, github, stackoverflow), skills, languages, currentCompany.
maxResultsnumberoptionalMaximum matching profiles to find (1–500, default 100). Charged up front on search creation: 1 credit per reserved slot, capped at your available credits. Pagination of this search is then free.
enrichbooleanoptionalInclude email and phone data (LinkedIn only). Adds +1 credit per successfully enriched LinkedIn profile on the current page (a profile counts when it is returned with an email or phone). Default: false.
per_pagenumberoptionalNumber of results to return per page (1–50, default 10).
pagenumberoptionalPage number (1-indexed). Use with searchId to paginate. Default: 1.
timeoutMsnumberoptionalMax wait time in ms before returning partial results (1000–120000, default 90000).
X-Credits-Used, X-Credits-Remainingexperiences, education, certifications are LinkedIn-only. GitHub profiles include username, topRepositories, publicRepos, followers. StackOverflow profiles include reputation, badges, answerCount, questionCount. emails and phones are only present when enrich: true.
curl -X POST 'https://api.herohunt.ai/api/v1/people-search/search' \
-H 'Content-Type: application/json' \
-H 'x-api-key: YOUR_API_KEY' \
-d '{
"query": "Senior Java developer with Kotlin experience in the US",
"filters": {
"platforms": ["linkedin", "github"],
"skills": ["Java", "Kotlin"]
},
"maxResults": 100,
"per_page": 10
}'{
"searchId": "665f1a2b3c4d5e6f7a8b9c0d",
"query": "Senior Java developer with Kotlin experience",
"totalResults": 42,
"status": "completed",
"results": [
{
"profileId": "665f1a2b3c4d5e6f7a8b9c0d",
"platform": "linkedin",
"firstName": "John",
"lastName": "Doe",
"headline": "Senior Java Developer at Google",
"summary": "Passionate engineer with 10+ years of experience in distributed systems.",
"currentTitle": "Senior Software Engineer",
"currentCompany": "Google",
"location": "San Francisco, CA",
"profileUrl": "https://linkedin.com/in/johndoe",
"profilePicUrl": "https://media.licdn.com/...",
"skills": ["Java", "Kotlin", "Spring Boot"],
"languages": ["English", "German"],
"matchScore": 85,
"experiences": [
{
"title": "Senior Software Engineer",
"company": "Google",
"description": "Led a team of 5 engineers building microservices with Kotlin and Spring Boot.",
"startDate": "2021-3",
"endDate": "Present",
"location": "Mountain View, CA"
},
{
"title": "Software Engineer",
"company": "Acme Corp",
"description": "Developed backend services in Java.",
"startDate": "2018-6",
"endDate": "2021-2",
"location": "San Francisco, CA"
}
],
"education": [
{
"school": "MIT",
"degree": "Bachelor of Science",
"fieldOfStudy": "Computer Science",
"description": "Bachelor of Science in Computer Science",
"startDate": "2015-9",
"endDate": "2019-6"
}
],
"certifications": [
{ "name": "AWS Solutions Architect", "authority": "Amazon Web Services" }
],
"emails": [
{ "value": "john.doe@example.com", "type": "work" }
],
"phones": [
{ "value": "+1 555-0123", "type": "work" }
]
},
{
"profileId": "665f1a2b3c4d5e6f7a8b9c0e",
"platform": "github",
"firstName": "Jane",
"lastName": "Smith",
"headline": "Senior Developer",
"profileUrl": "https://github.com/janesmith",
"username": "janesmith",
"avatarUrl": "https://avatars.githubusercontent.com/u/12345",
"matchScore": 92,
"publicRepos": 42,
"followers": 120,
"topRepositories": [
{
"name": "awesome-project",
"description": "Open source library",
"language": "TypeScript",
"stars": 256,
"forks": 34,
"url": "https://github.com/janesmith/awesome-project"
}
]
},
{
"profileId": "665f1a2b3c4d5e6f7a8b9c0f",
"platform": "stackoverflow",
"firstName": "Alex",
"lastName": "Dev",
"profileUrl": "https://stackoverflow.com/users/12345",
"matchScore": 78,
"reputation": 15420,
"badges": { "gold": 5, "silver": 42, "bronze": 89 },
"answerCount": 320,
"questionCount": 12
}
],
"pagination": {
"page": 1,
"per_page": 10,
"total_pages": 5,
"has_more": true
}
}Account
/account/usageGet account usage
Returns current account plan, credits, and rate limit configuration.
x-api-key headerPlans: Trial (50 credits, 5 req/min), HeroHunt API Starter (1400 credits, 15 req/min), HeroHunt API Pro (3500 credits, 30 req/min).
curl 'https://api.herohunt.ai/api/v1/people-search/account/usage' \
-H 'x-api-key: YOUR_API_KEY'{
"plan": "trial",
"creditsTotal": 50,
"creditsUsed": 5,
"creditsRemaining": 45,
"creditResetDate": null,
"rateLimit": 5
}/account/keysList API keys
List all API keys for this account. Returns prefixes only — full keys are never stored.
x-api-key headercurl 'https://api.herohunt.ai/api/v1/people-search/account/keys' \
-H 'x-api-key: YOUR_API_KEY'[
{
"id": "665f1a2b3c4d5e6f7a8b9c0d",
"keyPrefix": "ps_live_xxxx",
"name": "Production Key",
"scopes": ["people:search", "people:search:enrich"],
"isActive": true,
"expiresAt": null,
"lastUsedAt": "2025-06-01T12:00:00.000Z",
"createdAt": "2025-01-15T10:00:00.000Z"
}
]/account/keysCreate a new API key
Create a new API key. The raw key is returned only once — store it securely.
x-api-key headernamestringrequiredA friendly name for this key.
scopesstring[]optionalPermission scopes: "people:search", "people:search:enrich". Defaults to ["people:search"].
expiresAtstringoptionalExpiration date (ISO 8601).
curl -X POST 'https://api.herohunt.ai/api/v1/people-search/account/keys' \
-H 'Content-Type: application/json' \
-H 'x-api-key: YOUR_API_KEY' \
-d '{ "name": "Production Key" }'{
"apiKey": "ps_live_a1b2c3d4e5f6...",
"keyPrefix": "ps_live_a1b2",
"name": "Production Key",
"scopes": ["people:search", "people:search:enrich"]
}/account/keys/{keyId}Revoke an API key
Permanently revoke an API key. Takes effect immediately.
x-api-key headercurl -X DELETE 'https://api.herohunt.ai/api/v1/people-search/account/keys/KEY_ID' \
-H 'x-api-key: YOUR_API_KEY'/account/keys/{keyId}/rotateRotate an API key
Deactivates the existing key and creates a new one. The new key is returned only once.
x-api-key headercurl -X POST 'https://api.herohunt.ai/api/v1/people-search/account/keys/KEY_ID/rotate' \
-H 'x-api-key: YOUR_API_KEY'{
"apiKey": "ps_live_n3w4k3y5...",
"keyPrefix": "ps_live_n3w4",
"name": "Production Key",
"scopes": ["people:search", "people:search:enrich"]
}MCP server
The People Search API is also a hosted Model Context Protocol server. Point Claude, Cursor, or any MCP client at https://api.herohunt.ai/api/v1/mcp and authenticate with the same API key. Credits, rate limits, and scopes are shared across REST and MCP.
{
"mcpServers": {
"herohunt-people-search": {
"url": "https://api.herohunt.ai/api/v1/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}{
"mcpServers": {
"herohunt-people-search": {
"url": "https://api.herohunt.ai/api/v1/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
const transport = new StreamableHTTPClientTransport(
new URL("https://api.herohunt.ai/api/v1/mcp"),
{
requestInit: {
headers: { Authorization: `Bearer ${process.env.HEROHUNT_API_KEY}` },
},
},
);
const client = new Client({ name: "my-agent", version: "1.0.0" });
await client.connect(transport);
const tools = await client.listTools();
const result = await client.callTool({
name: "people_search",
arguments: {
query: "Senior Java developers in the US",
maxResults: 50,
per_page: 10,
},
});# Raw HTTP / curl — useful for debugging only.
# Real MCP clients (Cursor, Claude Desktop, etc.) handle these headers automatically.
curl -X POST https://api.herohunt.ai/api/v1/mcp \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'How search works (async pattern)
Searches run in the background, so people_search can return status: "processing" with zero or partial results. Follow the nextAction hint and poll the same searchId (pagination is free) until status === "completed".
{
"searchId": "abc123",
"status": "processing",
"totalResults": 0,
"pagination": { "page": 1, "per_page": 10, "has_more": false },
"nextAction": {
"tool": "people_search_paginate",
"reason": "Search is still running. Poll the same searchId.",
"arguments": { "searchId": "abc123", "page": 1, "per_page": 10 },
"waitMs": 10000,
"stopWhen": "status === \"completed\" || pagination.has_more === false"
}
}Available tools
| Tool | Type | Summary |
|---|---|---|
people_search | Write | Run a new natural-language people search. Charges 1 credit per reserved slot up front. |
people_search_paginate | Read-only | Fetch additional pages for an existing searchId. Free unless enrich is enabled. |
account_usage_get | Read-only | Plan, credits used / remaining, rate limit, next reset date. |
account_searches_list | Read-only | Paginated history of past searches with first-page profiles. |
account_upgrade_link | Read-only | Returns a dashboard URL prefilled with your email, surface this on INSUFFICIENT_CREDITS. |
account_billing_portal_link | Read-only | Stripe Customer Portal URL for managing or cancelling the subscription. |
api_keys_list | Read-only | Lists API key prefixes, scopes, last-used timestamps. |
api_keys_create | Destructive | Create a new API key. Full key returned only once. |
api_keys_rotate | Destructive | Deactivate an existing key and return a new one with the same scopes. |
api_keys_revoke | Destructive | Permanently revoke an API key. |
Resources & prompts
herohunt://people-search/usage— JSON snapshot of credits & rate limitherohunt://people-search/searches— recent search historyherohunt://people-search/searches/{searchId}— a single past search- Prompt templates
find-candidatesandenrich-pagecompose recruiter-grade queries.
Start building with the People Search API
Create an API key, install the SDK, and fetch real-time profiles from 1 billion candidates today.














