> ## Documentation Index
> Fetch the complete documentation index at: https://docs.enrichloops.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Reverse email lookup

> Send a work email address. Get the confirmed LinkedIn profile behind it, or an honest "we are not sure".

```
POST /v1/people/enrich
```

Send `email` instead of `linkedinUrl`. Same endpoint, same task response, same result shape as [people enrichment](/people). The difference is how we get there.

| Field      | Type   | Description                                                                                       |
| ---------- | ------ | ------------------------------------------------------------------------------------------------- |
| `email`    | string | A work email address, like `"jane.doe@acme.com"`.                                                 |
| `fullName` | string | Optional tie-break hint. Only read after an `ambiguous` result. Rejected alongside `linkedinUrl`. |
| `title`    | string | Optional tie-break hint. The person's job title.                                                  |
| `location` | string | Optional tie-break hint. A city or country.                                                       |
| `loop_id`  | uuid   | Optional. Also deliver the result to this Loop's webhook.                                         |

## How it works

We do not look the address up in a purchased people database. We resolve it live, against LinkedIn, for your request.

<Steps>
  <Step title="Identify the company">
    The domain tells us which company the address belongs to.
  </Step>

  <Step title="Work out who the address could name">
    `jane.doe@` could be Jane Doe. `jdoe@` could be several people.
  </Step>

  <Step title="Search that company's staff on LinkedIn">
    We look for current employees whose names fit.
  </Step>

  <Step title="Pull each plausible profile and confirm">
    We return a person only when they hold a current position at that company under a name the address fits.
  </Step>
</Steps>

This takes longer than a profile URL lookup. Expect a `202` and poll, or send it through a [Loop](/loops-and-webhooks).

## Example

```bash theme={null}
curl -X POST "https://api.enrichloops.com/v1/people/enrich" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email":"jane.doe@acme.com"}'
```

On success, `data` is a person, plus an `email_match` object saying how we tied the address to them:

```json theme={null}
{
  "task": { "id": "c358aed6-...", "object_type": "person", "status": "succeeded", "credits_charged": 3 },
  "data": {
    "linkedin_url": "https://www.linkedin.com/in/jane-doe",
    "full_name": "Jane Doe",
    "headline": "Head of Finance at Acme",
    "positions": [{ "title": "Head of Finance", "company_name": "Acme", "is_current": true }],
    "email_match": {
      "email": "jane.doe@acme.com",
      "method": "resolved",
      "confidence": 0.9
    }
  }
}
```

| `email_match.method` | Meaning                                                                        |
| -------------------- | ------------------------------------------------------------------------------ |
| `exact`              | The address was already on record against this person.                         |
| `resolved`           | We resolved the address live and confirmed it against a profile we pulled now. |
| `inferred`           | The local part identified them among people we already held at that domain.    |

`confidence` is a number from 0 to 1. It says how strongly the address identifies this person.

## When we are not sure

If the address fits more than one current employee and nothing separates them, the task fails with `ambiguous`. We do not guess. Two Mark Jeffersons at the same company is a real situation, and the wrong one in your CRM is worse than no answer.

```json theme={null}
{
  "task": { "id": "c358aed6-...", "status": "failed", "credits_charged": 0 },
  "error": {
    "code": "ambiguous",
    "message": "More than one person at this company matches that address and nothing separates them. Retry with fullName, title or location to disambiguate.",
    "candidates": 2,
    "hintsAccepted": ["fullName", "title", "location"]
  }
}
```

`candidates` is how many people matched. Names are never included.

To break the tie, send the same `email` again with one or more of `fullName`, `title` or `location`:

```bash theme={null}
curl -X POST "https://api.enrichloops.com/v1/people/enrich" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email":"mark.jefferson@acme.com","title":"VP Sales"}'
```

Hints are read only to separate candidates we already gathered. They are never used as a search filter, so a hint cannot make us return someone the address does not fit.

## Addresses we refuse

Two kinds of address fail with `not_found` before any lookup runs:

* **Personal addresses.** Gmail, Outlook, and other consumer providers. There is no company behind the domain to search.
* **Role addresses.** `info@`, `sales@`, `support@` and similar. They do not name a person.

## Pricing

An email lookup costs 3 credits. A LinkedIn URL lookup costs 1. Resolving an address can take several LinkedIn retrievals, which is where the difference goes.

You only pay when we return a person. `ambiguous`, `not_found`, and every other failure is refunded. An address we cannot confidently resolve never costs you a credit.

## Freshness

An address that resolves to a person we already hold follows the same rule as [people enrichment](/people): a profile older than 30 days is re-fetched before the task settles.

## Through a Loop

Create a `person` Loop in the dashboard and send the address to it:

```bash theme={null}
curl -X POST "https://api.enrichloops.com/v1/loops/YOUR_LOOP_ID/run" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email":"jane.doe@acme.com"}'
```

A confirmed person arrives on your webhook as `task.succeeded`. An `ambiguous` result arrives as `task.failed` with the same `error` object shown above, so your receiver can retry with a hint.
