# Company Intelligence API - Profiles by Domain and DUNS (`nabeelbaghoor/company-intelligence-api`) Actor

Resolve companies from a domain, DUNS number, FIGI, id or name into structured profiles with registration country, founded year, stock listing, parent company, locations, tags and socials, or list companies newly profiled in a date range. Pay per result. Bring your own API key.

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

## Pricing

$18.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 Intelligence API

Turn a list of domains, DUNS numbers or company names into structured company profiles, and keep a watchlist current by pulling every company newly profiled in a date range.

Most enrichment tools take a domain and give you back a firmographic row. This actor wraps a company intelligence API that also carries registration country, DUNS and FIGI identifiers, stock listing, parent company, office locations and government prohibited list entries, which makes it as useful for supplier screening and entity resolution as it is for prospecting.

### Two modes

| Mode | What it does | What you give it |
| --- | --- | --- |
| `company-lookup` | Resolves identifiers into full company profiles | Domains, DUNS numbers, FIGIs, provider ids or names |
| `newly-added` | Lists every company the provider profiled in a date range | A from date and a to date |

Identifiers are routed by shape, so a mixed list works without sorting it first: a domain or website URL goes to the domain lookup, a nine digit number to the DUNS lookup, a code starting BBG to the FIGI lookup, any other number to the provider id lookup, and anything else to a name search. Set `identifierType` to force one type when your list is all company names.

### Choosing fields

This provider is a GraphQL API, which means the caller chooses the fields and one unknown field fails the entire query rather than just that column. The default selection is a verified set of company profile fields, and two extra blocks are one toggle away: office locations and US government prohibited list entries.

Everything else in the schema, including financials, funding rounds, human capital, technology stack, website traffic, court filings, sustainability metrics and risk ratings, is reachable through `extraSelection`, a raw GraphQL fragment merged into the query. Give the field with its own subfields, for example `technologies { name }`. Check the subfield names against your provider's field reference before running a large job, because a wrong name fails the whole query.

### Example output

```json
{
  "recordType": "company",
  "matched": true,
  "companyId": "12345",
  "name": "Example Industrial Group",
  "homepage": "https://example.com",
  "domain": "example.com",
  "shortDescription": "Contract manufacturer of precision components.",
  "companyType": "PRIVATE",
  "status": "ACTIVE",
  "countryOfRegistration": "United States",
  "foundedYear": "1998",
  "duns": "123456789",
  "stockTicker": null,
  "parentCompany": "Example Holdings",
  "locationsCount": 7,
  "headquartersCity": "Cleveland",
  "headquartersCountry": "United States",
  "tags": ["Manufacturing", "Aerospace"],
  "linkedin": "https://www.linkedin.com/company/example",
  "queriedIdentifier": "example.com",
  "queriedAs": "domain"
}
```

Every row also carries `raw`, the untouched provider record, so anything you added through `extraSelection` survives the flattening even though it is not modelled by name.

### Pricing

Pay per result. You are charged once per company profile saved to the dataset. Duplicates are removed before charging, and an identifier that resolves to nothing is stored with `matched: false` free of charge, so a list of dead domains costs you nothing. Apify platform usage is included in the per-result price. Your own provider plan is billed separately by the provider.

### Bring your own API key

This actor does not include data access. You use your own API key from Craft, which is the provider whose company data API this actor calls. The key is sent as a request header and never logged.

### FAQ

#### What is a company intelligence API?

A company intelligence API returns a structured profile for a company rather than a single data point: identity and registration details, corporate hierarchy, locations, listings, and depending on your plan, financials, headcount, technology and risk signals. This actor wraps one and turns its results into a dataset you can export as CSV, JSON or Excel, or pull from another tool.

#### Can I look companies up by DUNS number?

Yes. Paste the DUNS numbers into `companyIdentifiers` and they are routed to the DUNS lookup automatically, because a nine digit value is unambiguous. Set `identifierType` to `duns` if your numbers arrive with formatting that makes the shape less obvious.

#### How do I get fields the actor does not return by default?

