# LinkedIn Company Finder from Website (`khadinakbar/linkedin-company-finder-from-website`) Actor

Find public LinkedIn company pages from website URLs or domains. Returns canonical LinkedIn URL, slug, company name, and confidence. Homepage extraction first, then ScrapeCreators/SociaVault Google Search. Optional public firmographic enrich. Cookieless, no LinkedIn login. MCP-ready.

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

## Pricing

from $10.00 / 1,000 linkedin 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/actors/running/actors-in-store.md#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 Finder from Website

Turn company **website URLs or domains** into **public LinkedIn company pages**. Paste `stripe.com` or `https://www.notion.so` and get one dataset row with `matchStatus`, canonical LinkedIn URL, slug, company name, and a confidence score when a public match exists. Unmatched sites return a free CLEAR row so you can tell a completed empty lookup from a provider outage. No LinkedIn login or cookies.

Designed for B2B sales, CRM enrichment, and AI-agent pipelines that already have a website and need the matching public LinkedIn company URL. This is the reverse of [LinkedIn Company Profile Scraper](https://apify.com/khadinakbar/linkedin-company-profile-scraper), which starts from a company URL or vanity name. For keyword search instead of a website, use [LinkedIn Company Search Scraper](https://apify.com/khadinakbar/linkedin-company-search-scraper).

### What you get

| Output | What it answers |
|---|---|
| `inputWebsite` + `matchStatus` | **Which site** was processed and whether a public company page was found |
| `linkedinUrl` + `linkedinSlug` | **Where** the company is on LinkedIn |
| `companyName` + `confidence` | **Which entity** matched and how strongly |
| `matchStrategy` + `provider` | **Why this match** was accepted — homepage HTML, Google Search, or enrichment |
| `clearReason` on CLEAR rows | **Why there is no billable match** — no public hit, below confidence, or ambiguous result |
| `OUTPUT` / `RUN_SUMMARY` outcomes | **Provenance** — complete, empty, invalid input, or upstream outage |

### Who it is for (and why it matters)

- **Sales development reps** — attach a LinkedIn company URL to inbound domains before account research.
- **RevOps / CRM owners** — backfill account records with a canonical `/company/` URL from the website column.
- **Recruiters** — map employer career-site domains to public LinkedIn company pages for hiring-manager research.
- **AI agents** — one tool call with `websites` returns structured found or CLEAR rows, so the agent can enrich, skip, or route without guessing.

### When to use this Actor

- You have company websites or domains and need public LinkedIn company page URLs.
- You want unmatched sites recorded as CLEAR so the dataset stays honest.
- You need optional public firmographics (industry, employees, HQ, followers) after a match.
- When you already have LinkedIn `/company/` URLs, start with [LinkedIn Company Profile Scraper](https://apify.com/khadinakbar/linkedin-company-profile-scraper).
- When the starting point is a keyword, industry, or location instead of a website, use [LinkedIn Company Search Scraper](https://apify.com/khadinakbar/linkedin-company-search-scraper).

### Best fit for this Actor

- Strongest starting condition: a company homepage that either links to LinkedIn or is well-indexed next to `site:linkedin.com/company`.
- Useful output: one row per website, billed only when `matchStatus` is `found`.
- When you already have the LinkedIn company URL and need people at that company, route to a company-employee or profile Actor instead of this finder.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `websites` | array (required) | 1 example domain | Up to 100 domains or homepage URLs per run |
| `maxItems` | integer | 50 | Cap on **found** companies saved and billed (CLEAR rows stay outside this cap) |
| `minConfidence` | integer | 60 | Minimum 0–100 score required to accept a match |
| `enrichCompany` | boolean | false | Add industry, employees, HQ, followers ($0.02/row extra) |
| `providerOrder` | enum | `scrapecreators-first` | Public-data provider priority; fallback fires automatically |
| `maxConcurrency` | integer | 2 | Websites processed in parallel (1–5) |

#### Quick start input

```json
{
    "websites": ["stripe.com"],
    "maxItems": 1,
    "enrichCompany": false
}
```

That input selects a single well-known company homepage so the run stays inside the five-minute quality window and still returns a real found row.

#### Example input — bulk domains, enrichment on

```json
{
    "websites": [
        "stripe.com",
        "https://www.notion.so"
    ],
    "maxItems": 50,
    "minConfidence": 60,
    "enrichCompany": true
}
```

Duplicate websites are deduplicated automatically. Values that are not domains or URLs are written as CLEAR `invalid_website` and never billed.

### What data you receive

One dataset item is one website lookup. Found rows carry the LinkedIn company identity; CLEAR rows document that the lookup finished with no billable match.

```json
{
    "inputWebsite": "stripe.com",
    "normalizedDomain": "stripe.com",
    "matchStatus": "found",
    "confidence": 96,
    "linkedinUrl": "https://www.linkedin.com/company/stripe",
    "linkedinSlug": "stripe",
    "companyName": "Stripe",
    "matchStrategy": "website-html",
    "enriched": false,
    "provider": "website-html",
    "scrapedAt": "2026-08-21T00:00:00.000Z"
}
```

CLEAR example:

```json
{
    "inputWebsite": "this-domain-has-no-linkedin-page.example",
    "normalizedDomain": "this-domain-has-no-linkedin-page.example",
    "matchStatus": "clear",
    "clearReason": "no_public_match",
    "enriched": false,
    "scrapedAt": "2026-08-21T00:00:00.000Z"
}
```

Every terminal run also writes `OUTPUT` and `RUN_SUMMARY` with a named `outcome`, per-website results, provider diagnostics, and billing counters.

### Workflow story: from a CRM website column to outreach-ready LinkedIn company URLs

A RevOps lead exports 40 account websites from a webinar sponsor list. She pastes them into this Actor with `enrichCompany: true` and `maxItems` at 40. The run first reads each homepage for a `linkedin.com/company/` link, then falls back to public Google Search restricted to LinkedIn company pages, and keeps only matches that clear the confidence bar. Thirty-one rows come back `found` with company URLs; seven are CLEAR (`no_public_match`); two stay unmatched because the domain is a parking page. She then filters `matchStatus=found`, hands the `linkedinUrl` values to [LinkedIn Company Profile Scraper](https://apify.com/khadinakbar/linkedin-company-profile-scraper) only when she needs a deeper public profile, and skips paying for the CLEAR rows. Event cost is 31 × $0.01 plus enrichment on the rows that actually received public firmographic fields.

### Use through the API

```bash
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~linkedin-company-finder-from-website/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "websites": ["stripe.com"],
    "maxItems": 1,
    "enrichCompany": false
  }'
```

Results land in the run's default dataset: `https://api.apify.com/v2/datasets/{datasetId}/items?clean=true`. Paginate large batches with `offset`/`limit`. The same Actor is exposed through Apify MCP as `apify--linkedin-company-finder-from-website`.

### Use with AI agents through Apify MCP

> Given these company websites, find each company's public LinkedIn company page URL, slug, and name. Return CLEAR for sites with no public match. Keep only dataset `linkedinUrl` values. Cap the run at 25 found companies.

Inspect the terminal `outcome`, read the dataset, keep `linkedinUrl` as the source identifier, and treat `clearReason` as a completed empty lookup for that website. Connect through [Apify MCP](https://mcp.apify.com).

```json
{
    "websites": ["stripe.com"],
    "maxItems": 25,
    "minConfidence": 60,
    "enrichCompany": true,
    "providerOrder": "scrapecreators-first",
    "maxConcurrency": 2
}
```

Then read results with `get-actor-output`, keep `matchStatus=found` rows for enrichment, and pass remaining websites to a different data source.

### Pricing

This Actor uses Pay per event plus Apify platform usage. Open the live Pricing tab for current event details, and use Apify's run cost controls to keep the workflow aligned with your budget.

| Event | Price | Charged when |
|---|---|---|
| Actor start | $0.00005 | Once per run (scaled by memory) |
| `company-found` | $0.01 | One found LinkedIn company page saved |
| `company-enriched` | $0.02 | Additional, only when enrichment succeeded |

CLEAR rows, invalid input, and unmatched websites are not billed as `company-found`.

| Run | Found rows | Enrichment | Event cost (approx.) |
|---|---|---|---|
| 1 website, match | 1 | off | ~$0.01 |
| 1 website, match | 1 | on | ~$0.03 |
| 40 websites, 31 found | 31 | off | ~$0.31 |
| 40 websites, 31 found | 31 | on | ~$0.93 |

Your run log prints the exact cost cap before any charge fires. Platform usage is billed on top at Apify's rates — the live [Pricing tab](https://apify.com/khadinakbar/linkedin-company-finder-from-website/pricing) is the current source of truth.

### Best results

- Prefer the company's primary homepage or apex domain (`stripe.com`), not a random blog post.
- Keep `minConfidence` at 60 unless you have a reason to accept weaker brand-only matches.
- Turn on `enrichCompany` when you need industry, employee count, headquarters, or followers for routing.
- After you have company URLs, pass them to [LinkedIn Company Profile Scraper](https://apify.com/khadinakbar/linkedin-company-profile-scraper) for the full public profile, or to [LinkedIn Company Search Scraper](https://apify.com/khadinakbar/linkedin-company-search-scraper) when you are still discovering companies by keyword.

### Builder's note

I built this after probing live homepages and both public-data providers: many companies already publish `linkedin.com/company/{slug}` in the footer or JSON-LD `sameAs`, which is a stronger signal than a Google snippet. When the homepage has no LinkedIn link, ScrapeCreators `GET /v1/google/search` with `site:linkedin.com/company "domain.com"` returns the company page with the website in the snippet, and SociaVault is a clean envelope fallback. There is no native website-to-LinkedIn endpoint. That is why this Actor tries homepage HTML first, bills only found company pages, writes honest CLEAR rows, and keeps optional firmographics on a second event.

### Responsible use

Use this Actor on websites you are authorized to process for legitimate sales, recruiting, research, or verification. It reads **public homepage HTML, public web search results, and public LinkedIn company pages only**. It does not log into LinkedIn, does not use your cookies, and is not a private company graph or data-broker dump. Follow GDPR, CCPA, LinkedIn's terms, and any local law that applies to your outreach.

This tool is provided for lawful public-data collection. You are responsible for how you use the output.

# Actor input Schema

## `websites` (type: `array`):

Company homepage URLs or domains to resolve to public LinkedIn company pages, e.g. stripe.com or https://www.notion.so. Accepts bare domains, www URLs, or https links. Up to 100 per run. NOT LinkedIn company URLs — for those use LinkedIn Company Profile Scraper.

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

Maximum number of matched LinkedIn company pages to save and bill this run. Default 50. CLEAR / not-found rows do not count toward this cap and are never billed. Prefill is 1 so Apify quality tests finish quickly; raise it for production batches.

## `minConfidence` (type: `integer`):

Minimum 0-100 confidence required to accept a LinkedIn company page as a match. Default 60. Lower values return more matches with a higher false-positive risk; higher values keep only domain or slug locks. This is not a LinkedIn login threshold.

## `enrichCompany` (type: `boolean`):

When enabled, each found LinkedIn company page is fetched to add industry, employee count, headquarters, followers, founded year, and description. Enrichment costs an additional $0.02 per successfully enriched company on top of the $0.01 found-company charge. Leave disabled when you only need the LinkedIn URL.

## `providerOrder` (type: `string`):

Which public-data provider to try first for Google Search and optional company enrichment after homepage extraction. Both providers return the same row shape; the fallback is used automatically when the primary fails or returns no results. Keep the default unless you have a reason to prefer SociaVault.

## `maxConcurrency` (type: `integer`):

How many website lookups to run in parallel. Default 2 balances speed against provider rate limits. Raise to 5 for large batches; lower to 1 if you see provider rate-limit errors in the run log.

## Actor input object example

```json
{
  "websites": [
    "stripe.com"
  ],
  "maxItems": 1,
  "minConfidence": 60,
  "enrichCompany": false,
  "providerOrder": "scrapecreators-first",
  "maxConcurrency": 2
}
```

# Actor output Schema

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

Dataset items containing input website, matchStatus, LinkedIn company URL, slug, name, confidence, and optional enrichment.

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

Run summary including outcome, companiesFound, clearRows, provider diagnostics, and billing counters.

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

Machine-readable RUN\_SUMMARY record mirroring OUTPUT 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 = {
    "websites": [
        "stripe.com"
    ],
    "maxItems": 1,
    "minConfidence": 60,
    "enrichCompany": false,
    "maxConcurrency": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/linkedin-company-finder-from-website").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 = {
    "websites": ["stripe.com"],
    "maxItems": 1,
    "minConfidence": 60,
    "enrichCompany": False,
    "maxConcurrency": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/linkedin-company-finder-from-website").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 '{
  "websites": [
    "stripe.com"
  ],
  "maxItems": 1,
  "minConfidence": 60,
  "enrichCompany": false,
  "maxConcurrency": 2
}' |
apify call khadinakbar/linkedin-company-finder-from-website --silent --output-dataset

```

## MCP server setup

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

```

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/rs9pkKCfDcdihqtWS/builds/J9kFz9OkSvH4qcpSL/openapi.json
