# LinkedIn Company Scraper by URL | No Cookies (`b2bdata/company-by-linkedin-url`) Actor

LinkedIn company data by page URL: give company page URLs, get one row per company with name, website domain, industry, size, headquarters, founded year and locations. Free plan: 100 URLs per run. Pay per company found, misses free. No login or cookies.

- **URL**: https://apify.com/b2bdata/company-by-linkedin-url.md
- **Developed by:** [Open Enrich](https://apify.com/b2bdata) (community)
- **Categories:** Lead generation, Marketing
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.10 / 1,000 company delivereds

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

## LinkedIn Company Scraper by URL | No Cookies

LinkedIn company data by page URL: give a list of company page URLs, get one row per company with name, website domain, industry, size, headquarters, founded year, locations and the LinkedIn page. The same company named by two URL forms is one row, not two. No login, no cookies, no start fee. You pay only for a company row you receive.

**No login | Any URL form in | One company per row | Website domain included | Size count and size range | Pages with no company = free | JSON/CSV export**

> **Page URLs in, company records out.** You get a flat, stable row you can drop into a CRM: the website domain is already split out, the size is a number and a range, the headquarters is separate from the other locations. It does not return people or email addresses. For the people at a company, take the website domain from this actor and run [people-at-company](https://apify.com/b2bdata/people-at-company).

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

***

### 💳 Pricing and plans

One event, `company-card`, charged once per company row delivered. Prices per 1,000 companies (set on the Pricing tab):

| Event | When it is charged | Free plan | Gold plan |
|---|---|---|---|
| `company-card` | A company row is delivered to your dataset | $1.396 | $1.096 |

Bronze and Silver prices are on the Pricing tab. Higher Apify plans only lower the price. Empty runs, pages with no company on file, failed lookups, unreadable entries and notices are free, and there is no start fee.

**Plan-credit math.** The free plan's $5 monthly credit covers about 3,580 companies at the Free price.

#### Success-only billing

You are charged only for a company row you receive. A page with no company on file gets one free notice row (`reason: "not_found"`). An entry that is not a company page URL, a repeat, or a lookup that fails is listed in `MISSES` with its position and a reason and costs nothing. A company you already received under another URL form is skipped and never charged.

#### The free plan

Free Apify accounts get up to 100 URLs 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 valid URLs are looked up and one free notice row (`reason: "free_plan_limit"`) says how many 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

`limit` (default 100, maximum 3,000) caps the whole run and so caps what is charged. Try one URL with `limit: 1`, read the row, then scale up.

***

### ⚡ Why this company data actor?

- **Any URL form.** `https://www.linkedin.com/company/stripe`, `linkedin.com/company/Stripe/about` and `https://uk.linkedin.com/company/stripe?trk=x` all become one company. The page's numeric id in the same place works too.
- **Flat rows for a CRM.** Name, domain, industry, size count, size range, headquarters, founded year and a short locations list, with empty values left out.
- **A stable id.** `linkedinCompanyId` is the company's id on the platform, so you can join rows even when page names change.
- **One row per company.** Two URL forms of one company are delivered and charged once.
- **Success-only, no start fee.** Missing pages, bad entries, repeats and notices are free.

***

### 🎯 Use cases: enrich a list of company pages

- **CRM enrichment.** You hold LinkedIn company URLs from a list or a form; fill in the website, industry and size.
- **Domain lookup.** Turn a column of company page URLs into website domains.
- **Account scoring.** Use size, industry, country and founded year to score a target list.
- **Agent workflows.** An AI agent holds a company page URL and needs the company facts in a single call.

***

### 🚀 Quick start: company data for a list of URLs

#### 1. One company

```json
{ "items": ["https://www.linkedin.com/company/stripe"], "limit": 1 }
```

#### 2. A list, any URL form

```json
{ "items": ["https://www.linkedin.com/company/openai", "linkedin.com/company/shopify/about", "https://uk.linkedin.com/company/microsoft"], "limit": 50 }
```

Each entry becomes its canonical company page address before the lookup.

***

### ⚙️ Inputs

| Key | Type | Default | What it does |
|---|---|---|---|
| `items` | array of strings | required | LinkedIn company page URLs, in any form (with or without https or www, a country prefix, a trailing slash, a tracking query). A company name, a website, or a person or school page is not accepted and is listed in `MISSES` as `invalid_url`. The same company written twice is looked up once. Free plan: 100 URLs per run. |
| `limit` | integer | 100 | Most companies delivered in the whole run, which also caps what is charged. Maximum 3,000. URLs not reached are listed in `MISSES`. |
| `includeAudit` | boolean | false | Adds an `audit` object to each row. |

Any other field stops the run before a lookup with `remove unsupported fields: ...`. Nothing is charged.

***

### 📤 Output

One result row per company, in input order. Empty values are left out.

| Key | Type | Meaning, and when it is missing |
|---|---|---|
| `name` | string | Company name |
| `linkedinUrl` | string | Canonical company page address |
| `linkedinCompanyId` | string | The company's id on the platform |
| `domain` | string | Host of the website the page lists, `www.` removed. See "How to read the rows" |
| `website` | string | The website exactly as the page lists it |
| `tagline`, `description` | string | The page's tagline and "about" text. Missing when the page has none |
| `industry` | string | The industry the page declares |
| `employeeCount` | integer | Employee count shown on the page |
| `employeeRange` | string | Size band, such as `1001-5000` or `10001+` for an open top |
| `followerCount` | integer | Followers of the page |
| `type` | string | Company type as on the page, such as `PRIVATELY_HELD`, `PUBLIC_COMPANY`, `NON_PROFIT`. Missing when not set |
| `foundedYear` | integer | Year founded. Missing when the page has none |
| `hqCity`, `hqState`, `hqCountry` | string | Headquarters. `hqCountry` is a two-letter code. `hqCity` often carries the region as well |
| `specialities` | array of strings | The specialities the page lists. Missing when none |
| `locations` | array | Offices: `city`, `state`, `country`, `postalCode`, `isHq`. Missing when none |
| `fundingTotalUsd`, `fundingRounds` | integer | Partial funding summary. Missing when not on file, and always missing for listed companies. See "How to read the rows" |
| `updatedAt` | string | When the record was last refreshed in the data |
| `audit` | object | Only with `includeAudit`: `requestId`, `latencyMs`, `inputRaw` |

Example output (the shape is real, the values are illustrative):

```json
{
  "linkedinUrl": "https://www.linkedin.com/company/example-co",
  "linkedinCompanyId": "1234567",
  "name": "Example Co",
  "domain": "example.com",
  "website": "https://www.example.com/",
  "tagline": "We build examples.",
  "description": "Example Co builds example software for example teams.",
  "industry": "Software Development",
  "employeeCount": 2900,
  "employeeRange": "1001-5000",
  "followerCount": 120000,
  "type": "PRIVATELY_HELD",
  "foundedYear": 2015,
  "hqCity": "Dublin",
  "hqState": "Dublin",
  "hqCountry": "IE",
  "specialities": ["software", "payments"],
  "locations": [
    { "city": "Dublin", "state": "Dublin", "country": "IE", "postalCode": "D02", "isHq": true },
    { "city": "London", "country": "GB", "isHq": false }
  ],
  "fundingTotalUsd": 100000000,
  "fundingRounds": 3,
  "updatedAt": "2026-11-03T14:28:32.315Z"
}
```

#### How to read the rows

- **Two size fields.** `employeeCount` is the number shown on the page; `employeeRange` is a separate band the data holds. They can disagree (a company with a band of 1001-5000 can show 11,000 on its page). Use the count when you need a number and the band when you need a bucket.
- **Domain is the page's website.** `domain` is read from the website the page lists. That is usually the company's main site, but a page can list a news site, a product site or a donation page, and then `domain` is that host. Check `website` before you match on `domain`.
- **Funding is a partial summary.** `fundingTotalUsd` and `fundingRounds` come from a funding summary the data holds and can be well below the real total. They are left out for listed companies, where the data was not credible. There is no last-round field.
- **City and region.** `hqCity` can read "San Francisco, CA" or "Redmond, Washington". `hqState` is separate when the data has it.
- **A page name can change.** The row carries the page address the data holds now, which can differ from the one you sent when a company renamed its page.

#### Other records in the run

- **`MISSES`** (key-value store): `[{index, input, reason}]` for every entry without a result row. Reasons: `not_found` (no company on file for that page), `invalid_url` (not a company page address), `duplicate_input` (the same page as an earlier entry; `duplicateOf` names it), `duplicate_company` (the same company as an earlier entry under another URL form), `unreadable_response`, `not_looked_up_limit` (the run `limit` was reached first), or `Upstream HTTP <code>`.
- **`errors-company-by-linkedin-url`** (key-value store): the lookups that failed for a technical reason, so you can re-run only those URLs.
- **`RUN_SUMMARY`**: counts (requested, valid, looked up, delivered, not found, repeats skipped).
- **Notice rows** (`type: "notice"`) appear for a page with no company on file (`not_found`), a free-plan list longer than 100 (`free_plan_limit`), a reached `limit` (`limit_reached`), a reached spend limit (`charge_limit_reached`) or invalid input (`invalid-input`). Notices are never charged.

#### What is NOT returned

- People, employees or email addresses (use [people-at-company](https://apify.com/b2bdata/people-at-company))
- A search across companies by name, keyword or location (use [linkedin-company-search](https://apify.com/b2bdata/linkedin-company-search))
- Posts, job listings or a company's follower list
- A last funding round, investors or revenue

***

### 🛡️ Reliable results

**Our data promise.** We work to keep the data current, and we stand behind it. If a company is missing, a field is wrong or a row looks off, open the Issues tab with your run link. We review every report and sort it out with you, case by case.

- **No data is free and visible.** Every entry without a row is in `MISSES` with its position and a reason and is never charged.
- **Repeats are charged once.** The same URL written twice, or the same company named by two URL forms, is one row.
- **Each row is saved as it is delivered.** A run that stops keeps what it already produced.
- **Bounded pace.** Lookups run at about one a second, so a long list takes time: 3,000 companies is under an hour. The run timeout is one hour.
- **Typos fail early.** An unsupported input field, a bad number or a limit above its maximum stops the run before any charge. A company name or a website in `items` is listed as `invalid_url`, not guessed.

***

### 🤖 For AI agents (MCP)

This actor runs through the Apify MCP server. Prompt to copy:

> "Use b2bdata/company-by-linkedin-url with items=\["https://www.linkedin.com/company/stripe"] and limit=1. Return name, domain, industry, employeeCount and hqCountry."

**When to use it.** You hold a LinkedIn company page URL and need the company facts.
**When not to.** You need the people at the company (use b2bdata/people-at-company), you only have a company name (use b2bdata/linkedin-company-search) or you need email addresses (use b2bdata/email-finder).
**Input contract.** `items` array of company page URLs; optional `limit` 1-3,000 (default 100).
**Output contract.** One row per company with `name`, `linkedinUrl`, `linkedinCompanyId`, `domain`, `industry`, `employeeCount`, `hqCountry`. Output is deterministic and schema-stable. A page with no company is a free notice row and listed in `MISSES`.
**Smoke test.** `limit: 1` on a well-known company page returns one row.
**Error cases.** `No valid company page URLs` means no entry was a company page address. `remove unsupported fields`, or a bad `limit`, ends the run SUCCEEDED with one free `invalid-input` notice row and nothing charged.

***

### 🔌 Integrations: send results anywhere

1. **API.** Fetch rows from the run's default dataset: `GET /v2/datasets/{datasetId}/items?format=csv`.
2. **Webhook** on run success to push rows to your own endpoint.
3. **n8n, Make, Zapier.** Use the native Apify nodes: run the actor, then read the dataset.
4. **Google Sheets, Airtable, HubSpot, Salesforce, Clay.** Join on `linkedinUrl` or `domain` and map `name`, `industry` and `employeeCount` to account fields.

***

### 🕐 Schedule examples

- **Weekly account refresh.** A schedule with a saved task that points at your target-account list.
- **New-account enrichment.** A webhook from your CRM starts a run with the new company URLs.

***

### 🔗 Related actors

- `b2bdata/people-at-company`: the people at a company, one row per person, from a company domain. [Open](https://apify.com/b2bdata/people-at-company)
- `b2bdata/linkedin-company-search`: find company pages by name, keyword or URL. [Open](https://apify.com/b2bdata/linkedin-company-search)
- `b2bdata/linkedin-employee-search`: the people who work at a company, found by company name or URL. [Open](https://apify.com/b2bdata/linkedin-employee-search)
- `b2bdata/headcount-by-department`: how many people a company has per team. [Open](https://apify.com/b2bdata/headcount-by-department)

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

***

### ❓ FAQ

#### Data and coverage

**How do I get company data from a LinkedIn company URL?**
Put the page URL in `items` and run. You get one row per company with name, domain, industry, size, headquarters and founded year.

**Which URL forms work?**
Any address of a company page: with or without https or www, a country prefix such as uk., a trailing slash, an /about path, a tracking query, any letter case. The numeric id in place of the page name works too. Person pages, school pages, websites and company names do not.

**Why is a URL missing from the results?**
It is in `MISSES` with a reason: no company on file for that page, an entry that was not a company page address, or a repeat.

**Why do the employee count and the size range disagree?**
They are two different fields: the number shown on the page and a size band the data holds. See "How to read the rows".

**Do I get people or email addresses?**
No. Use `b2bdata/people-at-company` for the people at a company and `b2bdata/email-finder` for an email.

**Do I need a LinkedIn account or cookies?**
No. It is a lookup without login, cookies or an account to ban.

#### Pricing

**What do I pay when a page has no data?**
Nothing. There is no start fee, and pages with no company, bad entries, repeats and notices are free.

***

### 🛟 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. Published on Apify by b2bdata. Not affiliated with, endorsed by, or sponsored by any company or person named in the examples above.

# Changelog

This Actor's version history is a separate document: https://apify.com/b2bdata/company-by-linkedin-url/changelog.md

# Actor input Schema

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

LinkedIn company page URLs to look up. Example: \["https://www.linkedin.com/company/stripe", "linkedin.com/company/openai/about", "https://uk.linkedin.com/company/microsoft"]. Any form of the address works (with or without https or www, a country prefix, a trailing slash or a tracking query); the company's numeric page id in the same place also works. A company name, a website, or a person or school page is not accepted and is listed in the MISSES record as invalid_url. Each company is looked up once; repeats are listed in MISSES as duplicate_input. A page with no company on file returns one free notice row. Free plan: 100 URLs per run.

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

Most companies delivered in the whole run, which also caps what is charged. URLs not reached are listed in MISSES and are not charged. Default 100, maximum 3000 (lookups run at about one a second, so 3000 fit the one-hour run limit).

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

Adds requestId, latencyMs and inputRaw to each row under audit. Omit for clean rows.

## Actor input object example

```json
{
  "items": [
    "https://www.linkedin.com/company/stripe"
  ],
  "limit": 100,
  "includeAudit": false
}
```

# Actor output Schema

## `companies` (type: `string`):

One row per company: name, domain, industry, size, headquarters, founded year, locations and LinkedIn page

## `summary` (type: `string`):

Counts and stop reason for this run

# 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/company/stripe"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("b2bdata/company-by-linkedin-url").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/company/stripe"] }

# Run the Actor and wait for it to finish
run = client.actor("b2bdata/company-by-linkedin-url").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/company/stripe"
  ]
}' |
apify call b2bdata/company-by-linkedin-url --silent --output-dataset

```

## MCP server setup

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

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/l6MhZS5cuWCgQiZ8f/builds/pcb4SlRiQrKtEsBfM/openapi.json
