# Website Contact Finder (`prodiger/website-contact-finder`) Actor

Website emails scraper and contact finder for lead generation. Extract email addresses, phone numbers, social profiles, and optional email verification from company websites in bulk. CRM-ready output, no browser required.

- **URL**: https://apify.com/prodiger/website-contact-finder.md
- **Developed by:** [Arnas](https://apify.com/prodiger) (community)
- **Categories:** Lead generation, SEO tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## Website Contact Finder — Website Emails Scraper, Phone & Social Extractor

### What does Website Contact Finder do?

**Website Contact Finder is a bulk website emails scraper and contact finder for lead generation.** Paste company website URLs and it extracts **email addresses, phone numbers, social media profile links, contact-page URLs, and optional email verification** — returning one clean contact record per website for CRM import or outreach campaigns.

If you need an **email scraper for websites**, use it to scan one site or hundreds of sites in the same run. The actor automatically prioritizes contact, about, and team pages — across **eight languages**, including German, Spanish, French, Italian, Portuguese, Dutch, and Japanese — for faster email discovery on non-English sites. It filters false positives (image-embedded emails, example domains, noreply addresses), handles international phone formats via libphonenumber, decodes Cloudflare-obfuscated emails, and detects profiles on LinkedIn, Twitter/X, Facebook, Instagram, YouTube, GitHub, and TikTok.

**No browser required** — fast pure HTTP crawling keeps costs low and runs fast.

### Why use Website Contact Finder?

- ✅ **Bulk processing** — scan dozens or hundreds of websites in a single run with one flat start fee
- 🌐 **i18n contact-page prioritization** — recognizes `impressum`, `kontakt`, `contacto`, `nosotros`, `contatti`, `contactez-nous`, `お問い合わせ`, and more, so non-English sites don't waste your crawl budget
- 🔓 **Cloudflare email decoding** — finds emails hidden behind `data-cfemail` XOR obfuscation that most baseline scrapers silently miss
- 🧪 **Email obfuscation handling** — `name [at] domain [dot] com`, `(at)` / `(dot)`, HTML entities (`&#64;`, `&#46;`), and Cloudflare email protection are all decoded automatically
- 📞 **libphonenumber-validated phones** — full E.164 validation kills false positives from SKUs, order numbers, and dates
- 📧 **Filtered emails** — removes image-embedded addresses, example domains (`@example.com`), noreply addresses, and analytics IDs
- 📍 **Per-finding source tracking** — every email and phone is tagged with the page URLs where it was discovered
- 🌐 **7 social networks** — LinkedIn, Twitter/X, Facebook, Instagram, YouTube, GitHub, and TikTok with share-button filtering
- ⚡ **No browser** — fast pure HTTP requests, no Chromium overhead
- 📤 **CRM-ready output** — one structured JSON record per website
- 🔧 **Configurable depth** — control how many pages to crawl per site (default: 20, max: 200)
- 💰 **Predictable pricing** — pay only for pages crawled, not for what was found

### Who is it for?

**Sales teams and SDRs doing outbound prospecting**

- 📋 Enrich a lead list from LinkedIn or Apollo with verified email addresses and phone numbers
- 📞 Find direct contact info for decision-makers at target companies before cold outreach

**Marketing agencies building lead databases**

- 🗂️ Scan hundreds of client-submitted company websites overnight and deliver a contact spreadsheet
- 🎯 Find social media handles for prospect companies to target with paid social campaigns

**Recruiters and HR professionals**

- 🔍 Find careers email addresses and HR contacts at target employers
- 🌐 Discover company social pages to research culture and team before outreach

**Developers building lead generation pipelines**

- 🤖 Integrate contact extraction into automated prospecting workflows via the Apify API
- ⚡ Process thousands of URLs programmatically without manual browser work
- 🧩 Feed results into HubSpot, Salesforce, Pipedrive, or Airtable via Make or Zapier

### What data can you extract?

| Field | Example |
|---|---|
| `websiteUrl` | `"https://example.com"` |
| `emails` | `["info@example.com", "sales@example.com"]` |
| `phones` | `["+15551234567", "+442079460958"]` (E.164 normalized) |
| `socialLinks.linkedin` | `"https://linkedin.com/company/example"` |
| `socialLinks.twitter` | `"https://x.com/example"` |
| `socialLinks.facebook` | `"https://facebook.com/example"` |
| `socialLinks.instagram` | `"https://instagram.com/example"` |
| `socialLinks.youtube` | `"https://youtube.com/@example"` |
| `socialLinks.github` | `"https://github.com/example"` |
| `socialLinks.tiktok` | `"https://tiktok.com/@example"` |
| `contactPageUrl` | `"https://example.com/contact"` |
| `pagesCrawled` | `15` |
| `crawledAt` | `"2026-05-15T12:00:00.000Z"` |
| `emailSources` | `{ "info@example.com": ["https://example.com/contact"] }` |
| `phoneSources` | `{ "+15551234567": ["https://example.com/contact"] }` |
| `emailVerification` | array, only when `verifyEmails: true` |

### How much does it cost to find website contacts?

This Actor uses **pay-per-event pricing** — you pay only for what you scan. No monthly subscription. All platform costs are included.

| Event | Free | Bronze ($29/mo) | Silver ($199/mo) | Gold ($999/mo) |
|---|---|---|---|---|
| Run started (once per run) | $0.035 | $0.033 | $0.030 | $0.026 |
| Per page crawled | $0.001 | $0.0009 | $0.0008 | $0.00065 |

**Real-world cost examples (Free tier, 20 pages per site):**

| Websites scanned | Cost |
|---|---|
| 1 website | ~$0.055 |
| 10 websites | ~$0.235 |
| 100 websites | ~$2.035 |
| 500 websites | ~$10.035 |

Set `maxPagesPerSite` lower to reduce cost on a large batch — most contact info is found on the homepage, footer, and contact page (3-5 pages).

> Note: `page-crawled` is charged only for successful HTML responses. PDFs, images, and failed requests never bill.

### How to use Website Contact Finder

1. Click **Try for free** on the Actor page (no credit card needed for the free $5 credit)
2. Enter your list of website URLs — one per line. Bare domains (`acme.com`) are auto-prefixed with `https://`
3. Set **Max pages per site** (default 20 covers most sites)
4. Click **Start** and wait for results
5. Export to JSON, CSV, or Excel for CRM import or outreach

#### Example input

```json
{
  "urls": [
    "https://apify.com",
    "https://example.com"
  ],
  "maxPagesPerSite": 10,
  "maxConcurrency": 5,
  "requestTimeoutSecs": 15,
  "useProxy": false,
  "verifyEmails": false,
  "verificationLevel": "mx"
}
````

### Input parameters

| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| `urls` | array | Yes | — | List of website URLs to scan |
| `maxPagesPerSite` | integer | No | 20 | Max internal pages to crawl per website (1–200) |
| `maxConcurrency` | integer | No | 5 | Parallel HTTP requests (1–20) |
| `requestTimeoutSecs` | integer | No | 15 | Per-request timeout, seconds (5–60) |
| `useProxy` | boolean | No | false | Enable Apify proxy |
| `proxyConfiguration` | object | No | — | Proxy settings (used only when `useProxy: true`) |
| `verifyEmails` | boolean | No | false | Inline email verification, free |
| `verificationLevel` | string | No | `"mx"` | `format`, `mx`, or `smtp` |

### Output examples

#### Standard output (`verifyEmails: false`)

```json
{
  "websiteUrl": "https://example.com",
  "emails": ["info@example.com", "sales@example.com"],
  "phones": ["+15551234567"],
  "socialLinks": {
    "linkedin": "https://linkedin.com/company/example",
    "twitter": "https://x.com/example",
    "facebook": null,
    "instagram": "https://instagram.com/example",
    "youtube": null,
    "github": "https://github.com/example",
    "tiktok": null
  },
  "contactPageUrl": "https://example.com/contact",
  "pagesCrawled": 15,
  "crawledAt": "2026-05-15T12:00:00.000Z",
  "emailSources": {
    "info@example.com": ["https://example.com/", "https://example.com/contact"],
    "sales@example.com": ["https://example.com/contact"]
  },
  "phoneSources": {
    "+15551234567": ["https://example.com/contact"]
  }
}
```

#### With email verification (`verifyEmails: true, verificationLevel: "mx"`)

The `emailVerification` array carries per-email metadata:

```json
"emailVerification": [
  {
    "email": "info@example.com",
    "isValidFormat": true,
    "hasMxRecords": true,
    "isVerified": false,
    "confidenceScore": 45,
    "isDisposable": false,
    "isFreeProvider": false,
    "isRoleAccount": true,
    "provider": "google_workspace"
  }
]
```

**Confidence score rubric** (matches the source actor's contract):

- **0–29** — invalid format or disposable domain
- **30–44** — valid syntax, domain has no MX records (or MX-check skipped)
- **45** — MX records found; or inconclusive SMTP (catch-all server / blocking provider)
- **60** — catch-all server (server accepts all mail; individual mailbox unverified)
- **95** — SMTP verified individual mailbox exists (not catch-all, not a blocking provider)

`isVerified: true` is only set at the 95 tier. **For Gmail, Microsoft 365, and Yahoo, `isVerified` is always `false`** — these providers block SMTP probing, and we cap confidence honestly at 45 rather than pretending we know more.

Sites with no public contact info return `emails: []` and `phones: []` — never silent failures.

### Tips for best results

- 📋 **Scan the full list at once** — provide all URLs in one run to minimize start fees and get results in one dataset
- 📄 **Start with 15–20 pages per site** — contact info is usually on the homepage, footer, contact page, or about page
- 🔌 **Leave proxy off by default** — most sites work without it; enable only if you see timeouts or empty results
- 🔗 **Check `contactPageUrl`** — if no email is found, the contact page may use a form instead of a mailto link
- 🧹 **Filter empty results** — some sites deliberately hide emails or use JS-only contact widgets; plan for ~15–25% returning no email
- 🌐 **Use the full domain root** — always use `https://company.com` rather than a deep subpage; the crawler discovers contact pages automatically
- 🇪🇺 **Works on non-English sites** — German `impressum`, Spanish `contacto`, French `contactez-nous`, etc. are all prioritized like English `contact` pages

### Improvements over the baseline `automation-lab/website-contact-finder`

This actor is drop-in input/output compatible with the popular `automation-lab/website-contact-finder` actor, at identical pricing, with these material improvements:

1. **Cloudflare email decoding** — decodes `data-cfemail` XOR-obfuscated addresses (the baseline silently drops them, which is the #1 reason it returns empty results on Cloudflare-hosted sites)
2. **Email obfuscation handling** — `name [at] domain [dot] com`, `(at)` / `(dot)` variants, HTML-entity-encoded emails
3. **i18n crawl prioritization** — eight languages of contact-page keywords, not just English
4. **libphonenumber-js phone validation** — drops false positives from SKUs, dates, and order numbers
5. **Per-finding source tracking** — `emailSources` and `phoneSources` maps tell you which page each contact came from
6. **HTML content-type gating** — `page-crawled` is only billed for successful HTML responses

### FAQ

**What types of emails does it find?** Emails from `mailto:` links, plain text, HTML entities, `[at]`/`[dot]` obfuscation, and Cloudflare's `data-cfemail` protection. It filters out: image-embedded addresses, `noreply@`, addresses at `example.com` / `test.com` / `domain.com`, image-extension false positives like `logo@2x.png`, and pure-numeric IDs.

**Does it find phone numbers?** Yes. It extracts numbers from `tel:` links and visible body text, validated by `libphonenumber-js` and normalized to E.164 (e.g., `+15551234567`). Fictional NANP numbers (the reserved `555-01xx` range) are correctly rejected.

**Which social platforms does it detect?** LinkedIn, Twitter/X, Facebook, Instagram, YouTube, GitHub, and TikTok. Share-button URLs (`intent/tweet`, `sharer.php`, `shareArticle`, etc.) are rejected so you don't get back your own outbound share links.

**How many pages should I crawl per site?** 10–20 pages covers most small and medium business websites. Increase to 50+ for large enterprise sites or e-commerce stores with distributed contact info across regional pages.

**Do I need a proxy?** Usually no. The actor uses HTTP requests without a proxy by default, and most public websites don't block them. Enable proxy only if you see timeout errors or empty results — residential proxies work best for stubborn sites.

**Does it need a browser?** No. Fast HTTP requests only — no Chromium or Playwright overhead. This keeps cost and run time low.

**The actor found no emails on a site I know has contact info. Why?** The most common remaining reason is that the email is rendered by JavaScript (we already decode Cloudflare and `[at]`/`[dot]` obfuscation). Since this actor uses HTTP-only requests, it cannot extract emails that only appear after JavaScript execution. Some sites also exclusively use contact forms without ever publishing a `mailto:` link — check the `contactPageUrl` field; it likely points to a form-based contact page.

**Can I scrape multiple websites in one run?** Yes — bulk processing is built in. Add all URLs to the `urls` array.

**How does pricing work for bulk runs?** You pay $0.001 per page crawled plus a $0.035 flat start fee per run (Free tier). The cost is fully predictable — page count, not "what was found", determines the bill. Setting `maxPagesPerSite: 5` is a fast way to cut costs by 4x compared to the default.

### Is it legal to scrape website contact information?

This actor only accesses publicly available web pages — contact information intentionally published by website owners for visitors to find. It does not bypass login walls, CAPTCHAs, or access controls.

Automated collection of public contact data is standard practice in sales prospecting and business research. That said, you should review applicable laws in your jurisdiction and the target website's terms of service. For data containing personal information (individual email addresses), ensure compliance with GDPR, CCPA, and similar privacy regulations — particularly around how you store, use, and retain the data.

### Changelog

#### v0.1 — 2026-05-15

Initial release. Drop-in compatible with `automation-lab/website-contact-finder` on input and output schema, at identical pay-per-event pricing.

# Actor input Schema

## `urls` (type: `array`):

Company or business website URLs to scan for contact information. Enter one URL per line. Use the domain root (e.g. https://company.com) — the crawler automatically finds contact and about pages. Domains without http:// are auto-prefixed.

## `maxPagesPerSite` (type: `integer`):

Maximum internal pages to crawl per website. Contact and about pages are automatically prioritized via i18n keyword scoring. 10–20 pages covers most small and medium business sites. Increase to 50+ for large enterprise sites.

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

Number of parallel HTTP requests. Higher = faster but may trigger rate limiting on some sites. Recommended: leave at 5.

## `requestTimeoutSecs` (type: `integer`):

Timeout for each HTTP request. Increase to 30+ for slow or international sites.

## `useProxy` (type: `boolean`):

Enable Apify proxy for requests. Leave off by default — most public websites work without proxy. Enable only if you see timeout errors or empty results from sites you know are accessible.

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

Apify proxy settings. Only used when Enable proxy is on. Residential proxies work best for sites with strict bot detection.

## `verifyEmails` (type: `boolean`):

When enabled, each extracted email is verified after crawling. Results are added to the emailVerification array in the output. Verification is free (no extra charge) and uses DNS + optional SMTP checks depending on the verification level. Disabled by default — enable for higher-quality lead lists.

## `verificationLevel` (type: `string`):

Controls how deeply each email is verified. format = syntax check only (instant, no network, confidence 0–30). mx = syntax + DNS MX record lookup (confidence 30–45, recommended). smtp = syntax + MX + direct SMTP probe (confidence 45–95). Gmail, Microsoft 365, and Yahoo block SMTP probing — confidence is honestly capped at 45 for those providers even at the smtp level.

## Actor input object example

```json
{
  "urls": [
    {
      "url": "https://apify.com"
    },
    {
      "url": "https://example.com"
    }
  ],
  "maxPagesPerSite": 20,
  "maxConcurrency": 5,
  "requestTimeoutSecs": 15,
  "useProxy": false,
  "verifyEmails": false,
  "verificationLevel": "mx"
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# 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 = {
    "urls": [
        {
            "url": "https://apify.com"
        },
        {
            "url": "https://example.com"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("prodiger/website-contact-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 = { "urls": [
        { "url": "https://apify.com" },
        { "url": "https://example.com" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("prodiger/website-contact-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 '{
  "urls": [
    {
      "url": "https://apify.com"
    },
    {
      "url": "https://example.com"
    }
  ]
}' |
apify call prodiger/website-contact-finder --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Website Contact Finder",
        "description": "Website emails scraper and contact finder for lead generation. Extract email addresses, phone numbers, social profiles, and optional email verification from company websites in bulk. CRM-ready output, no browser required.",
        "version": "0.1",
        "x-build-id": "AQkh02GSJEPy0HMvs"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/prodiger~website-contact-finder/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-prodiger-website-contact-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/prodiger~website-contact-finder/runs": {
            "post": {
                "operationId": "runs-sync-prodiger-website-contact-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/prodiger~website-contact-finder/run-sync": {
            "post": {
                "operationId": "run-sync-prodiger-website-contact-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": [
                    "urls"
                ],
                "properties": {
                    "urls": {
                        "title": "Website URLs to scan",
                        "type": "array",
                        "description": "Company or business website URLs to scan for contact information. Enter one URL per line. Use the domain root (e.g. https://company.com) — the crawler automatically finds contact and about pages. Domains without http:// are auto-prefixed.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxPagesPerSite": {
                        "title": "Max pages per site",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Maximum internal pages to crawl per website. Contact and about pages are automatically prioritized via i18n keyword scoring. 10–20 pages covers most small and medium business sites. Increase to 50+ for large enterprise sites.",
                        "default": 20
                    },
                    "maxConcurrency": {
                        "title": "Concurrent requests per site",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Number of parallel HTTP requests. Higher = faster but may trigger rate limiting on some sites. Recommended: leave at 5.",
                        "default": 5
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout (seconds)",
                        "minimum": 5,
                        "maximum": 60,
                        "type": "integer",
                        "description": "Timeout for each HTTP request. Increase to 30+ for slow or international sites.",
                        "default": 15
                    },
                    "useProxy": {
                        "title": "Enable proxy",
                        "type": "boolean",
                        "description": "Enable Apify proxy for requests. Leave off by default — most public websites work without proxy. Enable only if you see timeout errors or empty results from sites you know are accessible.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify proxy settings. Only used when Enable proxy is on. Residential proxies work best for sites with strict bot detection."
                    },
                    "verifyEmails": {
                        "title": "Verify extracted emails",
                        "type": "boolean",
                        "description": "When enabled, each extracted email is verified after crawling. Results are added to the emailVerification array in the output. Verification is free (no extra charge) and uses DNS + optional SMTP checks depending on the verification level. Disabled by default — enable for higher-quality lead lists.",
                        "default": false
                    },
                    "verificationLevel": {
                        "title": "Verification depth",
                        "enum": [
                            "format",
                            "mx",
                            "smtp"
                        ],
                        "type": "string",
                        "description": "Controls how deeply each email is verified. format = syntax check only (instant, no network, confidence 0–30). mx = syntax + DNS MX record lookup (confidence 30–45, recommended). smtp = syntax + MX + direct SMTP probe (confidence 45–95). Gmail, Microsoft 365, and Yahoo block SMTP probing — confidence is honestly capped at 45 for those providers even at the smtp level.",
                        "default": "mx"
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
