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

# LinkedIn URL → Profile

> Turn a LinkedIn, Sales Navigator, or Recruiter profile URL into a full contact profile with verified emails, direct dials, and mobile numbers.

> [!NOTE]
>
> **Endpoint** `POST /contacts/research` · **Credits** 1 per profile · **Delivery** async (poll or webhook) · **Versions** v1, v2

## Introduction

Send a LinkedIn profile URL and get back the contact details LinkedIn doesn't show: work and personal emails with validation status, direct dials, mobile numbers, company phones, and a normalized location. Accepts public profile URLs, Sales Navigator URLs, and Recruiter URLs.

Use it to enrich LinkedIn exports, Sales Navigator lead lists, and URLs captured by your own tools.

## AI agent prompt

```text theme={null}
Read https://docs.seamless.ai/llms.txt and https://docs.seamless.ai/api-catalog/linkedin-to-profile.
Using my Seamless.AI API key from SEAMLESS_API_KEY, read a CSV of LinkedIn URLs, send them in batches
of up to 500 to POST https://api.seamless.ai/api/client/v1/contacts/research as
{"contacts":[{"liProfileUrl": <url>}]}, poll each requestId until done,
and write email, contactPhone1, jobTitle, and companyName back to the CSV.
```

## Authentication

Send your API key in the `Token` header, or `Authorization: Bearer <token>` with [OAuth](/authentication/oauth). Create a key under [Settings → Public API](/authentication/api-keys).

## Example

```bash cURL theme={null}
curl -X POST https://api.seamless.ai/api/client/v1/contacts/research \
  -H "Token: $SEAMLESS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "contacts": [
      { "liProfileUrl": "https://www.linkedin.com/in/janedoe" },
      { "liSalesNavUrl": "https://www.linkedin.com/sales/lead/ACwAAA..." }
    ]
  }'
```

```python Python theme={null}
import os, requests

resp = requests.post(
    "https://api.seamless.ai/api/client/v1/contacts/research",
    headers={"Token": os.environ["SEAMLESS_API_KEY"]},
    json={"contacts": [{"liProfileUrl": "https://www.linkedin.com/in/janedoe"}]},
)
request_ids = resp.json()["requestIds"]  # poll /contacts/research/poll with these
```

```javascript Node.js theme={null}
const resp = await fetch("https://api.seamless.ai/api/client/v1/contacts/research", {
  method: "POST",
  headers: { Token: process.env.SEAMLESS_API_KEY, "Content-Type": "application/json" },
  body: JSON.stringify({ contacts: [{ liProfileUrl: "https://www.linkedin.com/in/janedoe" }] }),
});
const { requestIds } = await resp.json();
```

```bash Poll theme={null}
curl "https://api.seamless.ai/api/client/v1/contacts/research/poll?requestIds=REQUEST_ID" \
  -H "Token: $SEAMLESS_API_KEY"
```

## Reference

Each item in `contacts` needs one of these URLs. Up to 500 items per request.

| Parameter | Type | Description |
| - | - | - |
| `contacts[].liProfileUrl` | string | Public LinkedIn profile URL |
| `contacts[].liSalesNavUrl` | string | Sales Navigator lead URL |
| `contacts[].liRecruiterUrl` | string | LinkedIn Recruiter profile URL |
| `listIds` | integer\[] | Optional. Add each contact to these Seamless lists. |
| `skipDeduplicationCheck` | boolean | Optional. Research again even if researched recently. Uses credits. |

## Response

The call returns `202` with `requestIds`. When a poll returns `status: done`, `contact` holds the full record:

| Field | Description |
| - | - |
| `email`, `email1`-`email3`, `email{n}EmailAI` | Work emails with validation status |
| `personalEmail` | Personal email, when available |
| `contactPhone1`, `contactPhone2`, `contactPhone{n}DataType` | Direct dials and mobiles |
| `companyPhone1`-`companyPhone3` | Company phones |
| `fullName`, `jobTitle`, `seniority`, `companyName`, `companyDomain` | Identity and employer |
| `lIProfileUrl`, `lISalesNavUrl`, `lIRecruiterUrl` | All known LinkedIn URLs |

See the [Data dictionary](/api-catalog/data-dictionary) for every field.

## Errors

| Status | Meaning |
| - | - |
| `401` | Missing or invalid API key |
| `422` | `insufficientCredits` or `missingLicense` |
| `429` | Rate limit reached |
| Poll `not found` | No person matched the URL |

## Related

* [Email → Profile](/api-catalog/email-to-profile)
* [Phone → Profile](/api-catalog/phone-to-profile)
* [Contact Research API](/api-catalog/contact-enrichment)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.