# LinkedIn Profile & Email Finder — by Company or Role (`signalengine/linkedin-profile-finder`) Actor

Find decision-makers on LinkedIn — names, titles, profile URLs and verified work emails — by company or role. It reads public Google/Bing snippets: no login, no cookies, no account-ban risk. Optional email enrichment with your own Prospeo or Hunter key.

- **URL**: https://apify.com/signalengine/linkedin-profile-finder.md
- **Developed by:** [James Taylor](https://apify.com/signalengine) (community)
- **Categories:** Lead generation
- **Stats:** 21 total users, 16 monthly users, 99.1% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 profiles

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 & Email Finder — Decision-Makers by Company or Role

This **LinkedIn profile and email finder** turns a list of companies — or a single
role/location query — into a clean list of decision-makers: the person's name, title,
company, a direct `linkedin.com/in/...` profile URL, and (optionally) their **verified work
email**. It works entirely from **public Google (and Bing) search snippets** — so it
**never logs into LinkedIn**, never opens a profile page, and never touches a cookie. There's
nothing of yours to get banned.

It's built for founders, marketers, agencies and sales teams who want to **find
decision-makers by company domain or by role**, without risking a LinkedIn account or
fighting Cloudflare.

### Why this instead of scraping LinkedIn directly?

Authenticated LinkedIn scrapers log in with your `li_at` cookie, hammer profile pages, and
trip LinkedIn's defences — which is how accounts get rate-limited, challenged, or banned. This
actor takes the opposite path. It reads what Google has already indexed about public LinkedIn
profiles (`site:linkedin.com/in "<company>"`) and parses the result snippets. That means:

- **No login, no account, no `li_at` cookie** — there is nothing of yours to suspend.
- **No LinkedIn profile-page fetch** — so no Cloudflare wall, no checkpoint, no auth challenge.
- **Zero account risk** — you can't get *your* LinkedIn banned by a tool that never signs in.

It's the safe, auth-less way to **scrape LinkedIn without login** — a LinkedIn profile URL
finder that reads public search results, not private pages.

### What the LinkedIn Profile Finder does

- Takes a list of **companies** (`{name, domain}` objects or plain strings) and/or a
  **free-form query** like `"marketing director Manchester"`.
- Searches public results for `linkedin.com/in/...` profiles, biased toward decision-makers
  with your `roleKeywords` (CEO, owner, founder, director by default).
- Parses each result's title into a **person name + job title**, and confirms the profile
  actually belongs to your target before keeping it.
- Returns a tidy dataset — one item per person — with the name, title, company, profile URL,
  and *why* we matched it.
- Runs through Apify's **GOOGLE_SERP proxy** by default (no BYO key); falls back to Bing when
  Google returns nothing.

### Who it's for

- **B2B founders & marketers** who need a named decision-maker at each target account.
- **Agencies** building prospect lists for client niches by company or by role + location.
- **Sales & SDR teams** who want LinkedIn profile URLs to enrich a CRM or start outreach.
- **Recruiters & researchers** finding people by company domain without a Sales Navigator seat.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `companies` | array | `[]` | Companies to find decision-makers at. Each item is an object `{name, domain}` or a plain string (a dotted no-space string like `acme.co.uk` is treated as a domain, otherwise as a company name). |
| `searchQuery` | string | `""` | Alternative to companies: a role/location query, e.g. `"marketing director Manchester"`. Provide `companies`, `searchQuery`, or both. |
| `roleKeywords` | array | `["CEO","owner","founder","director"]` | Bias results toward decision-makers. |
| `maxResultsPerTarget` | integer | `5` | How many profiles to keep per company/query. |
| `maxProfiles` | integer | `100` | Hard cap on total profiles for the whole run (caps your spend). |
| `searchEngine` | string | `"google"` | `google` or `bing`. Google is default; the actor falls back to Bing if Google returns nothing. |
| `findEmails` | boolean | `false` | Enrich each company-matched profile with a verified work email using your BYO key (see `emailProvider` + `emailApiKey`). Requires a company domain; free-form query results stay `null`. Off by default. |
| `emailProvider` | string | `"prospeo"` | Which email-finder provider your key is for: `prospeo` (Prospeo) or `hunter` (Hunter.io). |
| `emailApiKey` | string (secret) | — | Your own Prospeo or Hunter API key. Only used when `findEmails` is on. You pay your provider directly for lookups. No key? Get one from [Prospeo](https://prospeo.io/?via=james) *(referral link)* — 100 free lookups/month. |
| `maxConcurrency` | integer | `3` | Parallel search requests (kept modest). |
| `proxyConfiguration` | object | `GOOGLE_SERP` | Defaults to Apify's GOOGLE_SERP proxy group (required to read search results reliably). |

At least one of `companies` or `searchQuery` is required — with neither, the run stops with a
clear "nothing to search" error.

#### Example input

**Find decision-makers at specific companies** (company mode):

```json
{
  "companies": [
    { "name": "Monzo", "domain": "monzo.com" },
    "stripe.com",
    "Acme Dental"
  ],
  "roleKeywords": ["CEO", "founder", "director", "head of"],
  "maxResultsPerTarget": 5
}
````

**Find people by role and location** (free-form mode):

```json
{
  "searchQuery": "marketing director Manchester",
  "maxProfiles": 25
}
```

You can also pass both — the actor searches each company *and* the free-form query in the
same run.

### How to run

1. Click **Try for free** (or open the actor in your Apify Console).
2. Either paste your **companies** (names and/or domains) or type a **free-form query**
   like `marketing director Manchester`.
3. (Optional) Tune **roleKeywords** to bias toward the seniority you want.
4. Set **maxProfiles** (and **maxResultsPerTarget**) to cap your spend.
5. Click **Start**. When the run finishes, open the **Dataset** tab and export to
   JSON/CSV/Excel, or pull it via the API (below).

Run it on a **schedule** (Apify Schedules) to refresh a target list, or call it from
**Make / Zapier / n8n** via the Apify integrations.

### Output

Each item in the dataset is one person. Here is an example for a company-mode run with
`findEmails` on and a valid key:

```json
{
  "type": "profile",
  "name": "John Smith",
  "title": "Chief Information Security Officer",
  "company": "Monzo",
  "profileUrl": "https://www.linkedin.com/in/john-smith-monzo",
  "matchedOn": "domain",
  "source": "google-linkedin",
  "targetCompany": "Monzo",
  "targetDomain": "monzo.com",
  "query": null,
  "email": "john.smith@monzo.com",
  "emailStatus": "VALID",
  "emailConfidence": null
}
```

When `findEmails` is off (default) or no `emailApiKey` is supplied, or the profile came from a
free-form query (no company domain), these fields are always `null`:

```json
  "email": null,
  "emailStatus": null,
  "emailConfidence": null
```

Field notes:

- **`name` / `title`** are parsed from the public search-result title (e.g. *"John Smith — CISO
  at Monzo"*). A person-name guard rejects company names and boilerplate, so you don't get junk
  rows.
- **`profileUrl`** is the public `linkedin.com/in/...` URL — open it, or enrich it in your CRM.
- **`matchedOn`** tells you *why* we trusted this result belongs to your target: `domain`,
  `businessName`, or `urlSlug` in company mode, or `query` in free-form mode.
- **`company`** is best-effort — parsed from the title's "… at \<Company>" when present,
  otherwise `null`.
- **`targetCompany` / `targetDomain`** echo the company you searched (both `null` for free-form
  queries); **`query`** holds your free-form text (and is `null` in company mode).
- **`email`** is the verified work email returned by your provider. `null` unless `findEmails` is
  on, a key is supplied, and the profile has a company domain. We never fabricate — the
  provider's verdict is passed through unchanged.
- **`emailStatus`** is the provider's verification verdict (e.g. `VALID` for Prospeo, `valid` for
  Hunter). `null` when no email was found.
- **`emailConfidence`** is the numeric confidence score (Hunter only, 0–100). `null` for Prospeo
  and for any profile without a found email.

A run that finds nobody doesn't return a silent blank dataset — it sets a clear status message
with tips (add a domain, widen `roleKeywords`, try `searchEngine: "bing"`).

### Finding emails

Turn on `findEmails` and supply your own **Prospeo** or **Hunter.io** API key to add a verified
work email to each company-mode profile.

**Don't have a key yet?** We recommend **[Prospeo](https://prospeo.io/?via=james)** *(referral
link)* — it's the provider we test this actor against, and it gives **100 free lookups/month** to
start. Create an account, copy your API key, and paste it into `emailApiKey`. The actor also
supports [Hunter.io](https://hunter.io) — set `emailProvider` to `hunter` if you use that instead.

**How it works:**

1. After each profile is matched, the actor calls your provider's email-finder endpoint. For
   **Prospeo**, it matches on the person's **exact LinkedIn profile URL** for the highest accuracy
   (falling back to name + company domain); **Hunter** uses name + company domain.
2. If the provider returns a verified email, it is written to `email` + `emailStatus` (and
   `emailConfidence` for Hunter).
3. You are charged **$0.002 per email returned** by us (via Apify Pay-Per-Event), plus your
   provider's own per-lookup charge.

**Requirements and limits:**

- `findEmails` must be `true` and a non-empty `emailApiKey` must be supplied.
- Only **company-mode** profiles get enriched — profiles matched via `targetDomain` have the
  domain the provider needs. Free-form query results (`query` mode) and profiles from
  name-only company entries that couldn't resolve a domain will always return `email: null`.
- Set `emailProvider` to `prospeo` (default) or `hunter` to match your key.
- You pay your provider directly. We never proxy or store your API key beyond the run.

**Example input with email enrichment:**

```json
{
  "companies": [{ "name": "Monzo", "domain": "monzo.com" }],
  "maxProfiles": 10,
  "findEmails": true,
  "emailProvider": "prospeo",
  "emailApiKey": "YOUR_PROSPEO_KEY"
}
```

#### Export & API

```bash
## Last run's dataset items as JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=json&token=<APIFY_TOKEN>"
```

Or use the **run-sync-get-dataset-items** endpoint to run-and-wait in a single call — handy
for embedding the actor in your own backend.

### Limitations

- **Profiles are snippet-derived.** We read what search engines have indexed, so
  decision-maker coverage varies by company — some targets return five named profiles, others
  return one or two. Adding a `domain` alongside the company `name` improves matching.
- **Free-form mode is noisier.** A query like `"marketing director Manchester"` casts a wide
  net and can return loosely-relevant people; company mode (with a domain) is the precise path.
- **Name collisions.** A company name that's also a common surname (e.g. *"Baker"*, *"Marshall"*)
  can occasionally match an unrelated person. Pass a `domain` to disambiguate — that's the
  strongest match signal.
- **Emails require opt-in and a company domain.** Set `findEmails: true` and supply a Prospeo
  or Hunter `emailApiKey` to get work emails. Free-form query mode and name-only companies that
  couldn't resolve a domain return `email: null` — the provider needs a domain to look up.

### Compliance

This actor reads **public search-engine snippets only**. It does **not** log into LinkedIn,
fetch the LinkedIn profile page, use cookies or an `li_at` token, or access anything behind
authentication. It reads results through Apify's SERP proxy and runs at modest concurrency.
You are responsible for using the returned data in line with applicable privacy and outreach
laws (GDPR, CAN-SPAM, and any rules that apply to you).

### FAQ

**How do I find LinkedIn profiles by company?** Put each company in `companies` — as a
`{name, domain}` object or a plain string. The actor searches public results for that company
and returns the decision-maker profiles it can confirm belong to it. Adding the `domain` gives
the most accurate matches.

**Can it find a LinkedIn profile URL for me?** Yes — every dataset item includes `profileUrl`,
the public `linkedin.com/in/...` link. That's the core of what this LinkedIn profile URL finder
does: turn a company or role into named people with their profile URLs.

**Does it log into LinkedIn — will it ban my LinkedIn account?** No. It never logs in, never
opens a LinkedIn profile page, and never uses your cookie or `li_at`. It only reads public
Google/Bing search snippets, so there's no account of yours involved and nothing to get banned.
That's the whole point of scraping LinkedIn data *without login*.

**Do I need a LinkedIn account, cookie, or API key?** No — none of those. You don't supply a
LinkedIn login, an `li_at` cookie, or a search-API key. Google searches run through Apify's
GOOGLE\_SERP proxy out of the box.

**Does it find emails?** Yes — turn on `findEmails` and supply your Prospeo or Hunter key via
`emailApiKey`, and we return the provider-verified work email for each company-domain profile.
Set `emailProvider` to `prospeo` (default) or `hunter` to match your key. Need a key? Start with
[Prospeo](https://prospeo.io/?via=james) *(referral link)* — 100 free lookups/month. Free-form
query results and name-only companies without a domain return `email: null` — a company domain is
required for the lookup. We never fabricate an address: the provider's verdict is passed through
unchanged.

**What does it cost to find emails?** You pay two charges: your provider's own per-lookup fee
(check Prospeo or Hunter's pricing), plus **$0.002 per email returned** to us as an Apify
Pay-Per-Event `email` event. The $0.002 event is only charged when the provider actually returns
a verified email — unsuccessful lookups are not charged by us.

**When should I use company search vs role search?** Use **company mode** (`companies`, ideally
with a domain) when you have target accounts and want the right people inside them — it's the
precise path. Use **free-form mode** (`searchQuery`) to discover people by role and location
when you don't have a company list — it's broader and a bit noisier.

**How is it priced and how do I control cost?** Apify Pay-Per-Event — you're charged per
**profile** returned ($0.004/profile) and, when `findEmails` is on, an additional **$0.002 per
email** returned (the `email` event). Set `maxProfiles` (run-wide cap) and
`maxResultsPerTarget` (per-company cap) to control spend; non-matching and duplicate results
are never charged. Email lookups that return no address are not charged by us (though your
provider may still count them against your plan).

**How fresh is the data?** It reads live search results on each run, so freshness tracks what
Google/Bing currently index for each profile. Re-run on a schedule to refresh a target list.

**What if a run finds nobody?** You'll get a clear status message (not a silent empty dataset)
suggesting fixes — add a company `domain`, widen `roleKeywords`, or switch `searchEngine` to
`bing`.

***

#### Want this fully automated?

This actor finds the decision-makers. If you'd like the **whole loop** — finding the right
people, enriching their contact details, AI-personalised outreach, and reply handling — done
for you, that's what we build at **[SignalEngine](https://engine.signalsprint.io)**. This actor
is a taste of the engine that powers it.

Looking for buyer-intent leads instead of named decision-makers? See our **Reddit Lead Finder**.

# Actor input Schema

## `companies` (type: `array`):

Companies to find decision-makers at. Each item is an object {name, domain} or a plain string (a dotted no-space string like acme.co.uk is treated as a domain, otherwise as a company name).

## `searchQuery` (type: `string`):

Alternative to companies: a role/location query, e.g. "marketing director Manchester". Provide companies, searchQuery, or both.

## `roleKeywords` (type: `array`):

Bias results toward decision-makers.

## `maxResultsPerTarget` (type: `integer`):

How many profiles to keep per company/query.

## `maxProfiles` (type: `integer`):

Hard cap on total profiles for the whole run (caps your spend).

## `searchEngine` (type: `string`):

Which engine to use. Google is default; the actor falls back to Bing if Google returns nothing.

## `findEmails` (type: `boolean`):

Enrich each company-matched profile with a verified work email using YOUR email-finder key (see emailProvider + emailApiKey). Requires a company domain; free-form query results stay null. Off by default.

## `emailProvider` (type: `string`):

Which email-finder provider your key is for.

## `emailApiKey` (type: `string`):

Your own Prospeo or Hunter API key (matching emailProvider). Only used when findEmails is on. You pay your provider directly for lookups.

## `emailThrottleMs` (type: `integer`):

Delay between email lookups. Prevents provider rate-limiting (Prospeo's free tier rate-limits — rate-limited calls silently return no email). Lower it to 0 on a paid/high-limit plan to speed up large runs.

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

Parallel search requests (kept modest).

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

Defaults to Apify's GOOGLE\_SERP proxy group (required to read search results reliably).

## Actor input object example

```json
{
  "companies": [],
  "searchQuery": "marketing director London",
  "roleKeywords": [
    "CEO",
    "owner",
    "founder",
    "director"
  ],
  "maxResultsPerTarget": 5,
  "maxProfiles": 100,
  "searchEngine": "google",
  "findEmails": false,
  "emailProvider": "prospeo",
  "emailThrottleMs": 1100,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "GOOGLE_SERP"
    ]
  }
}
```

# Actor output Schema

## `profiles` (type: `string`):

Per-person records: name, title, company, linkedin.com/in URL, and why it matched.

# 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 = {
    "searchQuery": "marketing director London"
};

// Run the Actor and wait for it to finish
const run = await client.actor("signalengine/linkedin-profile-finder").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 = { "searchQuery": "marketing director London" }

# Run the Actor and wait for it to finish
run = client.actor("signalengine/linkedin-profile-finder").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 '{
  "searchQuery": "marketing director London"
}' |
apify call signalengine/linkedin-profile-finder --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "LinkedIn Profile & Email Finder — by Company or Role",
        "description": "Find decision-makers on LinkedIn — names, titles, profile URLs and verified work emails — by company or role. It reads public Google/Bing snippets: no login, no cookies, no account-ban risk. Optional email enrichment with your own Prospeo or Hunter key.",
        "version": "0.1",
        "x-build-id": "A2q8ywOSpKLSX2cxa"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/signalengine~linkedin-profile-finder/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-signalengine-linkedin-profile-finder",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/signalengine~linkedin-profile-finder/runs": {
            "post": {
                "operationId": "runs-sync-signalengine-linkedin-profile-finder",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/signalengine~linkedin-profile-finder/run-sync": {
            "post": {
                "operationId": "run-sync-signalengine-linkedin-profile-finder",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "companies": {
                        "title": "Companies",
                        "type": "array",
                        "description": "Companies to find decision-makers at. Each item is an object {name, domain} or a plain string (a dotted no-space string like acme.co.uk is treated as a domain, otherwise as a company name).",
                        "default": []
                    },
                    "searchQuery": {
                        "title": "Free-form search query",
                        "type": "string",
                        "description": "Alternative to companies: a role/location query, e.g. \"marketing director Manchester\". Provide companies, searchQuery, or both.",
                        "default": ""
                    },
                    "roleKeywords": {
                        "title": "Role keywords",
                        "type": "array",
                        "description": "Bias results toward decision-makers.",
                        "default": [
                            "CEO",
                            "owner",
                            "founder",
                            "director"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResultsPerTarget": {
                        "title": "Max profiles per target",
                        "minimum": 1,
                        "maximum": 25,
                        "type": "integer",
                        "description": "How many profiles to keep per company/query.",
                        "default": 5
                    },
                    "maxProfiles": {
                        "title": "Max profiles (run cap)",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Hard cap on total profiles for the whole run (caps your spend).",
                        "default": 100
                    },
                    "searchEngine": {
                        "title": "Search engine",
                        "enum": [
                            "google",
                            "bing"
                        ],
                        "type": "string",
                        "description": "Which engine to use. Google is default; the actor falls back to Bing if Google returns nothing.",
                        "default": "google"
                    },
                    "findEmails": {
                        "title": "Find work emails",
                        "type": "boolean",
                        "description": "Enrich each company-matched profile with a verified work email using YOUR email-finder key (see emailProvider + emailApiKey). Requires a company domain; free-form query results stay null. Off by default.",
                        "default": false
                    },
                    "emailProvider": {
                        "title": "Email provider",
                        "enum": [
                            "prospeo",
                            "hunter"
                        ],
                        "type": "string",
                        "description": "Which email-finder provider your key is for.",
                        "default": "prospeo"
                    },
                    "emailApiKey": {
                        "title": "Email provider API key",
                        "type": "string",
                        "description": "Your own Prospeo or Hunter API key (matching emailProvider). Only used when findEmails is on. You pay your provider directly for lookups."
                    },
                    "emailThrottleMs": {
                        "title": "Email lookup throttle (ms)",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Delay between email lookups. Prevents provider rate-limiting (Prospeo's free tier rate-limits — rate-limited calls silently return no email). Lower it to 0 on a paid/high-limit plan to speed up large runs.",
                        "default": 1100
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Parallel search requests (kept modest).",
                        "default": 3
                    },
                    "proxyConfiguration": {
                        "title": "Proxy",
                        "type": "object",
                        "description": "Defaults to Apify's GOOGLE_SERP proxy group (required to read search results reliably).",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "GOOGLE_SERP"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
