# Company Information API - Domain Lookup and Search (`nabeelbaghoor/company-information-api`) Actor

Turn a list of domains, work emails or company names into full company records, or discover companies by industry, size, revenue, location and business type. Pay per result. Bring your own API key.

- **URL**: https://apify.com/nabeelbaghoor/company-information-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

$10.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 Information API - Domain Lookup and Search

Turn a list of domains, work email addresses or company names into full company records, or discover new companies from filters. Lookup mode enriches what you already have. Search mode finds what you do not: filter by industry, SIC and NAICS code, employee band, revenue band, country, state, city, world region and business type. You pay only for the companies actually matched and returned.

This actor is built for enriching a CRM or signup list with firmographics, building target account lists, and cleaning up a spreadsheet of domains into something a sales team can use.

### What you can do with it

- Enrich a list of domains or work email addresses into full company records.
- Turn a column of company names into domains, logos and firmographics.
- Build a target account list by industry, headcount band, revenue band and country.
- Segment by business type: private, public, subsidiary, government, education or non profit.
- Pull social profiles and identifiers for every account, including LinkedIn, Crunchbase and stock ticker.
- Export everything as JSON, CSV or Excel, or push it into a CRM or warehouse.

### Features

- Two modes in one actor: bulk lookup for a list you already have, and filtered search for discovery.
- Lookup accepts domains, full URLs and work email addresses, reducing an address such as jane@example.com to its domain automatically.
- A value the provider cannot match is stored as a row with `matched: false` and is never charged, so a lookup list keeps its shape and you can see exactly what failed.
- `skipUnmatched` drops those rows entirely when you would rather have a clean file.
- Every documented search filter is a real input field, with region and business type as proper dropdowns.
- Search pagination follows the provider's own next-page pointer, and treats a short page as the end rather than guessing.
- Duplicate companies are removed across pages and across lookup values, keyed on domain then id then name, before anything is charged.
- Remaining provider credits are read from every response and reported at the end of the run.
- The untouched provider payload is kept under `raw`, so nothing is lost.
- Rate limits are handled with retry-after aware backoff, and a run that hits a limit keeps everything already collected.
- Pay-per-result pricing with a hard result cap so a run can never surprise you.

### Input

| Field | Type | Description |
| --- | --- | --- |
| `mode` | string | `lookup` to enrich a list, `search` to discover by filters. |
| `domains` | array | Lookup: domains, URLs or work email addresses. |
| `companyNames` | array | Lookup: company names to resolve. |
| `companyIds` | array | Lookup: the provider's own company ids. |
| `searchText` | string | Search: free text across the company record. |
| `companyNameFilter` | string | Search: company name contains this text. |
| `searchDomains` | array | Search: restrict to these domains. |
| `industries` / `industryIds` | array | Search: industry names or ids. |
| `sicCodes` / `naicsCodes` | array | Search: classification codes. |
| `employees` / `revenues` | array | Search: employee and revenue bands. |
| `countries` / `states` / `cities` / `regions` | array | Search: location filters. |
| `businessTypes` | array | Education, government, non profit, public, private, subsidiary. |
| `excludeEu` | boolean | Leave out companies based in the European Union. |
| `rawFilters` | object | Any extra search filter, merged last. |
| `skipUnmatched` | boolean | Drop unmatched lookup rows instead of keeping them. |
| `maxResults` | integer | Stop after this many companies (1 to 20,000). |
| `pageSize` | integer | Search: companies per API call (1 to 100). |
| `apiKey` | string | Your API key. Required, stored securely. |

Lookup mode needs at least one domain, name or id. Search mode needs at least one filter.

### Example output

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

```json
{
  "id": "1234567",
  "name": "Example Analytics",
  "domain": "example.com",
  "website": "https://example.com",
  "description": "Example Analytics builds revenue forecasting software for subscription businesses.",
  "industry": "Computer Software",
  "sicCode": "7372",
  "sicDescription": "Prepackaged Software",
  "naicsCode": "541511",
  "naicsDescription": "Custom Computer Programming Services",
  "employees": 310,
  "revenue": 44000000,
  "yearFounded": 2013,
  "type": "private",
  "ticker": null,
  "exchange": null,
  "phoneNumber": "+1 617-555-0188",
  "faxNumber": null,
  "address": "88 Example Avenue",
  "city": "Boston",
  "state": "MA",
  "zip": "02110",
  "county": "Suffolk",
  "country": "United States",
  "logo": "https://logo.uplead.com/example.com",
  "linkedinUrl": "https://www.linkedin.com/company/example-analytics",
  "twitterUrl": "https://twitter.com/exampleanalytics",
  "facebookUrl": null,
  "youtubeUrl": null,
  "instagramUrl": null,
  "crunchbaseUrl": "https://www.crunchbase.com/organization/example-analytics",
  "yelpUrl": null,
  "alexaRank": 184052,
  "matched": true,
  "requestedValue": "example.com",
  "raw": { "company_name": "Example Analytics", "domain": "example.com" }
}
```

### Pricing and the credit model

This actor uses pay-per-result pricing. You are charged a fixed price for each matched company delivered to the dataset, after duplicates are removed. Unmatched lookups and empty runs cost 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 credits separately, and the actor logs how many you have left at the end of each run.

### Bring your own API key

