# LinkedIn Company by Domain Scraper (`khadinakbar/linkedin-company-by-domain-scraper`) Actor

Resolve company domains to public LinkedIn company pages with Google SERP evidence and confidence scoring. Cookieless, no LinkedIn login, MCP-ready.

- **URL**: https://apify.com/khadinakbar/linkedin-company-by-domain-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Social media, Lead generation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 company founds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## LinkedIn Company by Domain Scraper

Turn a list of **company website domains** into **public LinkedIn company page URLs** — canonical link, slug, company name, and a confidence score for every input. Paste domains like `stripe.com` or `https://www.hubspot.com`; get structured rows back with honest outcome codes (`FOUND`, `NO_MATCH`, `LOW_CONFIDENCE`, and more). No LinkedIn login required.

Built for **B2B enrichment**, CRM cleanup, and AI-agent pipelines. Each run returns machine-readable JSON with optional Google Search evidence, so you can audit why a domain matched — or why it did not.

### What data you get

| Field | Description |
|---|---|
| `inputDomain` | The original domain string you supplied |
| `normalizedDomain` | Cleaned hostname without `www` |
| `linkedinCompanyUrl` | Canonical `https://www.linkedin.com/company/{slug}/` |
| `linkedinSlug` | The company's LinkedIn slug identifier |
| `companyName` | Company name from SERP title (if available) |
| `source` | Always `google_serp` |
| `confidence` | 0–1 match confidence |
| `outcome` | `FOUND` / `NO_MATCH` / `LOW_CONFIDENCE` / `INVALID_INPUT` / `UPSTREAM_FAILED` |
| `diagnostics` | Array of per-query diagnostic objects |
| `errors` | Any error messages for this row |
| `serpEvidence` | *(optional)* Query, rank, title, and snippet that produced the match |

### How it works

1. Normalize each domain (strip protocol, `www`, validate format).
2. Build two Google SERP queries: `site:linkedin.com/company "domain.com"` and a keyword variant using the domain root.
3. Parse results with Cheerio for `linkedin.com/company/*` links and score each candidate against the input domain (slug match, domain mention in snippet, keyword overlap, rank).
4. Assign an outcome code:
   - `FOUND` — confidence ≥ `minConfidence`, charges `company-found` PPE event.
   - `LOW_CONFIDENCE` — match found but below threshold (row written, not charged).
   - `NO_MATCH` — Google returned no LinkedIn company URLs.
   - `UPSTREAM_FAILED` — all SERP requests failed.
   - `INVALID_INPUT` — domain could not be parsed.

### Input

```json
{
  "domains": ["stripe.com", "https://www.notion.so"],
  "maxResultsPerDomain": 1,
  "includeSerpEvidence": true,
  "minConfidence": 0.6
}
```

| Parameter | Type | Default | Description |
|---|---|---|---|
| `domains` | string\[] | — | Company domains or URLs to resolve |
| `maxResultsPerDomain` | integer | 1 | Max LinkedIn company candidates per domain (1–5) |
| `includeSerpEvidence` | boolean | true | Include SERP query/rank/title/snippet evidence |
| `minConfidence` | number | 0.6 | Confidence threshold (0–1) below which rows are `LOW_CONFIDENCE` |

### Example output row

```json
{
  "inputDomain": "stripe.com",
  "normalizedDomain": "stripe.com",
  "linkedinCompanyUrl": "https://www.linkedin.com/company/stripe/",
  "linkedinSlug": "stripe",
  "companyName": "Stripe",
  "source": "google_serp",
  "confidence": 0.95,
  "outcome": "FOUND",
  "diagnostics": [{"query": "site:linkedin.com/company \"stripe.com\"", "resultCount": 1}],
  "errors": [],
  "serpEvidence": [{"query": "site:linkedin.com/company \"stripe.com\"", "rank": 1, "title": "Stripe | LinkedIn", "snippet": "...", "resultUrl": "https://www.linkedin.com/company/stripe/"}]
}
```

### Pricing

Pay-per-event. Charged via Apify Pay per event + platform usage pass-through.

