Skip to main content
POST
/
v3
/
people
/
search
People Search
curl --request POST \
  --url https://api.leadmagic.io/v3/people/search \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: <api-key>' \
  --data '
{
  "company_domain": "stripe.com",
  "titles": [
    "VP Sales",
    "Head of Revenue"
  ],
  "roles": [
    "Revenue",
    "Sales"
  ],
  "has_phone": true,
  "preview": false,
  "limit": 10,
  "use_embeddings": false
}
'
{
  "message": "People found",
  "credits_consumed": 0.5,
  "people": [
    {
      "first_name": "Jane",
      "last_name": "Doe",
      "full_name": "Jane Doe",
      "title": "VP Sales",
      "job_level": "VP",
      "job_function": "Sales",
      "profile_url": "https://www.linkedin.com/in/jane-doe/",
      "company_name": "Stripe",
      "company_domain": "stripe.com",
      "country_code": "US",
      "headline": "VP Sales at Stripe",
      "has_email": true,
      "has_phone": true,
      "matched_title": "VP Sales"
    }
  ],
  "count": 10,
  "returned_count": 10,
  "limit_applied": 10,
  "resolved_company_domain": "stripe.com",
  "resolved_by": "company_domain",
  "warnings": [],
  "metadata": {
    "provider": "profile_worker",
    "query_name": "people_search_v3",
    "query_path": "title_search",
    "db_ms": 420,
    "embeddings_used": false
  }
}

Documentation Index

Fetch the complete documentation index at: https://leadmagic.io/docs/llms.txt

Use this file to discover all available pages before exploring further.

People Search

Search for people at a company using the Profile Worker. Start with a company domain, company name, or LinkedIn company URL, then optionally add titles or roles to narrow the result set. Use this endpoint when you want a flexible people search surface. If you already know the exact search mode, the related endpoints below use the same backend and response shape with more specific naming.

Pricing

ModeCredits
Full search0.05 credits per returned person
No returned people0 credits
Preview mode0 credits
The gateway authorizes up to limit * 0.05 credits before running the search. It finalizes only the actual returned count, so empty and partial-result searches are not overcharged.

Example

At least one company identifier is required: company_domain, company_name, or linkedin_url.
curl -X POST 'https://api.leadmagic.io/v3/people/search' \
  -H 'X-API-Key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "company_domain": "stripe.com",
    "titles": ["VP Sales", "Head of Revenue"],
    "limit": 10
  }'
Full request body:
{
  "company_domain": "stripe.com",
  "company_name": "Stripe",
  "linkedin_url": "https://www.linkedin.com/company/stripe/",
  "title": "VP Sales",
  "job_title": "Head of Revenue",
  "titles": ["VP Sales", "Head of Revenue"],
  "roles": ["Revenue", "Sales"],
  "has_phone": true,
  "hasPhone": true,
  "preview": false,
  "limit": 25,
  "use_embeddings": false
}

Search modes

People Search has two query paths:
Input shapeQuery pathBest for
Company onlycompany_employeesListing employees at a company
Company plus title, job_title, titles, or rolestitle_searchFinding specific personas or roles
When you pass multiple titles or roles, the API searches each term, deduplicates people, and returns up to limit total results.

Request fields

company_domain
string
Company domain. This is the preferred company identifier.
company_name
string
Company name. Use this when you do not have a domain.
linkedin_url
string
LinkedIn company profile URL, such as https://www.linkedin.com/company/stripe/.
title
string
Single title to search for.
job_title
string
Alias for title.
titles
string[]
Up to 12 title or role terms. Terms are deduplicated case-insensitively.
roles
string[]
Role terms. These are combined with titles.
has_phone
boolean
Set to true to return only people with phone availability. Set to false to return only people without phone availability. Omit it to return both.
hasPhone
boolean
Camel-case alias for has_phone.
preview
boolean
default:"false"
Run the search without charging credits. The response shape is the same, but credits_consumed is 0.
limit
integer
default:"25"
Number of people to return. Maximum is 1000.
use_embeddings
boolean
default:"false"
Request semantic matching where available. The response includes a warning if the route uses standard title search.

Response fields

