Skip to main content
POST
Enrich person by multiple parameters

Minimum Requirements

Every request must include at least one of the following:
  1. A primary identifier (any single field is sufficient)
  2. Name + context (name plus at least one contextual field)
Requests that don’t meet these requirements return 400 Bad Request.

Primary Identifiers

Any one of these fields is enough to look up a person on its own:

Name + Context

When no primary identifier is available, provide a name (first_name, last_name, or full_name) plus at least one contextual field: You can combine multiple context fields for better match accuracy. For example, name + company + birth_date uses company for matching and birth_date to narrow results.
Name alone or location alone is not sufficient. The API requires name plus at least one contextual field for non-identifier lookups.

URLs and Domains

The company and school fields accept names, website URLs, or social URLs:
URLs and domains are resolved to the corresponding company or school name before matching.

Authorizations

API-Key
string
header
required

Body

application/json

Request model for person enrichment. Requires a primary identifier (email, phone, social_url, linkedin_id, legion_id, email_hash) OR name + context (location, company, school, job_title, birth_date).

email
string | null

Email address (will be normalized)

email_hash
string | null

SHA-256 (64 chars), SHA-1 (40 chars), or MD5 (32 chars) hash of normalized email address (for privacy)

phone
string | null

Phone number (will be normalized to E.164)

linkedin_id
string | null

LinkedIn numeric ID

social_url
string | null

Social profile URL (LinkedIn, Twitter/X, GitHub, Facebook - will be normalized and detected)

legion_id
string | null

Legion ID (exact match)

full_name
string | null

Full name (will be normalized)

first_name
string | null

First name (will be normalized)

last_name
string | null

Last name (will be normalized)

address
string | null

Full address string (will be parsed to extract city, state, postal_code, and country)

city
string | null

City name

state
string | null

State name or code

country
string | null

Country name or code

postal_code
string | null

Postal/ZIP code

job_title
string | null

Job title

company
string | null

Company name, website, or social URL

school
string | null

School name, website, or social URL

birth_date
string | null

Birth date for matching or narrowing name-based results (YYYY-MM-DD, YYYY-MM, or YYYY). Can be used as name + birth_date lookup or as a qualifier on other name-based combos.

multiple_results
boolean
default:false

If true, return multiple matches sorted by confidence

limit
integer
default:2

Maximum number of results to return when multiple_results=true (default: 2, max: 10)

Required range: 1 <= x <= 10
min_confidence
string | null

Minimum match confidence level to include in results: 'high', 'moderate', or 'low'. Matches below this threshold will be filtered out.

titlecase
boolean
default:false

If true, format text fields in title case (names, job titles, company names, locations, skills, headlines). Raw fields, IDs, URLs, codes, and confidence fields are excluded.

required_fields
string | null

Comma-separated list of fields that must be present, else the match is filtered out. Supports top-level fields ('work_email,phones'), a non-empty list subfield ('emails.type'), or a subfield equal to a value ('emails.type:personal', 'phones.type:mobile', 'socials.network:linkedin'). Unknown field names or out-of-range enum values return HTTP 400.

include_fields
string | null

Comma-separated list of fields to include in response. If omitted, all fields are returned.

exclude_fields
string | null

Comma-separated list of fields to exclude from response. Applied after include_fields filter.

pretty_print
boolean
default:false

If true, pretty-print JSON response with indentation.

Response

Success - person(s) found

Multiple person matches response.

matches
PersonMatchResponse · object[]
required

List of matches sorted by confidence (descending). Capped at the request's limit.

total
integer
required

For /person/search and /person/discover, the total number of rows matching the query's WHERE clause across the database (not just this page). For /person/enrich, the number of matches found for the input identifier. On search/discover, if the exact count exceeds its time budget (broad, low-selectivity queries) it falls back to the query planner's row estimate, and if that is unavailable, to the size of the returned page; the response header Total-Count-Status reports which (exact, estimate, or page).