API Reference
People
The people at your activated accounts: rosters, decision-maker search, verified emails, phones, lists, and CRM push. Data is unlimited on every plan, so none of these endpoints draw down a credit balance.
employee). When you run a Find People search, matched decision makers are saved with their match tier (source waterfall). Both land in the same collection and dedupe by LinkedIn profile per account.List people
/peopleReturns people newest first, paginated. Supports filters:
account_idstringoptionalOnly people at this account.
job_levelstringoptionalC-Team, VP, Director, Manager, or Staff.
country_codestringoptionalISO 2-letter country code, e.g. US.
sourcestringoptionalemployee (roster sync) or waterfall (Find People match).
has_emailbooleanoptionaltrue for only people with a verified email; false for people without one.
list_idstringoptionalOnly people saved to this list.
searchstringoptionalSubstring match on name, title, or headline.
sortstringoptionalcreated_at (default) or full_name.
orderstringoptionalasc or desc. Default desc.
pageintegeroptionalPage number. Default 1.
per_pageintegeroptionalMax 100. Default 50.
curl "https://usehunch.co/api/v1/people?job_level=VP&has_email=true&per_page=25" \
-H "Authorization: Bearer hunch_YOUR_KEY"{
"data": [
{
"id": "...",
"account_id": "...",
"full_name": "Lena Tran",
"title": "Head of Revenue Operations",
"headline": "RevOps at Fielder",
"linkedin_url": "https://www.linkedin.com/in/lenatran",
"email": "lena@fielder.app",
"email_checked_at": "2026-07-06T...",
"phone": null,
"phone_checked_at": null,
"location": "Denver, US",
"country_code": "US",
"connections_count": 500,
"profile_picture_url": "...",
"job_level": "Director",
"source": "waterfall",
"icp_tier": 2,
"ranking": 1,
"created_at": "2026-07-06T..."
}
],
"pagination": { "total": 128, "page": 1, "per_page": 25, "has_more": true }
}Get a person
/people/:idReturns the full person record plus list_ids, the ids of every list they are saved to.
Find people
/people/findDescribe who you want in plain English. Hunch compiles it into a prioritized title cascade (the ideal role first, adjacent roles behind it, a sensible fallback last), runs it at each activated account, and attaches a verified work email to every hit. Matches are saved to People and returned in the response.
querystringrequiredWho you want, in plain English. e.g. "The demand generation leader. If none, whoever runs marketing. Skip agencies and consultants."
account_idsstring[]optionalSpecific activated accounts to search. Defaults to the most recent activated accounts.
max_accountsintegeroptionalHow many accounts one call sweeps. Default 20, max 50. For bigger rosters, call again with account_ids batches.
curl -X POST https://usehunch.co/api/v1/people/find \
-H "Authorization: Bearer hunch_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "VP of Sales or CRO in the US. If neither, whoever runs revenue operations.",
"account_ids": ["acc_123"]
}'{
"data": {
"found": 3,
"accountsSearched": 1,
"tiers": 3,
"cascade": [ ... ],
"contacts": [ { "id": "...", "full_name": "...", "email": "...", "icp_tier": 1, ... } ]
}
}icp_tier on each match tells you which tier matched: 1 is the ideal role, higher numbers are fallbacks. Searches can take a minute or two for many accounts since lookups are paced for reliability.
Load an account's roster
/people/syncLoads (or refreshes) the full employee roster for an activated account into People. This runs automatically when an account is activated, so you only need it for accounts activated before rosters existed or to refresh one.
account_idstringrequiredAn ACTIVE account id.
{ "data": { "account_id": "...", "synced": 43 } }Reveal a work email
/people/:id/emailReturns the verified work email for a person and stores it on the record. Idempotent: if the email is already known it is returned without a new lookup. email is null when no verified address exists.
{ "data": { "id": "...", "email": "lena@fielder.app" } }Reveal a phone number
/people/:id/phoneReturns a mobile or direct phone for a person and stores it. Coverage is focused on the US;phone is null when none is found.
Push people to your CRM
/people/crm-pushPushes people to the connected CRMs as Contacts. Each person's company record is created or updated first (with its signal context), so contacts always land linked to an account. People need a verified email first: email is the dedupe key in both CRMs, and people without one are skipped and counted in skippedNoEmail.
contact_idsstring[]requiredPerson ids to push (max 100 per call).
providerstringoptionalhubspot or salesforce. Omit to push to every connected CRM.
{
"data": {
"pushed": 4,
"failed": 0,
"skippedNoEmail": 1,
"providers": ["hubspot"],
"results": [ { "contactId": "...", "provider": "hubspot", "ok": true, "created": true } ]
}
}People lists
/people/listsLists every saved people list with member counts.
/people/listsnamestringrequiredList name, e.g. "Q3 outreach - RevOps leaders". Creating an existing name returns that list.
/people/lists/:idDeletes a list. The people in it are kept.
/people/lists/:id/membersaddstring[]optionalPerson ids to add (max 500 per call).
removestring[]optionalPerson ids to remove.
{ "data": { "list_id": "...", "added": 12, "removed": 0 } }Enrich an account
/accounts/:id/enrichRuns enrichment for an ACTIVE account on demand: full company profile, workforce breakdown by department and country, and the employee roster into People. This is the same pipeline that runs automatically on activation, so you only need it to refresh or backfill. Returns the updated account.