> Enrich.chat gives AI agents verified work emails and mobiles. To use it from an agent, read https://enrich.chat/agents.md . This is the Markdown version of https://enrich.chat/api/linkedin-to-contact/

# LinkedIn URL in, verified work email and mobile out

Send a LinkedIn profile URL to one endpoint. Get back a work email with a status and a mobile with a line type. We never log in to LinkedIn, and credits are spent only when we find a match.

By Enrich.chat Editorial. Updated October 15, 2026.

**Short answer:** To get an email from a LinkedIn URL, send the profile URL to a contact data API. Enrich.chat's GET /v1/person returns a work email marked verified, catch_all or unknown and a mobile with its line type. A work email found uses 10 credits, a mobile 250, and no match uses 0. [LinkedIn's own API](https://learn.microsoft.com/en-us/linkedin/consumer/integrations/self-serve/sign-in-with-linkedin-v2) only shares the email of a member who signs in to your app.

## Key takeaways

- One GET request turns a LinkedIn profile URL into a work email and a mobile, each with its own status.
- Enrich.chat never logs in to LinkedIn or uses anyone's LinkedIn account. The URL is only a lookup key.
- LinkedIn's User Agreement bans scraping and bots, and Proxycurl shut down on July 4, 2025 after LinkedIn sued it.
- Credits are spent only on matches: 10 per work email, 250 per mobile, 0 on a miss. 10 lookups a day are free.

## Everything you need to turn a profile URL into a contact

- **Any profile URL format.** With or without https or www, a trailing slash, or a share-link query string.
- **No LinkedIn login.** We never log in to LinkedIn or use anyone's account. The URL is only a lookup key.
- **Catch-all flagged.** Domains that accept every address come back as catch_all, so you can treat them as risky.
- **A status on every field.** Email comes back verified, catch_all or unknown. Mobile comes back with a line of mobile or unknown.
- **Credits only on matches.** A miss uses 0 credits. Unlimited seats on every plan, billed monthly.
- **Ready for agents.** Add the MCP server at enrich.chat/mcp, or let any agent read /agents.md and call the API. No SDK needed.

## From LinkedIn URL to verified contact

1. **Send the LinkedIn URL.** GET /v1/person with linkedin_url and fields=email,mobile.
2. **We match the person.** We return the work email with its status and the mobile with its line type.
3. **Use the result.** Read each field's status, then write it to your CRM, sheet or agent.

## How do you get an email and phone number from a LinkedIn URL?

Send the profile URL to an API that accepts LinkedIn URLs as input. With Enrich.chat it is one GET request to `/v1/person` with `linkedin_url` and `fields=email,mobile`. You get back the person's work email with a status and their mobile with a line type.

LinkedIn's self-serve API does not offer this lookup. Its [Sign In with LinkedIn](https://learn.microsoft.com/en-us/linkedin/consumer/integrations/self-serve/sign-in-with-linkedin-v2) product returns only the email of the member who signs in to your app. On the site, a member's primary email is [visible only to direct connections by default](https://www.linkedin.com/help/linkedin/answer/261). So a URL from a search, a spreadsheet or your CRM needs a lookup service to become a contact. For the manual routes, see [how to find an email on LinkedIn](https://enrich.chat/blog/find-email-on-linkedin/).

**Figure 1: How a LinkedIn URL becomes a contact.** A LinkedIn profile URL goes into Enrich.chat, which cleans the URL, matches the person and returns the work email and mobile. There are three outcomes: a work email with a status of verified, catch_all or unknown; a mobile with a line of mobile or unknown; or no match, which returns found false and uses 0 credits.

*One request, three possible outcomes. Every contact field carries its own status. Source: [Enrich.chat agent docs](https://enrich.chat/agents.md).*

Every contact field comes with a status, so your code or your agent can decide what to trust:

| Field | Value | What it tells you |
| --- | --- | --- |
| `work_email.status` | verified | Our records mark the mailbox as verified. |
| `work_email.status` | catch_all | The domain accepts every address, so the mailbox cannot be confirmed. Treat it as risky. Test domains with the [catch-all checker](https://enrich.chat/tools/catch-all-checker/). |
| `work_email.status` | unknown | We could not confirm the mailbox. |
| `mobile.line` | mobile | The number is a mobile number. That is its type, not a check that the line is live, and it does not prove the number belongs to the person. |
| `mobile.line` | unknown | The number's type could not be told. The [phone number validator](https://enrich.chat/tools/phone-number-validator/) explains line types. |
| `found` | false | No match. It uses 0 credits. |

Need one field only? `GET /v1/mobile?linkedin_url=...` returns just the phone, and `/v1/email` also accepts `linkedin_url`. To test a few profiles without code, paste them into the free [LinkedIn email and phone finder](https://enrich.chat/tools/linkedin-email-finder/).

```text
Use www.enrich.chat to find the work email and mobile number for linkedin.com/in/jane-doe-ops
```

## Why does it matter that Enrich.chat never logs in to LinkedIn?

It matters because LinkedIn bans scraping and automation, and it sues the companies that do it. Enrich.chat never logs in to LinkedIn or uses anyone's LinkedIn account. The URL is only a lookup key, so no LinkedIn account of yours is involved.

Section 8.2 of the [LinkedIn User Agreement](https://www.linkedin.com/legal/user-agreement) forbids software, scripts and browser plugins used "to scrape or copy the Services, including profiles and other data." It also bans bots and other unauthorized automated access. LinkedIn's [prohibited software page](https://www.linkedin.com/help/linkedin/answer/a1341387) warns that members who use such tools risk having their accounts restricted or shut down.

**Figure 2: Scraper versus lookup API.** A scraper or account automation tool signs in to LinkedIn, opens the profile page and copies the page data, which breaks section 8.2 of the LinkedIn User Agreement and puts the account at risk. A lookup API such as Enrich.chat takes the URL only as a lookup key and returns a work email and mobile without ever logging in to LinkedIn or using anyone's account.

*A scraper works through a LinkedIn login. A lookup API takes the URL as a key and never signs in. Source: [LinkedIn User Agreement, section 8.2](https://www.linkedin.com/legal/user-agreement).*

LinkedIn enforces these terms in court:

- **hiQ Labs, 2022.** The long scraping case ended in a [$500,000 consent judgment](https://www.proskauer.com/blog/hiq-and-linkedin-reach-proposed-settlement-in-landmark-scraping-case) and a permanent ban on scraping LinkedIn.
- **Proxycurl, 2025.** LinkedIn [sued Proxycurl in January](https://news.linkedin.com/2025/linkedin-takes-legal-action-to-defend-member-privacy) over fake accounts and scraping. Proxycurl [shut down on July 4, 2025](https://nubela.co/blog/goodbye-proxycurl/), and a [permanent injunction](https://www.socialmediatoday.com/news/linkedin-wins-legal-case-data-scrapers-proxycurl/756101/) required it to delete all LinkedIn data it obtained without authorization.
- **ProAPIs, 2025.** In October, LinkedIn [sued ProAPIs](https://therecord.media/linkedin-sues-data-scraping-company), alleging a network of fake accounts that scraped member data and sold it.

The lesson for buyers: a tool that drives a LinkedIn account puts that account at risk, and a vendor that depends on scraping can vanish along with your pipeline. Our review of [LinkedIn MCP servers](https://enrich.chat/blog/linkedin-mcp/) covers the same risk for agent tools.

## Which LinkedIn URL formats does the API accept?

Any public profile URL that contains `linkedin.com/in/`. The protocol, `www`, a trailing slash and share-link query strings are all optional, so you can send URLs exactly as you copied them.

| Accepted format | Example |
| --- | --- |
| Full URL | `https://www.linkedin.com/in/jane-doe-ops` |
| No protocol | `www.linkedin.com/in/jane-doe-ops` |
| No protocol or www | `linkedin.com/in/jane-doe-ops` |
| Trailing slash | `linkedin.com/in/jane-doe-ops/` |
| Share link with a query string | `linkedin.com/in/jane-doe-ops?utm_source=share` |

URL-encode the value when it carries a query string, so its `?` and `&` do not break your request. In Python, `requests` does this for you through `params`. With cURL, add the `-G` flag and pass the URL through `--data-urlencode`:

```
URL="https://www.linkedin.com/in/jane-doe-ops/?utm_source=share"
curl -G "https://enrich.chat/v1/person" \
  --data-urlencode "linkedin_url=$URL" \
  -d "fields=email"
```

Two tips. Sales Navigator lead pages use a different address, so open the lead's regular LinkedIn profile and copy its `/in/` URL. And members can change their custom URL [up to five times in six months](https://www.linkedin.com/help/linkedin/answer/a542685), while LinkedIn keeps the old one linked for six months. Store the `linkedin_url` the API returns next to your original.

## How do you look up a list of LinkedIn URLs in bulk?

Loop over the list and call `/v1/person` once per URL, at no more than 5 requests per second. Ask only for the fields you need, record which rows are done, and handle the few error codes below.

```
import os
import time
import requests

# Optional: a paid key from enrich.chat/account/ lifts the free limit
key = os.environ.get("ENRICH_KEY")
headers = {"Authorization": "Bearer " + key} if key else {}

urls = [
    "linkedin.com/in/jane-doe-ops",
    "https://www.linkedin.com/in/john-roe/",
]
results = {}
total_credits = 0

for url in urls:
    while True:
        r = requests.get(
            "https://enrich.chat/v1/person",
            params={"linkedin_url": url, "fields": "email,mobile"},
            headers=headers,
            timeout=30,
        )
        if r.status_code != 429:
            break
        # Rate limited: wait retry_after seconds, then retry
        time.sleep(r.json().get("retry_after", 5))

    if r.status_code == 402:  # today's free lookups are used up
        print("Stopped before", url, r.json()["upgrade_url"])
        break
    results[url] = r.json()  # found: false rows use 0 credits
    total_credits += results[url].get("credits_used", 0)
    time.sleep(0.2)  # 5 requests per second at most

print("credits used:", total_credits)
```

| Response | Meaning | What to do |
| --- | --- | --- |
| `"found": false` | No match for this URL | It uses 0 credits. Try an email or name plus company. |
| `400` | Bad or missing parameter | Fix the request. Do not retry it unchanged. |
| `401` | `invalid_api_key`: the key is wrong or was revoked | Check the key on your [account page](https://enrich.chat/account/), or leave it out to use the free tier. |
| `402` | `free_limit_reached`, or with a key `credits_exhausted` or `plan_inactive` | Stop and tell the user about the `upgrade_url`, which points to [/account/](https://enrich.chat/account/). Free lookups resume after `resets_at`. Credits come back with the next monthly payment. |
| `429` | Too many requests | Wait `retry_after` seconds, then continue. |
| `503` | Temporarily unavailable | Retry once after `retry_after` seconds. Nothing was used. |

### In Clay, n8n and AI agents

In Clay, add an [HTTP API enrichment column](https://university.clay.com/docs/http-api-integration-overview). Set the method to GET, map your LinkedIn column to the `linkedin_url` query parameter, and add a headers account with your key if you have one. Clay's rate limit setting caps requests per time window, and its field paths pull out `work_email.value` and `mobile.value`. In n8n, use the [HTTP Request node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/) with query parameters and header auth, then set Items per Batch to 5 and Batch Interval to 1000 ms. In ChatGPT, Claude or Cursor, paste this prompt with your list:

```text
Use www.enrich.chat to find the work email and mobile for each LinkedIn URL in this list. Add them as new columns and tell me the total credits_used
```

## How much does a LinkedIn to email lookup cost?

Enrich.chat spends credits only on matches: 10 for a work email and 250 for a mobile found. A lookup that finds nothing returns `"found": false` and uses 0 credits.

| What you ask for | Credits | Used when |
| --- | --- | --- |
| Work email (`fields=email`) | 10 | A work email is found |
| Mobile (`fields=mobile` or `/v1/mobile`) | 250 | A mobile is found |
| Profile (`fields=profile`) | 5 | A profile is returned |
| No match | 0 | Never |

Each response carries `credits_used`, so you can total a run as it goes. The sample response above found both fields, so it used 260 credits, 10 plus 250. Every IP also gets 10 free lookups a day with no signup, and nothing is charged on the free tier. For more, plans bill monthly: Growth $29 for 100,000 credits, Scale $90 for 500,000 credits, Pro $299 for 2,500,000 credits. Every plan has unlimited seats. A list of 1,000 profiles where every row returns an email and a mobile uses 260,000 credits, which fits the Scale plan at $90 a month. To get a key, log in at [enrich.chat/account/](https://enrich.chat/account/) with your email and a one-time code, pick a plan, and pay through checkout. The key appears on that page. Send it as `Authorization: Bearer pp_...` or `?key=pp_...`. A key is optional on the free tier. Credits renew with each monthly payment, and unused credits do not roll over. See [Enrich.chat pricing](https://enrich.chat/pricing/) for the details.

## Who uses a LinkedIn to contact API?

It suits anyone who holds LinkedIn URLs but needs a way to reach the people behind them. Four groups fit best: former Proxycurl users, Sales Navigator users, recruiters and AI SDR builders.

### Former Proxycurl users

Proxycurl's founder lists the [Person Profile, Work Email Lookup and Personal Contact Number Lookup endpoints](https://nubela.co/blog/what-is-proxycurl-api-now-in-2026-im-the-founder/) among its main ones. Each has a direct Enrich.chat equivalent that takes the same LinkedIn URL:

| Proxycurl endpoint | Enrich.chat request |
| --- | --- |
| Person Profile | `GET /v1/person?linkedin_url=...&fields=profile` |
| Work Email Lookup | `GET /v1/email?linkedin_url=...` |
| Personal Contact Number Lookup | `GET /v1/mobile?linkedin_url=...` |

**Figure 3: LinkedIn legal actions against scrapers, 2022 to 2025.** A timeline: in December 2022 hiQ Labs accepted a $500,000 judgment and a permanent ban on scraping LinkedIn; in January 2025 LinkedIn sued Proxycurl; on July 4, 2025 Proxycurl shut down; in July 2025 a settlement and permanent injunction required Proxycurl to delete LinkedIn data; in October 2025 LinkedIn sued ProAPIs over a fake account network that sold scraped data.

*LinkedIn takes scrapers to court, and two cases ended in permanent injunctions. Sources: [Proskauer](https://www.proskauer.com/blog/hiq-and-linkedin-reach-proposed-settlement-in-landmark-scraping-case), [LinkedIn](https://news.linkedin.com/2025/linkedin-takes-legal-action-to-defend-member-privacy), [Nubela](https://nubela.co/blog/goodbye-proxycurl/), [Social Media Today](https://www.socialmediatoday.com/news/linkedin-wins-legal-case-data-scrapers-proxycurl/756101/), [The Record](https://therecord.media/linkedin-sues-data-scraping-company).*

For other replacements and a migration checklist, read the [Proxycurl alternatives guide](https://enrich.chat/blog/proxycurl-alternative/).

### Sales Navigator users and recruiters

A saved lead list or a candidate pipeline is mostly profile URLs, because LinkedIn shows a member's email [only to direct connections by default](https://www.linkedin.com/help/linkedin/answer/261). Send those URLs to the API and reach people by email or phone. If you are weighing seat costs, see our [Sales Navigator pricing breakdown](https://enrich.chat/blog/linkedin-sales-navigator-pricing/), and for phone-first outreach read [how to get phone numbers from LinkedIn](https://enrich.chat/blog/find-phone-number-from-linkedin/).

### AI SDR and agent builders

An agent reads [agents.md](https://enrich.chat/agents.md) once and starts calling the API, or adds the [remote MCP server](https://enrich.chat/install/) at enrich.chat/mcp, which needs no key. There is no SDK yet; SDKs are planned. For search and company lookups, see [Enrich.chat for AI agents](https://enrich.chat/agents/). To start from an email or a name instead, use the [people enrichment API](https://enrich.chat/api/person-enrichment/). If your agent calls mobiles, [US law](https://www.law.cornell.edu/uscode/text/47/227) requires prior express consent for autodialed or prerecorded calls to cell phones. Anyone can remove their data at [enrich.chat/opt-out](https://enrich.chat/opt-out/).

## Frequently asked questions

### Can you get someone's email from their LinkedIn URL?

Yes, with a contact data API that accepts LinkedIn URLs. LinkedIn shows a member's primary email [only to direct connections by default](https://www.linkedin.com/help/linkedin/answer/261), and its official API only shares the email of a member who signs in to your app. Enrich.chat takes the URL as a lookup key and returns a work email marked verified, catch_all or unknown. A work email found uses 10 credits, and no match uses 0.

### Does LinkedIn have an API that returns email addresses?

Only for your own users. [Sign In with LinkedIn using OpenID Connect](https://learn.microsoft.com/en-us/linkedin/consumer/integrations/self-serve/sign-in-with-linkedin-v2) has an email scope that returns the primary email of the member who signs in to your app, and LinkedIn notes the field can be missing. It does not let you look up other members' emails or phone numbers by profile URL. For that you need a third-party lookup API such as Enrich.chat.

### Is it legal to get emails and phone numbers from LinkedIn URLs?

It depends on how the data is collected and how you use it. LinkedIn's [User Agreement](https://www.linkedin.com/legal/user-agreement) bans scraping and bots, and LinkedIn has sued scrapers such as Proxycurl. Enrich.chat never logs in to LinkedIn or uses anyone's account. Your outreach must still follow CAN-SPAM and GDPR for email and the TCPA for calls to mobiles. This is general information, not legal advice.

### What replaced Proxycurl for LinkedIn URL lookups?

[Proxycurl shut down on July 4, 2025](https://nubela.co/blog/goodbye-proxycurl/), after LinkedIn sued it in January 2025. If you used its Work Email Lookup or Personal Contact Number Lookup endpoints, Enrich.chat's /v1/email and /v1/mobile take the same LinkedIn URL and return a work email or a mobile, each with a status. Our [Proxycurl alternatives guide](https://enrich.chat/blog/proxycurl-alternative/) compares the other options.

### Can I get a mobile number from a LinkedIn profile?

Yes. Send the profile URL to GET /v1/mobile and Enrich.chat returns the mobile with a line of mobile or unknown. That is the number's type, not a check that the line is live, and it does not prove the number belongs to that person, so confirm before you rely on it. A mobile found uses 250 credits, and a miss uses 0.

### Will a LinkedIn email finder get my LinkedIn account banned?

It can, if the tool works through your LinkedIn session. LinkedIn says members who use scraping or automation tools [risk having their accounts restricted or shut down](https://www.linkedin.com/help/linkedin/answer/a1341387), and its User Agreement names browser plugins that copy profiles. Enrich.chat never logs in to LinkedIn or uses your account. You send it a URL, so your account is not involved.

## Sources

1. [User Agreement, section 8.2](https://www.linkedin.com/legal/user-agreement)
2. [Prohibited software and extensions](https://www.linkedin.com/help/linkedin/answer/a1341387)
3. [LinkedIn takes legal action to defend member privacy](https://news.linkedin.com/2025/linkedin-takes-legal-action-to-defend-member-privacy)
4. [Proxycurl Shuts Down. Thank you.](https://nubela.co/blog/goodbye-proxycurl/)
5. [What Is Proxycurl API Now in 2026? I'm the founder.](https://nubela.co/blog/what-is-proxycurl-api-now-in-2026-im-the-founder/)
6. [LinkedIn Wins Legal Case Against Data Scrapers](https://www.socialmediatoday.com/news/linkedin-wins-legal-case-data-scrapers-proxycurl/756101/)
7. [LinkedIn sues software company allegedly scraping data from millions of profiles](https://therecord.media/linkedin-sues-data-scraping-company)
8. [hiQ and LinkedIn Reach Proposed Settlement in Landmark Scraping Case](https://www.proskauer.com/blog/hiq-and-linkedin-reach-proposed-settlement-in-landmark-scraping-case)
9. [Sign In with LinkedIn using OpenID Connect](https://learn.microsoft.com/en-us/linkedin/consumer/integrations/self-serve/sign-in-with-linkedin-v2)
10. [Manage who can see your email address on LinkedIn](https://www.linkedin.com/help/linkedin/answer/261)
11. [Manage your public profile URL](https://www.linkedin.com/help/linkedin/answer/a542685)
12. [HTTP API](https://university.clay.com/docs/http-api-integration-overview)
13. [HTTP Request node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/)
14. [47 U.S. Code § 227](https://www.law.cornell.edu/uscode/text/47/227)

## Examples

**cURL**

```bash
# Email and mobile in one call
curl "https://enrich.chat/v1/person?linkedin_url=linkedin.com/in/jane-doe-ops&fields=email,mobile"

# Mobile only
curl "https://enrich.chat/v1/mobile?linkedin_url=linkedin.com/in/jane-doe-ops"

# The free tier needs no key. A key is optional;
# paying subscribers get one at enrich.chat/account/
# and can add: -H "Authorization: Bearer $ENRICH_KEY"
```

**Python**

```python
import requests

r = requests.get(
    "https://enrich.chat/v1/person",
    params={
        "linkedin_url": "linkedin.com/in/jane-doe-ops",
        "fields": "email,mobile",
    },
    timeout=30,
)
person = r.json()

if r.status_code == 402:
    print("free limit reached, upgrade at", person["upgrade_url"])
elif not r.ok:
    print(person["error"], person["message"])
elif person["found"]:
    email = person.get("work_email") or {}
    mobile = person.get("mobile") or {}
    print(email.get("value"), email.get("status"))
    print(mobile.get("value"), mobile.get("line"))
    print("credits used:", person["credits_used"])
else:
    print("not found, 0 credits")
```

**Node**

```javascript
const url = new URL("https://enrich.chat/v1/person");
url.searchParams.set("linkedin_url", "linkedin.com/in/jane-doe-ops");
url.searchParams.set("fields", "email,mobile");

const res = await fetch(url);
const person = await res.json();

if (res.status === 402) {
  console.log("free limit reached, upgrade at", person.upgrade_url);
} else if (!res.ok) {
  console.log(person.error, person.message);
} else if (person.found) {
  console.log(person.work_email?.value, person.work_email?.status);
  console.log(person.mobile?.value, person.mobile?.line);
  console.log("credits used:", person.credits_used);
} else {
  console.log("not found, 0 credits");
}
```

**Response**

```json
{
  "found": true,
  "name": "Jane Doe",
  "title": "VP Operations",
  "company": {"name": "Acme Logistics"},
  "linkedin_url": "https://www.linkedin.com/in/jane-doe-ops",
  "work_email": {"value": "jane.doe@acmelogistics.com", "status": "verified"},
  "mobile": {"value": "+1 415 555 0142", "line": "mobile"},
  "credits_used": 260,
  "free_lookups_remaining": 9
}
```

## Prices

| What you get | Credits |
| --- | --- |
| Work email found | 10 |
| Mobile number found | 250 |
| Company tech stack or profile found | 5 |

10 free lookups a day for every IP address, no signup. Nothing is charged when nothing is found. Monthly plans start at $29 for 100,000 credits.

## Try this prompt

Turn LinkedIn URLs into contacts

```text
Use www.enrich.chat to find the work email and mobile for each LinkedIn URL in this list. Add them as new columns and tell me the total credits_used
```

## Related

- [Proxycurl alternatives (2026): what to use after the shutdown](https://enrich.chat/blog/proxycurl-alternative/)
- [LinkedIn email and phone finder](https://enrich.chat/tools/linkedin-email-finder/)
- [Person enrichment API](https://enrich.chat/api/person-enrichment/)
