# Phone Number Finder by LinkedIn URL | from $29.963/1k (`b2bdata/phone-number-finder`) Actor

Phone number finder for LinkedIn profile URLs: get the phone numbers on file plus name, job title, company and location. Many profiles have none: you pay only per profile with a phone; misses are free. Does not find numbers from an email; use email-phone-finder. Free plan: 100 per run.

- **URL**: https://apify.com/b2bdata/phone-number-finder.md
- **Developed by:** [Open Enrich](https://apify.com/b2bdata) (community)
- **Categories:** Lead generation
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $29.96 / 1,000 phone founds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Phone Number Finder by LinkedIn URL | from $29.963/1k

Phone number finder for LinkedIn profiles: paste profile links and get back the phone numbers on file for each person, in international format, with name, job title, company and location so you know who you are about to call. You pay only for profiles that really have a number. No LinkedIn account, no cookies, no ban risk.

**No login | Profile URL, short URL or bare slug | Only profiles with a phone become rows | Misses are free | Up to 1,000 numbers per run | JSON/CSV export**

> **How many profiles have a phone number?** In our small test of 25 public profiles, 1 returned a phone number (2026-10-13). Many profiles have none, and those are never charged. Give a longer list than the number of rows you want.

> **Not a scraper of linkedin.com.** The actor never opens a LinkedIn page. Each row is read from a profile database by the profile address you supply.

[See all actors by b2bdata](https://apify.com/b2bdata)

***

### 💳 Pricing and plans

Pay per result, see the Pricing tab. Free Apify plan: up to 100 inputs looked up per run, as many runs as your Apify credit covers. Paid plans have no per-run limit. Normal Apify platform usage applies.

| Event | When it is charged | Free plan, per 1,000 | Gold plan, per 1,000 |
|---|---|---|---|
| `phone-found` | One profile with at least one phone number, delivered as a row | $39.963 | $30.772 |

The free plan's $5 monthly credit covers about 125 phone numbers. Bronze and Silver prices are on the Pricing tab. Higher Apify plans only lower the price. One row is one event, however many numbers the profile has.

#### Success-only billing

You pay for delivered rows only.

- A profile with no phone number is not charged.
- A profile that is not found is not charged.
- A failed lookup is free.
- An input that is not a LinkedIn profile link is skipped and is free.
- A notice row (for example `free_plan_limit`) is free.
- An empty run is free, and there is no start fee.

Each delivered row is one `phone-found` event, charged right before the row is saved.

#### The free plan

Free Apify accounts get up to 100 inputs looked up per run, and as many runs as their Apify credit covers. Nothing is stored on our side. When a list is longer, the first 100 are looked up and one free notice row (`reason: "free_plan_limit"`) says how many inputs were not looked up; they are not charged. Run again with the rest, or use a paid Apify plan for no per-run limit.

#### Keep a run small while you test

Use `limit` to cap the rows. The default is 25, the maximum is 1,000. For a hard money cap use `maxChargeUsd` (see Inputs). Run 3 to 5 profiles first, read the rows, then scale up.

***

### ⚖️ This vs. the alternatives

| | **This actor** | Cookie-based extension tools | Other Store phone actors |
|---|---|---|---|
| LinkedIn account needed | **No** | Yes (your own session) | Varies by actor |
| Your account at risk | **No, it is never used** | Yes | Varies by actor |
| Rows without a phone | **Never delivered, never charged** | Rows with empty phone | Opt-in flag on some actors |
| Number format | **International format (+...) when the country code is given** | Varies | Varies |
| Context on the row | **Name, title, company, seniority, location** | Varies | Varies |
| Start fee | **None** | n/a | Charged by some actors |
| Misses | **Free and listed in `MISSES` with a reason** | n/a | Varies |

Public Store prices for phone actors, per phone number or lead at the FREE tier, from public Store pages on 2026-10-13. Check the pages for current prices.

| Actor | Event | Price per 1,000 (FREE tier) |
|---|---|---|
| This actor | phone found | $39.963 |
| code_crafter mobile-finder | phone found | $40 (flat, plus a start fee of $0.001 per GB) |
| scalelist phone-number-finder | lead submitted | $145 (Gold tier $100) |
| x_guru linkedin-phone-scraper-no-cookies | result | $2 (plus a one-time start fee) |

We compare on price only and make no claim about the other actors beyond that. Events differ: one actor bills per lead submitted, another per result, so check what each one charges for before you compare cost.

***

### ⚡ Why this LinkedIn phone number finder?

- **No login, no cookies.** Nothing of yours is exposed and nothing can get banned.
- **You pay for numbers, not attempts.** A profile with no phone never becomes a row and never costs anything. The lookup asks for phone-bearing profiles only.
- **Forgiving input.** `https://www.linkedin.com/in/slug`, `linkedin.com/in/slug` and plain `slug` all work. Query strings and trailing slashes are stripped, duplicates are looked up once.
- **International format.** A number given with its country code comes back as `+14155550100` style. A number without one is returned as written, because the country cannot be guessed.
- **Person context.** Every row carries name, headline, job title, company, seniority and location, so a sales call list needs no second lookup.
- **Honest misses.** Every input that did not turn into a row is listed with a reason in the `MISSES` record.
- **Strict input.** An unknown field fails the run at once with "remove unsupported fields", before anything is charged, so a typo never turns into a silent default.
- **Spend control.** `maxChargeUsd` stops the run before a result that would pass your cap.

***

### 🎯 Use cases

- **Call lists.** You hold a list of LinkedIn links from a sales navigator export. Add a phone number to everyone who has one.
- **Post-event follow-up.** Turn the attendee profiles you collected into a call sheet the same day.
- **Recruiting.** Reach a shortlist by phone and see current title and company next to each number.
- **CRM clean-up.** Fill the empty phone column for contacts you already track by profile URL.
- **Agent tool.** Let an AI agent turn a profile URL into a number and the context to open the call.

***

### 🔗 Pipeline guide: from a name to a phone number

```
  Names or a target list, no URLs yet
        |
        v
 [1] linkedin-people-search / linkedin-person-search   -> profile URLs
        |
        v
 [2] phone-number-finder (this actor)                         -> phone number + context per profile
        |
        v
 [3] your dialer or CRM                                 -> calls
```

Step 1 is only needed when you have no URLs. Have an email instead of a link? Use [email-phone-finder](https://apify.com/b2bdata/email-phone-finder): work email in, person and phone out. Need the profile facts without a phone? Use [linkedin-profile-by-url](https://apify.com/b2bdata/linkedin-profile-by-url). All actors are on the publisher page: [See all actors by b2bdata](https://apify.com/b2bdata). A Make or n8n scenario can chain them without code.

***

### 🚀 Quick start

Open the actor, paste your links, press Start. Or send JSON. Three examples:

#### 1. Find phone number from LinkedIn URL: a short list

Most profiles on a list like this return nothing, and nothing is charged for those. `limit` 5 stops the run after 5 numbers.

```json
{
  "items": [
    "https://www.linkedin.com/in/satyanadella",
    "https://www.linkedin.com/in/williamhgates",
    "https://www.linkedin.com/in/jeffweiner08",
    "https://www.linkedin.com/in/reidhoffman",
    "https://www.linkedin.com/in/sundarpichai"
  ],
  "limit": 5
}
```

#### 2. A list in mixed formats, with a spend cap

```json
{
  "items": [
    "https://www.linkedin.com/in/jane-example",
    "linkedin.com/in/john-sample",
    "casey-demo"
  ],
  "limit": 3,
  "maxChargeUsd": 0.5,
  "sourceTag": "event-2026-10"
}
```

#### 3. A bigger batch with the audit view

```json
{
  "items": [
    "https://www.linkedin.com/in/jane-example",
    "https://www.linkedin.com/in/john-sample",
    "https://www.linkedin.com/in/casey-demo"
  ],
  "limit": 200,
  "includeAudit": true
}
```

In a real batch, `items` holds your own links, one per line in the form. The slugs above are placeholders.

***

### ⚙️ Inputs

Only `items` is required. Any field not listed here is rejected.

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `items` | string list | Yes | none (prefilled with an example link) | LinkedIn profile links, one per entry. Accepted: `https://www.linkedin.com/in/slug`, `linkedin.com/in/slug`, or just the slug. Duplicates are collapsed and input order is kept. |
| `limit` | integer | No | `25` | Maximum rows delivered, 0 to 1000. `0` means all, up to the maximum of 1,000. Above 1,000 the run stops with a message and nothing is charged. The run stops once `limit` rows are delivered, so later entries are not looked up. |
| `includeAudit` | boolean | No | `false` | Adds an `audit` object to each row with `requestId`, `batchUnitsCharged`, `latencyMs`, `inputRaw` and `inputCanonical`. |
| `maxChargeUsd` | number | No | no cap | Advanced. The run stops before a result that would push its charges above this amount. `0` or empty means no cap. |
| `sourceTag` | string | No | none | Advanced. A label of 1 to 64 characters copied onto every row and into the run summary. |

Tips:

- Entries that are not profile links (a company page, a search URL, free text with spaces) are skipped and cost nothing.
- Start with `limit` 3 to 5, then raise it.
- Many profiles have no phone on file. Give a longer list than the number of rows you want, and set `limit` to the rows you want.

***

### 📤 Output

One dataset row per profile that has a phone number. The sample values are illustrative, not a real person. The keys are those of a real delivered row; `seniority` and `phoneType` appear only when the source has them:

```json
{
  "profileUrl": "https://www.linkedin.com/in/jane-example",
  "slug": "jane-example",
  "firstName": "Jane",
  "lastName": "Example",
  "fullName": "Jane Example",
  "headline": "VP Sales at Example Group",
  "jobTitle": "VP Sales",
  "company": "Example Group",
  "location": "Example City, Example Region",
  "country": "US",
  "phone": "+14155550100",
  "phones": ["+14155550100"],
  "scrapedAt": "2026-10-13T00:00:00.000Z",
  "inputQuery": "https://www.linkedin.com/in/jane-example",
  "sourceTag": "event-2026-10"
}
```

Column list. A field with no value is left out of the row (fields you might see when present):

| Key | Type | When it is present |
|---|---|---|
| `profileUrl`, `slug` | string | Always |
| `firstName`, `lastName`, `fullName` | string | When public |
| `headline` | string | When set |
| `jobTitle`, `company` | string | When a current role exists |
| `seniority` | `cxo`, `vp`, `director`, `manager`, `founder`, `other` | When a current role exists |
| `location` | string | When public |
| `country` | ISO-2 code | When public |
| `phone` | string | Always (the first number on file) |
| `phoneType` | string, for example `mobile` or `work` | Only when the source gives a type |
| `phones` | string list | Always, every number on file, de-duplicated |
| `scrapedAt` | ISO datetime | Always, the time of your run |
| `inputQuery` | string | Always, the entry you sent |
| `sourceTag` | string | Only when you set it |
| `audit` | object | Only with `includeAudit` |

Export as JSON, CSV, Excel, XML or HTML from the Output tab, or read the dataset over the API.

#### Other records in the run

- `MISSES` (key-value store): one entry per input that did not become a row, with the `input` and a `reason`: `no_phone`, `not_found`, `invalid_input`, or `Upstream HTTP <code>` / `Upstream unavailable` when the lookup itself failed.
- `errors-phone-number-finder` (key-value store): only the inputs that failed because the lookup itself failed, so you can retry exactly those.
- `RUN_SUMMARY` (key-value store): counts for the run (`requested`, `valid`, `pushed`, `missed`, `units`, `sourceTag`, `spendCapHit`, `freePlanNotLookedUp`, `build`).
- A status message on the run shows how many profiles had a phone and how many missed.

#### Direct dial, mobile or office: `phoneType`

The actor returns the phone numbers on file; it cannot promise a number is a direct dial. Where the source states the type, `phoneType` says so (for example `mobile`). If the source gives no type, the field is left out.

#### Column notes

- `phone` is the first number on file. `phones` lists all of them in the same order.
- A number is in international format (`+` and digits) when the source gives its country code. Otherwise it is returned as written. Check before you bulk-dial.
- `phoneType` is shown only when the source states it. A missing type does not mean the number is a landline.
- `seniority` is derived from the current role. A missing value means no current role was found.

#### What is NOT returned

- ❌ Email addresses (use [email-phone-finder](https://apify.com/b2bdata/email-phone-finder) or [linkedin-profile-by-url](https://apify.com/b2bdata/linkedin-profile-by-url))
- ❌ Rows for profiles without a phone number
- ❌ Posts, comments, reactions or job listings
- ❌ Profile photos
- ❌ Private or non-public profile data
- ❌ Profiles found by name or keyword (this actor only takes a link, use [linkedin-people-search](https://apify.com/b2bdata/linkedin-people-search) for discovery)

***

### 🛡️ Reliable results

**Our data promise.** We work to keep every contact current, and we stand behind it. If a number is outdated or a person has moved on, open the Issues tab with your run link. We review every report and sort it out with you, case by case.

- **Misses are free and visible.** A profile with no phone, one that is not found, or one that fails to load is listed in `MISSES` with a reason and is never charged.
- **Duplicates are collapsed.** The same profile written as a full URL, a short URL and a slug is looked up once and charged once.
- **You never get more rows than you asked for.** Lookups are sent in groups of up to 25 and never larger than the rows still allowed by `limit`.
- **Each row is saved as it is delivered.** A run that stops keeps what it already produced.
- **Failures do not kill the run.** A failed lookup is listed and the run carries on. After three failed lookups in a row the run stops, keeps its rows and finishes as SUCCEEDED.
- **Typos fail early.** An unsupported input field stops the run before any charge.
- **Check before you dial.** Numbers are on file, not live-tested. This actor does not call anyone to confirm a number.

***

### 🤖 For AI agents

This section is written for an LLM agent that calls this actor as a tool, through the Apify MCP server or the API. Humans: it doubles as a one-screen contract.

Prompt to copy:

> "Use b2bdata/phone-number-finder with items=\["https://www.linkedin.com/in/jane-example"] and limit=1, then return fullName, jobTitle, company, phone and phoneType."

#### When to use this actor, and when to use a sister actor

- **Use `b2bdata/phone-number-finder`** when you hold LinkedIn profile links and need a phone number for each person.
- [email-phone-finder](https://apify.com/b2bdata/email-phone-finder): you have a work email and need the person and their phone.
- [linkedin-profile-by-url](https://apify.com/b2bdata/linkedin-profile-by-url): you hold profile links and need profile facts, with or without emails.
- [linkedin-person-search](https://apify.com/b2bdata/linkedin-person-search): you know a name and a company but have no link.
- [linkedin-people-search](https://apify.com/b2bdata/linkedin-people-search): you want to find people by title or company when you have no links yet.
- [ceo-founder-email-finder-by-domain](https://apify.com/b2bdata/ceo-founder-email-finder-by-domain): you have a domain and need its founders.

#### Input contract

| Field | Type | Default | Notes |
|-------|------|---------|-------|
| `items` | string\[] | required | Profile URL, `linkedin.com/in/slug` or bare slug. Duplicates collapsed, order kept. |
| `limit` | integer 0-1000 | `25` | Rows delivered. 0 = all, up to 1000. Above 1000 is rejected. |
| `includeAudit` | boolean | `false` | Adds `audit` to each row. |
| `maxChargeUsd` | number | none | Stops before a result that would pass this spend. |
| `sourceTag` | string | none | Echoed onto rows and into `RUN_SUMMARY`. |

Send only the fields you need. Any other field fails the run with `Invalid input: remove unsupported fields: x`, and nothing is charged.

#### Output contract

Each item has `profileUrl`, `slug`, `phone`, `phones`, `scrapedAt`, `inputQuery`, and, when known, `firstName`, `lastName`, `fullName`, `headline`, `jobTitle`, `seniority`, `company`, `location`, `country`, `phoneType`, `sourceTag`. Absent fields are left out, not set to null. A notice row has `type: "notice"` and a `reason`, and is not a person.

#### Cost per call

You pay per profile that has a phone, plus Apify platform usage. Misses, failed lookups, invalid inputs and notices are free. Start with `limit` 1, then scale.

#### Chaining

Take `phone`, `fullName` and `company` from each row. For a person with no phone on file, `MISSES` says `no_phone`. Try [email-phone-finder](https://apify.com/b2bdata/email-phone-finder) with their work email as a second route.

#### Error cases and what to do

| Situation | What you see | What to do |
|-----------|--------------|------------|
| Unknown input field | Run fails: `remove unsupported fields: x`, nothing charged | Remove the field and retry once. |
| `limit` above 1000 | Run fails with the maximum stated, nothing charged | Lower `limit` or split the list. |
| Empty `items` list | The platform rejects it before the run starts (`items must NOT have fewer than 1 items`) | Pass at least one profile link or slug. |
| No valid items | Run fails: `No valid items in input` | Pass at least one profile link or slug. |
| Profile has no phone | No row; `MISSES` entry `no_phone`, free | Not an error. Try another route. |
| Profile not found | No row; `MISSES` entry `not_found`, free | Check the link. Do not retry more than once. |
| Lookup failed | No row; `MISSES` and `errors-phone-number-finder` entry `Upstream HTTP <code>` or `Upstream unavailable`, free | Retry the failed inputs once, later. |
| Spend cap reached | Run SUCCEEDED, `spendCapHit: true` in `RUN_SUMMARY` | Raise `maxChargeUsd` and run the rest. |
| Free Apify plan, list longer than 100 | Run SUCCEEDED, first 100 looked up, one free `free_plan_limit` notice row | Not an error. Run again with the rest; a paid Apify plan removes the limit. |

#### Minimal call

```json
{
  "items": ["https://www.linkedin.com/in/jane-example"],
  "limit": 1
}
```

***

### 🔌 Integrations: send results anywhere

Every run writes to an Apify dataset. Actor id for all recipes: `b2bdata/phone-number-finder` (in API URLs, write it as `b2bdata~phone-finder`).

#### 1. Fetch results over the API (native)

Send the token in a header, never in the URL. Latest successful run, as JSON, CSV or Excel:

`curl -H "Authorization: Bearer $APIFY_TOKEN" "https://api.apify.com/v2/acts/b2bdata~phone-finder/runs/last/dataset/items?format=json&clean=true&status=SUCCEEDED"`

Swap `format=json` for `format=csv` or `format=xlsx`. Pick fields with jq:

`curl -s -H "Authorization: Bearer $APIFY_TOKEN" "https://api.apify.com/v2/acts/b2bdata~phone-finder/runs/last/dataset/items?format=json&clean=true&status=SUCCEEDED" | jq '.[] | {fullName, phone, company}'`

#### 2. Webhook on run success (native)

In the Actor's Integrations tab add a webhook with event type `ACTOR.RUN.SUCCEEDED` and your own endpoint as the request URL. Apify sends a POST whose `resource` holds the run, including the default dataset id. Fetch the rows from there.

#### 3. n8n (native node)

Apify node, operation "Run an Actor and get dataset". Select `b2bdata/phone-number-finder`, paste the Actor input as JSON, connect your Apify token as a credential. Each dataset item arrives as one n8n item.

#### 4. Make (native app)

Apify app: module "Run an Actor" with `b2bdata/phone-number-finder`, then "Get Dataset Items" with the run's default dataset id. Each bundle is one row.

#### 5. Zapier (native app)

Apify app: action "Run Actor" with `b2bdata/phone-number-finder`, then "Fetch dataset items". Map `fullName`, `phone`, `company`, `profileUrl` into your next step.

#### 6. Clay (HTTP API)

In Clay, create an HTTP API request with method GET, URL `https://api.apify.com/v2/acts/b2bdata~phone-finder/runs/last/dataset/items?format=json&clean=true&status=SUCCEEDED`, and a header `Authorization: Bearer <your Apify token>`. Treat each returned item as a row.

#### 7. HubSpot, Salesforce, Airtable

Download with `format=csv` or use the n8n, Make or Zapier recipe and the CRM's module there. Use `profileUrl` as the dedupe key.

| Output field | Typical CRM placement |
|---|---|
| `fullName` | Contact name |
| `phone` | Mobile or direct phone field |
| `phones` | Note or custom text field (all numbers) |
| `jobTitle`, `company` | Title and account |
| `profileUrl` | Custom text field, also your dedupe key |
| `sourceTag` | Lead source or campaign field |

All recipes use the public Apify API; nothing is stored by the publisher.

***

### 🕐 Schedule examples

Use Apify Schedules (cron) on a saved task.

- **Weekly call-list refresh:** `0 6 * * 1`, your link list in `items`, `limit` 100, `maxChargeUsd` 5. Update your CRM by `profileUrl`.
- **After each event:** trigger by hand with the attendee links and `sourceTag` set to the event name.

Keep scheduled runs small and capped. A schedule you forget is still billed for every phone found.

***

### 🔗 Related actors

More from the publisher: [See all actors by b2bdata](https://apify.com/b2bdata)

- `b2bdata/email-phone-finder` ([link](https://apify.com/b2bdata/email-phone-finder)): work email in, person and phone out.
- `b2bdata/linkedin-profile-by-url` ([link](https://apify.com/b2bdata/linkedin-profile-by-url)): profile facts and optional emails per profile link.
- `b2bdata/linkedin-person-search` ([link](https://apify.com/b2bdata/linkedin-person-search)): find a named person.
- `b2bdata/linkedin-people-search` ([link](https://apify.com/b2bdata/linkedin-people-search)): find people by title or company.
- `b2bdata/ceo-founder-email-finder-by-domain` ([link](https://apify.com/b2bdata/ceo-founder-email-finder-by-domain)): CEO and founder emails at one domain.

***

### ❓ FAQ

**How to find phone number from LinkedIn profile URL?**
Paste the profile link into `items` and run; the same steps get phone number from LinkedIn profile link lists of any size. Each profile that has a number on file comes back as one row with `phone`, `phones` and the person's name, title and company. No LinkedIn account is needed.

**Is there a LinkedIn mobile number finder, no cookies needed?**
It returns the phone numbers on file, and whether one is a mobile depends on `phoneType`, which appears only when the source states it. The actor never signs in to LinkedIn and uses no cookies.

**Is there a bulk LinkedIn phone finder with job title?**
Yes, each row carries the job title next to the number. Send up to 1,000 rows' worth of links per run. Profiles are looked up in groups of 25, the run stops once `limit` rows are delivered, and you are charged only for rows with a number.

**How many profiles come back with a phone number?**
Few. In our small test of 25 public profiles, 1 returned a phone number (2026-10-13), and 4 well-known executives returned none. Many profiles have no number on file, and those are never charged. Run a short list first and read the rows.

**Do I pay when a profile has no phone number?**
No. A profile without a number is not delivered and not charged. It appears in the `MISSES` record with the reason `no_phone`.

**What format are the numbers in?**
International format (`+` and digits) when the source includes the country code, for example `+14155550100`. A number stored without a country code is returned as written.

**Is there a direct dial finder for sales prospects who only have an email address?**
Yes, with [email-phone-finder](https://apify.com/b2bdata/email-phone-finder): work email in, person and phone out. This actor is the direct dial finder for sales prospects you know by LinkedIn link; a number is a direct dial only when `phoneType` says so.

**What does it cost to try?**
Free Apify plan: up to 100 inputs looked up per run, as many runs as your Apify credit covers. Paid plans have no per-run limit.

**How do I stop a run from spending too much?**
Set `maxChargeUsd`. The run stops before a result that would pass it and finishes as SUCCEEDED with the rows delivered so far.

***

### 🛟 Support

Use the **Issues** tab on this actor's Apify page for bugs, questions and feature requests. We answer within 48 hours on working days. Please include the run ID and the input you used.

***

### 📜 Legal

**Use for B2B prospecting only. Comply with all applicable laws including GDPR, CCPA, and CAN-SPAM.**

Not affiliated with LinkedIn. The LinkedIn name belongs to its respective owner. This actor returns profile facts from a profile database. It does not log in, use cookies, access private pages or bypass authentication. This tool is not affiliated with, endorsed by, or sponsored by LinkedIn.

# Changelog

This Actor's version history is a separate document: https://apify.com/b2bdata/phone-number-finder/changelog.md

# Actor input Schema

## `items` (type: `array`):

Accepted forms: https://www.linkedin.com/in/slug, linkedin.com/in/slug, or just the slug. Example: https://www.linkedin.com/in/satyanadella. Most profiles have no phone; those are free and listed in MISSES. Results keep input order; duplicates are collapsed. Required: the run stops with a message when no valid profile is given.

## `limit` (type: `integer`):

Maximum rows (profiles with a phone number) delivered. Default 25. 0 means all, up to the hard maximum of 1000 rows per run. A value above 1000 is rejected with a message, never silently lowered.

## `includeAudit` (type: `boolean`):

Adds requestId, batchUnitsCharged, latencyMs, inputRaw and inputCanonical to each row (audit view). Off by default.

## `maxChargeUsd` (type: `number`):

Optional. Stops the run before a result that would push the charges above this amount. 0 or empty means no cap.

## `sourceTag` (type: `string`):

Optional label (1 to 64 characters) copied onto every row and into the run summary, to trace which job or list a row came from.

## Actor input object example

```json
{
  "items": [
    "https://www.linkedin.com/in/satyanadella",
    "https://www.linkedin.com/in/williamhgates",
    "https://www.linkedin.com/in/jeffweiner08",
    "https://www.linkedin.com/in/reidhoffman",
    "https://www.linkedin.com/in/sundarpichai"
  ],
  "limit": 25,
  "includeAudit": false
}
```

# Actor output Schema

## `phones` (type: `string`):

One row per profile with a phone: number, type, name, title, company, location

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "items": [
        "https://www.linkedin.com/in/satyanadella",
        "https://www.linkedin.com/in/williamhgates",
        "https://www.linkedin.com/in/jeffweiner08",
        "https://www.linkedin.com/in/reidhoffman",
        "https://www.linkedin.com/in/sundarpichai"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("b2bdata/phone-number-finder").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "items": [
        "https://www.linkedin.com/in/satyanadella",
        "https://www.linkedin.com/in/williamhgates",
        "https://www.linkedin.com/in/jeffweiner08",
        "https://www.linkedin.com/in/reidhoffman",
        "https://www.linkedin.com/in/sundarpichai",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("b2bdata/phone-number-finder").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "items": [
    "https://www.linkedin.com/in/satyanadella",
    "https://www.linkedin.com/in/williamhgates",
    "https://www.linkedin.com/in/jeffweiner08",
    "https://www.linkedin.com/in/reidhoffman",
    "https://www.linkedin.com/in/sundarpichai"
  ]
}' |
apify call b2bdata/phone-number-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,b2bdata/phone-number-finder"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/XljpBrNdfvEpuThte/builds/blm3OPklKVGfuROfa/openapi.json
