# Website Contact & Tech Enricher (`voidstar17/website-contact-tech-enricher`) Actor

Enrich company websites with public emails, phones, socials, technology signals and email-domain MX checks. One company row with source URLs. Bounded crawling, robots.txt respected, predictable pricing per successful report.

- **URL**: https://apify.com/voidstar17/website-contact-tech-enricher.md
- **Developed by:** [Riccardo Vecchi](https://apify.com/voidstar17) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 company reports

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

## Website Contact & Tech Enricher

Turn company website URLs into contact records with evidence. Get one row per website with public emails, valid published phone links, social profiles, technology signals and email-domain MX checks. Designed for existing company lists from a CRM, directory or research workflow.

### What you get

- Public email addresses with exact source URLs. Addresses are never guessed.
- Primary email and phone, plus flat fields for CSV and spreadsheets.
- Social profile links with sharing links filtered out.
- 33 known HTML technology signals, including WordPress, Shopify, WooCommerce, Webflow, Next.js, analytics and support tools.
- MX domain results: mx_found, no_mx, null_mx or unknown.
- One company row even when several contact pages are checked.
- Explicit diagnostic rows for blocked or inaccessible websites.

### Quick start

Paste domains or website URLs into Company websites or domains and click Start. Export the dataset as JSON, CSV or Excel.

```json
{
  "websites": ["https://apify.com"],
  "maxPagesPerWebsite": 5,
  "checkEmailDomains": true,
  "businessEmailsOnly": false
}
```

Enable Role-based business emails only to keep addresses such as info@, sales@, support@, contact@ and contatti@. The optional startUrls field accepts Apify-style URL lists for integrations. Duplicate domains are merged.

### Pricing

$5 per 1,000 successful company reports ($0.005 each), with platform usage included. No start fee, per-page charge or paid add-on. A successful report requires at least one HTML page fetched and analyzed; it may have no contacts if none are published. Failed and robots-excluded websites return diagnostic rows without the company-enriched charge. Set your maximum charge to bound charged results.

### Output

| Field | Meaning |
| --- | --- |
| website, domain, status | Website and result status |
| primaryEmail, primaryPhone | Preferred published contact |
| emailsText, phonesText, technologiesText | Flat export fields |
| emails | Address, classification, method and sourceUrls |
| phones | Valid tel links and evidence |
| socialLinks | Profiles grouped by platform |
| technologies | Technology signals and matched evidence |
| emailDomainChecks | Domain MX results |
| pagesScanned, scannedUrls, warnings | Coverage and limitations |

The SUMMARY key-value record reports successful and failed websites and whether the charge limit stopped the run.

### How it works

The Actor checks robots.txt, reads each starting page and prioritizes same-site contact, about and legal links, with conventional contact paths as fallbacks. It uses bounded HTTP requests, without a browser, proxy configuration or external paid API. It reads ordinary HTML and decodes explicitly published \[at]/\[dot] and Cloudflare email markup.

### Limits

- JavaScript-only, CAPTCHA-protected, login-only or blocked pages are unsupported and are not bypassed.
- MX records indicate domain mail configuration, not mailbox existence or deliverability. No SMTP probe or email is sent.
- Technology detection is based on known HTML signals; it is not a complete inventory.
- Phones come from valid published tel links. Set a default country for local numbers.
- Up to 1,000 websites per run, eight attempted pages per website and approximately 45 seconds per website. Up to five sites run concurrently. Time limits can produce partial coverage.
- Respect website terms and applicable requirements for downstream use. Public availability does not grant permission for every use.

### Automation and support

Run with the Apify API or a schedule to refresh company lists. Map structured output into Make, n8n, Zapier, spreadsheets or CRM workflows. For support, open an Actor issue with a public URL, run ID and expected result. Do not post credentials or private customer data.

# Actor input Schema

## `websites` (type: `array`):

Paste company websites, one per line. Duplicate domains are merged. Only public HTTP(S) pages are supported.

## `startUrls` (type: `array`):

Optional URL-list input, compatible with other Apify workflows. You can use this instead of websites.

## `maxWebsites` (type: `integer`):

Upper limit of unique websites processed per run. At most 1,000.

## `maxPagesPerWebsite` (type: `integer`):

Includes the starting page and internal contact/about pages. Up to eight pages; price stays the same per successful company report.

## `businessEmailsOnly` (type: `boolean`):

Keep role mailboxes such as info@, sales@, support@ and contatti@. When disabled, other explicitly published addresses are included too. Addresses are never guessed.

## `checkEmailDomains` (type: `boolean`):

Check whether email domains publish mail-exchanger DNS records. This is not verification that a mailbox exists or accepts mail.

## `defaultPhoneCountry` (type: `string`):

Optional two-letter country code for local tel: links, for example IT, GB or US. International numbers work without this setting.

## `concurrency` (type: `integer`):

Process up to five different websites at once. Pages on each website are fetched sequentially.

## Actor input object example

```json
{
  "websites": [
    "https://apify.com"
  ],
  "maxWebsites": 100,
  "maxPagesPerWebsite": 5,
  "businessEmailsOnly": false,
  "checkEmailDomains": true,
  "defaultPhoneCountry": "",
  "concurrency": 3
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "websites": [
        "https://apify.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("voidstar17/website-contact-tech-enricher").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 = { "websites": ["https://apify.com"] }

# Run the Actor and wait for it to finish
run = client.actor("voidstar17/website-contact-tech-enricher").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 '{
  "websites": [
    "https://apify.com"
  ]
}' |
apify call voidstar17/website-contact-tech-enricher --silent --output-dataset

```

## MCP server setup

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

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/EZan18megP5e1Zw5c/builds/UtCJPZJ1EzLIzMtNy/openapi.json
