Enrichment
People enrichment
Profile, work email, phone, and the person behind an email address.
You have a person. People enrichment fills in the rest: the full LinkedIn profile, a work email checked over SMTP (also from just a name and a company domain), a phone number, or, from an email address, who it is. All of it is open for every key and every assistant.
Profile#
Say: "Get the full profile of these three people."
MCP — enrich_people with profile_urls. REST — POST /person/enrich.
{ "profile_urls": ["https://www.linkedin.com/in/jane-example"] }
Up to 25 profiles per call, each fetched live from LinkedIn: current and past positions, education, skills, languages and certifications. 0.6 credits per profile found; a profile that does not exist costs nothing. The member-id URL that Search People returns works too. On the REST API, a per_… id from a search goes in person_ids while Signals is turned on.
A person your workspace enriched in the last 30 days comes back from that result for free, with reused: true and the email's original checked_at; a result without include_email does not count for a call with it. Send refresh: true to look them up again, which charges as usual.
Work email#
Say: "And their work email."
Add include_email: true to the same call. We build the address from the name and the company domain and check it over SMTP; when we only find a personal address, you get that one. 0.6 credits more per address found, nothing when there is none. email_status says what the check found: verified, catch_all, unverifiable or not_found, and person.email.checked_at when. Someone who runs more than one company gets the address of one of them: email_employer says which current employer fits the domain (null when none does). See Work email.
When that finds no address, a second source looks. It usually answers within a minute, and the call waits up to 30 seconds for it. An email still being looked up comes back as email_status: "pending": send the same URLs again after retry_after_seconds. That call returns the same profile with the email and charges only the email.
Measured on 27 October 2026 with both sources, Enrich People found a work email for 123 of 139 people (88%) in seven European countries, 64 verified and 59 catch-all. The rate per country and how it was measured: Work emails per country.
Email from a name#
Say: "Find the work email of Jane Example at acme.com."
MCP — enrich_people with people. REST — POST /person/enrich with people.
{ "people": [{ "first_name": "Jane", "last_name": "Example", "domain": "acme.com" }] }
For when you have a name and a company but no LinkedIn profile: the same Enrich People call, with the person in people instead of profile_urls. Each needs first_name, last_name and domain (the company domain, not a personal provider like gmail.com); profile_urls and people together take up to 25 per call. For them only the work email is looked up, also without include_email, at the price of every work email: 0.6 credits per address found, once; nothing found is free. Their entries come after the profiles, with person null and the address in email, with email_status, checked_at and save_input for save_leads. When the first source finds nothing, a second source looks; a person still being looked up after the wait comes back as pending: send them again after retry_after_seconds. With a LinkedIn profile, send the profile instead: you also get the profile. To find people you do not know yet, use Search People.
Phone#
Say: "Find a mobile number for Jane."
MCP — find_phones. REST — POST /person/phone.
{ "profile_urls": ["https://www.linkedin.com/in/jane-example"] }
Up to 25 profiles, mobile first. 10 credits per person with a number found, and only once: asking again for the same person is free. Nobody found, a lookup that is still running, or an error costs nothing. Most lookups answer within seconds; a person still being looked up after the wait comes back as pending: send the same URLs again after retry_after_seconds.
Reverse work email#
Say: "Who is behind jane@acme.example?"
MCP — reverse_email_lookup. REST — POST /person/reverse-email.
{ "emails": ["jane@acme.example"] }
You get the full profile (the same fields as Enrich People) and their company, with the domain of the address as company.domain; email_type is work. 1 credit per person found; an address nobody matches is free.
Reverse personal email#
Say: "Who is behind jane.example@gmail.com?"
MCP — reverse_email_lookup. REST — POST /person/reverse-email.
{ "emails": ["jane.example@gmail.com"] }
For an address at Gmail, Outlook, iCloud or another mailbox provider: the same call, at the same 1 credit per person found. You get the full profile and the current employer from it; company.domain is null, because the address says nothing about the company, and email_type is personal. To reach them at work, send the profile to Enrich People with include_email.
Both kinds take up to 25 addresses per call, also mixed. The address itself is not checked over SMTP: for a verified work email, use Enrich People with include_email. When the first source finds nobody, a second source looks; an address still being looked up after the wait comes back as pending: send it again after retry_after_seconds. The person is charged once, on the call that returns them.
When no source knows the address#
As a last step, the call looks for the person by the name in the address (jan.peeters@acme.example is Jan Peeters): at the company of a work address, and for a personal address at the company or in the country you send with it, or of an IP address they used. Every match says how it was found: match is direct (a source knows the address itself, always confidence: "high") or inferred (found by name), and match_reason says why in one sentence.
- high: a work address, the only person by that name at that company, and a separate check gives this exact address for them.
- medium: the only person by that name at a company, not confirmed; or the only one in the country with a name that is rare worldwide.
- low: the only one by that name in the country, but the name is common elsewhere.
Two or more people with that name is no match. Only matches at or above min_confidence come back (default high), so for a personal address send "min_confidence": "medium" or "low". Tell the user how sure a match is before you contact anyone. What you know helps: send an entry as an object.
{
"emails": [{ "email": "wouter.vanderzwalm@gmail.com", "country": "BE", "ip": "84.195.100.1" }],
"min_confidence": "medium"
}
first_name and last_name (when the address does not show the name), company, country and ip are all optional; the IP address is used during the call only and never stored. A match by name costs the same 1 credit; a match below min_confidence is not returned and costs nothing.
Before you enrich#
- Enrich the people you keep, not every row a search returned: decide first from the headline, the title and the company.
max_creditsstops the call before it would cost more: a profile that would pass it is skipped and costs nothing.- The same person twice in one call, also in two URL forms, is charged once.
- An enriched profile carries
save_input: pass it tosave_leadsso the profile and the email land on the row in Leads.