# LinkedIn Profile Search Scraper (`spectre_scrape/linkedin-profile-search-scraper`) Actor

Extract public LinkedIn profile data from Google Search without logging in. Features multi-query batching, structured data extraction (name, job title, company, location), automatic retries, and deduplication. Ideal for recruiting and lead generation. Pay only for profiles successfully scraped.

- **URL**: https://apify.com/spectre\_scrape/linkedin-profile-search-scraper.md
- **Developed by:** [Spectre](https://apify.com/spectre_scrape) (community)
- **Categories:** Automation, Lead generation
- **Stats:** 43 total users, 10 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.00005 / actor start

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Profile Search Scraper

Find and extract publicly available LinkedIn profile data from Google Search results — with **structured output**, **multi-query batching**, and **automatic retry**.

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-brightgreen)](https://apify.com)

***

### What does it do?

This Actor searches Google using targeted `site:linkedin.com/in` queries to discover publicly indexed LinkedIn profiles. It extracts structured data from search result snippets — **no LinkedIn login required**.

#### Key Features

| Feature | Details |
|---|---|
| 🔎 **Single or batch queries** | Pass one query string or a list for bulk searches |
| 🧠 **Structured output** | Parsed `name`, `jobTitle`, `company`, `location` — not just raw snippets |
| 📄 **Multi-page support** | Up to 20 pages per query (~200 profiles per query) |
| 🔁 **Automatic retry** | 3-attempt retry with backoff on failed requests |
| 🌍 **Global search** | Set `countryCode` for localized Google results |
| 🚫 **Deduplication** | Duplicate profiles are removed across pages and queries |
| 💰 **Max results cap** | Set `maxResults` to control spend precisely |
| 🔒 **Public data only** | No LinkedIn session or credentials needed |

***

### Input

Configure via the **Input** tab in Apify Console.

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `query` | string | No\* | — | Single Google search query |
| `queries` | array | No\* | — | Multiple queries for batch scraping |
| `maxPages` | integer | No | `1` | Pages per query (1–20, ~10 profiles/page) |
| `maxResults` | integer | No | unlimited | Hard cap on total profiles saved |
| `countryCode` | string | No | `us` | Google locale (`us`, `uk`, `de`, `in`, `au`…) |
| `proxyConfiguration` | object | No | `GOOGLE_SERP` | Proxy settings — SERP proxies required |

> \* At least one of `query` or `queries` must be provided.

#### Query Examples

```
site:linkedin.com/in "software engineer" "San Francisco"
site:linkedin.com/in "product manager" fintech "New York"
site:linkedin.com/in director "venture capital"
site:linkedin.com/in founder startup "London"
site:linkedin.com/in nurse "Los Angeles"
```

> 💡 Use quotes for exact phrase matching. Combine with `OR` / `AND` for complex filters.

***

### Output

Results are saved to the default dataset and can be exported as **JSON, CSV, Excel, or HTML**.

#### Dataset Fields

| Field | Type | Description |
|---|---|---|
| `name` | string | Parsed name from the search result title |
| `jobTitle` | string | Parsed job title (e.g. "Software Engineer") |
| `company` | string | Parsed current company (e.g. "Google") |
| `location` | string | Location from result subtitle (e.g. "San Francisco Bay Area") |
| `title` | string | Full raw title from search result |
| `profileUrl` | string | Direct LinkedIn profile URL |
| `description` | string | Full snippet text from Google |
| `displayUrl` | string | URL shown in search result |
| `position` | integer | Result position (1-based) |
| `sourceUrl` | string | Google search page URL |
| `scrapedAt` | string | ISO 8601 timestamp |

#### Example Output

```json
{
  "name": "Jane Smith",
  "jobTitle": "Senior Software Engineer",
  "company": "Stripe",
  "location": "San Francisco, California, United States",
  "title": "Jane Smith - Senior Software Engineer at Stripe",
  "profileUrl": "https://www.linkedin.com/in/janesmith",
  "description": "Senior Software Engineer at Stripe · San Francisco Bay Area · 2K followers",
  "displayUrl": "https://www.linkedin.com/in/janesmith",
  "position": 1,
  "sourceUrl": "https://www.google.com/search?q=site%3Alinkedin.com%2Fin+software+engineer",
  "scrapedAt": "2026-05-30T08:46:28.000Z"
}
```

***

### Use Cases

| Use Case | Example Query |
|---|---|
| **Recruiting** | `site:linkedin.com/in "software engineer" "San Francisco"` |
| **Lead Generation** | `site:linkedin.com/in "marketing director" "New York"` |
| **Market Research** | `site:linkedin.com/in founder startup` |
| **Competitive Intel** | `site:linkedin.com/in engineer Google OR Meta` |
| **Networking** | `site:linkedin.com/in "data scientist" healthcare` |

***

### Tips & Tricks

**Optimize queries:**

- Use quotes for exact matches: `"product manager"`
- Include location: `"San Francisco"` or `"London"`
- Filter by company: `site:linkedin.com/in engineer Google`
- Combine with OR: `site:linkedin.com/in (engineer OR developer)`

**Control costs:**

- Set `maxResults` to cap total profiles regardless of query count
- Start with `maxPages: 1` to preview results
- Use `countryCode` to improve regional relevance

**Data quality:**

- Structured fields (`name`, `jobTitle`, `company`) are parsed heuristically — verify for edge cases
- Google's snippet content varies; some profiles may have partial data
- Results depend on Google's indexing

***

### Limitations

- Extracts **publicly available** data only from Google Search results
- Does not log into LinkedIn or access private profile information
- Results depend on Google's indexing — not all profiles appear
- Google may occasionally rate-limit requests; the Actor retries automatically (3 attempts per page)

***

### Support

- **Issues**: Report via the Actor's Issues tab in Apify Store
- **Docs**: [Apify Platform Documentation](https://docs.apify.com)

Built with ❤️ on the [Apify Platform](https://apify.com).

# Actor input Schema

## `query` (type: `string`):

Single Google search query (e.g. site:linkedin.com/in "software engineer" "San Francisco"). Use this OR the queries list below.

## `queries` (type: `array`):

Run multiple search queries in one go. Each query is processed independently.

## `maxPages` (type: `integer`):

Maximum number of Google Search result pages to scrape per query (1–20, ~10 profiles per page).

## `maxResults` (type: `integer`):

Hard cap on total profiles saved across all queries. Leave empty for unlimited.

## `countryCode` (type: `string`):

Google Search locale/domain (e.g. us, uk, de, in, au). Affects result relevance.

## `proxyConfiguration` (type: `object`):

Select proxies to be used by your scraper. GOOGLE\_SERP proxies are strongly recommended.

## Actor input object example

```json
{
  "query": "site:linkedin.com/in \"software engineer\" \"San Francisco\"",
  "maxPages": 1,
  "countryCode": "us",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "GOOGLE_SERP"
    ]
  }
}
```

# Actor output Schema

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

Dataset of LinkedIn profiles found via Google Search, with structured fields for name, job title, company, and location.

# 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 = {
    "query": "site:linkedin.com/in \"software engineer\" \"San Francisco\""
};

// Run the Actor and wait for it to finish
const run = await client.actor("spectre_scrape/linkedin-profile-search-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 = { "query": "site:linkedin.com/in \"software engineer\" \"San Francisco\"" }

# Run the Actor and wait for it to finish
run = client.actor("spectre_scrape/linkedin-profile-search-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "query": "site:linkedin.com/in \\"software engineer\\" \\"San Francisco\\""
}' |
apify call spectre_scrape/linkedin-profile-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=spectre_scrape/linkedin-profile-search-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/QzH1WMUtYrIlqCr0A/builds/4DDFKX8pW1HQeKbBK/openapi.json
