Enrichment

Find a phone number from a LinkedIn profile

One person in, every number we hold out, best first. 1 record per call, including a call that finds nothing.

Get your free API key →Free to start. No credit card. 1,000 records to spend whenever you like.

What you get

The phone endpoint returns the numbers we hold for one person, ordered best first, each with a type: mobile, direct or office. It also repeats the top number as best, so you can skip the array when you only want one. found: false means we hold none. It does not mean the lookup failed.

FieldWhat it isExample
person_idThe record the answer came from"1234567"
foundWhether we hold any number for this persontrue
phones[].phoneThe number in international format"+14155550133"
phones[].typeThe source's own label: mobile, direct, office"mobile"
bestThe first entry of phones, or null{ "phone": "+14155550133", "type": "mobile" }

The older GET /v1/people/phone adds ddi, dnc, carrier, priority and score on each number, plus has_phone. Use it when you need those fields or want to look a person up by work email or by a number you already hold.

What you send

InputRequiredNote
linkedin_urlOne of the twoA personal profile URL, linkedin.com/in/...
contact_idOne of the twoThe id on a people-search row at meta.source_ids.person_id. person_id is the same field.

Send exactly one. Sending both, or neither, is a 400. There is no lookup by name, and the v2 endpoint takes no email or phone as input. The key needs the enrich scope.

About one person in five has no LinkedIn URL. For those, search first and send the person_id back.

Three ways to run it

In the app

Yes, phones are exportable. The Exports page at app.leadocean.io has phone_N_number, phone_N_type, phone_N_ddi, phone_N_dnc, phone_N_carrier, phone_N_priority and phone_N_score in its column picker. The default is 2 numbers per person. The page shows the record price before you start and gives you a CSV. Every exported row is one record, whatever the columns.

With the API

bash
curl -s -G "https://api.leadocean.io/v2/people/phone" \
  --data-urlencode "linkedin_url=https://www.linkedin.com/in/jane-doe" \
  -H "x-api-key: $LEADOCEAN_API_KEY"

The response has the shape the docs show, with a placeholder number:

json
{
  "success": true,
  "data": {
    "person_id": "1234567",
    "found": true,
    "phones": [ { "phone": "+14155550133", "type": "mobile" } ],
    "best":   { "phone": "+14155550133", "type": "mobile" }
  }
}

There is no meta object on this endpoint. The quota state rides in the X-Quota-State and X-RateLimit-Limit headers. Developer detail is in Find Phone Number API.

From an AI agent

The MCP tool is leadocean_find_phone. It takes linkedin_url, email, phone or person_id, and returns has_phone plus each number with type and priority. Try: "Find the phone numbers for linkedin.com/in/jane-doe and tell me which one is the mobile." Setup is in Find Phone Number over MCP. To run it over a list, install the Find Phone Number skill.

What it costs

One call is 1 record. A call that finds nothing also costs 1 record on the v2 endpoint. A 404, where we hold no record for the person at all, costs nothing. Rejected requests (429, 402, 503) are never metered.

Free gives you 1,000 records, one-off, no card. Pro is $499 a month, flat, with no per-record price, inside fair use. See pricing.

Worked example: you look up 10,000 people. That is up to 10,000 records, found or not. Free covers the first 1,000 once. On Pro the month is $499 whatever the count.

Size the list before you spend. Search with hasPhone=true and count=true with limit=1 to get a free total. A search page returns one record per row, so pull pages only for the people you want.

Coverage

LeadOcean holds 693M people, and 166M of them have a phone number (measured 2026-09-23). That is about one in four. Expect roughly that hit rate on a random list, and a much better one if you filter with hasPhone=true first.

Accuracy and limits

  • Do-not-call is not answered. dnc exists on the v1 response but is not populated. Null means unknown, never safe to call. The v2 response drops the field so it cannot look like clearance. Run your own DNC check.
  • Type is a label, not a guarantee. It is the source's own word and not a closed list. Treat an unrecognised value as unknown.
  • Numbers are shared. Switchboards and reassignment mean a number can belong to several people over time. A match is evidence, not proof.
  • A miss still bills. found: false is a 200 and costs 1 record. Filter with hasPhone=true to avoid paying for empty answers.
  • Rate limit. 100 requests per second per key, on every plan. A 429 carries Retry-After.
  • Errors. 400 validation, 401 bad key, 403 missing scope, 404 not in our data, 503 store unreachable and never billed.
  • Gap. The docs publish no phone verification status and no timestamp. Unlike email, there is no email_status equivalent for numbers.

FAQ

Can I find a phone number from an email address?

Not on the v2 endpoint, which takes linkedin_url or contact_id. The v1 endpoint and the MCP tool accept a work email too. Both cost 1 record.

Does it return mobile numbers?

It returns the types we hold: mobile, direct and office. The type is the source's own label, so check it per number. Not every person has a mobile on file.

Can I find a phone number by name and company?

No. There is no name lookup. Search by title and company domain first, then send the person_id from the row to the phone endpoint. For two examples, see how to find a VP of Sales phone number and a VP of Marketing phone number.

Is a phone lookup included in the free plan?

Yes. Free has the same API and MCP server as Pro, with 1,000 records spent once. Each phone lookup uses 1. The Enrichments hub lists the other lookups.

Find your first phone number free

Free to start. No credit card. 1,000 records to spend whenever you like.

Get your free API key →