> ## 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.

# People enrichment

> Send a LinkedIn profile URL. Get the person's profile and employment history back.

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

Send exactly one of `linkedinUrl` or `email`. This page covers `linkedinUrl`. For `email`, see [reverse email lookup](/reverse-email-lookup).

| Field         | Type   | Description                                                            |
| ------------- | ------ | ---------------------------------------------------------------------- |
| `linkedinUrl` | string | A LinkedIn profile URL, like `"https://www.linkedin.com/in/jane-doe"`. |
| `email`       | string | A work email address, as an alternative to `linkedinUrl`.              |
| `loop_id`     | uuid   | Optional. Also deliver the result to this Loop's webhook.              |

## 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 '{"linkedinUrl":"https://www.linkedin.com/in/jane-doe"}'
```

The response is a task. Poll it, then read `data`:

```json theme={null}
{
  "task": { "id": "c358aed6-...", "object_type": "person", "status": "succeeded" },
  "data": {
    "linkedin_url": "https://www.linkedin.com/in/jane-doe",
    "full_name": "Jane Doe",
    "first_name": "Jane",
    "last_name": "Doe",
    "headline": "Head of Finance at Acme",
    "city": "Amsterdam",
    "country_code": "NL",
    "linkedin_followers": 2400,
    "linkedin_connections": 500,
    "memorialized": false,
    "enrichment_status": "enriched",
    "last_enriched_at": "2026-09-01T10:14:02.000Z",
    "positions": [
      {
        "title": "Head of Finance",
        "company_name": "Acme",
        "company": { "name": "Acme", "domain": "acme.com" },
        "company_linkedin_url": "https://www.linkedin.com/company/acme",
        "employment_type": "Full-time",
        "location": "Amsterdam, Netherlands",
        "start_date": "2023-03-01",
        "start_date_precision": "month",
        "end_date": null,
        "end_date_precision": null,
        "is_current": true
      }
    ]
  }
}
```

## The result

Profile fields: `full_name`, `first_name`, `last_name`, `headline`, `about`, `avatar_url`, `city`, `country_code`, `linkedin_followers`, `linkedin_connections`. Any of them can be `null` when LinkedIn does not show it.

`memorialized` is `true` when LinkedIn has marked the profile as belonging to someone who has died.

### Positions

`positions` is the employment history, current roles first. Two things to know:

* **`company` is often `null`.** A LinkedIn experience entry gives an employer name and rarely anything we can match to a company record. Read `company_name`. It is populated whenever we have an employer at all. Treat `company` as extra detail for the cases where we matched it.
* **Dates are always full dates but not always fully known.** Read `start_date_precision` and `end_date_precision` before displaying them. A source that gave only `"2021"` comes back as `2021-01-01` with precision `"year"`.

## Freshness

A stored profile older than 30 days is not served as-is. The request is queued (`202`), the profile is re-fetched, and then the task settles. This matters more for people than for companies. A person who changed jobs is not just out of date. The new role is usually the reason you asked.

Refreshing costs the same 1 credit as any other profile request.

If the refresh cannot complete, the task still succeeds and returns the stored record. Compare `last_enriched_at` to tell the two apart.