- `apify-actor-start`: $0.00005 (one-time per run)
- `company-found`: **$0.008 per successfully resolved LinkedIn company page**

Rows with `LOW_CONFIDENCE`, `NO_MATCH`, `INVALID_INPUT`, and `UPSTREAM_FAILED` outcomes are **not charged**.

### Limitations

- Resolution is based on Google SERP. If Google blocks or throttles the request, the domain returns `UPSTREAM_FAILED`.
- Confidence scoring uses keyword matching, not login-gated LinkedIn data. A domain with an unusual name or no SERP presence may return `NO_MATCH` even when a LinkedIn page exists.
- Only **public** LinkedIn company pages reachable from Google are resolved. Private or invite-only pages are not accessible.
- Multi-brand or multi-entity domains (e.g., a holding company with many subsidiaries) may surface a parent company instead of a specific subsidiary.

### Legal disclaimer

This actor uses publicly available Google Search results to locate public LinkedIn company pages. It does not scrape LinkedIn directly, bypass authentication, or access private data. Users are responsible for complying with Google's Terms of Service, LinkedIn's Terms of Service, and applicable data protection laws in their jurisdiction. Apify is not responsible for how users use the data retrieved.

### Related actors

- [LinkedIn Company Search Scraper](https://apify.com/khadinakbar/linkedin-company-search-scraper) — keyword/industry/location search for company pages
- [LinkedIn Profile Search Scraper](https://apify.com/khadinakbar/linkedin-profile-search-scraper) — find LinkedIn profiles by keyword and job title
- [Email to LinkedIn Profile Scraper](https://apify.com/khadinakbar/email-to-linkedin-profile-scraper) — resolve email addresses to public LinkedIn profiles
- [Bulk Website Contact Extractor](https://apify.com/khadinakbar/bulk-website-contact-extractor) — extract emails and phones from company domains

# Actor input Schema

## `domains` (type: `array`):

One domain or homepage URL per line — e.g. stripe.com, https://www.hubspot.com. Accepts bare domains, www URLs, or https links.

## `maxResultsPerDomain` (type: `integer`):

How many LinkedIn company candidates to return per domain (1–5). Use 1 for enrichment lists; raise it when a domain may map to multiple entities.

## `includeSerpEvidence` (type: `boolean`):

Attach the Google Search query, rank, title, and snippet that produced each match — useful for audits and agent debugging.

## `minConfidence` (type: `number`):

Minimum match confidence (0–1) required to bill a row as FOUND. Lower values accept more matches; higher values reduce false positives.

## Actor input object example

```json
{
  "domains": [
    "stripe.com",
    "https://www.notion.so"
  ],
  "maxResultsPerDomain": 1,
  "includeSerpEvidence": true,
  "minConfidence": 0.6
}
```

# Actor output Schema

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

Dataset items containing inputDomain, normalizedDomain, linkedinCompanyUrl, linkedinSlug, companyName, confidence, outcome, and optional serpEvidence.

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

Run summary including outcome, totalInputs, totalRows, foundRows, countsByOutcome, and chargedEventCounts.

## `runSummary` (type: `string`):

Machine-readable RUN\_SUMMARY record for integrations that read RUN\_SUMMARY directly.

# 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 = {
    "domains": [
        "stripe.com",
        "https://www.notion.so"
    ],
    "maxResultsPerDomain": 1,
    "includeSerpEvidence": true,
    "minConfidence": 0.6
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/linkedin-company-by-domain-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 = {
    "domains": [
        "stripe.com",
        "https://www.notion.so",
    ],
    "maxResultsPerDomain": 1,
    "includeSerpEvidence": True,
    "minConfidence": 0.6,
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/linkedin-company-by-domain-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 '{
  "domains": [
    "stripe.com",
    "https://www.notion.so"
  ],
  "maxResultsPerDomain": 1,
  "includeSerpEvidence": true,
  "minConfidence": 0.6
}' |
apify call khadinakbar/linkedin-company-by-domain-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,khadinakbar/linkedin-company-by-domain-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/rIx5BxFR9Pxvbe4wX/builds/363je5mKGaK8Xj05m/openapi.json
