# 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`](/docs/api-reference/enrich-people).

```json
{ "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](/docs/api-reference/enrich-people#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](/docs/getting-started/evaluate#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`](/docs/api-reference/enrich-people) with `people`.

```json
{ "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](/docs/enrichment/company-to-leads).

## Phone

Say: "Find a mobile number for Jane."

**MCP** — `find_phones`. **REST** — [`POST /person/phone`](/docs/api-reference/find-phone).

```json
{ "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`](/docs/api-reference/reverse-email-lookup#reverse-work-email).

```json
{ "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`](/docs/api-reference/reverse-email-lookup#reverse-personal-email).

```json
{ "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.

```json
{
  "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_credits` stops 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 to `save_leads` so the profile and the email land on the row in Leads.
