# Website Email & Phone Finder (`myagizm/website-contact-finder`) Actor

Find public business emails and phone numbers from company websites. Checks the homepage and a few same-site contact pages without login.

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

## Pricing

from $3.20 / 1,000 company contact records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Website Email & Phone Finder (No API Key, No Login)

<p align="center">
  <img src="https://img.shields.io/badge/Apify-Actor-00b96b?logo=apify&logoColor=white" alt="Apify Actor">
  <img src="https://img.shields.io/badge/API%20Key-not%20needed-blue" alt="No API key">
  <img src="https://img.shields.io/badge/Login-not%20needed-blue" alt="No login">
  <img src="https://img.shields.io/badge/Proxy-not%20used-green" alt="No proxy">
  <img src="https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20Excel-orange" alt="Dataset exports">
  <img src="https://img.shields.io/badge/Pricing-pay%20per%20result-success" alt="Pay per result">
</p>

**Turn a list of company websites into a clean contact list.** The Actor reads each public page, follows a small number of contact links on the same host, and returns business email addresses, phone numbers, a company name, and an address when the page provides them. It does not create contacts, infer missing values, or claim an address is verified when the site has not published it.

Start with one website, check the flat `email` and `phone` columns, then raise the input size when the output matches your use case.

### Table of contents