This actor connects to a third-party B2B company data provider (UpLead) on your behalf and requires your own provider API key. Create a key in your provider account settings and 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, domain and website, description, industry with SIC and NAICS codes and descriptions, employee count, annual revenue, year founded, business type, stock ticker and exchange, phone and fax, the full postal address broken into street, city, state, zip, county and country, logo, and social and reference profiles including LinkedIn, Twitter, Facebook, YouTube, Instagram, Crunchbase and Yelp, plus the global website rank. Every record also carries the untouched provider payload.

#### What is the difference between lookup and search?

Lookup takes identifiers you already have, one company per domain, work email address, company name or provider id, and is the right mode for enriching a CRM export or a signup list. Search takes filters and pages through everything that matches, and is the right mode for building a new target account list.

#### Can I look a company up from an email address?

Yes. Put the address in `domains` and the actor reduces jane@example.com to example.com before calling the provider. Full URLs with a scheme and path are reduced the same way.

#### What happens when a company cannot be matched?

The row is still written, with `matched` set to false and `requestedValue` holding what you asked for, and it is not charged. That keeps a lookup file aligned with its input. Turn on `skipUnmatched` if you would rather those rows were dropped.

#### Is a domain or a company name the better lookup key?

A domain, every time. Domains are unique and already normalised, whereas a company name can be ambiguous, abbreviated or shared across unrelated businesses. Use names only where you have no domain.

#### How do employee and revenue bands work?

They are band labels from the provider rather than free numbers, so a filter takes a value such as `201-500` rather than a minimum and maximum. Pass several bands to widen the range. The returned `employees` and `revenue` fields are kept as numbers when the provider sends numbers and as the band text when it sends a label.

#### How does search pagination work?

The provider returns a meta block with the total, the current page and a next-page pointer. The actor follows that pointer, stops when there is no next page, and treats a page shorter than requested as the end rather than guessing at another call.

#### How do I know how many provider credits I have left?

Every response carries the remaining credit balance, and the actor logs it when the run finishes. Charging on the actor side and credit consumption on the provider side are separate meters, so watch both.

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

It throttles requests, honours the retry-after signal on a rate-limited response, and backs off exponentially. A response saying the account is out of credits stops the run early and keeps everything already collected.

#### How am I charged?

You pay a fixed price per matched company returned to the dataset. Duplicates and unmatched lookups are not charged 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 information api, company data api, domain to company api, company enrichment api, b2b company database api, email to company lookup, company name to domain, firmographic data api, sic naics code lookup, company revenue data api, employee count data api, company logo api, linkedin company url lookup, target account list builder, crm data enrichment, b2b prospecting data, company search by industry, bulk domain enrichment, account based marketing data, company technographics and firmographics.

# Actor input Schema

## `mode` (type: `string`):

Lookup enriches a list of domains, work email addresses or company names you already have. Search discovers new companies from filters.

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

Lookup mode. Company domains, full URLs or work email addresses. An email address is reduced to its domain automatically.

## `companyNames` (type: `array`):

Lookup mode. Company names to resolve. A domain is a more reliable match than a name, so prefer domains where you have them.

## `companyIds` (type: `array`):

Lookup mode. The provider's own company identifiers, if you already hold them.

## `searchText` (type: `string`):

Search mode. Free text matched across the company record.

## `companyNameFilter` (type: `string`):

Search mode. Restrict matches to company names containing this text.

## `searchDomains` (type: `array`):

Search mode. Restrict the search to these company domains.

## `industries` (type: `array`):

Industry names to include.

## `industryIds` (type: `array`):

Industry identifiers, for an exact alternative to industry names.

## `sicCodes` (type: `array`):

SIC classification codes to include.

## `naicsCodes` (type: `array`):

NAICS classification codes to include.

## `employees` (type: `array`):

Employee count bands as the provider labels them, for example 11-50 or 201-500.

## `revenues` (type: `array`):

Annual revenue bands as the provider labels them.

## `countries` (type: `array`):

Countries to include.

## `states` (type: `array`):

States or provinces to include.

## `cities` (type: `array`):

Cities to include.

## `regions` (type: `array`):

Broad world regions to include.

## `businessTypes` (type: `array`):

Restrict matches to these kinds of organisation.

## `excludeEu` (type: `boolean`):

Leave out companies based in the European Union.

## `rawFilters` (type: `object`):

Any additional search filter, merged over the ones above. Use this for a filter the provider adds after this actor was published.

## `skipUnmatched` (type: `boolean`):

Lookup mode. By default a value the provider cannot match is still stored as a row with matched set to false, and is never charged. Turn this on to drop those rows entirely.

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

Stop after this many company records (1 to 20,000). You are charged per matched result returned.

## `pageSize` (type: `integer`):

Search mode. How many companies to request per API call (1 to 100).

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

Your own API key for the data provider. Required. Found in your provider account settings. Stored securely and never logged.

## Actor input object example

```json
{
  "mode": "lookup",
  "excludeEu": false,
  "rawFilters": {},
  "skipUnmatched": false,
  "maxResults": 100,
  "pageSize": 50
}
```

# 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 = {
    "rawFilters": {},
    "maxResults": 100,
    "pageSize": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("nabeelbaghoor/company-information-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 = {
    "rawFilters": {},
    "maxResults": 100,
    "pageSize": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("nabeelbaghoor/company-information-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 '{
  "rawFilters": {},
  "maxResults": 100,
  "pageSize": 50
}' |
apify call nabeelbaghoor/company-information-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nabeelbaghoor/company-information-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/9SjF82A6t1Vo93Ydo/builds/wiRUZaKHnBviEUNnq/openapi.json
