# LinkedIn B2B Phone Number Scraper (`parsebird/linkedin-b2b-phone-number-scraper`) Actor

Find B2B phone numbers and business emails on public LinkedIn company pages, showcase pages, posts, and people listings. Search by B2B terms or paste LinkedIn URLs. Validated E.164 phone numbers.

- **URL**: https://apify.com/parsebird/linkedin-b2b-phone-number-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.89 / 1,000 linkedin leads

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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

### LinkedIn B2B Phone Number Scraper

LinkedIn B2B Phone Number Scraper finds **business phone numbers and business emails** that companies and professionals publish on public LinkedIn pages, and turns them into clean B2B leads.

<table><tr>
<td style="border-left:4px solid #0A66C2;padding:12px 16px;font-weight:600">
Search LinkedIn companies, people, showcase pages, and posts by any B2B keyword, or paste LinkedIn URLs, and get validated E.164 phone numbers with business emails, names, industries, and locations — no LinkedIn account or cookies needed.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Actor: parsebird/linkedin-b2b-phone-number-scraper — finds phone numbers and business emails on public LinkedIn pages (companies, people, showcase pages, posts). Input: {"target": "terms" | "profileUrls" | "companyUrls", "searchTerms": ["software companies"], "sourceTypes": ["companies","people","postsPages","profiles"] (optional, empty = all), "profileUrls": [{"url": "https://www.linkedin.com/in/..."}], "companyUrls": [{"url": "https://www.linkedin.com/company/..."}], "geography": "US" | "Germany" | "Austin, Texas" (optional), "excludeTerms": ["recruiter"] (optional), "requireCompleteContact": false, "maxItems": 25 (optional, empty = all)}. Run via ApifyClient("YOUR_TOKEN").actor("parsebird/linkedin-b2b-phone-number-scraper").call(run_input=input). Output: one row per LinkedIn page with sourceType, matchedTarget, sourceUrl, name, title, description, location, phoneNumber (E.164, e.g. +12295601796), businessEmail. Optional fields are omitted when the page does not show them. Pricing: pay per lead saved. Get your API token at https://console.apify.com/account#/integrations. Full API spec: https://apify.com/parsebird/linkedin-b2b-phone-number-scraper/api
```

### What is LinkedIn B2B Phone Number Scraper?

LinkedIn B2B Phone Number Scraper is a **LinkedIn phone number extractor** for B2B lead generation. Many businesses list a phone number and a contact email in their [LinkedIn](https://www.linkedin.com/) company "About" section, in their posts ("📞 Call us: …"), or in their headline. This actor finds those public pages for your keywords, reads the contact details, **validates every phone number**, and saves one clean lead per page.

The easiest way to try it: keep the example term `software companies`, click **Start**, and open the dataset a minute later.

It works as a **LinkedIn API alternative** for contact data: no LinkedIn login, no cookies, no browser extension, and no risk to your own LinkedIn account.

### What can LinkedIn B2B Phone Number Scraper do?

- 🔎 **Search by B2B terms** — industries, niches, or job titles such as `roofing contractor`, `accountants`, or `real estate agent`.
- 🏢 **Four LinkedIn source types** — company pages, people profiles, showcase pages, and posts/articles. Pick some or search all of them.
- 🔗 **Scrape LinkedIn URLs directly** — paste company URLs, or profile, showcase, and post URLs.
- 📞 **Validated phone numbers** — every number is checked against country numbering rules and normalized to international E.164 format (`+442081592018`). Fax lines, follower counts, IDs, and dates are skipped.
- 📧 **Business emails first** — company-domain addresses are preferred over free-mail addresses.
- 🌍 **Geography filter** — with a country code or country name, only leads whose phone number or page location is in that country are kept; a city or region narrows the search to that place.
- 🚫 **Exclude terms** — skip leads mentioning words like `recruiter` or `hiring`.
- ✅ **Complete contacts only** — optionally keep only leads with both a phone number and an email.

As an Apify Actor it also gives you [scheduling](https://docs.apify.com/platform/schedules), a full [REST API](https://docs.apify.com/api/v2), [integrations](https://apify.com/integrations) with Make, Zapier, Google Sheets, HubSpot and webhooks, and exports to JSON, CSV, Excel, XML, or HTML.

### What data can you extract from LinkedIn?

| Field | Description |
|-------|-------------|
| `sourceType` | LinkedIn page type: `companies`, `people`, `profiles` (showcase pages), or `postsPages` |
| `matchedTarget` | The search term or the input URL that found the lead |
| `sourceUrl` | Canonical LinkedIn URL of the page |
| `name` | Company, page, or person name |
| `title` | Industry for companies and showcase pages, headline for people, post headline for posts |
| `description` | Public description, summary, or post text |
| `location` | Headquarters or location shown on the page |
| `phoneNumber` | Validated phone number in E.164 format |
| `businessEmail` | Email shown on the same page |

Optional fields are left out of a row when LinkedIn does not show them. Every saved lead has a `phoneNumber`, a `businessEmail`, or both.

### How to scrape phone numbers from LinkedIn

1. Open [LinkedIn B2B Phone Number Scraper](https://apify.com/parsebird/linkedin-b2b-phone-number-scraper) and click **Try for free**.
2. In **Target**, choose **B2B search terms**, **LinkedIn profile or post URLs**, or **LinkedIn company URLs**.
3. Add your terms (for example `plumbing services`) or paste your LinkedIn URLs into the matching list.
4. Optionally pick **LinkedIn source types**, a **Geography** such as `GB` or `Austin, Texas`, and **Exclude terms**.
5. Set **Max leads** for a small first run, for example `25`.
6. Click **Start** and download the leads from the **Output** tab as JSON, CSV, or Excel.

### Input

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `target` | string | **Yes** | `terms` | `terms`, `profileUrls`, or `companyUrls`. Only the matching list is used. |
| `searchTerms` | array of strings | For `terms` | — | B2B terms to search. Wrap a phrase in double quotes for an exact match. |
| `sourceTypes` | array of strings | No | all | `companies`, `people`, `postsPages`, `profiles`. Ignored for URL targets. |
| `profileUrls` | array of `{url}` | For `profileUrls` | — | LinkedIn `/in/`, `/showcase/`, `/posts/`, or `/pulse/` URLs. |
| `companyUrls` | array of `{url}` | For `companyUrls` | — | LinkedIn `/company/` URLs. |
| `geography` | string | No | — | Country code (`US`, `GB`, `DE`), country name, or place (`Austin, Texas`). |
| `excludeTerms` | array of strings | No | — | Skip leads whose name, title, description, or location contains any of these words. |
| `requireCompleteContact` | boolean | No | `false` | Keep only leads with both a phone number and a business email. |
| `maxItems` | integer | No | all | Stop after this many leads. Leave empty to run until the public results run out. |

Example input:

```json
{
  "target": "terms",
  "searchTerms": ["software companies"],
  "requireCompleteContact": false,
  "maxItems": 25
}
```

### Output example

```json
[
  {
    "sourceType": "companies",
    "matchedTarget": "https://www.linkedin.com/company/forevercare-home-care",
    "sourceUrl": "https://www.linkedin.com/company/forevercare-home-care",
    "name": "ForeverCare Home Care",
    "title": "Home Health Care Services",
    "description": "ForeverCare Home Care | 5 followers on LinkedIn. Compassion. Comfort. ForeverCare. | At ForeverCare Home Care, we believe that everyone deserves to feel safe, comfortable, and cared for in the place they call home. ...",
    "location": "BUFORD, GA",
    "phoneNumber": "+12295601796",
    "businessEmail": "info@forevercocareservices.com"
  },
  {
    "sourceType": "companies",
    "matchedTarget": "accountants",
    "sourceUrl": "https://www.linkedin.com/company/reflexaccounting",
    "name": "Reflex Accounting Limited",
    "title": "Accounting",
    "description": "Reflex Accounting Limited | 1,603 followers on LinkedIn. We are Chartered Certified Accountants serving small to medium sized businesses and limited companies. | We are Chartered Certified Accountants based in Birmingham, serving small to medium sized businesses and limited companies. ...",
    "location": "Birmingham, West Midlands",
    "phoneNumber": "+441212621528",
    "businessEmail": "info@reflexaccounting.co.uk"
  }
]
```

Download the dataset in JSON, CSV, Excel, XML, or HTML, or read it through the [Apify API](https://docs.apify.com/api/v2/dataset-items-get).

### Use cases

- **Cold calling lists** — build call lists of companies in a niche, such as roofing contractors or accounting firms.
- **Local B2B prospecting** — combine a service term with a city, for example `plumbing services` and `Austin, Texas`.
- **Country-specific outreach** — set `geography` to `GB` or `DE` to get numbers from that country.
- **CRM enrichment** — paste LinkedIn company URLs you already have and add their public phone numbers and emails.
- **Agency lead generation** — find agencies and service providers that actively advertise their contact details in LinkedIn posts.

### How it works

1. For search terms, the actor finds public LinkedIn pages of the chosen source types that match your term and mention contact details. Pages whose name, industry, or description don't mention your term are skipped as off-topic.
2. Each public company, showcase, and post page is read in full, including the company's own posts shown on the page.
3. LinkedIn hides most personal profiles from logged-out visitors, so for people the actor reads the profile's public search listing (name, headline, and summary text).
4. Phone numbers are validated for the page's country (or your geography) and normalized to E.164; emails on the company's own domain are preferred.
5. Pages without a phone number or email are skipped and not charged. Each LinkedIn page is saved at most once per run.

### How much does it cost to scrape LinkedIn phone numbers?

LinkedIn B2B Phone Number Scraper uses pay-per-event pricing. You pay only for leads saved to the dataset — pages without contact data are free.

| Event | Free plan | Bronze | Silver | Gold |
|-------|-----------|--------|--------|------|
| `lead-scraped` — per lead | $0.00249 | $0.00229 | $0.00209 | $0.00189 |
| Per 1,000 leads | **$2.49** | **$2.29** | **$2.09** | **$1.89** |

For example, 1,000 LinkedIn leads on the Free plan cost $2.49. Apify's free monthly platform credit covers about 2,000 leads a month. Use **Max leads** or a [spending limit](https://docs.apify.com/platform/actors/running/usage-and-resources) to cap each run.

### Is it legal to scrape LinkedIn phone numbers?

LinkedIn B2B Phone Number Scraper reads only public pages that LinkedIn shows to logged-out visitors, and only contact details that the business or person chose to publish there. It does not log in, bypass paywalls, or access private data.

Phone numbers and emails can still be personal data under GDPR, CCPA, and similar laws, and outreach may be governed by rules such as TCPA or PECR. Make sure you have a legitimate reason to process the data and follow the rules that apply to you. If in doubt, consult a lawyer. Read more in Apify's post [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

### Use LinkedIn B2B Phone Number Scraper with the API

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("parsebird/linkedin-b2b-phone-number-scraper").call(run_input={
    "target": "terms",
    "searchTerms": ["roofing contractor"],
    "geography": "US",
    "maxItems": 100,
})
for lead in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(lead["name"], lead.get("phoneNumber"), lead.get("businessEmail"))
```

