# Website & Domain Intelligence (`itzcloud/website-intel`) Actor

Enrich company domains in bulk: public emails, phones, social profiles, tech stack (270+ technologies, a BuiltWith & Wappalyzer alternative), email provider, SPF/DMARC and domain age (RDAP/WHOIS). One row per company, no browser. $4 per 1,000 domains, only charged when data is found.

- **URL**: https://apify.com/itzcloud/website-intel.md
- **Developed by:** [Juan Orjuela](https://apify.com/itzcloud) (community)
- **Categories:** Lead generation, SEO tools, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 domain enricheds

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 & Domain Intelligence — Emails, Tech Stack & Email Provider

**Turn a list of company domains into sales-ready rows.** For every domain you get public emails, phone numbers, social profiles, the full tech stack (270+ technologies), the email provider behind the domain (Google Workspace, Microsoft 365…), SPF/DMARC health and the domain age, all in **one row per company**.

> **All-in-one domain & tech stack enrichment for lead generation. It replaces 3 separate actors** (contact scraper + tech stack detector + DNS/WHOIS lookup) with a single run and a single price.

- ⚡ **Fast and lightweight.** It sends plain HTTP requests, no headless browser. About 100 domains in 10-20 seconds.
- 💸 **$4 per 1,000 domains**, and **you only pay for domains that return data.** Dead or non-existent domains are free.
- 🧩 **Modular.** Turn off what you don't need. The data you keep is identical.
- 🛡️ **Robust.** A slow or blocked website never stops the run. The error is classified, and you still get the DNS and registration data.

***

### What data do you get?

| Group | Fields |
|---|---|
| **Company** | `companyName`, `title`, `description`, `language`, `ogImage`, `favicon`, `url` |
| **Contacts** | `primaryEmail` (the best generic address on the company's own domain, e.g. `sales@` or `info@`), `emails` (up to 20), `phones` (up to 5, E.164 format), `socials` (LinkedIn, Facebook, Instagram, X, YouTube, TikTok, GitHub, Pinterest) |
| **Tech stack** | `technologies` plus `techByCategory`: CMS, e-commerce, analytics, tag managers, A/B testing, **ad pixels** (Meta, LinkedIn, Google Ads, TikTok…), **marketing automation & CRM** (HubSpot, Marketo, Pardot, Salesforce…), **B2B intent tools** (6sense, Clearbit, ZoomInfo…), live chat, payments, consent, hosting/CDN, **ATS / hiring signals** and more |
| **Email & DNS** | `emailProvider`, `emailSecurityGateway` (Mimecast, Proofpoint…), `emailSendingServices` (from SPF: SendGrid, Mailchimp, HubSpot, Salesforce…), `mxRecords`, `spf` (valid, `-all`/`~all`, DNS lookup count, issues), `dmarc` (policy, pct, reporting addresses) |
| **Domain** | `domainRegisteredAt`, `domainAgeYears`, `domainExpiresAt`, `registrar` (from the official RDAP registry) |
| **Status** | `websiteOk`, `httpStatus`, `errorType` (`timeout`, `dns`, `tls`, `http`, `connection`, `not_html`), `hasData` (charged or not) |

### Use cases

- **Cold outreach.** Find a generic company email and the social profiles for every account on your list. The email provider tells you whether you're writing to a Google Workspace or a Microsoft 365 inbox.
- **Sales ops & CRM enrichment.** Enrich accounts with tech stack, company name and domain age before they reach your reps.
- **Lead scoring & segmentation.** Target companies that run Shopify, HubSpot or Salesforce. Spot ad pixels (a signal that they spend on marketing), B2B intent tools and ATS platforms (a signal that they're hiring).
- **Competitor & market analysis.** See which CMS, analytics and chat tools a whole market uses.
- **Email deliverability audits.** Bulk-check SPF and DMARC configuration and the email-sending services a domain authorizes.

### How to use it

1. Paste your domains into **Domains or website URLs**, or paste a whole spreadsheet column into **Bulk paste**. URLs such as `https://www.acme.com/pricing` are fine, and duplicates are removed.
2. Optional: turn off the data modules you don't need, or set **Max domains to process**.
3. Click **Start**, then export the results as CSV, Excel or JSON, or use them via API, webhooks, Make, Zapier or Google Sheets.

#### Input example

```json
{
  "domains": ["yoast.com", "basecamp.com", "https://www.hubspot.com/pricing"],
  "includeContacts": true,
  "includeTechnologies": true,
  "includeMetadata": true,
  "includeDns": true,
  "includeDomainAge": true,
  "maxPagesPerDomain": 3
}
```

You can also send `startUrls` (`[{ "url": "https://acme.com" }]`), so this actor chains directly after other Apify actors.

#### Output example (a real result)

```json
{
  "domain": "yoast.com",
  "url": "https://yoast.com/",
  "websiteOk": true,
  "hasData": true,
  "companyName": "Yoast",
  "title": "SEO for everyone • Yoast",
  "language": "en",
  "primaryEmail": "support@yoast.com",
  "emails": ["support@yoast.com"],
  "phones": ["+31248200337"],
  "socials": {
    "facebook": "https://www.facebook.com/yoast",
    "instagram": "https://www.instagram.com/yoast",
    "linkedin": "https://www.linkedin.com/company/yoast-com"
  },
  "technologies": ["WordPress", "WooCommerce", "jQuery", "Bootstrap", "Google Tag Manager", "Convert", "ActiveCampaign", "Cloudflare", "Trustpilot", "Wistia", "Google Fonts"],
  "techByCategory": {
    "cms": ["WordPress"],
    "ecommerce": ["WooCommerce"],
    "marketing-automation": ["ActiveCampaign"],
    "ab-testing": ["Convert"],
    "hosting-cdn": ["Cloudflare"]
  },
  "emailProvider": "Microsoft 365",
  "emailSendingServices": ["Google Workspace", "Postmark", "Help Scout", "ActiveCampaign", "Microsoft 365"],
  "mxRecords": ["yoast-com.mail.protection.outlook.com"],
  "spf": { "valid": true, "allQualifier": "-", "lookups": 5, "issues": [] },
  "dmarc": { "valid": true, "policy": "quarantine", "pct": 100 },
  "domainRegisteredAt": "2000-03-22T14:33:55.000Z",
  "domainAgeYears": 26.4,
  "registrar": "NameCheap, Inc."
}
```

The **Output** tab has ready-made table views: *Overview*, *Contacts*, *Tech stack*, *Email & DNS* and *Unreachable websites*.

### Pricing

This actor uses **pay-per-event** pricing. Platform usage is included, so you won't see extra compute charges.

| Event | Price |
|---|---|
| Domain enriched (a row with data) | **$0.004** ($4 per 1,000 domains) |
| Domain with no data at all (doesn't exist, no DNS, no website) | **Free** |
| Run start | Apify's standard start fee (a fraction of a cent per run) |

| Domains | Cost |
|---|---|
| 100 | $0.40 |
| 1,000 | $4 |
| 10,000 | $40 |

Tip: set **Max cost per run** in the run options. The actor stops cleanly at your budget and keeps everything it has already delivered.

### Performance

Measured on Apify with 100 real company domains and every module enabled:

| Memory | Time for 100 domains | Websites reached |
|---|---|---|
| **512 MB (default)** | **10-20 s** | 91% |
| 256 MB (minimum) | 30-45 s | 86% |

Concurrency adjusts automatically to the memory you choose. For the fastest runs, keep 512 MB and turn off modules you don't need. With `maxPagesPerDomain: 1` only the homepage is scanned.

### FAQ

**Does it use a browser?**
No. It reads the raw HTML over HTTP, queries DNS directly and calls the official RDAP registry. That's why it's fast and cheap.

**Why do some websites return `http` 403 or `timeout`?**
Some large brands block automated traffic. The row still includes the DNS/email-provider and domain-age data when they're available, and it's only charged if it contains data.

**Why are some emails or phones missing?**
The actor only returns what companies publish on their homepage and contact/about pages. Large enterprises often hide contacts behind forms, while small and mid-size businesses usually publish them. Demo and placeholder addresses (for example `you@company.com`, `ana@tuempresa.com`, `noreply@`) are filtered out.

**Which pages are scanned?**
The homepage plus up to 2 pages that look like contact, about or legal pages on the same domain. Each page is capped at 1 MB.

**How is the tech stack detected?**
With 270+ hand-written fingerprints that match script URLs, HTML attributes, HTTP headers, cookies and the `generator` meta tag. Mentions in visible text and links to comparison pages don't count, so there are fewer false positives.

**Is this legal?**
The actor only collects publicly available information from company websites, public DNS records and the RDAP registry. It doesn't log in anywhere and doesn't bypass access controls. You are responsible for using the data in line with the laws that apply to you (e.g. GDPR or CAN-SPAM for outreach).

### Integrations

Use the results in Google Sheets, HubSpot, Salesforce, Airtable, Make, Zapier, n8n, or anywhere else through the [Apify API](https://docs.apify.com/api/v2) and webhooks.

### More tools from the same developer

- **[Shopify Store Intelligence](https://apify.com/itzcloud/shopify-intel)**: theme, installed apps, product count, price range, markets and contacts for any Shopify store. Great after this actor detects `Shopify` in `technologies`.
- **[Email Domain Health & Deliverability Checker](https://apify.com/itzcloud/email-health)**: SPF (recursive lookups), DKIM, DMARC, MTA-STS, BIMI and blocklists with a 0-100 deliverability score.

# Actor input Schema

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

Company domains or URLs, one per line (e.g. <code>stripe.com</code> or <code>https://www.stripe.com/pricing</code>). Duplicates of the same domain are processed once.

## `domainsText` (type: `string`):

Paste a whole column from a spreadsheet. Domains can be separated by new lines, commas, semicolons or spaces. Combined with the list above.

## `includeContacts` (type: `boolean`):

Scans the homepage plus up to 2 contact/about pages.

## `includeTechnologies` (type: `boolean`):

CMS, e-commerce platform, analytics, ad pixels, CRM and marketing automation, live chat, payments, hosting/CDN and more.

## `includeMetadata` (type: `boolean`):

Company name, page title, description, language, OpenGraph image and favicon.

## `includeDns` (type: `boolean`):

Email provider (Google Workspace, Microsoft 365…), security gateway, email-sending services found in SPF, and SPF/DMARC health. Works even when the website is down.

## `includeDomainAge` (type: `boolean`):

Registration date, age in years, expiration date and registrar from the official RDAP registry. Some country TLDs don't publish RDAP.

## `maxResults` (type: `integer`):

Process only the first N unique domains. 0 = no limit.

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

Homepage plus up to 2 contact/about pages. Set to 1 for maximum speed.

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

How many domains are processed in parallel. Leave empty for automatic (scales with the run memory: 512 MB → 25).

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

Maximum time for each page request. Slow websites are reported with errorType "timeout".

## Actor input object example

```json
{
  "domains": [
    "apify.com",
    "basecamp.com",
    "hubspot.com"
  ],
  "includeContacts": true,
  "includeTechnologies": true,
  "includeMetadata": true,
  "includeDns": true,
  "includeDomainAge": true,
  "maxResults": 0,
  "maxPagesPerDomain": 3,
  "requestTimeoutSecs": 12
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

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

No description

## `techStack` (type: `string`):

No description

## `emailDns` (type: `string`):

No description

## `allFields` (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",
        "basecamp.com",
        "hubspot.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("itzcloud/website-intel").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",
        "basecamp.com",
        "hubspot.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("itzcloud/website-intel").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",
    "basecamp.com",
    "hubspot.com"
  ]
}' |
apify call itzcloud/website-intel --silent --output-dataset

```

## MCP server setup

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

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/Rm0Z7MQNMj6PANJjx/builds/GLn4ttqcUm4iogilC/openapi.json
