# Phone Finder

> Find the phone number of a person from a LinkedIn profile URL with the Emelia Phone Finder API. 50 credits, refunded when no number is found.

Source: https://docs.emelia.io/docs/enrichment/phone-finder

The Phone Number Finder API returns the phone number of a person from a LinkedIn profile URL. It costs 50 credits per search, refunded when no number is found.

## Start a search

[`POST /tools/find/phone`](https://docs.emelia.io/docs/enrichment/phone-finder/find-phone-number.md)

The only input is a public LinkedIn profile URL, `https://www.linkedin.com/in/<slug>`. A URL without `linkedin.com/in/`, such as a Sales Navigator lead URL, is refused with `Invalid LinkedIn URL`.

**curl**

```bash
curl -X POST https://api.emelia.io/tools/find/phone \
  -H "Authorization: $EMELIA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"linkedinUrl": "https://www.linkedin.com/in/claire-fontaine"}'
# {"success":true,"jobId":"6650f1a2b839d80011c5f002"}
```

**JavaScript**

```js
const res = await fetch('https://api.emelia.io/tools/find/phone', {
  method: 'POST',
  headers: { Authorization: process.env.EMELIA_API_KEY, 'Content-Type': 'application/json' },
  body: JSON.stringify({ linkedinUrl: 'https://www.linkedin.com/in/claire-fontaine' }),
});
const { jobId } = await res.json();
```

**Python**

```python
import os
import requests

res = requests.post(
    "https://api.emelia.io/tools/find/phone",
    headers={"Authorization": os.environ["EMELIA_API_KEY"]},
    json={"linkedinUrl": "https://www.linkedin.com/in/claire-fontaine"},
)
job_id = res.json()["jobId"]
```

## Read the result

[`GET /tools/find/phone/{jobId}`](https://docs.emelia.io/docs/enrichment/phone-finder/get-result.md)

**curl**

```bash
curl https://api.emelia.io/tools/find/phone/6650f1a2b839d80011c5f002 \
  -H "Authorization: $EMELIA_API_KEY"
```

**JavaScript**

```js
const res = await fetch(`https://api.emelia.io/tools/find/phone/${jobId}`, {
  headers: { Authorization: process.env.EMELIA_API_KEY },
});
const { data } = await res.json();
if (data.qualification === 'found') console.log(data.phoneNumber, data.country);
```

**Python**

```python
res = requests.get(
    f"https://api.emelia.io/tools/find/phone/{job_id}",
    headers={"Authorization": os.environ["EMELIA_API_KEY"]},
)
data = res.json()["data"]
if data.get("qualification") == "found":
    print(data["phoneNumber"], data["country"])
```

```json title="Response"
{
  "success": true,
  "data": {
    "_id": "6650f1a2b839d80011c5f002",
    "linkedinUrl": "https://www.linkedin.com/in/claire-fontaine",
    "status": "done",
    "qualification": "found",
    "phoneNumber": "+33612345678",
    "country": "FR",
    "date": "2026-10-11T08:00:00.000Z"
  }
}
```

`qualification` is `found` and `phoneNumber` is set when a number was found. Otherwise the 50 credits come back.

The result arrives from the provider when it is ready: there is no fixed upper bound on the wait. Poll every few seconds, then less often, and keep the `jobId` if you stop. A number already found for the same profile in the last 6 months is returned at once, and costs 50 credits too.

## Past searches

[`GET /tools/find/phone`](https://docs.emelia.io/docs/enrichment/phone-finder/list-past-searches.md)

Your searches, newest first, with `page` from 1 and `limit` (15 by default, 100 at most). Check it before searching a profile again.

## Tips

* **Search only the contacts you will call.** At 50 credits a search, filter first.
* **Store the number in `phone`** with [Update a contact](https://docs.emelia.io/docs/lists/update-contact.md): it is the field lists count.
* **Polling is free** and not counted in the per minute quota.
