# Company Contact Finder: Emails, Phones & Socials (`offerastudio/company-contact-finder`) Actor

Enter company domains and get the emails, phone numbers and social profiles (LinkedIn, X, Facebook, Instagram, YouTube, GitHub) published on their own website, plus company name, description and tech. Pay only for domains where contacts are found.

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

## Pricing

from $10.00 / 1,000 domain with contacts founds

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/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 does Company Contact Finder do?

**Company Contact Finder** turns a list of company domains into contact details. For each domain it reads the company's **own website** (home page plus the contact, imprint and about pages it links to) and returns:

- 📧 **emails**, each flagged as **on the company's domain** or not, and as a **role inbox** (info@, sales@) or not
- 📞 **phone numbers** in international format, validated
- 🔗 **social profiles**: LinkedIn, X (Twitter), Facebook, Instagram, YouTube, GitHub and TikTok
- 🏢 **company name, description** and postal address (when the site publishes it)
- 🧩 **detected tech**: CMS, shop platform, analytics, chat and marketing tools
- 📄 **pages checked**, with the HTTP status of each

**You only pay for domains where at least one contact was found.** Domains with no emails, phones or social profiles, and domains that fail to load, cost **$0**.

Paste domains, click **Start**, and export the results to CSV, Excel or JSON, or push them to Google Sheets, HubSpot, Make, Zapier or your own code through the Apify API.

### Why use this email finder for websites?

- **Lead generation and sales prospecting**: enrich a list of company websites with emails, phone numbers and LinkedIn pages.
- **CRM enrichment and cleanup**: fill in missing contact fields and social links for accounts you already have.
- **Partnership and PR outreach**: find the press, partner or sales inbox a company publishes.
- **Market research**: see which tools (Shopify, WordPress, HubSpot, Intercom …) a list of companies uses.

### Contacts are found, never guessed

Many "email finders" generate addresses like firstname.lastname@company.com and "verify" them. **This Actor doesn't.** Every email in the output is written on the company's website, and each one comes with the page where it was found (`foundOn`). It reads:

- `mailto:` links
- addresses hidden by Cloudflare email protection
- schema.org / JSON-LD Organization data (email, telephone, sameAs, address)
- page text, including common obfuscation such as `info [at] company (dot) com`, `kontakt(ät)firma.de` and HTML-entity-encoded addresses

Addresses are validated and de-duplicated. Image file names (`logo@2x.png`), placeholders (`name@example.com`, `your.name@company.com`) and error-tracking keys are dropped. Phone numbers come from `tel:` links, structured data and labelled text ("Tel.:", "Phone:", "Telefon:"), and are validated with Google's libphonenumber rules. Fax numbers are skipped.

### How to find contacts from a list of domains

1. Click **Try for free** and sign in to Apify.
2. Paste domains or URLs into **Domains or URLs**, one per line (up to 1,000 per run).
3. Optional: change **Pages to check per domain** (default 5).
4. Click **Start**. The **Contacts** tab shows one row per company; **All emails** shows one row per address.

### Input example

```json
{
    "domains": ["acme.com", "https://www.globex.example/de/", "initech.example"],
    "maxPagesPerDomain": 5
}
```

### Output example

One item per domain (shortened, with made-up data):

```json
{
    "domain": "acme.com",
    "url": "https://www.acme.com/",
    "companyName": "Acme Widgets Ltd",
    "description": "Widgets for every workshop.",
    "primaryEmail": "info@acme.com",
    "primaryPhone": "+44 20 7946 0018",
    "emails": [
        { "email": "info@acme.com", "sameDomain": true, "generic": true, "source": "structured-data", "foundOn": "https://www.acme.com/" },
        { "email": "sales@acme.com", "sameDomain": true, "generic": true, "source": "mailto", "foundOn": "https://www.acme.com/contact" }
    ],
    "phones": ["+44 20 7946 0018", "+44 20 7946 0991"],
    "socials": {
        "linkedin": "https://www.linkedin.com/company/acme-widgets",
        "x": "https://x.com/acmewidgets",
        "facebook": "https://www.facebook.com/acmewidgets",
        "instagram": null,
        "youtube": "https://www.youtube.com/@acmewidgets",
        "github": null,
        "tiktok": null
    },
    "address": "1 Example Street, EX1 1EX Exampleton, GB",
    "tech": ["WordPress", "HubSpot", "Cloudflare"],
    "pagesChecked": [
        { "url": "https://www.acme.com/", "type": "home", "httpStatus": 200, "note": null },
        { "url": "https://www.acme.com/contact", "type": "contact", "httpStatus": 200, "note": null }
    ],
    "contactsFound": true,
    "error": null
}
```

### How much does it cost to find company emails?

This Actor uses **pay per event**:

| Event | Price |
| --- | --- |
| Domain processed with **at least one** email, phone number or social profile | **$0.01** per domain |
| Domain with **no contacts found** | **free** |
| Domain that failed, was blocked by robots.txt or returned an error | **free** |

- 100 domains where contacts are found cost **$1**; 1,000 cost **$10**.
- The price per domain is the same whether we check 1 page or 10.
- Apify also charges a tiny standard start fee per run ($0.00005 for a normal 1 GB run).
- Apify's free plan includes $5 of monthly usage, enough for about 500 domains with contacts a month.
- Set **Maximum cost per run** in the run options and the Actor stops when it is reached.