message
string
Human-readable result summary, such as People found or No people found.
credits_consumed
number
Finalized credits charged for this request. This is based on returned people unless preview is true.
people
object[]
Returned people. The exact fields depend on whether the search used company employee lookup or title search.
count
integer
Number of people returned.
returned_count
integer
Alias for count.
limit_applied
integer
The parsed limit used by the route.
resolved_company_domain
string | null
Company domain resolved by the Profile Worker, when available.
resolved_by
string | null
How the company identity was resolved, such as domain, name, or LinkedIn URL.
warnings
string[]
Non-fatal warnings. For example, use_embeddings: true may return contact_profile_embeddings_unavailable; using indexed company/title search instead.
metadata
object
Operational metadata including provider, query name, query path, database timing, and whether embeddings were used.

Person fields

People returned from company employee lookup can include:
FieldTypeDescription
first_namestringFirst name when available
last_namestringLast name when available
full_namestringFull display name
titlestringCurrent or matched job title
job_levelstring | nullNormalized seniority level
job_functionstring | nullNormalized job function
profile_urlstring | nullLinkedIn profile URL
company_namestringCompany name
company_domainstringCompany domain
country_codestring | nullCountry code
headlinestring | nullLinkedIn headline
linkedin_connectionsinteger | nullLinkedIn connection count when available
has_emailbooleanWhether email availability exists
has_mobile_phonebooleanWhether mobile phone availability exists
Title search can also include:
FieldTypeDescription
has_phonebooleanPhone availability for title-search rows
seniority_scorenumber | nullRanking signal for role candidate searches
matched_titlestringTitle term that matched this person

Response example

{
  "message": "People found",
  "credits_consumed": 0.5,
  "people": [
    {
      "first_name": "Jane",
      "last_name": "Doe",
      "full_name": "Jane Doe",
      "title": "VP Sales",
      "job_level": "VP",
      "job_function": "Sales",
      "profile_url": "https://www.linkedin.com/in/jane-doe/",
      "company_name": "Stripe",
      "company_domain": "stripe.com",
      "country_code": "US",
      "headline": "VP Sales at Stripe",
      "has_email": true,
      "has_phone": true,
      "matched_title": "VP Sales"
    }
  ],
  "count": 10,
  "returned_count": 10,
  "limit_applied": 10,
  "resolved_company_domain": "stripe.com",
  "resolved_by": "company_domain",
  "warnings": [],
  "metadata": {
    "provider": "profile_worker",
    "query_name": "people_search_v3",
    "query_path": "title_search",
    "db_ms": 420,
    "embeddings_used": false
  }
}

Phone filtering

has_phone and hasPhone are availability filters. They do not return raw phone numbers from this endpoint. Use Mobile Finder when you need the actual mobile number. When a phone filter is present, the API may fetch a larger candidate set internally and then return only matching people up to your requested limit.

Embeddings

use_embeddings is accepted across the V3 people routes. Contact profile embeddings are not populated for this route yet, so the response can include a warning and fall back to indexed company/title search. POST /v3/people/lookalike forces use_embeddings: true and returns the same response shape. These endpoints share the same handler and response shape:
  • POST /v3/people/mixed-search
  • POST /v3/people/icp-search
  • POST /v3/people/employees
  • POST /v3/people/by-title
  • POST /v3/people/contacts-by-title
  • POST /v3/people/lookalike
Use by-title or contacts-by-title when a title input should be required. Use lookalike when the product flow wants semantic matching where available.

Authorizations

X-API-Key
string
header
required

Your LeadMagic API key. Header name is case-insensitive (X-API-Key, X-API-KEY, x-api-key all work).

Body

application/json
company_domain
string
Example:

"stripe.com"

company_name
string
Example:

"Stripe"

linkedin_url
string
Example:

"https://www.linkedin.com/company/stripe/"

title
string
Example:

"VP Sales"

job_title
string
Example:

"Head of Revenue"

titles
string[]
Maximum array length: 12
roles
string[]
Maximum array length: 12
has_phone
boolean

Return only people with phone availability when true, only people without phone availability when false.

hasPhone
boolean

Camel-case alias for has_phone.

preview
boolean
default:false

Run the search without charging credits. Response shape is unchanged.

limit
integer
default:25
Required range: 1 <= x <= 1000
use_embeddings
boolean
default:false

Response

People search results

message
string
credits_consumed
number

Finalized credits charged for this request.

people
object[]
count
integer
returned_count
integer
limit_applied
integer
resolved_company_domain
string | null
resolved_by
string | null
warnings
string[]
metadata
object