# Company Enrichment API — Domain to Full Company Profile (`ntriqpro/company-enrichment-api`) Actor

Turn a list of domains into complete company records: name, description, logo, tech stack, social profiles, public contacts and WHOIS registration. Built for lead enrichment and CRM cleanup. Domains that return nothing are never charged.

- **URL**: https://apify.com/ntriqpro/company-enrichment-api.md
- **Developed by:** [daehwan kim](https://apify.com/ntriqpro) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event + usage

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Company Enrichment API — Domain to Full Company Profile

Give it a list of domains. Get back complete company records: name, description, logo, tech stack, social profiles, public contacts and domain registration data.

Built for lead enrichment, CRM cleanup and account research.

### No data, no charge

Most enrichment actors bill you whether or not they found anything. This one doesn't.

A domain is charged **only when at least one core field comes back filled**. Dead domains, parked pages and unreachable sites cost you nothing — and they still appear in your dataset with `resolved: false` so you can see exactly what was skipped and why.

### It respects robots.txt

Before reading any company website, this actor checks that site's `robots.txt` and skips it if crawling is disallowed. Those domains are **never charged**, are marked with `robotsBlocked: true`, and still return their public WHOIS record.

You can turn the check off with `respectRobotsTxt: false` if you have your own agreement with the sites you are querying.

### Personal data is off by default

By default only role addresses are returned — `info@`, `sales@`, `support@` and similar. Addresses that name an individual (`jane.diaz@company.com`) are excluded, and the count of what was left out is reported as `personalEmailsExcluded`.

Set `includePersonalEmails: true` to receive them. Those addresses are personal data under GDPR and comparable laws, and you are responsible for having a lawful basis to process them.

### What you get per domain

| Field | Contents |
|---|---|
| `company` | Name, description, logo, language |
| `tech` | Detected technologies, each with the evidence it was found by |
| `socials` | LinkedIn, X/Twitter, Facebook, Instagram, YouTube, GitHub |
| `contacts` | Public email addresses and phone numbers |
| `registration` | Registrar, creation and expiry dates, domain age, nameservers |
| `fieldsFilled` / `confidence` | How many categories were filled, out of those you requested |
| `charged` | Whether this row was billed |

#### Technology detection tells you why

Every detected technology carries an `evidence` value:

- `resource` — found in a script or stylesheet the page actually loads
- `header` — the server itself reported it
- `meta` — the tool left its own generator tag

Detections based on a mere mention in page text are excluded by default, because a company writing "we integrate with Shopify" does not mean it runs on Shopify. That kind of guess is how enrichment data goes stale and wrong.

### Input

```json
{
  "domains": ["stripe.com", "notion.so"],
  "extractCompany": true,
  "extractTech": true,
  "extractSocials": true,
  "extractContacts": true,
  "extractRegistration": true,
  "chargeOnResultOnly": true,
  "maxConcurrency": 5
}
```

Full URLs work too — `https://stripe.com/pricing` is reduced to `stripe.com`. Duplicates and malformed entries are dropped before any work starts, so you are never billed for them.

### Output

```json
{
  "domain": "stripe.com",
  "company": {
    "name": "Stripe",
    "description": "Stripe is a financial services platform...",
    "logo": "https://stripe.com/img/v3/home/social.png",
    "language": "en"
  },
  "tech": [{ "name": "Next.js", "evidence": "resource" }],
  "socials": {
    "linkedin": "https://www.linkedin.com/company/stripe",
    "github": "https://github.com/stripe"
  },
  "contacts": { "emails": ["..."], "phones": [] },
  "registration": {
    "registrar": "SafeNames Ltd.",
    "domainAgeDays": 11292,
    "daysUntilExpiry": 395,
    "nameservers": ["..."]
  },
  "fieldsFilled": 5,
  "confidence": 1,
  "resolved": true,
  "charged": true
}
```

### Pricing

| Event | Price | When |
|---|---|---|
| `domain-resolved` | $0.03 | At least one core field filled |
| `deep-enrich` | $0.02 | Three or more categories filled |

A domain that returns nothing triggers neither event.

### Data sources

Only public information: the company's own website and public WHOIS registry records. No logins, no private data, no third-party platform scraping.

The actor identifies itself as `CompanyEnrichmentBot` when requesting pages, so sites can recognise and control it by name in their `robots.txt`.

### Disclaimer

This actor is not affiliated with, sponsored by, or endorsed by any company whose public data it returns. Company names and logos in the output belong to their respective owners and are returned solely as factual data about the domain you queried.

### Your responsibility for the sites you query

You choose which domains to submit. Some websites prohibit automated access or commercial use of their content in their own terms of service, regardless of what their `robots.txt` allows. **You are responsible for ensuring you may lawfully query the domains you submit**, and for any dispute arising from that choice.

### Your responsibility for personal data

Output may contain personal data — for example an email address that names an individual, if you enable `includePersonalEmails`. Under GDPR and comparable laws you act as the **data controller** for data you collect through this actor, which means you are responsible for having a lawful basis to collect and process it, and for handling any deletion requests. The actor excludes individual-looking addresses by default for this reason.

# Actor input Schema

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

Company domains to enrich. Accepts bare domains (stripe.com) or full URLs (https://stripe.com/pricing) — URLs are reduced to their domain.

## `extractCompany` (type: `boolean`):

Company name, description, logo and language, read from the site's own metadata.

## `extractTech` (type: `boolean`):

Detect frameworks, CMS and e-commerce platforms from the homepage (39 technologies).

## `extractSocials` (type: `boolean`):

LinkedIn, X/Twitter, Facebook, Instagram, YouTube and GitHub profile links published on the site.

## `extractContacts` (type: `boolean`):

Email addresses and phone numbers the company publishes on its own website.

## `extractRegistration` (type: `boolean`):

Registrar, creation and expiry dates, domain age and nameservers from public WHOIS records.

## `chargeOnResultOnly` (type: `boolean`):

When on, domains that return no usable data cost nothing. Leave this on unless you need a row for every input domain.

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

Skip the website of any company whose robots.txt disallows crawling. Public WHOIS data is still returned for those domains, and skipped websites are never charged.

## `includePersonalEmails` (type: `boolean`):

Off by default: only role addresses (info@, sales@, support@) are returned. Turning this on also returns addresses that name an individual, which count as personal data under GDPR and similar laws — you are responsible for having a lawful basis to process them.

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

How many domains to enrich at the same time.

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

Proxy used for fetching company websites. The default works for most sites.

## Actor input object example

```json
{
  "domains": [
    "stripe.com"
  ],
  "extractCompany": true,
  "extractTech": true,
  "extractSocials": true,
  "extractContacts": true,
  "extractRegistration": true,
  "chargeOnResultOnly": true,
  "respectRobotsTxt": true,
  "includePersonalEmails": false,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (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": [
        "stripe.com",
        "vercel.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ntriqpro/company-enrichment-api").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": [
        "stripe.com",
        "vercel.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("ntriqpro/company-enrichment-api").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": [
    "stripe.com",
    "vercel.com"
  ]
}' |
apify call ntriqpro/company-enrichment-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ntriqpro/company-enrichment-api"
        }
    }
}

```

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/46mL8p4YVybAV29qO/builds/9R3AWyblWwOn0T3d7/openapi.json