Use `extraSelection` and give a raw GraphQL fragment, for example `employees { count } websiteTraffic { visits }`. It is merged into the generated query. The returned values land in the `raw` column of each row. If you would rather control the whole document, use `rawQuery` instead: it receives one variable named `value` holding the identifier, and must return the company under a top-level `company` field.

#### What happens if I ask for a field my plan does not include?

The provider answers with a GraphQL error rather than an HTTP failure, and the actor tells you when the error text reads like an entitlement problem rather than a typo. Remove the field from the selection and rerun. Because GraphQL fails the whole query on one bad field, test a new selection against a single identifier before running it across a long list.

#### Can I pull more than 30 days of newly profiled companies?

Yes. The provider accepts a window of at most 30 days per request, and a longer range is split automatically into consecutive 30 day windows and walked in order, so asking for a whole quarter works in one run. Both ends of the range are inclusive.

#### Why are some rows marked matched false?

Because the identifier resolved to nothing. Those rows are stored so you can see exactly which inputs failed, and they are never charged for. Set `skipUnmatched` to true to leave them out of the dataset entirely.

#### How many results can one run return?

Up to 25,000 per run. The lookup mode makes one provider call per identifier, so run time scales with your list. The newly profiled mode pages at up to 100 records per call, which is the provider's maximum.

#### Do I need my own API key?

Yes. This actor is bring your own key, and your usage is billed on your own provider plan. The actor charges separately for each result it returns.

### Keyword map

company intelligence API, company data API, company enrichment API, domain to company API, DUNS lookup API, company profile API, firmographics API, entity resolution API, supplier screening API, company hierarchy data, parent company lookup, GraphQL company API, company watchlist API, newly added companies feed

# Actor input Schema

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

What this run does. Company lookup resolves identifiers you already hold into full company profiles. Newly profiled companies lists every company the provider added in a date range, which is how you keep a watchlist current.

## `companyIdentifiers` (type: `array`):

The companies to resolve. Each value is routed automatically by shape: a domain or website URL goes to the domain lookup, a nine digit number to the DUNS lookup, a code starting BBG to the FIGI lookup, any other number to the provider id lookup, and anything else to a name search. Company lookup mode only.

## `identifierType` (type: `string`):

Force every identifier to be treated as one type instead of routing by shape. Use this when your list is all names, since a name that happens to look like a domain would otherwise be sent as one.

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

Leave unresolved identifiers out of the dataset entirely. By default they are stored with matched set to false, which is free, so you can see exactly which inputs failed to resolve.

## `addedFrom` (type: `string`):

Start of the date range for newly profiled companies, as an ISO date such as 2026-07-01. Newly profiled mode only.

## `addedTo` (type: `string`):

End of the date range, as an ISO date such as 2026-07-31. Both ends are inclusive. Newly profiled mode only.

## `includeLocations` (type: `boolean`):

Add each company's office locations to the result, as city and country. The first location is also promoted into its own headquarters columns.

## `includeProhibitedLists` (type: `boolean`):

Add any US government prohibited list entries for the company, as list name and code. Useful for screening rather than prospecting.

## `extraSelection` (type: `string`):

A raw GraphQL selection fragment merged into the query, for fields beyond the default set. Give field names with their own subfields where the field is an object, for example: employees { count } technologies { name }. Consult your provider's field reference for the exact subfield names, because an unknown field fails the entire query rather than just that column.

## `rawQuery` (type: `string`):

Replace the generated query entirely. The query receives one variable named value, holding the identifier being looked up, and must return the company under a top-level company field. Company lookup mode only.

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

Stop after this many companies (1 to 25,000). You are charged per company returned.

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

How many companies to request per call in the newly profiled mode (1 to 100, which is the provider's maximum).

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

Your own API key for the data provider. Required. Sent as a request header and never logged.

## Actor input object example

```json
{
  "mode": "company-lookup",
  "identifierType": "auto",
  "skipUnmatched": false,
  "includeLocations": false,
  "includeProhibitedLists": false,
  "maxResults": 100,
  "pageSize": 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 = {
    "maxResults": 100,
    "pageSize": 100
};

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

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

```

## MCP server setup

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