# Company Domain Finder, Tech Stack and MX/DNS Enricher (`xenikii/company-domain-tech-stack-enricher`) Actor

Company domain finder and Wappalyzer alternative: resolve domains and enrich tech stack, MX/SPF/DMARC, GTM signals, and role contacts.

- **URL**: https://apify.com/xenikii/company-domain-tech-stack-enricher.md
- **Developed by:** [Xenikii](https://apify.com/xenikii) (community)
- **Categories:** Lead generation, Business, Integrations
- **Security:** Limited permissions
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $2.50 / 1,000 enriched domains

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

## Company Domain Finder, Tech Stack and MX/DNS Enricher

Resolve raw company names into verified official domains with confidence scores, and enrich any B2B domain with a **12-category tech stack**, **MX / SPF / DMARC email posture**, **DNS & cloud hosting providers**, **GTM signals** (`hasPricing`, `hasCareers`, `hasDocs`, languages), and **published corporate role contacts** — in one fast HTTP + DNS pass.

Built as a pay-as-you-go **Wappalyzer and BuiltWith alternative** for **Clay**, **n8n**, **Make**, CRM enrichment, and AI outbound agents.

### How It Compares to Wappalyzer & BuiltWith

| Capability | This Actor (`xenikii`) | Wappalyzer API | BuiltWith API |
| :--- | :--- | :--- | :--- |
| **Company Name → Official Domain Resolution** | Built-in (`confidenceScore` + country hint) | Separate / limited | Domain input required |
| **12-Category Live Tech Stack** | Live HTTP, CSP, JS/CSS bundles & DNS `TXT` | Cached crawl + live | Cached historical crawl |
| **Email Security & Provider (`MX`, `SPF`, `DMARC`)** | Included (`Google Workspace`, `M365`, `Proofpoint`, etc.) | Partial | Separate tier |
| **B2B GTM Signals (`hasPricing`, `hasCareers`, `hasDocs`)** | Included | No | No |
| **Published Role Contacts & Social Links** | Included (Cloudflare `cfemail` decoded, zero PII) | Add-on credits | Separate product |
| **Entry Pricing** | **`$2.50 / 1,000` enriched domains** (no subscription) | Monthly seat/credit plan | High monthly plan |

### Who Is This For?

- **Clay, n8n & Make Builders:** Turn messy CRM company names (`"Doctolib | FR"`, `"Atlassian"`) into verified domains, tech stacks, and email infrastructure inside a single webhook/HTTP step.
- **B2B Outbound & RevOps Teams:** Segment accounts by installed tools (`HubSpot`, `Salesforce`, `Marketo`, `Stripe`, `6sense`, `Intercom`, `OpenAI`), self-serve motion (`hasPricing`), active hiring (`hasCareers`), or email gateway (`Google Workspace` vs `Microsoft 365` vs `Proofpoint`).
- **Cybersecurity & MSP Agencies:** Audit prospect `SPF` and `DMARC` (`none` / `quarantine` / `reject`) posture alongside DNS and CDN providers at scale.

### Input

Mix bare company names, country-hinted names (`Company | ISO`), domains, and URLs in the same batch:

```json
{
  "companies": ["Atlassian", "Doctolib | FR", "Shopify", "linear.app"],
  "minConfidence": 0.65,
  "enableTechAndContacts": true,
  "enableDnsAndEmail": true
}
```

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `companies` *(required)* | `string[]` | `["Shopify", "Atlassian", ...]` | Company names (`"ASML"`, `"Doctolib \| FR"`) or domains/URLs (`"linear.app"`, `"https://cal.com"`). |
| `defaultCountry` | `string` | `""` | Optional 2-letter ISO code (`US`, `DE`, `NL`, `FR`, `JP`) prioritized when resolving company names without an inline country hint. |
| `minConfidence` | `number` | `0.65` | Minimum score (`0.1–1.0`) to accept a resolved domain. Lower-scoring matches return `unresolved` at `$0`. |
| `enableTechAndContacts` | `boolean` | `true` | Extract company profile, GTM signals, 12-category tech stack, social links, corporate phones, and role emails. |
| `enableDnsAndEmail` | `boolean` | `true` | Query DNS (`A`, `CNAME`, `MX`, `NS`, `TXT`, `SPF`, `DMARC`, `PTR`) and RDAP for email, DNS, and hosting providers. |
| `respectRobotsTxt` | `boolean` | `true` | Check `robots.txt` before fetching a target homepage. |
| `concurrency` | `integer` | `15` | Parallel workers (`1–50`). |
| `serperApiKey` / `braveApiKey` | `string` | `""` | Optional search API keys (BYOK) for local SMBs whose domain does not match their name and is not in Wikidata/GLEIF. |

### Output

Each item is written to the default **Dataset** (`JSON`, `CSV`, `Excel`, `Parquet`), and run totals are saved to `SUMMARY` in the default **Key-Value Store**. Below is an untouched live output record for `"Atlassian"`:

```json
{
  "input": "Atlassian",
  "inputType": "company_name",
  "status": "enriched",
  "companyName": "Atlassian",
  "domain": "atlassian.com",
  "websiteUrl": "https://www.atlassian.com/",
  "confidenceScore": 0.99,
  "resolutionMethod": "wikidata_verified",
  "description": "Atlassian unites every team with Jira, Confluence, Loom, and Rovo AI agents; one connected platform for planning, tracking, and delivering work.",
  "logoUrl": "https://dam-cdn.atl.orangelogic.com/CDNLink/AT12ESY0.png",
  "country": "US",
  "foundedYear": 2002,
  "emailProvider": "Proofpoint",
  "hasMx": true,
  "hasSpf": true,
  "dmarcPolicy": "reject",
  "dnsProvider": "AWS Route 53",
  "hostingProvider": "AWS CloudFront",
  "technologies": [
    "AWS CloudFront",
    "Intercom",
    "Marketo",
    "Google Analytics 4",
    "Google Tag Manager",
    "Microsoft Clarity",
    "Meta Pixel",
    "6sense",
    "Sentry",
    "OneTrust",
    "Contentful",
    "Algolia",
    "HubSpot",
    "Amazon SES",
    "Stripe",
    "Atlassian",
    "Notion",
    "DocuSign",
    "Zoom",
    "Miro",
    "Canva",
    "Postman",
    "MongoDB Atlas",
    "OpenAI",
    "Anthropic"
  ],
  "techByCategory": {
    "cdn_hosting": [
      "AWS CloudFront"
    ],
    "chat_support": [
      "Intercom"
    ],
    "marketing_automation": [
      "Marketo",
      "Amazon SES"
    ],
    "analytics": [
      "Google Analytics 4",
      "Google Tag Manager",
      "Microsoft Clarity"
    ],
    "ads_pixels": [
      "Meta Pixel",
      "6sense"
    ],
    "security_auth": [
      "Sentry",
      "OneTrust"
    ],
    "cms": [
      "Contentful"
    ],
    "saas_tools": [
      "Algolia",
      "Atlassian",
      "Notion",
      "DocuSign",
      "Zoom",
      "Miro",
      "Canva",
      "Postman",
      "MongoDB Atlas",
      "OpenAI",
      "Anthropic"
    ],
    "crm": [
      "HubSpot"
    ],
    "payments": [
      "Stripe"
    ]
  },
  "genericEmails": [
    "press@atlassian.com"
  ],
  "phones": [
    "+14157011110"
  ],
  "socialLinks": {
    "linkedin": "https://www.linkedin.com/company/atlassian",
    "x": "https://x.com/atlassian",
    "facebook": "https://www.facebook.com/Atlassian",
    "youtube": "https://www.youtube.com/user/GoAtlassian",
    "github": "https://github.com/atlassian",
    "instagram": "https://www.instagram.com/atlassian"
  },
  "gtmSignals": {
    "hasPricing": true,
    "hasCareers": true,
    "hasDocs": true,
    "languages": [
      "en",
      "ja",
      "fr",
      "de",
      "es",
      "pt",
      "zh",
      "ko",
      "ru",
      "pl",
      "it",
      "nl"
    ]
  },
  "error": null,
  "processedAt": "2026-11-04T09:20:54.527Z"
}
```

### Pricing (Pay Per Event)

Unresolved company names, invalid inputs, and dead domains cost **`$0`**. No residential proxies or headless browsers are required.

| Event | Title | Price | Charged When |
| :--- | :--- | :--- | :--- |
| `actor-start` | Actor start | `$0.0005` | Once per run |
| `domain-resolved` | Resolved domain | `$0.0015` (`$1.50 / 1,000`) | A `company_name` input resolves with `confidenceScore >= minConfidence` (`$0` if input is already a domain) |
| `domain-enriched` | Enriched domain | `$0.0025` (`$2.50 / 1,000`) | Live DNS or HTTP profile, tech stack, GTM signal, or contact data is extracted |

- **1,000 domains enriched:** `$2.50` total (`~2,000` domains/month covered by Apify's `$5` Free plan credit).
- **1,000 company names resolved + enriched (85% match rate):** `$3.40` total.
- Respects Apify's **Maximum total charge** cap and exits cleanly when reached.

### API, Clay, n8n & MCP Integration

```bash
curl -X POST "https://api.apify.com/v2/acts/xenikii~company-domain-tech-stack-enricher/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"companies": ["Atlassian", "Doctolib | FR", "linear.app"]}'
```

- **Clay / n8n / Make:** Call `run-sync-get-dataset-items` (or the native Apify node) with `["{{Company Name}} | {{Country}}"]`.
- **MCP (`mcp.apify.com`):** Works out of the box in Claude Desktop, Cursor, and OpenAI/LangGraph agents as `xenikii/company-domain-tech-stack-enricher`.

### FAQ & Data Compliance

- **How does tech detection catch tools hidden behind tag managers or SSR?** Besides DOM `<script>` tags and HTTP headers/cookies, the Actor inspects `Content-Security-Policy` allowlists, preloaded JS/CSS entry bundles, outbound SaaS/ATS links (`Ashby`, `Greenhouse`, `Calendly`), and DNS `TXT`/`SPF`/`DMARC` verification tokens (`HubSpot`, `Marketo`, `Stripe`, `OpenAI`, `Anthropic`, `6sense`).
- **Does it fabricate or guess `info@` emails?** Never. If a company publishes no contact emails on its homepage, contact/impressum subpages, `security.txt`, or DMARC records, `genericEmails` returns `[]`.
- **GDPR & Privacy Compliance:** This Actor processes **publicly published corporate metadata and infrastructure records only**. Personal employee emails (`first.last@`) and personal social profiles (`/in/...`) are filtered out in memory and never stored, keeping B2B enrichment aligned with GDPR data-minimization principles.

### Other B2B Intelligence Actors

Combine these Actors in **Clay**, **n8n**, **Make**, or **MCP** to build a complete B2B signal and SEO stack:

| Actor | Best For | Pricing |
| :--- | :--- | :--- |
| **[Company Domain, Tech Stack & MX/DNS Enricher](https://apify.com/xenikii/company-domain-tech-stack-enricher)** *(This Actor)* | Resolve company names to domains, 12-category tech stacks, MX/SPF/DMARC & role contacts | `$2.50 / 1k` enriched domains |
| **[B2B Hiring Signals & Multi-ATS Job Scraper](https://apify.com/xenikii/company-career-ats-job-scraper)** | Extract hiring velocity, salary transparency & open roles across 7 ATS platforms | `$1.50 / 1k` job postings |
| **[Google Ads Transparency & Ad Library Scraper](https://apify.com/xenikii/google-ads-transparency-scraper)** | Spy on active Google Search, Display & YouTube creatives, days active & EU reach | `$1.80 / 1k` ad creatives |
| **[Broken Link, Sitemap & AI SEO (`llms.txt`) Auditor](https://apify.com/xenikii/broken-link-sitemap-llms-txt-auditor)** | Audit broken links, XML sitemaps, `GPTBot`/`ClaudeBot` rules & generate `llms.txt` | `$3.00 / 1k` audited websites |
| **[Google Trends Breakout & Comparison Scraper](https://apify.com/xenikii/google-trends-scraper)** | Track `+5,000%` breakout queries, multi-keyword share of search & live news trends | `$2.50 / 1k` keyword trend reports |

# Actor input Schema

## `companies` (type: `array`):

List of company names (e.g. 'Stripe', 'Shopify | CA') or domains/URLs (e.g. 'linear.app', 'https://cal.com'). Append '| ISO_COUNTRY' (e.g. 'Doctolib | FR') to hint country for name resolution.

## `defaultCountry` (type: `string`):

Optional 2-letter ISO country code (e.g. US, GB, DE, NL, FR) used to prioritize country TLDs when resolving company names.

## `minConfidence` (type: `number`):

Minimum verification score required to accept a resolved domain for a company name. Candidates below this threshold return unresolved without charging domain-resolved.

## `enableTechAndContacts` (type: `boolean`):

Analyze HTML, Schema.org, CSP headers, entry JS/CSS bundles, and scored contact links to extract company profile, GTM signals, 12-category tech stack, social channels, phones, and de-obfuscated corporate role emails.

## `enableDnsAndEmail` (type: `boolean`):

Inspect DNS records to identify email provider (Google Workspace, Microsoft 365, Zoho, Proofpoint, etc.), SPF/DMARC posture, and DNS/CDN infrastructure.

## `respectRobotsTxt` (type: `boolean`):

Check robots.txt before fetching a domain homepage.

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

Number of companies/domains processed in parallel.

## `serperApiKey` (type: `string`):

Optional Serper.dev API key to improve recall on obscure local business names whose domains do not match their name slug.

## `braveApiKey` (type: `string`):

Optional Brave Search API key used as fallback for hard-to-guess company names.

## Actor input object example

```json
{
  "companies": [
    "Shopify",
    "Atlassian",
    "Oatly",
    "linear.app"
  ],
  "minConfidence": 0.65,
  "enableTechAndContacts": true,
  "enableDnsAndEmail": true,
  "respectRobotsTxt": true,
  "concurrency": 15
}
```

# Actor output Schema

## `results` (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 = {
    "companies": [
        "Shopify",
        "Atlassian",
        "Oatly",
        "linear.app"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("xenikii/company-domain-tech-stack-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 = { "companies": [
        "Shopify",
        "Atlassian",
        "Oatly",
        "linear.app",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("xenikii/company-domain-tech-stack-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 '{
  "companies": [
    "Shopify",
    "Atlassian",
    "Oatly",
    "linear.app"
  ]
}' |
apify call xenikii/company-domain-tech-stack-enricher --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,xenikii/company-domain-tech-stack-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/7oglaUCtSHY2TpYFi/builds/OtlGUKxZGTcgkxhpX/openapi.json