### Tips

- Paste the exact site you want, e.g. `https://www.company.com/en/`, if the home page redirects by language.
- Filter on `sameDomain = true` to keep only the company's own addresses, and on `generic = true` for shared inboxes such as info@ or sales@.
- `pagesChecked` shows which pages were read, so you can see why a contact was or wasn't found.

### Limitations

- Only the company's own website is read. No search engines, LinkedIn scraping or third-party databases.
- Contacts that appear only in images, PDFs, contact forms or text built by JavaScript are not found.
- The Actor **respects robots.txt** and waits at least one second between requests to the same site. Sites that block automated visitors return an error row (free).
- Up to 10 pages per domain: the home page plus contact, imprint (legal notice) and about pages linked from it. If none are linked, it tries `/contact`, `/about` and, for German-speaking sites, `/impressum`.

### Is it legal to collect contact data from websites?

This Actor only reads information that companies publish on their own public websites, and it respects robots.txt. Whether you may *use* that data depends on where you and the contacts are, and on what you do with it. In the EU and UK, data about identifiable people (such as jane.doe@company.com) is personal data under the GDPR, and email marketing is also covered by ePrivacy rules. The `generic` flag helps you separate role inboxes from named people. Check your legal basis before contacting anyone. This is not legal advice.

### FAQ

#### Why is a domain marked "no contacts found"?

The pages we could read didn't contain any email, phone number or social profile link, or the contacts are only in images, forms or JavaScript. You aren't charged for that domain.

#### Do you verify that the emails can receive mail?

No. We report addresses exactly as the company publishes them. We don't send test emails or query mail servers.

#### Can I run it from my code or on a schedule?

Yes. Use the Apify API, the JavaScript or Python client, or integrations such as Make, Zapier, n8n and Google Sheets. Schedules are set up in Apify Console.

#### Why did I get `blocked-by-robots-txt` or `http-403`?

The site's robots.txt disallows crawlers, or the site blocks automated visitors. These rows are free. For 403 errors you can try the Apify datacenter proxy in **Advanced options**.

### More tools from the same developer

All pay-per-result, no proxy or login needed, built and maintained by the same developer:

**Website audits**

- [Website Accessibility Checker: WCAG 2.2 & EAA](https://apify.com/offerastudio/website-accessibility-audit): accessibility issues with fixes, SEO basics and security headers.
- [Cookie & Tracker Audit: GDPR Consent Checker](https://apify.com/offerastudio/cookie-tracker-audit): cookies and tracking tags that load before consent.
- [AI Crawler Access Checker: robots.txt & llms.txt](https://apify.com/offerastudio/ai-crawler-access-audit): which AI crawlers a site allows, plus llms.txt.
- [Website Change Monitor: Diffs, Prices & Alerts](https://apify.com/offerastudio/website-change-monitor): get a row only when a page changes, with a clean diff.

**Company data and compliance**

- [UK New Companies Feed: Companies House Daily](https://apify.com/offerastudio/uk-new-companies-feed): newly incorporated UK companies with sector filters.
- [EU VAT Number Validator: Bulk VIES Checker](https://apify.com/offerastudio/eu-vat-number-validator): bulk VAT checks with name, address and consultation number.
- [LEI Corporate Tree: GLEIF Parents & Subsidiaries](https://apify.com/offerastudio/gleif-lei-corporate-tree): LEI lookup with parents, subsidiaries and a KYC summary.

**Market signals**

- [US WARN Layoff Notices: 12 States Daily Feed](https://apify.com/offerastudio/us-warn-layoff-notices): layoff and plant closure notices from official state sources.
- [US Product Recalls Monitor: FDA & CPSC Feed](https://apify.com/offerastudio/us-product-recalls-monitor): FDA and CPSC recalls in one feed, with severity.

### Feedback

Missing a contact that is clearly on the page? Open an issue on the **Issues** tab with the domain, and we'll look at it.

# Changelog

This Actor's version history is a separate document: https://apify.com/offerastudio/company-contact-finder/changelog.md

# Actor input Schema

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

Company websites to check, one per line, up to 1,000 per run. Bare domains (acme.com), full URLs (https://www.acme.com/de/) and duplicates are all fine. Each domain becomes one row.

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

The home page plus contact, imprint (legal notice) and about pages linked from it. 5 covers most sites; lower it for faster, cheaper runs. The price per domain stays the same.

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

Usually not needed. Use Apify datacenter proxies if some sites block the default IP addresses. Residential proxies are not supported and fall back to datacenter proxies.

## Actor input object example

```json
{
  "domains": [
    "apify.com",
    "crawlee.dev"
  ],
  "maxPagesPerDomain": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `contacts` (type: `string`):

No description

## `emails` (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 = {
    "domains": [
        "apify.com",
        "crawlee.dev"
    ],
    "maxPagesPerDomain": 5,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("offerastudio/company-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 = {
    "domains": [
        "apify.com",
        "crawlee.dev",
    ],
    "maxPagesPerDomain": 5,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("offerastudio/company-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 '{
  "domains": [
    "apify.com",
    "crawlee.dev"
  ],
  "maxPagesPerDomain": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call offerastudio/company-contact-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,offerastudio/company-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/nFaX8JQhcxDnCqzrT/builds/vySW6gQ2tjE6gGfZ1/openapi.json