**JavaScript**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('parsebird/linkedin-b2b-phone-number-scraper').call({
    target: 'companyUrls',
    companyUrls: [{ url: 'https://www.linkedin.com/company/forevercare-home-care' }],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

See the [API tab](https://apify.com/parsebird/linkedin-b2b-phone-number-scraper/api) for all endpoints and the [Apify API client docs](https://docs.apify.com/api/client/python) for more options.

### Other B2B lead generation scrapers

- [Website Contact Finder](https://apify.com/parsebird/website-contact-finder) — emails, phone numbers, and social profiles from any company website.
- [YellowPages USA Lead Generator](https://apify.com/parsebird/yellowpages-scraper) — US business listings with phone numbers and addresses.
- [BBB Scraper](https://apify.com/parsebird/bbb-scraper) — Better Business Bureau business profiles and contact data.
- [Nextdoor Business Scraper](https://apify.com/parsebird/nextdoor-business-scraper) — local businesses and their contact details from Nextdoor.
- [Owler Company Scraper](https://apify.com/parsebird/owler-company-scraper) — company profiles, revenue, and competitors.
- [UK Companies House Scraper](https://apify.com/parsebird/uk-companies-house-scraper) — official UK company registry data.

### FAQ

**Do I need a LinkedIn account or cookies?**
No. The actor reads only pages that LinkedIn shows to logged-out visitors, so your LinkedIn account is never used.

**Why don't all companies have a phone number?**
The actor returns only contact details that are visible on the public page. Companies that don't publish a phone number or email are skipped and not charged.

**How are phone numbers validated?**
Each number is checked against the numbering plan of its country and saved in E.164 format. Numbers without a `+` prefix are read using your `geography` country, then the page's own country, then the United States. When you set a country, numbers from that country are preferred.

**Which source type gives the most leads?**
Company and showcase pages usually give the most leads per search. People work best for professions that publish their number, such as real estate agents or brokers. Posts work well for local service businesses that advertise in their posts.

**Why did my run stop before reaching Max leads?**
When the public results for a term run out or stop returning contacts, the run ends. Add more search terms, remove filters, or try other source types to get more leads.

**Can I get more than one phone number per company?**
Each row holds the first contact number shown on the page (numbers labelled as phone, call, or mobile come first). One lead is saved per LinkedIn page.

**Can I schedule runs or send leads to my CRM?**
Yes. Use [Apify schedules](https://docs.apify.com/platform/schedules) for recurring runs and [integrations](https://apify.com/integrations) or webhooks to push leads to Google Sheets, HubSpot, Make, or Zapier.

**Something doesn't work?**
Open an issue on the [Issues tab](https://apify.com/parsebird/linkedin-b2b-phone-number-scraper/issues) with your run link and we'll look into it.

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/linkedin-b2b-phone-number-scraper/changelog.md

# Actor input Schema

## `target` (type: `string`):

Choose what to scrape. Only the list that matches this choice is used.

## `searchTerms` (type: `array`):

Add industries, niches, or job titles, e.g. <code>software companies</code>, <code>roofing contractor</code>, <code>real estate broker</code>. Wrap a phrase in double quotes for an exact match. Every term uses the same filters.

## `sourceTypes` (type: `array`):

Pick which public LinkedIn pages to search for your terms. Leave empty to search all of them. Ignored for URL targets, where each URL sets its own type.

## `profileUrls` (type: `array`):

Add public LinkedIn URLs: people profiles (<code>/in/</code>), showcase pages (<code>/showcase/</code>), posts (<code>/posts/</code>) or articles (<code>/pulse/</code>). Used only when Target is <b>LinkedIn profile or post URLs</b>.

## `companyUrls` (type: `array`):

Add public LinkedIn company pages, e.g. <code>https://www.linkedin.com/company/forevercare-home-care</code>. Used only when Target is <b>LinkedIn company URLs</b>.

## `geography` (type: `string`):

Optional. Enter a country code (<code>US</code>, <code>GB</code>, <code>DE</code>), a country name, or a place (<code>Austin, Texas</code>). A country keeps only leads whose phone number or page location is in that country; a place narrows term searches to it. It also sets the default country for reading local phone numbers without a + prefix.

## `excludeTerms` (type: `array`):

Optional. Skip leads whose name, title, description, or location contains any of these words, e.g. <code>recruiter</code>, <code>hiring</code>.

## `requireCompleteContact` (type: `boolean`):

Turn on to keep only leads that show both a phone number and a business email. When off, leads with either one are saved.

## `maxItems` (type: `integer`):

Stop after saving this many leads. Leave empty to keep going until the public results run out.

## Actor input object example

```json
{
  "target": "terms",
  "searchTerms": [
    "software companies"
  ],
  "sourceTypes": [],
  "profileUrls": [],
  "companyUrls": [],
  "excludeTerms": [],
  "requireCompleteContact": false,
  "maxItems": 10
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# 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 = {
    "target": "terms",
    "searchTerms": [
        "software companies"
    ],
    "requireCompleteContact": false,
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/linkedin-b2b-phone-number-scraper").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 = {
    "target": "terms",
    "searchTerms": ["software companies"],
    "requireCompleteContact": False,
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/linkedin-b2b-phone-number-scraper").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 '{
  "target": "terms",
  "searchTerms": [
    "software companies"
  ],
  "requireCompleteContact": false,
  "maxItems": 10
}' |
apify call parsebird/linkedin-b2b-phone-number-scraper --silent --output-dataset

```

## MCP server setup

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

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/z0Otmsmb5IJb9a2YX/builds/Do32lAc7gCphQzZlT/openapi.json
