# Company Domain Lookup API - Firmographics from a Website (`nabeelbaghoor/company-domain-lookup-api`) Actor

Enrich a list of company domains into full profiles: name, description, logo, founded year, employee count, headquarters address, SIC and NAICS codes, social profiles, emails, phones and keywords. Pay per result. Bring your own API key.

- **URL**: https://apify.com/nabeelbaghoor/company-domain-lookup-api.md
- **Developed by:** [Nabeel Hassan](https://apify.com/nabeelbaghoor) (community)
- **Categories:** Business, Developer tools, Lead generation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$15.00 / 1,000 company results

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/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 Domain Lookup API - Firmographics from a Website

Turn a list of company domains into complete company profiles. For each domain you get the registered name, description, logo, founded year, employee count, headquarters address, SIC and NAICS industry codes, LinkedIn and social profiles, public emails and phone numbers, descriptive keywords and a global traffic rank. You pay only for the profiles you actually receive.

This actor is built for enriching a CRM or signup list from nothing but a work email domain, cleaning up lead records, qualifying inbound accounts, and any workflow where you have the website and need everything else.

### What you can do with it

- Enrich a list of signup domains or work email addresses into full company records.
- Fill in industry codes, headcount and headquarters address on an incomplete CRM export.
- Attach logos, descriptions and social links to an account list for a sales or partner directory.
- Qualify inbound leads by company size, industry and founded year before routing them.
- Pull public company emails and phone numbers alongside the firmographics.
- Export everything as JSON, CSV or Excel, or push it into your CRM or warehouse.

### Features

- Bulk enrichment: paste hundreds of domains, one per line, and get one row each.
- Flexible input: full URLs and work email addresses are accepted and reduced to the bare domain.
- Headquarters detection: the location labelled as headquarters is preferred over the first address on file.
- Industry codes split into separate SIC and NAICS code and name columns, ready for filtering.
- Social profiles flattened into LinkedIn and Twitter columns, with the follower count where available.
- Emails, phones and keywords returned as clean arrays.
- Unmatched domains are kept as placeholder rows so your output lines up with your input, and are never charged. Turn on `skipUnmatchedDomains` to drop them instead.
- Profiles that the provider is still assembling are retried automatically before the domain is given up on.
- The complete raw provider payload is kept on every record, so nothing is lost.
- Pay-per-result pricing with a hard result cap so a run can never surprise you.

### Input

| Field | Type | Description |
| --- | --- | --- |
| `domains` | array | Company domains to enrich, one per line. Required. |
| `skipUnmatchedDomains` | boolean | Drop domains with no profile instead of storing a placeholder. |
| `maxResults` | integer | Stop after this many rows (1 to 5,000). |
| `apiKey` | string | Your API key. Required, stored securely. |

### Example output

Each dataset item is one domain. Fields are populated where the provider has data, and the complete provider payload is kept under `raw`:

```json
{
  "queriedDomain": "example.com",
  "matched": true,
  "name": "Example, Inc.",
  "website": "https://www.example.com",
  "bio": "Example builds warehouse automation software for mid-market distributors.",
  "logo": "https://example.com/logo.png",
  "founded": 2010,
  "employees": 350,
  "category": "Other",
  "locale": "en",
  "location": "1755 Blake Street Suite 450 Denver CO 80202",
  "addressLine1": "1755 Blake Street",
  "city": "Denver",
  "region": "Colorado",
  "regionCode": "CO",
  "postalCode": "80202",
  "country": "United States",
  "countryCode": "USA",
  "sicCode": "737",
  "sicName": "Computer Programming, Data Processing, and Other Computer Related Services",
  "naicsCode": "5182",
  "naicsName": "Data Processing, Hosting, and Related Services",
  "linkedin": "https://www.linkedin.com/company/example",
  "twitter": "https://twitter.com/example",
  "twitterFollowers": 2873,
  "emails": ["support@example.com", "sales@example.com"],
  "phones": ["+1 (720) 555-1292"],
  "keywords": ["CRM", "Contact Management", "Developer APIs"],
  "globalTrafficRank": 40093,
  "raw": { "name": "Example, Inc." }
}
```

A domain with no profile is stored as `{ "queriedDomain": "…", "matched": false }` unless you switch `skipUnmatchedDomains` on.

### Pricing and the credit model

This actor uses pay-per-result pricing. You are charged a fixed price for each enriched profile delivered to the dataset. Domains that returned no profile are stored free of charge, and a run that matches nothing costs nothing. Set `maxResults` to cap how many rows a run can collect, and set a run spending limit as a second safety net. Your own provider plan meters its own lookups separately.

### Bring your own API key

This actor connects to a third-party company enrichment provider (FullContact) on your behalf and requires your own provider API key. Generate a key in the provider's platform; it is displayed only once, so copy it straight away. Paste it into the `apiKey` input. It is stored securely and never logged, and the actor never ships with or shares credentials.

### Frequently asked questions

#### What data does this actor return?

Company name and description, logo and website, founded year and employee count, category and locale, the headquarters address broken into street, city, region, postal code and country, SIC and NAICS industry codes with their names, LinkedIn and Twitter profiles with follower counts, public emails and phone numbers, descriptive keywords, and a global traffic rank. Every record also carries the untouched provider payload.

#### Can I look a company up by name instead of domain?

No. The provider retired company lookup by name and now supports domain lookup only, which is what this actor uses. If you have a company name, resolve it to a domain first and then enrich it here.

#### Does it accept email addresses as input?

Yes. A work email address such as `jane@example.com` is reduced to `example.com` before the lookup, so you can paste a raw signup list without cleaning it first.

#### What happens when a domain has no profile?

The domain is logged, counted, and stored as a placeholder row with `matched: false`, at no charge. Turn on `skipUnmatchedDomains` if you would rather leave those rows out of the dataset entirely.

#### How do I get an API key?

The API is a paid product. Sign in to the provider's platform, generate an API key from the main page, and copy it immediately, since it is shown only once. The same key works across the provider's enrichment endpoints.

#### How does the actor handle rate limits?

It throttles requests, honours the retry-after signal on a rate-limited response, and backs off exponentially. If the limit is still in force it stops early and keeps everything already collected rather than failing the whole run.

#### How am I charged?

You pay a fixed price per enriched profile returned to the dataset. Unmatched domains and empty runs cost nothing. Use `maxResults` and the run spending limit to control cost.

#### What output formats are available?

The dataset can be exported as JSON, CSV, Excel, HTML or RSS, or read through the API for pushing into a CRM or warehouse.

### Keyword map

company enrichment api, domain to company data, company lookup by domain, firmographic enrichment, email domain enrichment, crm data enrichment, company logo api, company description data, employee count data, sic code lookup, naics code lookup, company linkedin profile, b2b lead enrichment, signup enrichment, account enrichment, company profile api, headquarters address data, company keywords data, lead qualification data, bulk company enrichment.

# Actor input Schema

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

The company domains to enrich, one per line, e.g. `example.com`. Full URLs and work email addresses are accepted and reduced to their domain, and `www.` is stripped. Duplicates are removed.

## `skipUnmatchedDomains` (type: `boolean`):

When enabled, domains the provider has no profile for are left out of the dataset entirely. When off, they are stored as a placeholder row with `matched: false` so the output lines up with your input list. Unmatched rows are never charged either way.

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

Stop after this many rows (1-5,000). One row is one domain. You are charged only for rows that carry an enriched profile.

## `apiKey` (type: `string`):

Your own API key for the data provider. Required. It is generated in the provider's platform and shown only once, so store it somewhere safe. Stored securely here and never logged.

## Actor input object example

```json
{
  "domains": [
    "fullcontact.com"
  ],
  "skipUnmatchedDomains": false,
  "maxResults": 100
}
```

# 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": [
        "fullcontact.com"
    ],
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("nabeelbaghoor/company-domain-lookup-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": ["fullcontact.com"],
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("nabeelbaghoor/company-domain-lookup-api").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": [
    "fullcontact.com"
  ],
  "maxResults": 100
}' |
apify call nabeelbaghoor/company-domain-lookup-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=nabeelbaghoor/company-domain-lookup-api",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/B4nEdklZ4FQhHJrpt/builds/pghfJKJWMEkPg92Mp/openapi.json