- [What it does](#what-it-does)
- [Who uses it](#who-uses-it)
- [What data you get](#what-data-you-get)
- [How to run it](#how-to-run-it)
- [Input example](#input-example)
- [Output example](#output-example)
- [Limits and access behavior](#limits-and-access-behavior)
- [Pricing](#pricing)
- [Tips](#tips)
- [Other data tools](#other-data-tools)
- [AI agents and integrations](#ai-agents-and-integrations)
- [API examples](#api-examples)
- [FAQ](#faq)
- [Related searches](#related-searches)
- [Disclaimer](#disclaimer)
- [Resources](#resources)
- [中文说明](#中文说明)

### What it does

- Reads public company websites over ordinary HTTP or HTTPS.
- Extracts email addresses from structured page data, visible text, or `mailto:` links.
- Extracts phone numbers from structured page data, visible phone links, or clearly labelled phone text.
- Checks the submitted page first. If it contains a same-host contact link, the Actor can check a few of those pages too.
- Returns one row for a submitted website only when the row contains at least one public email address or phone number.
- Keeps the primary email and phone in top-level columns so they are easy to see in the Apify table and export to CSV.
- Includes all found emails and phones in arrays for workflows that need more than one contact.
- Records which URLs were checked and how many pages were visited.

### Who uses it

- Sales and business-development teams building a small, source-linked prospect list.
- Researchers collecting published company contact details from a known list of domains.
- Agencies checking client websites for visible contact information.
- Data teams enriching a company list with public phone and email fields.
- Operations teams reviewing whether business pages include a working public contact route.

Use it only for websites and data you are allowed to process. A public contact address is not permission to send unsolicited messages.

### What data you get

| Field | Type | Availability |
|---|---|---|
| `domain` | string | Always populated from the submitted website hostname. |
| `website` | string | Always populated with the submitted URL. |
| `emails` | array of strings | Populated when public email addresses are present in checked pages. |
| `phones` | array of strings | Populated when public phone numbers are present in checked pages. |
| `email` | string or null | First extracted email, for a flat table column. Null when only a phone was found. |
| `phone` | string or null | First extracted phone, for a flat table column. Null when only an email was found. |
| `companyName` | string or null | Populated when the page declares an organization name, title, or site title. |
| `address` | string or null | Populated when structured page data contains a public postal address. |
| `sourceUrls` | array of strings | Pages successfully checked for the row. |
| `pagesVisited` | integer | Number of public pages checked for the website. |
| `crawledAt` | string | Collection time in UTC. |

A missing field is not guessed. An email is not marked as verified, deliverable, or safe to contact. Phone numbers are not enriched with person names.

### How to run it

1. Enter one or more full public website URLs. Include `https://` or `http://`.
2. Start with `maxPagesPerSite: 1` for a quick check. Use `2` to include one discovered contact page.
3. Set the request timeout between 3 and 20 seconds. Each job also has a fixed overall deadline.
4. Run the Actor and open the `Company contacts` dataset view.
5. Export the dataset as JSON, CSV, or Excel, or use the dataset API for automation.

The input accepts up to 100 URLs per run. The default checks at most two same-site pages per submitted website; the maximum is three.

### Input example

```json
{
  "urls": [
    "https://www.tanksdirect.com/",
    "https://example.org/contact/"
  ],
  "maxPagesPerSite": 2,
  "requestTimeoutSecs": 12
}
```

| Input | Default | Range | Purpose |
|---|---:|---:|---|
| `urls` | required | 1–100 URLs | Public company homepages or contact-page URLs. |
| `maxPagesPerSite` | `2` | 1–3 | Maximum same-site pages checked for each URL. |
| `requestTimeoutSecs` | `12` | 3–20 | Timeout for an individual public-page request. |

A URL list should contain business websites, not search terms. If you need to discover websites from a keyword, use a search or directory tool first, then pass the resulting public URLs here.

### Output example

The following is a redacted view of the record shape from a live wrapper test. Contact values are omitted from this documentation.

```json
{
  "companyName": "Tanks Direct",
  "domain": "tanksdirect.com",
  "email": "[redacted]",
  "phone": "[redacted]",
  "emails": ["[redacted]"],
  "phones": ["[redacted]"],
  "website": "https://www.tanksdirect.com/",
  "address": "[redacted]",
  "sourceUrls": ["https://www.tanksdirect.com/"],
  "pagesVisited": 1,
  "crawledAt": "UTC timestamp"
}
```

The live schema keeps `email` and `phone` flat for table and spreadsheet exports. The arrays preserve additional addresses from the checked pages. A zero-contact URL does not create an empty billable dataset row.

### Limits and access behavior

- The Actor makes direct public requests. It does not use a proxy, account, cookie, browser, or external contact-data API.
- Only HTTP and HTTPS URLs are accepted. IP-literal, local, private, and internal hostnames are rejected.
- Redirects must remain on the same host, with only a `www` variation allowed. The Actor does not follow external links.
- Contact-page links are followed only when found on the submitted page and only on the same host.
- Each URL is limited to 3 pages. Each response body is capped at 1 MB. The overall job deadline is 9 minutes.
- Access-denied, login, bot-verification, rate-limit, and server errors are not bypassed. The Actor stops that target and records the failure.
- A valid page with no public email or phone produces no contact row. An unexplained zero-row run remains FAILED; only an explicit benign NO\_RESULTS signal with a working control can finish SUCCEEDED.
- Multiple websites are processed sequentially. The Actor does not rotate IPs or identities to force access.

### Pricing

Pay per result: **$0.0032 for each stored company contact record**. One record represents one submitted website with at least one public email or phone. A page without a contact record does not create a dataset-item event.

There is no separate proxy or paid API charge in this Actor. Apify platform usage is reported by Apify separately from the event price. Check the live Store page before publishing because Apify may normalize tier prices or apply account-level price rules.

### Tips

- Submit canonical HTTPS URLs where possible. If a domain redirects between bare and `www` hostnames, start with the destination URL.
- Use a company's contact page as the input when its homepage has no direct contact details.
- Keep `maxPagesPerSite` low for a large list. Raise it only when the first page links to a contact page you need.
- Check `sourceUrls` before merging results into a CRM. It tells you which public pages contained the collected details.
- Treat phone and email values as published contact fields, not as confirmation that the contact is current.
- Remove duplicates in your own workflow using normalized domain and contact value.
- If a site blocks the request, do not keep retrying it with other identities. Report the access result or use an authorized data source.
- A missing result can mean no public contact detail, a changed page layout, or an access block. Review the run log before changing the input.

### Other data tools

- [Website Content Crawler](https://apify.com/myagizm/website-content-crawler) returns clean page content for research and indexing.
- [Email Verifier](https://apify.com/myagizm/email-verifier) checks email syntax, DNS, and SMTP signals for supplied addresses.
- [Keyword Website Lists Scraper](https://apify.com/myagizm/keyword-website-lists-scraper) finds website candidates from keywords.
- [Google Search Results Scraper](https://apify.com/myagizm/google-search-results-scraper) searches public web results.
- [Google Maps Scraper](https://apify.com/myagizm/google-maps-scraper) collects public local-business listing fields.

The full Actor family is available from the [myagizm profile](https://apify.com/myagizm).

### AI agents and integrations

When this Actor is available to your Apify account, an AI agent or automation can start a run through the Apify API, wait for completion, and read the default dataset. The Actor does not require a separate API provider key. Use Apify's supported MCP server and integrations if your workflow already connects to them; the input and output remain the same.

### API examples

Start a run and wait for the dataset to be populated:

```bash
curl -X POST "https://api.apify.com/v2/acts/myagizm~website-contact-finder/runs" \
  -H "Authorization: Bearer YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"urls":["https://www.tanksdirect.com/"],"maxPagesPerSite":2,"requestTimeoutSecs":12}'
```

Run synchronously and get the dataset items:

```bash
curl -X POST "https://api.apify.com/v2/acts/myagizm~website-contact-finder/run-sync-get-dataset-items" \
  -H "Authorization: Bearer YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"urls":["https://www.tanksdirect.com/"],"maxPagesPerSite":2,"requestTimeoutSecs":12}'
```

Fetch a completed run's default dataset:

```bash
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?format=json&clean=true" \
  -H "Authorization: Bearer YOUR_APIFY_TOKEN"
```

The API token belongs in an authorization header. Do not put it in a shared task, dataset, or public link.

### FAQ

**Does it find every email on a domain?**
No. It checks only the submitted page and up to two same-host pages linked from it. It does not crawl an entire site.

**Can I pass a domain without a scheme?**
No. Use a complete `https://` or `http://` URL.

**Does it verify an email address?**
No. It extracts an address that the public page displays. Use an email verification tool if you need syntax or mail-server signals.

**Does it verify a phone number?**
No. The Actor normalizes the public number format but does not call the number.

**Why is `email` null when `emails` is not empty?**
That should not occur in a successful record. The primary flat field is the first value from the `emails` array.

**Why is `phone` null when `phones` is not empty?**
That should not occur in a successful record. The primary flat field is the first value from the `phones` array.

**Why did one URL return no row?**
The page may not display an email or phone, or it may block public requests. The Actor creates a row only when at least one contact field is present.

**Does a zero-row run succeed?**
Only when the backend explicitly returns a benign `NO_RESULTS` signal and a known-good control confirms access. Unexplained zero-row results and upstream failures remain FAILED.

**Can it access a sign-in-only page?**
No. It does not sign in, use cookies, or access private pages.

**Can it solve a CAPTCHA or bot check?**
No. It reports the block and stops. It does not switch accounts or identities.

**Does it follow external links?**
No. It follows only discovered contact links on the same host and rejects cross-site redirects.

**Can it visit a subdomain such as `contact.example.com`?**
Only if that subdomain is the URL you submit. The crawler does not follow a link from one host to a different subdomain.

**How many pages are checked?**
One to three pages per website, controlled by `maxPagesPerSite`.

**Can one run take unlimited time?**
No. Each request has a timeout and the job has a fixed 9-minute deadline.

**How many websites can I send?**
Up to 100 URLs per run.

**Why does the output include `sourceUrls`?**
It lets you trace each contact value to the public pages that were checked.

**Can I export to a spreadsheet?**
Yes. Apify datasets support CSV and Excel exports. The primary email and phone are flat columns.

**Does it use a residential proxy?**
No. The current route is direct only. Proxy usage and proxy cost are zero.

**Can I use it for outreach?**
You are responsible for your use of the information and for following privacy, marketing, and anti-spam rules that apply to you.

**Can it find individual employees' personal emails?**
It extracts only details visible on the pages you submit. It does not search for people, infer email formats, or enrich personal profiles.

**What happens if the website changes its layout?**
The Actor uses public structured data, links, and visible page text. If the site changes how it publishes contacts, the output may change. Check the source URL and run log.

### Related searches

website email finder · company website contact scraper · public business email extractor · company phone number finder · website phone number scraper · business contact details scraper · contact page email extractor · scrape public company emails · business website lead enrichment · company domain contact lookup · B2B contact finder from URL · email and phone finder for websites · public company contact data · business email extraction API · website contact information API · company website enrichment · public telephone number scraper · same-domain contact page crawler · export company contacts to CSV · collect business contact details · website leads from company domains · company email and phone data · contact details from a URL · public business phone finder · email finder without login · company contacts in Apify dataset · website contact records for CRM · business email search from URLs · public website contact extraction

### Disclaimer

This independent tool collects only information visible on public pages submitted by the user. It does not log in or bypass access controls. You are responsible for choosing URLs you may lawfully process and for complying with privacy, marketing, anti-spam, and data-protection rules, including GDPR or CCPA where applicable. Company names and trademarks remain the property of their respective owners.

### Resources

- [Apify API documentation](https://docs.apify.com/api/v2)
- [Apify dataset exports](https://docs.apify.com/platform/storage/dataset)
- [Apify Actor tasks](https://docs.apify.com/platform/actors/running/tasks)
- [Apify MCP server](https://mcp.apify.com)
- [myagizm Store profile](https://apify.com/myagizm)

### 中文说明

## 网站邮箱与电话查找工具（无需 API Key，无需登录）

<p align="center">
  <img src="https://img.shields.io/badge/Apify-Actor-00b96b?logo=apify&logoColor=white" alt="Apify Actor">
  <img src="https://img.shields.io/badge/API%20Key-not%20needed-blue" alt="无需 API Key">
  <img src="https://img.shields.io/badge/Login-not%20needed-blue" alt="无需登录">
  <img src="https://img.shields.io/badge/Proxy-not%20used-green" alt="不使用代理">
  <img src="https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20Excel-orange" alt="数据集导出">
  <img src="https://img.shields.io/badge/Pricing-pay%20per%20result-success" alt="按结果计费">
</p>

**把公司网址列表整理成公开联系方式清单。** Actor 会读取每个公开网页，并在页面提供同域联系链接时检查少量相关页面。结果包含网页公布的商务邮箱、电话号码、公司名，以及页面提供时的地址。它不会生成联系人，不会猜测缺失字段，也不会把公开地址说成已经验证或仍然有效。

建议先提交一个网址，检查平面 `email` 和 `phone` 字段，再根据结果扩展输入规模。

### 目录

- [功能说明](#功能说明)
- [适用人群](#适用人群)
- [结果字段](#结果字段)
- [运行步骤](#运行步骤)
- [输入示例](#输入示例)
- [输出示例](#输出示例)
- [限制与访问行为](#限制与访问行为)
- [价格](#价格)
- [使用建议](#使用建议)
- [其他数据工具](#其他数据工具)
- [AI 与自动化](#ai-与自动化)
- [API 示例](#api-示例)
- [常见问题](#常见问题)
- [相关搜索](#相关搜索)
- [免责声明](#免责声明)
- [资源](#资源)

### 功能说明

- 通过普通 HTTP 或 HTTPS 请求读取公开公司网站。
- 从结构化页面数据、可见文字或 `mailto:` 链接中提取邮箱。
- 从结构化页面数据、可见电话链接或明确标注的电话文字中提取电话号码。
- 先检查输入页面；页面存在同域联系链接时，可继续检查少量联系页面。
- 只有至少包含一个公开邮箱或电话号码的网站才会生成一条记录。
- 主要邮箱和电话会放在顶层字段，方便在 Apify 表格中查看并导出 CSV。
- 完整邮箱和电话列表以数组保存，便于需要多个联系方式的工作流使用。
- 每条记录包含实际检查过的页面网址及访问页数。

### 适用人群

- 建立小规模、可追溯潜在客户名单的销售和业务拓展团队。
- 从已知域名列表收集公开公司联系方式的研究人员。
- 检查客户网站公开联系信息的代理机构。
- 为公司名单补充公开电话和邮箱字段的数据团队。
- 审核公司网站是否公开了联系渠道的运营团队。

使用 Actor 前请确认你有权处理相关网站和数据。公开联系方式不等于允许发送未经请求的营销信息。

### 结果字段

| 字段 | 类型 | 可用情况 |
|---|---|---|
| `domain` | 字符串 | 始终使用输入网址的主机名。 |
| `website` | 字符串 | 始终使用用户提交的网址。 |
| `emails` | 字符串数组 | 页面存在公开邮箱时填充。 |
| `phones` | 字符串数组 | 页面存在公开电话时填充。 |
| `email` | 字符串或 null | 第一个提取到的邮箱，供平面表格列使用；仅找到电话时为 null。 |
| `phone` | 字符串或 null | 第一个提取到的电话，供平面表格列使用；仅找到邮箱时为 null。 |
| `companyName` | 字符串或 null | 页面声明组织名称、标题或站点标题时填充。 |
| `address` | 字符串或 null | 结构化页面数据提供公开邮寄地址时填充。 |
| `sourceUrls` | 字符串数组 | 本条记录实际检查过的页面。 |
| `pagesVisited` | 整数 | 检查该网站的页面数。 |
| `crawledAt` | 字符串 | UTC 采集时间。 |

缺失字段不会猜测。Actor 不验证邮箱是否存在或可投递，也不为电话号码添加人员姓名。

### 运行步骤

1. 输入一个或多个完整的公开网站网址，必须带 `https://` 或 `http://`。
2. 快速检查可设置 `maxPagesPerSite: 1`；需要读取联系页时可设置为 `2`。
3. 将单次页面请求超时设置为 3 到 20 秒；每个任务另有固定总时限。
4. 运行 Actor 后打开 `Company contacts` 数据集视图。
5. 导出 JSON、CSV 或 Excel，或通过数据集 API 接入自动化。

每次运行最多接受 100 个网址。默认每个网站最多检查两个同域页面，最高为三个。

### 输入示例

```json
{
  "urls": [
    "https://www.tanksdirect.com/",
    "https://example.org/contact/"
  ],
  "maxPagesPerSite": 2,
  "requestTimeoutSecs": 12
}
```

| 输入 | 默认值 | 范围 | 说明 |
|---|---:|---:|---|
| `urls` | 必填 | 1–100 个网址 | 公司主页或联系页。 |
| `maxPagesPerSite` | `2` | 1–3 | 每个输入网站最多检查的同域页面数。 |
| `requestTimeoutSecs` | `12` | 3–20 | 单次公开页面请求的超时时间。 |

`urls` 中应填写公司网站，而不是搜索词。如果要先根据关键词发现网站，请先使用搜索或目录工具，再把得到的公开网址传入本 Actor。

### 输出示例

以下为真实包装器测试记录的脱敏结构。联系方式已从文档中移除。

```json
{
  "companyName": "Tanks Direct",
  "domain": "tanksdirect.com",
  "email": "[已脱敏]",
  "phone": "[已脱敏]",
  "emails": ["[已脱敏]"],
  "phones": ["[已脱敏]"],
  "website": "https://www.tanksdirect.com/",
  "address": "[已脱敏]",
  "sourceUrls": ["https://www.tanksdirect.com/"],
  "pagesVisited": 1,
  "crawledAt": "UTC 时间戳"
}
```

真实 schema 会把 `email` 和 `phone` 保留为顶层字段，方便表格和电子表格导出。数组保存页面中发现的其他联系方式。没有公开联系方式的网址不会生成空的计费记录。

### 限制与访问行为

- Actor 只发起直接公开请求，不使用代理、账号、Cookie、浏览器或外部联系人数据库 API。
- 只接受 HTTP 和 HTTPS。拒绝 IP 字面量、本地、私有及内部主机名。
- 重定向必须留在同一主机，允许 `www` 前缀差异；不会跟随外部链接。
- 只有在输入页面发现的同域联系链接才会继续访问。
- 每个网址最多检查 3 页；单个响应正文最多读取 1 MB；整个任务最长 9 分钟。
- 遇到拒绝访问、登录、机器人验证、限速或服务器错误时，不会绕过限制；Actor 会记录并停止该目标。
- 有效网页没有公开邮箱或电话时，不会生成联系记录。无法解释的零结果运行仍会以 FAILED 结束；只有后端明确返回良性 NO\_RESULTS 且已通过已知正常输入确认访问时，才能以 SUCCEEDED 结束。
- 多个网站按顺序处理。Actor 不会轮换 IP 或身份来强行访问。

### 价格

按结果计费：**每条已保存的公司联系记录 $0.0032**。一条记录对应一个至少公开了邮箱或电话的输入网站。没有联系人记录的页面不会产生数据集条目事件。

Actor 不产生单独的代理或付费 API 费用。Apify 平台使用费由 Apify 单独报告。发布前请查看 Store 实际价格，因为 Apify 可能规范化套餐价格或应用账户级定价规则。

### 使用建议

- 尽量提交规范的 HTTPS 网址。如果域名会在裸域和 `www` 间重定向，请直接输入最终主机名。
- 如果主页不显示联系方式，直接把公司联系页作为输入。
- 大名单先使用较小的 `maxPagesPerSite`。只有首页确实链接到需要的联系页时才增加页数。
- 导入 CRM 前检查 `sourceUrls`，确认联系方式来自哪些公开页面。
- 邮箱和电话号码仅表示页面公开的联系方式，不保证资料仍然有效。
- 在自己的工作流中按规范化域名和联系方式去重。
- 网站阻止请求时不要改用其他身份持续重试。记录访问结果或使用已获授权的数据源。
- 没有结果可能是页面没有公开联系方式、页面布局变化或访问受限。修改输入前先查看运行日志。

### 其他数据工具

- [Website Content Crawler](https://apify.com/myagizm/website-content-crawler) 返回适合研究和索引的干净网页正文。
- [Email Verifier](https://apify.com/myagizm/email-verifier) 检查已提供邮箱的语法、DNS 和 SMTP 信号。
- [Keyword Website Lists Scraper](https://apify.com/myagizm/keyword-website-lists-scraper) 根据关键词查找网站候选。
- [Google Search Results Scraper](https://apify.com/myagizm/google-search-results-scraper) 搜索公开网页结果。
- [Google Maps Scraper](https://apify.com/myagizm/google-maps-scraper) 收集公开本地商家资料字段。

所有 Actor 见 [myagizm 主页](https://apify.com/myagizm)。

### AI 与自动化

当此 Actor 对你的 Apify 账号开放后，AI agent 或自动化工作流可通过 Apify API 启动运行、等待完成并读取默认数据集。Actor 不需要单独的数据供应商 API Key。若工作流已使用 Apify 支持的 MCP server 或集成，可继续使用相同输入和输出结构。

### API 示例

异步启动任务：

```bash
curl -X POST "https://api.apify.com/v2/acts/myagizm~website-contact-finder/runs" \
  -H "Authorization: Bearer YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"urls":["https://www.tanksdirect.com/"],"maxPagesPerSite":2,"requestTimeoutSecs":12}'
```

同步运行并获取数据集条目：

```bash
curl -X POST "https://api.apify.com/v2/acts/myagizm~website-contact-finder/run-sync-get-dataset-items" \
  -H "Authorization: Bearer YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"urls":["https://www.tanksdirect.com/"],"maxPagesPerSite":2,"requestTimeoutSecs":12}'
```

读取已完成任务的数据集：

```bash
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?format=json&clean=true" \
  -H "Authorization: Bearer YOUR_APIFY_TOKEN"
```

API token 应放在 Authorization header 中，不要放入共享任务、数据集或公开链接。

### 常见问题

**它会找出整个域名的所有邮箱吗？**
不会。它检查输入页面以及最多两个从该页面发现的同域链接，不会遍历整个网站。

**可以只传域名、不带协议吗？**
不可以。请使用完整的 `https://` 或 `http://` 网址。

**它会验证邮箱吗？**
不会。它只提取公开页面显示的地址。如需检查语法或邮件服务器信号，请使用邮箱验证工具。

**它会拨打电话验证号码吗？**
不会。Actor 会规范化公开号码的格式，但不会拨打电话。

**为什么 `email` 是 null，但 `emails` 有内容？**
成功记录中不应出现这种情况。平面 `email` 字段取自 `emails` 数组的第一个值。

**为什么 `phone` 是 null，但 `phones` 有内容？**
成功记录中不应出现这种情况。平面 `phone` 字段取自 `phones` 数组的第一个值。

**为什么某个网址没有记录？**
页面可能没有公开邮箱或电话，也可能拒绝公开请求。只有存在至少一个联系方式时才会生成记录。

**零条结果的运行会成功吗？**
只有后端明确返回良性 `NO_RESULTS` 信号，且已知正常输入确认访问有效时才会成功。无法解释的零结果和上游故障仍会以 FAILED 结束。

**它能访问需要登录的页面吗？**
不能。Actor 不登录、不使用 Cookie，也不会访问私有页面。

**它会解决 CAPTCHA 或机器人验证吗？**
不会。遇到拦截时会报告并停止，不会切换账号或身份。

**它会跟随外部链接吗？**
不会。只跟随同一主机上发现的联系页面，跨站重定向会被拒绝。

**可以从 `contact.example.com` 子域名读取数据吗？**
只有把该子域网址直接作为输入时才可以。Actor 不会从一个主机跳转到另一个子域。

**每个网站最多检查多少页？**
一到三页，由 `maxPagesPerSite` 控制。

**单次运行会无限等待吗？**
不会。每个请求都有超时，整个任务最长 9 分钟。

**一次最多能传多少网站？**
每次最多 100 个网址。

**为什么输出有 `sourceUrls`？**
它可以追溯每个联系方式来自哪些公开页面。

**可以导出电子表格吗？**
可以。Apify 数据集支持 CSV 和 Excel。主要邮箱和电话是平面字段。

**Actor 使用住宅代理吗？**
不使用。当前路线只有直接请求，代理字节数和代理费用均为零。

**我可以用这些数据联系公司吗？**
你负责遵守适用于你的隐私、营销和反垃圾邮件规则。

**它会搜索员工的个人邮箱吗？**
不会。它只提取用户提交页面上公开显示的联系方式，不搜索个人、不推测邮箱格式，也不丰富个人资料。

**网站布局变化会影响结果吗？**
可能。Actor 使用公开结构化数据、链接和页面可见文字。网站改变联系方式的展示方式后，结果可能变化；请检查来源网址和运行日志。

### 相关搜索

网站邮箱查找 · 公司网站联系信息抓取 · 公开商务邮箱提取 · 公司电话号码查找 · 网站电话抓取 · 商务联系信息爬虫 · 联系页邮箱提取 · 抓取公开公司邮箱 · 网站潜在客户联系方式 · 公司域名联系信息 · 通过网址查找 B2B 联系人 · 网站邮箱电话查找 · 公开公司联系数据 · 商务邮箱提取 API · 网站联系信息 API · 公司网站数据补全 · 公开电话号码提取 · 同域联系页爬虫 · 导出公司联系人 CSV · 收集商务联系信息 · 公司域名潜客数据 · 从网址提取联系信息 · 公开商务电话查找 · 无需登录的邮箱提取 · Apify 公司联系人数据集 · CRM 网站联系记录 · 根据网址查找商务邮箱 · 公开网站联系信息提取

### 免责声明

本工具只收集用户提交的公开页面上可见的信息，不登录或绕过访问控制。你负责选择有权处理的网址，并遵守隐私、营销、反垃圾邮件和数据保护规则，包括适用时的 GDPR 或 CCPA。公司名称和商标仍归其所有者所有。

### 资源

- [Apify API 文档](https://docs.apify.com/api/v2)
- [Apify 数据集导出](https://docs.apify.com/platform/storage/dataset)
- [Apify Actor tasks](https://docs.apify.com/platform/actors/running/tasks)
- [Apify MCP server](https://mcp.apify.com)
- [myagizm Store 主页](https://apify.com/myagizm)

### Errors & billing

Input errors finish with status SUCCEEDED, no results and no charge; see the OUTPUT record for the reason.

### 错误与计费

输入错误会以 SUCCEEDED 状态结束，不返回结果且不收费；原因请查看 OUTPUT 记录。

# Actor input Schema

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

Public company homepages or contact-page URLs. One result is returned per website that exposes at least one public email address or phone number.

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

Maximum same-site pages to check, including the URL supplied. Contact links are followed only when found on that page.

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

Maximum time to wait for each public page request. The total job also has a fixed deadline.

## Actor input object example

```json
{
  "urls": [
    "https://www.tanksdirect.com/"
  ],
  "maxPagesPerSite": 2,
  "requestTimeoutSecs": 12
}
```

# Actor output Schema

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

Email and phone contact records for public company websites.

# 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": [
        "https://www.tanksdirect.com/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("myagizm/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": ["https://www.tanksdirect.com/"] }

# Run the Actor and wait for it to finish
run = client.actor("myagizm/website-contact-finder").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.tanksdirect.com/"
  ]
}' |
apify call myagizm/website-contact-finder --silent --output-dataset

```

## MCP server setup

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

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/A5gxZ4Vy0dQSWgAMd/builds/BizsQGxfLLnDqnj0X/openapi.json
