# Contact Page Scraper | Company Details, Emails, Phone Number (`aurelix/contact-details-scraper`) Actor

Extract company contact details priced per company, not per page: $3.00 per 1,000 companies for up to 25 pages each, 81% less than the most-used per-page contact scraper at 8 pages a site. Emails, company phone numbers, addresses, social media links, team members with titles, each with source URL.

- **URL**: https://apify.com/aurelix/contact-details-scraper.md
- **Developed by:** [Aurelix](https://apify.com/aurelix) (community)
- **Categories:** Lead generation, Business
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.10 / 1,000 company results

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

### What is Contact Page Scraper?

**Turn a list of company websites into their published emails, phones, addresses, social pages and team members for $3.00 per 1,000 companies, no login.**

For sales teams and agencies enriching lead lists. Reads up to 25 contact, about, team and imprint pages per company for one price, and every contact carries the page it came from. Your first run with the example input costs about $0.011 (3 companies in our test run).

[![Contact Page Scraper: example output from a real run](https://api.apify.com/v2/key-value-stores/twkCCtTWzsi8fVbx5/records/contact-details-scraper-card-v2.png)](https://console.apify.com/actors/wk2m44ZUsjOPc4XN4?addFromActorId=wk2m44ZUsjOPc4XN4)

[![Contact Page Scraper: 75-second demo video](https://api.apify.com/v2/key-value-stores/twkCCtTWzsi8fVbx5/records/contact-details-scraper-demo-thumb-v1.png)](https://api.apify.com/v2/key-value-stores/twkCCtTWzsi8fVbx5/records/contact-details-scraper-demo-v1.mp4)

**[▶ Watch the 75-second demo](https://api.apify.com/v2/key-value-stores/twkCCtTWzsi8fVbx5/records/contact-details-scraper-demo-v1.mp4)**

| | |
|---|---|
| **Input** | Company domains or website URLs |
| **Pages read** | Homepage plus contact, about, team, leadership and imprint pages; 8 per company by default, up to 25 |
| **Output** | 21 fields per company; JSON, CSV, Excel, API |
| **Automate** | Schedules, webhooks, Zapier, Make, n8n, Google Sheets, MCP for AI agents |
| **Price** | $3.00 per 1,000 companies ($2.10 per 1,000 companies on paid Apify plans) |
| **Login needed** | No |

### Why Contact Page Scraper users pick this one

- **Priced per company, not per page.** Up to 25 pages read for the same $3.00 per 1,000.
- **Every contact sourced.** Each email, phone, address and person carries its source URL.
- **Nothing found, nothing charged.** Companies with no published contacts cost only the start fee.
- **People with titles.** Title, seniority, function, plus email, phone and LinkedIn/X from their card.
- **81% under per-page pricing.** $3.00 per 1,000 companies vs $16.00 for 8 pages each at $2.00 per 1,000.

### Get started in 3 steps

1. Paste company domains or website URLs, one per line, e.g. sparkbox.com or https://www.welchllp.com.
2. Optionally change Max pages per company (default 8), turn people off, or cap people per company.
3. Click Start, then download JSON, CSV or Excel, or send the results to your CRM, Google Sheets, Zapier, Make or n8n through the API.

**[▶ Try it with the example input](https://console.apify.com/actors/wk2m44ZUsjOPc4XN4?addFromActorId=wk2m44ZUsjOPc4XN4)**

The form opens with an example input already filled in: that run costs about $0.011 on the free plan.

### How much does it cost to find company contact details?

Pay per event: you pay only for what the run returns, plus a small start fee. Bronze, Silver, Gold and higher Apify plans pay less per result.

| Companies | Free plan | Paid plans (Bronze, Silver, Gold) |
|---|---|---|
| 100 | $0.30 | $0.21 |
| 1,000 | $3.00 | $2.10 |
| 10,000 | $30.00 | $21.00 |

Totals include the $0.002 start fee per run, rounded to the cent. Apify's free plan includes $5 of credit a month, enough for about 1,600 companies (without people; each person adds $0.50 per 1,000).

One price per company, not per page: the pages read (up to 25 per company) are included. Companies with no published contact data, unreachable sites, sites whose robots.txt disallows the crawl, suppressed domains and pages read are not charged.

#### Billing events

| Event | Free plan | Paid plans (Bronze, Silver, Gold) |
|---|---|---|
| `company-result` | $3.00 per 1,000 companies | $2.10 per 1,000 companies |
| `person-result` | $0.50 per 1,000 people | $0.35 per 1,000 people |
| `apify-actor-start` | $0.002 per run | $0.002 per run |

### Benchmarks: how we compare

| Test | Sample | Result |
|---|---|---|
| Fill rate, small and mid-size firms | 1 cloud run, 28 domains (accountants, law firms, dentists, landscapers, software companies), up to 10 pages each | 25 companies returned and charged, 3 not (1 unreachable, 1 refused with HTTP 403, 1 with no contact data). Of the 25: phone 22, address 21, social page 16, email 13; 314 s |
| Fill rate, second set | 1 cloud run, 12 companies, up to 8 pages each | phone 12 of 12, social page 12 of 12, address 10 of 12, email 7 of 12; 138 s |
| Speed | 1 cloud run, 10 companies, default settings | 10 companies in 43 s |
| Unreachable or empty sites | 3 cloud runs: 1 dead domain; 10 domains, all unreachable or without contact data; 40 dead hosts | nothing charged but the start fee; finished in 2.4 s, 20 s and 75 s |
| Run timeout set to 45 s | 6 cloud runs on the 28-domain list | all finished SUCCEEDED in 38 to 40 s, with the companies done so far saved |
| Board, advisor and investor sections | 7 company sites with board or advisory pages | 0 of the 35 people listed there returned |
| Record accuracy, spot check | 10 random company records from the 28-domain run; 8 company records from a run on 8 new sites | 10 of 10 and 8 of 8 matched their source pages |
| Test-run success | 41 test runs | 39 succeeded; the 2 failures were run timeouts, fixed by stopping before the timeout |
| First run with the prefilled input | 1 run, 3 domains | 3 companies for $0.011 |

Measured on our own Apify cloud runs, plain HTTP with no proxy. Fill rate counts the companies that returned data; companies with nothing published are neither returned nor charged. It depends on what each company publishes, so expect it to vary by industry. Accuracy: each sampled record was checked field by field against its cited source pages.

### What data you get

**Contact Page Scraper** turns a list of company domains into one row per company: published emails (info@, sales@, named addresses), phones in E.164, structured addresses, LinkedIn, Facebook, X, Instagram and YouTube company pages, and the team members the company publishes with name, title, seniority, function and the email, phone, LinkedIn and X profile on their card. It reads the homepage plus the contact, about, team, leadership and imprint pages each site links to (English and French), and every item carries the URL it was published on.

- company_name, domain, website, primary_email, primary_phone, address
- linkedin_url, facebook_url, x_url, instagram_url, youtube_url (company pages only)
- emails \[{email, source_url}]: every email the company publishes (info@, sales@, toronto@, jane.doe@, Gmail) that is not already attached to a person
- phones \[{number (E.164), display, type phone|fax, source_url}] and addresses \[{full, street, city, region, postal_code, country, source_url}]
- people \[{name, title, seniority, function, work_email, work_phone, linkedin_url, twitter_url, source_url}] and people_count
- pages_crawled, source_url, scraped_at (ISO 8601 UTC)

| company_name | domain | primary_email | primary_phone | address | linkedin_url | people_count |
|---|---|---|---|---|---|---|
| Lerners Lawyers | lerners.ca | london@lerners.ca | +18887421113 | 85 Dufferin Ave., Box 2335, London, ON N6A 4G4 | https://www.linkedin.com/company/lerners-llp | 0 |
| Steam Whistle Brewing | steamwhistle.ca | info@steamwhistle.ca | +14163622337 | 255 Bremner Blvd., Toronto, Ontario |  | 0 |
| Viget | viget.com | hello@viget.com | +17038910670 | 105 West Broad Street, 4th Floor, Falls Church, VA 22046, US | https://www.linkedin.com/company/viget-labs | 8 |
| Welch LLP | welchllp.com |  | +16132369191 | 350 Albert Street, Suite 700, Ottawa, ON K1R 1A4 | https://www.linkedin.com/company/welchllp | 50 |
| Downtown Dental | downtowndentist.ca | info@downtowndentist.ca | +14032641736 | 215 9 Ave SW #150,, Calgary, AB T2P 1K3 |  | 3 |

One full company record, exactly as a real run returned it (long text and lists shortened here). From a real run:

```json
{
  "domain": "lerners.ca",
  "website": "https://lerners.ca/",
  "company_name": "Lerners Lawyers",
  "primary_email": "london@lerners.ca",
  "primary_phone": "+18887421113",
  "address": "85 Dufferin Ave., Box 2335, London, ON N6A 4G4",
  "linkedin_url": "https://www.linkedin.com/company/lerners-llp",
  "facebook_url": "https://www.facebook.com/LernersLLP",
  "x_url": null,
  "instagram_url": "https://www.instagram.com/lernerslawyers",
  "youtube_url": "https://www.youtube.com/@LernersLLP",
  "emails": [
    {
      "email": "london@lerners.ca",
      "source_url": "https://lerners.ca/"
    },
    {
      "email": "toronto@lerners.ca",
      "source_url": "https://lerners.ca/"
    },
    {
      "email": "strathroy@lerners.ca",
      "source_url": "https://lerners.ca/"
    },
    "... [1 more]"
  ],
  "phones": [
    {
      "number": "+18887421113",
      "display": "(888) 742-1113",
      "type": "phone",
      "source_url": "https://lerners.ca/"
    },
    {
      "number": "+15196406344",
      "display": "(519) 640-6344",
      "type": "phone",
      "source_url": "https://lerners.ca/"
    },
    {
      "number": "+15196724510",
      "display": "(519) 672-4510",
      "type": "phone",
      "source_url": "https://lerners.ca/"
    },
    "... [3 more]"
  ],
  "addresses": [
    {
      "full": "85 Dufferin Ave., Box 2335, London, ON N6A 4G4",
      "postal_code": "N6A 4G4",
      "region": "ON",
      "country": "CA",
      "source_url": "https://lerners.ca/contact"
    },
    {
      "full": "225 King Street West, Suite 1600, Toronto, ON M5V 3M2",
      "postal_code": "M5V 3M2",
      "region": "ON",
      "country": "CA",
      "source_url": "https://lerners.ca/contact"
    },
    {
      "full": "305 King St. West, Suite 301, Kitchener, ON N2G 1B9",
      "postal_code": "N2G 1B9",
      "region": "ON",
      "country": "CA",
      "source_url": "https://lerners.ca/contact"
    },
    "... [1 more]"
  ],
  "social_profiles": [
    {
      "network": "facebook",
      "url": "https://www.facebook.com/LernersLLP",
      "source_url": "https://lerners.ca/"
    },
    {
      "network": "instagram",
      "url": "https://www.instagram.com/lernerslawyers",
      "source_url": "https://lerners.ca/"
    },
    {
      "network": "linkedin",
      "url": "https://www.linkedin.com/company/lerners-llp",
      "source_url": "https://lerners.ca/"
    },
    "... [1 more]"
  ],
  "people": [],
  "people_count": 0,
  "pages_crawled": [
    "https://lerners.ca/",
    "https://lerners.ca/lawyers",
    "https://lerners.ca/contact",
    "... [1 more]"
  ],
  "input": "https://lerners.ca/",
  "source_url": "https://lerners.ca/",
  "scraped_at": "2026-11-04T11:26:08Z"
}
```

### Use cases

- Sales teams turning a list of target domains into published emails, phones and addresses
- Agencies enriching a CRM export with company social pages and main phone numbers
- Lead lists from Google Maps or Yellow Pages: run each website through for published company emails
- B2B researchers seeing who a company lists on its own team and leadership pages

### Use-case recipes

#### Add emails to a Google Maps lead list

For agencies building local lead lists. Run the Google Maps Business Scraper, then paste its `website` column into `domains` here with `includePeople` off. Join the results back on `domain`, and load `primary_email` and `primary_phone` into your CRM; `emails` holds every address found, each with its `source_url`.

```json
{
  "domains": [
    "downtowndentist.ca",
    "calgaryroofingpro.ca",
    "austinroofingcompany.com"
  ],
  "maxPagesPerDomain": 5,
  "includePeople": false
}
```

#### Fill gaps in a CRM export

For sales ops teams whose account records lack phones, addresses or social pages. Export the account domains, run them with people off, and map `primary_phone`, `address` and `linkedin_url` back onto each account by `domain`. Accounts with nothing published are simply absent from the dataset and cost nothing.

```json
{
  "domains": [
    "sparkbox.com",
    "thoughtbot.com",
    "metalab.com"
  ],
  "maxPagesPerDomain": 5,
  "includePeople": false
}
```

#### Route outreach to the right department inbox

For teams that want sales@ for a sales pitch and careers@ for recruiting partnerships, not a generic info@. The `emails` list keeps every mailbox the company publishes, each with the page it came from; pick the mailbox by its local part and keep `source_url` as proof of where it was published.

```json
{
  "domains": [
    "welchllp.com",
    "steamwhistle.ca"
  ],
  "maxPagesPerDomain": 8,
  "includePeople": false
}
```

#### Map a multi-office firm's branches

For territory planning across firms with several offices. Raise Max pages per company so more location pages are read. `addresses` lists up to 5 offices with street, city, region and postal code, and branch mailboxes named after a city (e.g. toronto@) appear in `emails`.

```json
{
  "domains": [
    "lerners.ca",
    "rlb.ca"
  ],
  "maxPagesPerDomain": 15,
  "includePeople": false
}
```

### Input

| Field | Type | What it does | Default |
|---|---|---|---|
| `domains` (Company domains or URLs) | array | One company per entry, e.g. \['sparkbox.com', 'https://www.welchllp.com']. | \["sparkbox.com", "welchllp.com", "steamwhistle.ca"] |
| `maxPagesPerDomain` (Max pages per company) | integer | Pages read per company, homepage included, e.g. 8. | 8 |
| `maxPeoplePerCompany` (Max people per company) | integer | Cap on people returned (and charged) per company, e.g. 50. | 50 |
| `includePeople` (Include people) | boolean | Add the people published on team, leadership and about pages (name, title, seniority, function, work email and phone where the... | true |

All 4 fields, with examples: see the **Input** tab.

### Use with AI agents (Apify MCP server, Claude, ChatGPT, n8n AI agent)

Contact Page Scraper is a ready-made tool for AI agents. Through the Apify MCP server an agent reads this Actor's input schema, fills in the input from your request, starts the run and reads the companies back. You pay the same per-result price as a run started by hand, from your own Apify account.

#### Example prompts

- "Find the published contact emails and phone numbers for sparkbox.com, thoughtbot.com and metalab.com and give me a table with the page each one came from"
- "Here are 30 company websites from my CRM export; add each company's LinkedIn page, main phone number and street address, company details only"
- "Take the website column of my Google Maps lead list and find each business's info@ or sales@ email and its Facebook page"

#### Claude (claude.ai and Claude Desktop)

Open **Settings > Connectors**, choose **Add custom connector**, paste `https://mcp.apify.com/?tools=aurelix/contact-details-scraper` and sign in to Apify when asked. Then ask Claude one of the prompts above.

#### Claude Code, Cursor, VS Code and other MCP clients

```bash
claude mcp add --transport http apify "https://mcp.apify.com/?tools=aurelix/contact-details-scraper"
```

Clients configured with JSON take the same URL:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com/?tools=aurelix/contact-details-scraper"
    }
  }
}
```

A client without Apify sign-in sends the header `Authorization: Bearer <YOUR_APIFY_TOKEN>`; to run the server locally instead, use `npx -y @apify/actors-mcp-server --actors aurelix/contact-details-scraper` with `APIFY_TOKEN` set.

#### ChatGPT

Where your ChatGPT plan offers custom connectors (developer mode), add `https://mcp.apify.com/?tools=aurelix/contact-details-scraper` as a connector, sign in to Apify, and ask for the data in plain words.

#### n8n AI agent

Give an **AI Agent** node an **MCP Client Tool** with the endpoint `https://mcp.apify.com/?tools=aurelix/contact-details-scraper` and a Bearer credential holding your Apify token. The agent can then call Contact Page Scraper whenever a workflow step needs companies; for a fixed, non-agent workflow use Apify's n8n node with **Run Actor** instead.

### Use it from AI agents (MCP), the API or no-code

#### Copy this to your AI assistant

```text
Use the Apify Actor aurelix/contact-details-scraper (Contact Page Scraper) through Apify's MCP server or API. Main input: domains (Company domains or URLs). Example input: {"domains": ["sparkbox.com", "welchllp.com", "steamwhistle.ca"], "maxPagesPerDomain": 8, "includePeople": true, "maxPeoplePerCompany": 50}. Each result is one company with fields such as domain, website, company_name, primary_email, primary_phone, address, linkedin_url, facebook_url. It costs $3.00 per 1,000 companies on Apify's free plan plus a $0.002 start fee per run, and needs no login.
```

MCP server URL for this Actor: `https://mcp.apify.com/?tools=aurelix/contact-details-scraper` (setup for each client in the section above).

#### API

Start a run and read the dataset with Apify's REST API or the Python and JavaScript clients:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("aurelix/contact-details-scraper").call(run_input={'domains': ['sparkbox.com', 'welchllp.com', 'steamwhistle.ca'], 'maxPagesPerDomain': 8, 'includePeople': True, 'maxPeoplePerCompany': 50})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

#### No-code: schedule it in 3 clicks

Send the results to Google Sheets, Zapier, Make, n8n, Slack or any webhook URL.

1. Fill in the input, then click **Save as a new task**.
2. In the task, click **Schedule** and pick daily or weekly (Apify Schedules).
3. Open the task's **Integrations** tab to send every run's results to Slack, Google Sheets, email or any webhook.

Prefer n8n or Make? Ask in the **Issues** tab and we will share a ready-made workflow for it.

### FAQ

#### Can I find company contact details without login?

Yes. It never logs in, so you need no company website account, password or cookies; only a free Apify account to run it.

#### Is there a company contact details API?

You can use this Actor as one. Start it with Apify's REST API or the Python and JavaScript clients and read the results as JSON (see the code above), or call it from an AI agent through MCP.

#### How much does it cost to find company contact details?

About $3.00 for 1,000 companies on Apify's free plan and $2.10 on paid plans, start fee included. The free $5 monthly credit covers about 1,600 companies (without people; each person adds $0.50 per 1,000).

#### Can I export company contact details data to Excel or Google Sheets?

Yes. Download the results as Excel, CSV, JSON, XML or HTML from the run's **Storage** tab, or send them to Google Sheets with Apify's Google Sheets integration or the API.

#### Is it legal to find company contact details?

It reads only public data any logged-out visitor can see: companies' own websites. It goes at a polite pace, respects robots.txt, never logs in and never solves CAPTCHAs. It returns the contact details the company publishes (emails, phones, addresses, social pages, team members with titles and the contact links on their cards) as shown on the page; no guessed emails, and anyone on our suppression list is withheld. To have a record removed, open an issue on this Actor's Issues tab; if a site owner formally asks us to stop, this Actor will stop. You are responsible for using the data lawfully, incl. anti-spam and privacy laws; this is not legal advice.

#### Can I find email addresses from a list of websites?

Yes. Give it company domains or website URLs; it returns the emails each company publishes on its own pages, each with the page it came from. Emails are never guessed or pinged.

#### Which pages does it read?

The homepage, then the pages the site links to as contact, about, team, leadership, staff or imprint (also French: nous joindre, à propos, équipe), best first, up to 'Max pages per company'. If the homepage links to none, it tries /contact, /about and /team. Individual profile pages are read last.

#### Which emails are returned?

Every email the company publishes on its own pages: role mailboxes (info@, sales@...), location mailboxes, named addresses such as jane.doe@ and free-mail addresses (Gmail, Outlook...). An address shown on a person's card whose mailbox spells that person's name goes in that person's work_email; every other address is in the company's emails list. Addresses at other companies' domains (e.g. the web designer) are left out. Nothing is guessed, generated or verified.

#### Which people are returned?

People the company publishes with a name and a job title on its own pages, e.g. a team or leadership page. Testimonials, reviews, blog authors, quotes and partner, customer and case-study pages are skipped. Board members, advisors and investors are excluded: nobody listed under a board, advisor or investor heading, and no board-only title such as Chair, is returned. A person whose title names another organisation or a past role (e.g. 'CEO of Telus', 'Vice President at SoftBank Investment Advisers', 'CEO (Telus)', 'President - Hootsuite', 'Former CTO of Shopify') is left out, whatever the role; a title naming a department, business line or region of the company itself (e.g. 'President, Retail Banking', 'Managing Director, North America') is kept. Work email, phone, linkedin_url and twitter_url are filled only when they appear on that person's own card (or in the page's structured data for that person); a link shared by two people is given to neither.

#### What is charged?

One company-result for each company that returns at least one email, phone, address, social page or person, plus one person-result per person included. Unreachable sites, sites that disallow crawling and companies with no published contact data are free apart from the run start fee.

#### Does it respect robots.txt?

Always, and it cannot be switched off. Disallowed pages are never requested, Crawl-delay is honoured, and redirects into disallowed paths are not followed.

#### How do I get my data removed?

Open an issue in the Issues tab with the domain, email or name. It is added to the shared suppression list within 7 days.

#### What happens if a site has no contact data or cannot be reached?

That company is left out of the dataset and not charged. The run's status message counts every company not charged by reason: site unreachable (with the error), blocked by robots.txt, no contact data found, stopped early, or suppressed on request. A run in which nothing is found costs only the $0.002 start fee.

#### How are duplicate or messy entries handled?

Entries for the same site (with or without www., https:// or a path) are crawled once and returned once. A full URL such as https://www.welchllp.com/contact is read along with the homepage. An email address is accepted and its domain is used. Entries that are not domains or URLs are skipped with a warning in the log.

#### How many domains can one run take, and how fast is it?

There is no fixed cap on the list. Five companies are crawled at a time, at most two requests per second per site, and each company gets at most 240 s of crawling. In our test runs, 10 companies took 43 s and 28 domains at up to 10 pages each took 314 s. For long lists, raise the run timeout: a run that nears it stops early and keeps the companies already done.

#### Can I get company details without people?

Yes. Set 'Include people' to false: no people are returned and no person-result is charged, only one company-result per company with data. You can also cap people with 'Max people per company'; people above the cap are neither returned nor charged.

#### What do seniority and function mean?

Both are read from the job title the company publishes. Seniority is one of founder_owner, c_suite, partner, vp, head, director, manager or staff. Function is one of executive, finance, hr, marketing, sales, engineering, product, legal, operations, customer_service or other. They are rule-based, so check the title itself before relying on them.

#### How are phone numbers and countries handled?

Numbers are validated with Google's libphonenumber; invalid ones are dropped and the rest are returned in E.164 and typed as phone or fax. A number written without a country code is read in the country of the site's domain ending: .ca as Canada, .uk as the UK, .com, .net, .org, .io and .co as the US, and other two-letter endings as that country. Page types are recognised in English and French, plus words such as Kontakt and Impressum.

#### Why do I get fewer emails than with a page-by-page scraper?

Every address the company publishes is kept; a person's own address sits inside that person, addresses at other companies' domains are left out, and file names, placeholders and tracking addresses are removed. Sites that show their email only through JavaScript return none.

#### Can I schedule it to track changes?

You can schedule it like any Actor, but there is no 'only new' mode: each run crawls every domain again and charges each company with data again. Schedule only the domains you want refreshed.

### Lawful use

- B2B use only: the data is contact information that companies publish on their own websites. Do not use it for consumer marketing.
- No spam: contact people only with relevant, individual business messages, identify yourself, and honour every opt-out at once.
- You are responsible for complying with the anti-spam and privacy laws that apply to you and to the people you contact, including Canada's CASL, the US CAN-SPAM Act and the EU/UK GDPR (lawful basis, transparency, the right to object).
- Only data published on the company's own public pages is collected: no login, no guessed or generated emails, no email verification pings and no sensitive data.
- Data is returned as shown publicly on the company's own pages; anyone can ask for removal by opening an issue in this Actor's Issues tab (see Removal requests).
- No guessed emails and no verification pings; robots.txt is always obeyed.

### Removal requests

Anyone can ask for their name, email or domain to be removed: open an issue in this Actor's **Issues tab** with the domain, email or name. Requests are honoured within **7 days**: the entry is added to the suppression list that every Aurelix contact Actor checks before returning data, so it is dropped from all future runs. A suppressed person's direct phone and email are also left out of the company's own fields.

### Limits (stated honestly)

- People are detected with rules from the company's own pages (mainly team and leadership pages), so they are best-effort: verify each name and title before outreach. A title naming only an unfamiliar place (e.g. 'General Manager, Kelowna') can be read as another organisation and left out.
- No JavaScript rendering: contact details that a site only shows through JavaScript (some Wix, Webflow and app-style sites) are not found, and those companies are not charged.
- People detection reads names and titles from the page layout; unusual layouts can miss people or a title, and a person without a published job title is not returned.
- Address parsing is tuned for Canadian and US formats; other countries' addresses are found mainly through the site's structured data.
- At most two requests per second per site and up to 25 pages per company, so very large teams spread over many pages can be partly covered.
- Social pages: LinkedIn company pages, plus Facebook, X, Instagram and YouTube accounts linked from the site's own header or footer (or its structured data), so a company whose social links sit elsewhere on the page returns none. Personal LinkedIn and X profiles are returned inside the person whose card links them.
- People coverage: team cards with the name and title together are read reliably; people shown only in images, sliders, JavaScript widgets or long biography text without a title line are missed.
- A domain that redirects to a domain on the suppression list is skipped and not charged.

### Works great with

- **Before this: [Google Maps Phone Scraper](https://apify.com/aurelix/google-maps-scraper)**: its `website` column is this Actor's `domains` input: a local lead list with contacts in two runs
- **Then: [Decision Maker Finder](https://apify.com/aurelix/decision-maker-finder)**: run the same `domains` list to add the names and titles of the people who decide

### Related Aurelix tools

Public Aurelix Actors, grouped by the data they collect. All are pay-per-result and need no login.

#### Leads and company data

- **[Decision Maker Finder](https://apify.com/aurelix/decision-maker-finder)**: Founders, CEOs, VPs and department heads from company team pages, with title, seniority and function.
- **[Newly Funded Companies Hiring](https://apify.com/aurelix/funded-companies-hiring)**: Companies that just raised money (SEC Form D), with their open roles and business contacts, as a new-only monitor.
- **[Google Maps Phone Scraper](https://apify.com/aurelix/google-maps-scraper)**: Local business lists from Google Maps: phones, websites, ratings, hours, coordinates; optional website emails and socials.
- **[Recently Funded Companies API](https://apify.com/aurelix/recently-funded-companies)**: US companies that just filed an SEC Form D: amount raised, industry, state, executives, confirmed website.
- **[Tech Stack API](https://apify.com/aurelix/tech-stack-detector)**: CMS, e-commerce platform, analytics, ad pixels, chat, CDN and email provider for each domain you enter.

#### Jobs and hiring data

- **[Greenhouse Jobs Scraper](https://apify.com/aurelix/greenhouse-jobs-scraper)**: Live jobs from a company's Greenhouse, Lever, Ashby or SmartRecruiters board, with salary and Canadian province tags.
- **[LinkedIn Jobs Country Filter Scraper](https://apify.com/aurelix/linkedin-jobs)**: Public LinkedIn job postings by keyword and country: title, company, location, seniority, job type, salary text, description.
- **[Multiple Job Boards Scraper](https://apify.com/aurelix/multi-job-board-scraper)**: LinkedIn, about 50 company career sites, Remote OK and We Work Remotely jobs in one deduplicated list.
- **[Remote Job Board Scraper API](https://apify.com/aurelix/remote-jobs-scraper)**: Remote OK and We Work Remotely jobs in one deduplicated list with salary, regions and tags.

#### E-commerce and product data

- **[AliExpress Scraper API](https://apify.com/aurelix/aliexpress-product-search)**: AliExpress search results by keyword: price, discount, rating, units sold, ship-from country and sponsored flag.
- **[Amazon New Releases & Best Sellers](https://apify.com/aurelix/amazon-best-sellers)**: Amazon Best Sellers and New Releases top 100 on 10 marketplaces: rank, ASIN, price, rating, rank change.
- **[Shopify Product Export Scraper](https://apify.com/aurelix/shopify-products-scraper)**: Every public product of any Shopify store with variants, SKUs, prices, barcodes, stock counts and collections.

#### Ad intelligence

- **[Competitor Watch](https://apify.com/aurelix/competitor-watch)**: One report per competitor with only what is new: Meta and TikTok ads, page changes, Shopify products and prices, jobs.
- **[Facebook Ad Library Search & API](https://apify.com/aurelix/facebook-ad-library-scraper)**: Facebook and Instagram business ads from the Meta Ad Library: copy, creatives, landing pages, dates, optional EU reach.

#### Canada and government data

- **[Canada Building Permits](https://apify.com/aurelix/canada-building-permits-scraper)**: Building permits and development applications from 7 Canadian cities: address, type, status, dates, value, applicant, contractor and Toronto planner contact.

#### AI, content and SEO

- **[Google Trends by Region](https://apify.com/aurelix/google-trends-scraper)**: Google Trends interest over time, by region and rising queries for any number of keywords, plus trending searches.
- **[Google Autocomplete API](https://apify.com/aurelix/google-autocomplete-scraper)**: Expands seed keywords into hundreds of real Google and YouTube autocomplete phrases, tagged by search intent.
- **[PDF Table Extraction & PDF to Markdown OCR](https://apify.com/aurelix/pdf-to-markdown)**: Turns linked PDF and Word files into Markdown per page, with tables as JSON rows, RAG chunks and OCR.
- **[Broken Link Crawler & SEO Audit](https://apify.com/aurelix/seo-audit-crawler)**: Audits a whole site: one row per page with SEO checks and broken links, plus a ranked issues summary.
- **[Website to Markdown API](https://apify.com/aurelix/website-to-markdown)**: Crawls a site and returns one row of clean main-content Markdown per page, with title, headings and links.
- **[YouTube Transcript Scraper](https://apify.com/aurelix/youtube-transcript-scraper)**: Returns YouTube video transcripts as text, timed segments and AI chunks, from videos, channels, playlists or searches.

#### More data tools

- **[Tennis Betting Odds Scraper](https://apify.com/aurelix/tennis-odds-scraper)**: Tennis results and upcoming matches with opening and closing odds per bookmaker and implied probabilities.

### Recent changes

- **0.1**: Company names, LinkedIn or other social pages and personal Gmail-style addresses in the domain list are skipped and named in the status message; vdrmota-style input (startUrls, maxRequestsPerStartUrl) is read as-is; the prefill uses sparkbox.com.

The full history is on the **Changelog** tab.

### Tested daily

An automated health check runs this Actor every day on a fixed input and checks that at least 3 companies come back with `domain`, `website`, `company_name`, `primary_phone`, `source_url`, `scraped_at` filled in; a failed check alerts the maintainer straight away.

### Your feedback

Missing a field, found a bug or need another filter? Open an issue on the **Issues** tab; we aim to answer within a day. If this Actor saved you time, a short review helps other people find it.

# Changelog

This Actor's version history is a separate document: https://apify.com/aurelix/contact-details-scraper/changelog.md

# Actor input Schema

## `domains` (type: `array`):

One company per entry, e.g. \['sparkbox.com', 'https://www.welchllp.com']. A bare domain gets https://; an email such as jane@acme.com reads acme.com. Give the website, not the company name or its LinkedIn page. Duplicates of the same site are crawled once.

## `maxPagesPerDomain` (type: `integer`):

Pages read per company, homepage included, e.g. 8. Contact and team pages are read first. More pages find more people on large sites; pages are not charged.

## `includePeople` (type: `boolean`):

Add the people published on team, leadership and about pages (name, title, seniority, function, work email and phone where the page shows them). Each person is charged a small extra fee. Turn off for company details only, e.g. false.

## `maxPeoplePerCompany` (type: `integer`):

Cap on people returned (and charged) per company, e.g. 50. Use 0 for none.

## Actor input object example

```json
{
  "domains": [
    "sparkbox.com",
    "welchllp.com",
    "steamwhistle.ca"
  ],
  "maxPagesPerDomain": 5,
  "includePeople": true,
  "maxPeoplePerCompany": 10
}
```

# Actor output Schema

## `companies` (type: `string`):

One item per company that publishes contact details: emails, phones, address, social company pages and people (name, title, work email and phone, LinkedIn and X profile links), each with its source URL.

# 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 = {
    "domains": [
        "sparkbox.com",
        "welchllp.com",
        "steamwhistle.ca"
    ],
    "maxPagesPerDomain": 5,
    "maxPeoplePerCompany": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("aurelix/contact-details-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "domains": [
        "sparkbox.com",
        "welchllp.com",
        "steamwhistle.ca",
    ],
    "maxPagesPerDomain": 5,
    "maxPeoplePerCompany": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("aurelix/contact-details-scraper").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 '{
  "domains": [
    "sparkbox.com",
    "welchllp.com",
    "steamwhistle.ca"
  ],
  "maxPagesPerDomain": 5,
  "maxPeoplePerCompany": 10
}' |
apify call aurelix/contact-details-scraper --silent --output-dataset

```

## MCP server setup

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

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/wk2m44ZUsjOPc4XN4/builds/PaydIZJ3J5T0Kuc2u/openapi.json
