# LinkedIn Company Page Mapper - Followers for Clay (`mambalabs/linkedin-company-presence-mapper`) Actor

Resolves a company domain to its LinkedIn company page and returns the exact follower count plus industry, company size band, headquarters and founded year from the public page. Flat, Clay ready, one row per company.

- **URL**: https://apify.com/mambalabs/linkedin-company-presence-mapper.md
- **Developed by:** [Mamba Labs](https://apify.com/mambalabs) (community)
- **Categories:** Lead generation, Automation, Social media
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.80 / 1,000 company checkeds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### 🔎 What can LinkedIn Company Page Mapper do?

Give it a company domain and it returns that company's LinkedIn company page URL, its **exact** follower count, and the firmographics LinkedIn publishes on the public page: industry, company size band, headquarters and founded year.

### 💡 Why use LinkedIn Company Page Mapper?

**The follower count is exact.** LinkedIn renders every digit, so this is one of only four surfaces in the Mamba Labs social program whose numbers can be summed across a target list. Instagram, TikTok, YouTube, Threads and Facebook all round.

**It refuses to report the wrong company.** This is the real engineering problem on LinkedIn, and it is not extraction. A guessed slug frequently resolves to a page that is completely real and belongs to somebody else: measured on 2026-08-21, a guess for notion.com landed on a live page with 879 followers and one for gitlab.com on a page with 3,167. A size check cannot catch that, because the page is normal. Only a name match can. When the name does not match, this actor reports `identity_mismatch` and returns no count rather than publishing a stranger's numbers under your domain.

**It starts from a domain.** LinkedIn tools take a company URL or a name. If you hold a list of domains, the URL is what you are missing.

#### 🧭 What is reachable logged out, and what is not

Everything here comes from the public page a logged out visitor sees. No login, no session cookie, no data vendor.

**Reachable:** company page URL, exact follower count, page name, tagline, industry, company size band, headquarters, founded year, specialties, linked website.

**Not reachable, and no logged out tool gets these:** employee lists, employee growth over time, post engagement, who follows the page, page admins, or anything else behind a session.

That ceiling is stated up front rather than discovered from empty columns. Any tool claiming logged out access to the second list is holding a session cookie or paying a vendor.

### 📋 What data can LinkedIn Company Page Mapper extract?

| Field | Type | Meaning |
|---|---|---|
| `degraded` | boolean | True when this row could not be produced normally, for example the company site was unreachable and no discovery could run. A degraded row is never charged. |
| `degradation_reason` | string | null | Why the row is degraded, in plain words. Null on a normal row. |
| `company_domain` | string | null | The company domain this row is about, normalized. Null when only a handle or a name was supplied. This is the join key across the whole Mamba Labs fleet. |
| `company_name` | string | null | The company name as supplied or derived. Improves search accuracy and is what the identity gate matches against. |
| `linkedin_url` | string | null | Canonical LinkedIn company page URL, or null when no trustworthy page was found. |
| `linkedin_slug` | string | null | The company slug from the URL path. |
| `linkedin_followers` | integer | null | Exact follower count. LinkedIn renders every digit, so unlike Instagram, TikTok, YouTube, Threads and Facebook this number is not rounded and can be summed across a list. |
| `linkedin_followers_exact` | boolean | null | Always true when a count was returned. LinkedIn does not round. |
| `linkedin_page_name` | string | null | The company name as it appears on the LinkedIn page. This is what the identity gate matches against, and a mismatch here is what stops a wrong company being reported. |
| `linkedin_tagline` | string | null | The page tagline or description snippet. |
| `linkedin_industry` | string | null | Industry as LinkedIn classifies it. Null when the page did not declare one or firmographics were turned off. |
| `linkedin_company_size` | string | null | The headcount BAND the company declares, for example "10,001+ employees". A band and a string, never a number. Note this is NOT the "view all N employees" figure elsewhere on the page: that counts people who list this company on LinkedIn, which is a different fact. |
| `linkedin_headquarters` | string | null | Headquarters locality where the page declares one. |
| `linkedin_founded_year` | integer | null | Founding year where the page declares one. |
| `linkedin_specialties` | string | null | The comma separated specialties list the company declares on its page. Useful as a free keyword source for personalization. |
| `linkedin_website` | string | null | The website the LinkedIn page links to. When its host matches company\_domain, that is independent proof the page belongs to this company. |
| `linkedin_discovery` | string | null | How the page was found: input\_handle, homepage\_sameas, homepage\_link, search or pattern\_guess. |
| `linkedin_status` | string | ok, not\_found, not\_extractable, blocked, identity\_mismatch, auth\_failed or skipped. identity\_mismatch means a real LinkedIn page was reached and it belongs to a different company, which is a measured and common outcome on guessed slugs. |
| `run_date` | string | ISO 8601 timestamp of this run. Social counts move, so a row without a date is a number with no shelf life. |

`linkedin_company_size` is a BAND and a string ("10,001+ employees"), never a number. LinkedIn also shows a "view all N employees" figure on the same page, and that is a DIFFERENT fact: it counts people who list this company on LinkedIn, not the size the company declares. This actor reads the declared band by its own label so the two are never confused. If you need a headcount number, the Company Firmographic Enricher joins on `company_domain`.

### 🛠️ How to find a company's LinkedIn page

1. Put a company domain in `company_domain`.
2. Add `company_name` when you have it. It is what the identity gate matches a discovered page against, so supplying it directly reduces wrong matches.
3. If you already know the slug, put it in `handle` to skip discovery.
4. Set `includeFirmographics` to `false` if you only want the URL and the follower count.
5. For a list, pass an array of objects.

#### 🧪 Using it in Clay

Add an **Enrichment > Apify** column, pick this actor, map `company_domain`.

Gate the column on your ICP filter first. LinkedIn is the most expensive fetch in this family because it needs residential routing, and there is no reason to spend it on accounts you have already disqualified.

### 💵 How much does it cost?

Pay per event. You are charged for output, never for input.

| Event | Fires when | Price |
|---|---|---|
| `company-checked` | Once per company for which the discovery cascade completed and a non degraded row was produced, whether or not a LinkedIn profile was found. Does not fire on a degraded row, because on a degraded row no discovery was performed. | $0.0040 |
| `profile-resolved` | Once per company whose candidate LinkedIn URL passed the identity gate. Fires on the validation work, not on a populated count. A candidate dropped as an impersonator does not charge: the work was done and the honest answer is that there is no such profile. | $0.0030 |
| `follower-count-extracted` | Once per company where a numeric follower count was read off the public page. Does not fire on not\_extractable, blocked, identity\_mismatch or url only runs. | $0.0025 |

An `identity_mismatch` row charges `company-checked` and `profile-resolved`, because the work of finding and validating a candidate was performed and the answer is that it was not this company. It does not charge the extraction event, because no count is returned.

**What the same coverage costs bought a la carte:** harvestapi/linkedin-company charges $0.0040 per company and returns a richer firmographic record, and it accepts a company URL or a name rather than a domain. This actor is priced at parity on the extraction and adds the domain to page resolution step, which is the step a buyer holding a domain list is missing.

### ⌨️ Input

| Field | Type | Required | Meaning |
|---|---|---|---|
| `company_domain` | string | no | Bare company domain, for example shopify.com. Supply this or a handle. With a domain the actor runs full discovery; with a handle it skips straight to the fetch. |
| `company_name` | string | no | Optional. Improves search accuracy and is what the identity gate checks a discovered profile against, so supplying it reduces wrong matches. |
| `handle` | string | no | Optional. The company slug from linkedin.com/company/<slug>, for example shopify. Supplying it skips discovery and goes straight to the fetch. |
| `includeFollowerCounts` | string | no | When "true" (default) the profile page is fetched and the counts are extracted. Set "false" to resolve the profile URL only, which is cheaper and needs no proxy. Sent as a string for Clay compatibility. |
| `skipCache` | string | no | When "false" (default) a successful lookup is cached for seven days and reused. Set "true" to force a fresh fetch. Sent as a string for Clay compatibility. |
| `includeFirmographics` | string | no | When "true" (default) industry, company size band, headquarters, founded year and website are parsed off the page alongside the follower count. Set "false" for the URL and follower count only. Sent as a string for Clay compatibility. |

```json
{
  "company_domain": "shopify.com",
  "company_name": "Shopify"
}
```

### 📤 Output

One flat, snake\_case row per company. No nested objects, so it drops straight
into Clay, a spreadsheet or a warehouse table without a flattening step.

```json
{
  "degraded": false,
  "degradation_reason": null,
  "company_domain": "shopify.com",
  "company_name": "Shopify",
  "linkedin_url": "https://www.linkedin.com/company/shopify",
  "linkedin_slug": "shopify",
  "linkedin_followers": 1103529,
  "linkedin_followers_exact": true,
  "linkedin_page_name": "Shopify",
  "linkedin_tagline": "Making commerce better for everyone.",
  "linkedin_industry": "Software Development",
  "linkedin_company_size": "10,001+ employees",
  "linkedin_headquarters": "Ottawa, ON",
  "linkedin_specialties": "ecommerce, API, applications, customer service",
  "linkedin_founded_year": 2006,
  "linkedin_website": "https://www.shopify.com",
  "linkedin_discovery": "homepage_link",
  "linkedin_status": "ok",
  "run_date": "2026-08-22T09:00:00.000Z"
}
```

#### false versus null, and why the difference matters

`false` means we looked and the answer is no. `null` means we could not look,
or the platform withheld it. They are never interchangeable in this output. If
you filter for companies with no presence on this platform, filter on `false`,
because `null` rows are unknown rather than absent and including them will
overstate your list.

### 💡 Tips

- **Supply `company_name`.** On this platform specifically it is what stops a wrong page shipping.
- **`linkedin_website` is a free confirmation.** When its host equals your `company_domain`, the page is provably the right one.
- **Filter out `pattern_guess` rows** if a wrong match would be expensive. It is the discovery route that produced both measured wrong pages.
- **The follower count is safe to sum.** Very few social counts are.

### ⚠️ Known limits

- **No employee data of any kind.** No lists, no headcount number, no growth over time. LinkedIn serves none of it to a logged out visitor and this actor never holds a session.
- **No post or engagement data.** A previous Mamba Labs actor measured the logged out ceiling on this precisely: no reactor identities at all and roughly ten commenters per post. That ceiling is carried across here rather than re-tested.
- **Company size is a band, not a number.** The separate "view all N employees" figure on the page is a different measurement and is deliberately not reported as company size.
- **Guessed slugs land on real wrong pages.** That is why the identity gate exists and why `identity_mismatch` is a status you will see.
- **LinkedIn blocks datacenter ranges,** so this actor needs residential proxy to work at all. On the Apify platform that is enabled by default.

### ❓ FAQ

**Does this need a LinkedIn login or cookie?**
No, and it never will. Holding a session burns accounts and it is not a product we will ship.

**Why can I not get employee counts?**
LinkedIn publishes a size BAND on the public page, not a number. `linkedin_company_size` gives you the band. For a real headcount figure, use the Company Firmographic Enricher, which joins on `company_domain`.

**What is `identity_mismatch`?**
We reached a real LinkedIn company page and its name does not match your company. Rather than report its follower count as yours, we report the mismatch. Two measured examples: guessed slugs for notion.com and gitlab.com both landed on real pages belonging to other companies.

**Is the follower count exact?**
Yes. LinkedIn renders the full integer.

**Can I pass a LinkedIn slug instead of a domain?**
Yes, in `handle`.

### 🧩 Want other GTM data?

Mamba Labs builds a fleet of GTM enrichment actors that share one flat,
Clay-ready output convention, so their rows join on `company_domain` with no
cleaning step:

- **Company Firmographic Enricher** headcount, industry, location and revenue band from a domain, joins on `company_domain`.
- **Domain to LinkedIn URL Resolver** the company LinkedIn URL for domains where the social mapper found none.
- **GTM Hiring Signal Scraper** open go to market roles, which is the buying signal a follower count is a proxy for.
- **Company Social Presence Mapper** every platform in one row when you want breadth rather than depth on one network.

Full fleet: [apify.com/mambalabs](https://apify.com/mambalabs)

### 🆘 Support

Issues, field requests and bug reports: open an issue on the actor's Issues tab.
Mamba Labs reads every one.

# Actor input Schema

## `company_domain` (type: `string`):

Bare company domain, for example shopify.com. Supply this or a handle. With a domain the actor runs full discovery; with a handle it skips straight to the fetch.

## `company_name` (type: `string`):

Optional. Improves search accuracy and is what the identity gate checks a discovered profile against, so supplying it reduces wrong matches.

## `handle` (type: `string`):

Optional. The company slug from linkedin.com/company/<slug>, for example shopify. Supplying it skips discovery and goes straight to the fetch.

## `includeFollowerCounts` (type: `string`):

When "true" (default) the profile page is fetched and the counts are extracted. Set "false" to resolve the profile URL only, which is cheaper and needs no proxy. Sent as a string for Clay compatibility.

## `skipCache` (type: `string`):

When "false" (default) a successful lookup is cached for seven days and reused. Set "true" to force a fresh fetch. Sent as a string for Clay compatibility.

## `includeFirmographics` (type: `string`):

When "true" (default) industry, company size band, headquarters, founded year and website are parsed off the page alongside the follower count. Set "false" for the URL and follower count only. Sent as a string for Clay compatibility.

## `source_tag` (type: `string`):

Internal attribution tag set by Mamba Labs on published task examples. Not required, and nothing depends on it. Leave it empty.

## Actor input object example

```json
{
  "company_domain": "shopify.com",
  "company_name": "Shopify",
  "includeFollowerCounts": "true",
  "skipCache": "false",
  "includeFirmographics": "true"
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset of one flat row per company, with per platform status so a blocked fetch never reads as a zero.

# 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 = {
    "company_domain": "shopify.com",
    "company_name": "Shopify",
    "handle": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("mambalabs/linkedin-company-presence-mapper").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 = {
    "company_domain": "shopify.com",
    "company_name": "Shopify",
    "handle": "",
}

# Run the Actor and wait for it to finish
run = client.actor("mambalabs/linkedin-company-presence-mapper").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 '{
  "company_domain": "shopify.com",
  "company_name": "Shopify",
  "handle": ""
}' |
apify call mambalabs/linkedin-company-presence-mapper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mambalabs/linkedin-company-presence-mapper"
        }
    }
}

```

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/zOPm6A9JEhUGcIdFW/builds/DlYKZbxiYvDq4ykqp/openapi.json
