# LinkedIn Profile Scraper + Verified Email Finder (No Cookies) (`crustapi/linkedin-profile-scraper-email-finder`) Actor

Scrape public LinkedIn profiles and find verified business emails, by URL or just a name and company. No cookies, no login. Pay only for verified emails.

- **URL**: https://apify.com/crustapi/linkedin-profile-scraper-email-finder.md
- **Developed by:** [Crust](https://apify.com/crustapi) (community)
- **Categories:** Lead generation, Social media, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 profile scrapeds

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 Scraper + Verified Email Finder

*No login. No cookies. Get the data from LinkedIn profiles, or find a real work email from just a name and company. You only pay when an email is checked and real.*

Build a clean list of leads with real, working emails. You only pay when an email is confirmed real. There is no LinkedIn login, no cookies, and your own LinkedIn account is never used or touched.

---

### Two ways to use it

**Path A: You have LinkedIn links.**
Paste the profile links (or usernames) and get the public profile info, plus a real, verified email.

**Path B: You just have a name and a company.**
No LinkedIn needed. Type the person's name and their company (or the company website) and get a verified work email. It skips LinkedIn completely.

You can mix both in one run. One line can be a LinkedIn link, the next can be a name and company. The tool handles each one the right way on its own.

This is two tools in one: a **LinkedIn profile scraper** and an **email finder**. It is made for sales teams, recruiters, agencies, and founders who build lead lists and want emails that actually reach the inbox.

---

### Real emails, not guesses (and you only pay for hits)

- **No cookies, no login, no account.** It reads only public info, the kind a logged-out visitor sees. Your LinkedIn account is never used.
- **Real emails only.** Every email is checked against the company's mail server to make sure it actually exists. If it can't be confirmed, you don't get it, and you don't pay for it.
- **Pay only when it works.** No charge on misses. You are never billed for an email the tool couldn't confirm.
- **Two tools in one.** Full LinkedIn data and a name-to-email finder, in one place.
- **Easy table plus full data.** A clean table anyone can read, plus a full data file (JSON) for power users and other apps.

---

### LinkedIn email finder (name + company to a real email)

No LinkedIn link? You don't need one. Give the tool a full name and the company (the company website works even better) and it will:

1. Figure out the company's email domain.
2. Find the person's most likely work email.
3. Check that the email is real.
4. Return it, and charge you only if it's real.

This is the same job an email finder does: name and company in, real work email out. No LinkedIn needed.

---

### What happens when you click Start

For each person on your list, the tool:

1. **If you gave a LinkedIn link,** it reads the public profile: name, headline, location, the full About section, work and school history, follower and connection counts, and "people also viewed."
2. **Finds the work email** from the person's name and company.
3. **Checks that the email is real.**
4. **Returns the email,** and only charges you when one is found.

If you gave only a name and company, it skips LinkedIn and goes straight to finding and checking the email.

---

### How to use it (step by step)

1. Open the tool and go to the Input tab.
2. Paste your leads in the "Leads" box (LinkedIn links, usernames, or name and company), or upload a CSV.
3. Make sure **"Find verified business emails"** is on.
4. Click **Start**.
5. When it's done, open the **Output** tab to see the table, or download it as CSV, Excel, or JSON.

No setup. No cookies to paste. No LinkedIn login.

> **How long does it take?** Real LinkedIn pages load through residential proxies (that's what keeps you un-blocked), so each profile takes about 10 to 30 seconds. It does several at once, but big lists still take a while; a few hundred profiles can take 20 to 40 minutes. It runs in the background, so you can close the tab and come back; rows show up in the Output tab live as they finish. Name + company leads (no LinkedIn) are much faster.

#### Paste a list

Put one lead per line. Mix any of these:

````

https://www.linkedin.com/in/williamhgates/
satyanadella
Jane Doe, Acme Inc
John Smith, acme.com
Maria Garcia, Globex Corporation, globex.com

````

#### Or upload a CSV (for big lists)

Columns can be in any order. Add whichever ones you have:

| Column | What it is |
|---|---|
| `linkedinUrl` | LinkedIn profile link or username |
| `firstName` | First name |
| `lastName` | Last name |
| `fullName` | Full name (use this instead of first/last) |
| `company` | Company name |
| `domain` | Company website (like `acme.com`) |

There is just one switch: **"Find verified business emails" (on or off).** Leave it on to get emails. Turn it off if you only want profile info.

> Tip: For emails, the company website (like `acme.com`) gives the best results. A company name works too, and the tool will find the website for you.

#### Sample input

```json
{
  "profiles": [
    "https://www.linkedin.com/in/williamhgates/",
    "Jane Doe, Acme Inc",
    "John Smith, acme.com"
  ],
  "findEmail": true
}
````

***

### What you get back (easy table plus full data)

A clean table anyone can read and download to CSV:

| Field | Example |
|---|---|
| Name | Jane Doe |
| Title | Head of Marketing |
| Company | Acme Inc |
| Verified email | jane.doe@acme.com |
| Email status | verified |
| Location | San Francisco Bay Area |
| Country | United States |
| LinkedIn URL | https://www.linkedin.com/in/janedoe/ |
| Followers | 4,210 |
| Connections | 1,500+ |
| # Experience | 5 |
| # Education | 2 |

Plus a **full data file (JSON)** for power users: full work history, school history, the About section, follower and connection counts, and "people also viewed."

#### Sample output

```json
{
  "fullName": "Jane Doe",
  "currentTitle": "Head of Marketing",
  "currentCompany": "Acme Inc",
  "email": "jane.doe@acme.com",
  "emailStatus": "verified",
  "headline": "Head of Marketing at Acme Inc",
  "location": "San Francisco Bay Area",
  "country": "United States",
  "linkedinUrl": "https://www.linkedin.com/in/janedoe/",
  "followerCount": 4210,
  "connectionsCount": 1500,
  "experienceCount": 5,
  "educationCount": 2,
  "about": "Marketing leader focused on growth...",
  "experience": [
    { "position": "Head of Marketing", "companyName": "Acme Inc", "startDate": { "text": "2021" }, "endDate": { "text": "Present" } },
    { "position": "Marketing Manager", "companyName": "Globex", "startDate": { "text": "2018" }, "endDate": { "text": "2021" } }
  ],
  "education": [
    { "schoolName": "State University", "degree": "BA, Communications" }
  ],
  "_meta": { "source": "public-profile", "emailStatus": "verified", "emailSource": "verified" }
}
```

***

### Who it's for

- **Sales teams:** turn a list of names or LinkedIn links into real emails for outreach.
- **Recruiters:** look up candidate profiles and reach people on their work email.
- **Agencies and teams that build lead lists:** make big lists, download to CSV, hand off clean data.
- **Founders:** find the email of the person you want to reach from just a name and company.

***

### Pricing (pay only for what works)

You pay for results, not for time:

- A small charge for each profile read.
- A separate charge for each real email found, **only when it's real**.

**If an email can't be confirmed, you are not charged for it.** You only ever pay for emails that were checked and found to be real. (The exact amounts are on the tool's page, nothing is hidden.)

> In the real world, work-email success is usually about 20 to 60 out of 100, and depends a lot on the company. Personal emails (like Gmail) are close to zero, which is normal for any email finder. You're never billed for the ones that can't be confirmed.

***

### What you get vs. what we don't promise

It reads only public info, the kind a logged-out visitor can see. Here is the honest list of what's included, and what isn't:

| You get (public profile) | What we don't promise |
|---|---|
| Name, headline, location | Skills and endorsements |
| The full About section | Recommendations |
| Work history (titles, companies, dates) | Long job descriptions |
| School history (schools, degrees, dates) | A complete resume |
| Follower and connection counts |  |
| People also viewed |  |

**Emails are never taken from LinkedIn** (LinkedIn doesn't show them). They are found from the person's name and company, then checked to be real. No fake promises, no made-up numbers.

***

### Why pick this over other tools

- You get one email that was checked and is real, or nothing, with no charge.
- No monthly fee. Pay per real email, nothing on misses.
- No login, no cookies. Your LinkedIn account is never used.
- Two jobs in one tool: LinkedIn data and name-to-email, so you don't need two tools.

***

### Use it with the API, other apps, and AI agents

You can run it from the **Apify API**, set it on a schedule, or connect it to your other tools. Download as **CSV, Excel, or JSON**, or send results to Google Sheets, your CRM, Make, Zapier, and more. AI assistants and agents can use it as a tool, too (it works with MCP).

***

### FAQ

**Do I need a LinkedIn account or cookies?**
No. It reads only public info. There's nothing to log into and nothing to paste, and your own LinkedIn account is never used.

**Can I find an email without a LinkedIn link?**
Yes, that's Path B. Give a name and company (or company website) and it finds and checks the email without using LinkedIn.

**How do you find the email?**
From the person's name and their company website, then it checks the email is real. You only get (and pay for) emails that are confirmed real.

**Will I be charged if no email is found?**
No. You're only charged when an email is found and real. Misses are free.

**How often do you find an email?**
Usually about 20 to 60 times out of 100 for work emails, depending on the company. Personal emails are close to zero. You're never billed for misses.

**Can you get phone numbers, skills, or endorsements?**
No. LinkedIn hides those unless you log in, so the tool doesn't get them and won't pretend to.

**Can I run a big list or upload a CSV?**
Yes. Upload a CSV with any of these columns: `linkedinUrl, firstName, lastName, fullName, company, domain` (any order). Or paste a list. Big lists are exactly what it's for.

**Do I need to set anything up?**
No. Everything technical is handled for you.

**What can I download?**
CSV, Excel, and JSON, plus connections to other apps and the API.

**Is this allowed?**
It reads only public info: no login, no cookies, no fake accounts. You are responsible for using the data within the law (for example GDPR and CAN-SPAM) and your own outreach rules.

***

### Support & feedback

Have a question, an idea, or a profile that didn't come out right? Open an **Issue** on the tool's page or reach us through Apify. We read everything and fix things fast. If this saved you time, a rating on the Apify Store really helps.

# Actor input Schema

## `profiles` (type: `array`):

One lead per line. Any of these work:
• A LinkedIn URL or username: linkedin.com/in/williamhgates
• A name and company: Jane Doe, Acme Inc
• A name and company domain: John Smith, acme.com
Mix them freely, or upload a CSV below.

## `leadsFile` (type: `array`):

Upload a CSV instead of pasting. Use a header row; recognized columns (any order): linkedinUrl, firstName, lastName, fullName, company, domain. Rows with a LinkedIn URL are scraped; rows with name + company/domain go straight to email finding. Tip: export from Excel or Google Sheets as CSV.

## `findEmail` (type: `boolean`):

Find a real business email for each lead and check that it works. You are charged only when a verified email is returned, never on a miss. Turn this off to get profile data only.

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

Stop after this many results, a simple cost cap. Leave at 0 to process every lead.

## `emailMinConfidence` (type: `integer`):

Discard verified emails scoring below this (0 = keep every verified hit). Advanced.

## `resolveCompanyDomains` (type: `boolean`):

Look up each person's company website from their public LinkedIn company page to improve email hit-rate. Advanced (on by default).

## `httpFirst` (type: `boolean`):

Read profiles over a lightweight HTTP request first and only open a full browser when needed (much faster + cheaper). Advanced (on by default).

## `debugDumpHtml` (type: `boolean`):

Diagnostic only. Saves the raw HTML of the first few profiles to the key-value store for inspection. Advanced.

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

Built-in verified finder ('builtin', default), or a custom HTTP endpoint ('custom'). Advanced — set via JSON/API.

## `emailProviderEndpoint` (type: `string`):

For the 'custom' engine. POST endpoint returning {email, verified}. Advanced.

## `emailProviderApiKey` (type: `string`):

Bearer token for the custom endpoint. Stored encrypted. Advanced.

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

Parallel fetches. Advanced — sensible default applied.

## `maxRequestsPerMinute` (type: `integer`):

Global throttle. Advanced — sensible default applied.

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

Residential proxies are used automatically (required for LinkedIn). Advanced.

## `profileDeduplicationMode` (type: `string`):

Deduplication: 'none' / 'in-run' (default) / 'mongodb' (cross-run). Advanced — set via JSON/API.

## `mongoDbConnectionString` (type: `string`):

Only for MongoDB dedup / post-filtering. Stored encrypted. Advanced.

## `mongoDbDatabaseName` (type: `string`):

Database for cross-run dedup / post-filtering. Advanced.

## `postFilteringMongoDbQuery` (type: `object`):

MongoDB find() filter applied after enrichment. Advanced.

## `postFilterPredicate` (type: `string`):

Safe per-result expression; keep rows where it returns true (result is `p`). Advanced.

## `stealthEngine` (type: `string`):

Browser engine: 'patchright' (default) or 'playwright'. Advanced.

## `useFingerprintInjector` (type: `boolean`):

Inject a generated browser fingerprint. Advanced.

## `debugLog` (type: `boolean`):

Detailed logs for troubleshooting. Advanced.

## Actor input object example

```json
{
  "profiles": [
    "https://www.linkedin.com/in/williamhgates",
    "Jane Doe, Acme Inc",
    "John Smith, acme.com"
  ],
  "findEmail": true,
  "maxItems": 0
}
```

# Actor output Schema

## `leads` (type: `string`):

Each row has the name, title, company, verified email, location, LinkedIn URL, follower/connection counts, and the full profile detail.

# 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 = {
    "profiles": [
        "https://www.linkedin.com/in/williamhgates",
        "Jane Doe, Acme Inc",
        "John Smith, acme.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("crustapi/linkedin-profile-scraper-email-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 = { "profiles": [
        "https://www.linkedin.com/in/williamhgates",
        "Jane Doe, Acme Inc",
        "John Smith, acme.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("crustapi/linkedin-profile-scraper-email-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 '{
  "profiles": [
    "https://www.linkedin.com/in/williamhgates",
    "Jane Doe, Acme Inc",
    "John Smith, acme.com"
  ]
}' |
apify call crustapi/linkedin-profile-scraper-email-finder --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "LinkedIn Profile Scraper + Verified Email Finder (No Cookies)",
        "description": "Scrape public LinkedIn profiles and find verified business emails, by URL or just a name and company. No cookies, no login. Pay only for verified emails.",
        "version": "0.0",
        "x-build-id": "fydneF8JlXNZ86OiM"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/crustapi~linkedin-profile-scraper-email-finder/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-crustapi-linkedin-profile-scraper-email-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/crustapi~linkedin-profile-scraper-email-finder/runs": {
            "post": {
                "operationId": "runs-sync-crustapi-linkedin-profile-scraper-email-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/crustapi~linkedin-profile-scraper-email-finder/run-sync": {
            "post": {
                "operationId": "run-sync-crustapi-linkedin-profile-scraper-email-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",
                "required": [
                    "profiles"
                ],
                "properties": {
                    "profiles": {
                        "title": "Leads (LinkedIn URLs or names + companies)",
                        "type": "array",
                        "description": "One lead per line. Any of these work:\n• A LinkedIn URL or username: linkedin.com/in/williamhgates\n• A name and company: Jane Doe, Acme Inc\n• A name and company domain: John Smith, acme.com\nMix them freely, or upload a CSV below.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "leadsFile": {
                        "title": "…or upload a CSV file",
                        "type": "array",
                        "description": "Upload a CSV instead of pasting. Use a header row; recognized columns (any order): linkedinUrl, firstName, lastName, fullName, company, domain. Rows with a LinkedIn URL are scraped; rows with name + company/domain go straight to email finding. Tip: export from Excel or Google Sheets as CSV."
                    },
                    "findEmail": {
                        "title": "Find verified business emails",
                        "type": "boolean",
                        "description": "Find a real business email for each lead and check that it works. You are charged only when a verified email is returned, never on a miss. Turn this off to get profile data only.",
                        "default": true
                    },
                    "maxItems": {
                        "title": "Max results (0 = no limit)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Stop after this many results, a simple cost cap. Leave at 0 to process every lead.",
                        "default": 0
                    },
                    "emailMinConfidence": {
                        "title": "Minimum email confidence (0–100)",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Discard verified emails scoring below this (0 = keep every verified hit). Advanced."
                    },
                    "resolveCompanyDomains": {
                        "title": "Resolve company domains",
                        "type": "boolean",
                        "description": "Look up each person's company website from their public LinkedIn company page to improve email hit-rate. Advanced (on by default)."
                    },
                    "httpFirst": {
                        "title": "Fast HTTP-first fetching",
                        "type": "boolean",
                        "description": "Read profiles over a lightweight HTTP request first and only open a full browser when needed (much faster + cheaper). Advanced (on by default)."
                    },
                    "debugDumpHtml": {
                        "title": "Debug: dump raw profile HTML",
                        "type": "boolean",
                        "description": "Diagnostic only. Saves the raw HTML of the first few profiles to the key-value store for inspection. Advanced."
                    },
                    "emailProvider": {
                        "title": "Email finder engine",
                        "type": "string",
                        "description": "Built-in verified finder ('builtin', default), or a custom HTTP endpoint ('custom'). Advanced — set via JSON/API."
                    },
                    "emailProviderEndpoint": {
                        "title": "Custom email endpoint",
                        "type": "string",
                        "description": "For the 'custom' engine. POST endpoint returning {email, verified}. Advanced."
                    },
                    "emailProviderApiKey": {
                        "title": "Custom email API key",
                        "type": "string",
                        "description": "Bearer token for the custom endpoint. Stored encrypted. Advanced."
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Parallel fetches. Advanced — sensible default applied."
                    },
                    "maxRequestsPerMinute": {
                        "title": "Max requests per minute",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Global throttle. Advanced — sensible default applied."
                    },
                    "proxyConfiguration": {
                        "title": "Proxy",
                        "type": "object",
                        "description": "Residential proxies are used automatically (required for LinkedIn). Advanced."
                    },
                    "profileDeduplicationMode": {
                        "title": "Deduplication",
                        "type": "string",
                        "description": "Deduplication: 'none' / 'in-run' (default) / 'mongodb' (cross-run). Advanced — set via JSON/API."
                    },
                    "mongoDbConnectionString": {
                        "title": "MongoDB connection string",
                        "type": "string",
                        "description": "Only for MongoDB dedup / post-filtering. Stored encrypted. Advanced."
                    },
                    "mongoDbDatabaseName": {
                        "title": "MongoDB database name",
                        "type": "string",
                        "description": "Database for cross-run dedup / post-filtering. Advanced."
                    },
                    "postFilteringMongoDbQuery": {
                        "title": "Post-filtering MongoDB query",
                        "type": "object",
                        "description": "MongoDB find() filter applied after enrichment. Advanced."
                    },
                    "postFilterPredicate": {
                        "title": "Post-filter expression",
                        "type": "string",
                        "description": "Safe per-result expression; keep rows where it returns true (result is `p`). Advanced."
                    },
                    "stealthEngine": {
                        "title": "Browser stealth engine",
                        "type": "string",
                        "description": "Browser engine: 'patchright' (default) or 'playwright'. Advanced."
                    },
                    "useFingerprintInjector": {
                        "title": "Use fingerprint injector (experimental)",
                        "type": "boolean",
                        "description": "Inject a generated browser fingerprint. Advanced."
                    },
                    "debugLog": {
                        "title": "Verbose debug logging",
                        "type": "boolean",
                        "description": "Detailed logs for troubleshooting. Advanced."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
