# Company Data Enrichment (`spookyweb/company-enrichment`) Actor

Domain in, company profile out. Reads a company's own website for the name, what it does, emails, phones, addresses, social profiles, the technology the site runs on and the registration number in its footer. Legal name, VAT, size and founding year follow where the site states them.

- **URL**: https://apify.com/spookyweb/company-enrichment.md
- **Developed by:** [丂卩ㄖㄖҜㄚ](https://apify.com/spookyweb) (community)
- **Categories:** Lead generation, Integrations, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.60 / 1,000 company enricheds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Data Enrichment

Give it a company domain and it returns a structured company profile built from the company's own website: the name, what it does, how to reach it, where it is, who it is on social media, what the site is built with, and the registration number in its footer. One row per company, one charge per company.

### 🔍 What does Company Data Enrichment do?

Company Data Enrichment reads a company's **own website** and turns it into a structured record. It reads the homepage, follows the contact, about, legal and team pages, and pulls the identity out of what the company publishes about itself: schema.org **Organization** markup first because it is machine readable and authoritative, then Open Graph tags, then the about and contact pages, then the footer legal text where the registration and VAT numbers live.

The fastest way to try it is to paste two domains into `domains` and press start. You get one row per company, ready to load into a CRM.

It charges **once per company answered**, decided by your input list rather than by the target's site map. A one page site and a two hundred page site cost the same, which is why `maxPagesPerDomain` is free to raise.

### 📊 What data can I extract?

One row per domain, with every one of these fields present on every row. A field the company does not publish comes back `null` or empty rather than guessed.

| Field | Type | What it holds |
|---|---|---|
| `domain` | string | The domain that was enriched, lowercased, no protocol or www |
| `websiteUrl` | string | The homepage that answered, after any redirect |
| `companyName` | string | Trading name, from schema.org, then Open Graph, then the page title |
| `legalName` | string | Registered legal name, only where the site declares one separately from the trading name |
| `description` | string | What the company says it does |
| `tagline` | string | The slogan, or the strapline beside the name in the page title |
| `logoUrl` | string | Absolute URL of the logo or site icon |
| `industry` | string | Sector, only where the site declares a specific schema.org business type such as `ClothingStore` or `Dentist` |
| `foundedYear` | number | Year founded, from a declared date or from founded and established wording |
| `employeeRange` | string | Size band such as `11-50` or `51-200`, only where the site states a headcount |
| `addresses` | array | Postal addresses, each with `street`, `city`, `region`, `postalCode`, `country`, `raw` and `source` |
| `phones` | array | Phone numbers from tel links and visible text |
| `emails` | array | Email addresses on the company's own domain |
| `contactPageUrl` | string | The contact page that was read |
| `socials` | object | One profile per platform: `linkedin`, `twitter`, `facebook`, `instagram`, `youtube`, `github`, `tiktok`, `crunchbase`, `bluesky`, `threads` |
| `technologies` | array | Detected software, each with `name`, `category`, `categoryLabel`, `confidence` and `evidence` |
| `registrationNumbers` | array | Company registration numbers from footer legal text |
| `vatNumbers` | array | VAT numbers from footer legal text |
| `languages` | array | Language codes the site declares |
| `pagesRead` | array | Every page URL actually read for this company |
| `status` | string | `enriched`, `partial` or `unreachable` |
| `confidence` | number | Share of the eight identity signals found, 0 to 1 |
| `checkedAt` | string | When the company was enriched, ISO 8601 |
| `error` | string | Why a site could not be read, on an `unreachable` row only |

#### How full a row comes back

Measured on 15 August 2026 across **30 real company domains**, a mix of UK and international businesses from consumer brands to industrial suppliers. Of the 30, 25 came back `enriched`, 1 `partial` and 4 `unreachable`: one site would not accept the connection and three answered with an anti-bot challenge page instead of their own content.

The counts below are over the **26 domains whose site could be read**, because a field is only missing in a way you can do anything about once the site has answered.

| Field | Filled |
|---|---|
| `companyName` | 26 of 26 |
| `languages` | 26 of 26 |
| `logoUrl` | 26 of 26 |
| `description` | 25 of 26 |
| `technologies` | 24 of 26 |
| `socials` | 23 of 26 |
| `tagline` | 19 of 26 |
| `contactPageUrl` | 18 of 26 |
| `emails` | 17 of 26 |
| `phones` | 13 of 26 |
| `registrationNumbers` | 9 of 26 |
| `foundedYear` | 7 of 26 |
| `addresses` | 6 of 26 |
| `legalName` | 4 of 26 |
| `employeeRange` | 4 of 26 |
| `vatNumbers` | 3 of 26 |
| `industry` | 1 of 26 |

Thirty domains is a sample, not a population, so read the top of that table as "nearly always" and the bottom as "occasionally" rather than as a rate to forecast a bill against.

The bottom of the table measures what companies choose to publish, not how hard the Actor looks. `industry` needs a specific schema.org business type and the overwhelming majority of sites declare the generic `Organization`, which states no sector. `legalName`, `employeeRange` and `vatNumbers` need the site to say them outright, and most sites print the registration number without the VAT number beside it.

So build on the top of that table and treat the bottom as a bonus. If you need a legal name and a VAT number for every company on a list, a company register is the right source and this is not.

### 💡 Why enrich companies from their own website?

**Filling a CRM from a list of domains.** Domains from a form, a webinar or an import come back with a name, a description, a contact route and a technology stack, one row each and one price each.

**Scoring and routing signups.** A signup with a company domain becomes a record carrying an email, a phone number and a social profile before the first reply, so routing rules have something to read.

**Building a company file.** Registration numbers give you an identity to match against a company register. Addresses give you a location. The technology stack says what the site runs on, each detection carrying the evidence behind it.

**Feeding an AI agent.** The output schema means an agent can chain this Actor into a workflow and read the result without a parser. Domain in, structured company out, one predictable charge.

**Supplier and counterparty checks.** The registration number, the registered address and the legal name, where the site publishes them, are where a compliance check starts, and they sit on the company's own website rather than behind a paywall.

### 🚀 How do I use Company Data Enrichment?

1. Click **Try for free**.
2. Put your company domains into `domains`, one per line. Protocol and www are optional.
3. Leave `maxPagesPerDomain` at 8, or raise it for large sites. It costs you nothing extra.
4. Reorder `pagePriority` if you care most about a particular kind of page, for example put `legal` first when you are after registration numbers.
5. Press **Start**, then download the results as JSON, CSV or Excel, or read them from the API.

### ⬇️ Input

```json
{
  "domains": ["monzo.com", "octopus.energy"],
  "maxPagesPerDomain": 8,
  "pagePriority": ["contact", "about", "legal", "team"],
  "includeContacts": true,
  "includeSocials": true,
  "includeTechStack": true
}
```

| Field | Type | Default | What it does |
|---|---|---|---|
| `domains` | array | `["monzo.com", "octopus.energy"]` | The companies to enrich. Required. Each one is charged once |
| `maxPagesPerDomain` | integer | `8` | Pages to read per company, homepage included, maximum 20 |
| `pagePriority` | array | `contact, about, legal, team` | The order the page budget is spent in. Also accepts `careers` and `pricing` |
| `includeContacts` | boolean | `true` | Addresses, phone numbers and email addresses |
| `includeSocials` | boolean | `true` | One social profile per platform |
| `includeTechStack` | boolean | `true` | CMS, framework, analytics, CRM, payments, hosting and server software |

### ⬆️ Output

#### Table view

Results arrive as a **Companies** table you can sort and filter in the Console, lining up the domain, company name, description, emails, phones, addresses, socials, technologies, registration numbers, contact page, status and confidence for every company in the run. Every other field is still in the row and in the JSON, CSV and Excel exports.

#### JSON

A real row, produced by the run recorded in `research/company-enrichment-coverage/`:

```json
{
  "domain": "cambridgesatchel.com",
  "websiteUrl": "https://www.cambridgesatchel.com/",
  "companyName": "Cambridge Satchel",
  "legalName": null,
  "description": "Discover our collection of high-quality leather bags, handcrafted here in the UK. Keep up-to-date with the latest collaborations and designs here. 10% off when you sign up for our emails.",
  "tagline": null,
  "logoUrl": "https://cdn.shopify.com/s/files/1/2418/7055/files/SEO_Logo.jpg?v=1742989265",
  "industry": "Retail",
  "foundedYear": null,
  "employeeRange": null,
  "addresses": [
    {
      "street": "The Cambridge Satchel Company, 1A Avery Row",
      "city": "London",
      "region": "London",
      "postalCode": "W1K 4AJ",
      "country": "UK",
      "raw": "The Cambridge Satchel Company, 1A Avery Row, London, London, W1K 4AJ, UK",
      "source": "schema.org"
    }
  ],
  "phones": [
    "0800 0855 811",
    "+44(0)1223 499122",
    "01223 833050"
  ],
  "emails": [
    "contactus@cambridgesatchel.com",
    "press@cambridgesatchel.com",
    "returns@cambridgesatchel.com",
    "wholesale@cambridgesatchel.com"
  ],
  "contactPageUrl": "https://www.cambridgesatchel.com/pages/contact-us",
  "socials": {
    "linkedin": "https://www.linkedin.com/company/cambridge-satchel",
    "facebook": "https://www.facebook.com/CamSatchelCo",
    "instagram": "https://www.instagram.com/cambridge_satchel",
    "tiktok": "https://www.tiktok.com/@cambridge_satchel"
  },
  "technologies": [
    {
      "name": "Shopify",
      "category": "ecommerce",
      "categoryLabel": "Ecommerce",
      "confidence": "high",
      "evidence": [
        {
          "kind": "asset-host",
          "detail": "cdn.shopify.com/"
        },
        {
          "kind": "html",
          "detail": "Shopify.theme"
        }
      ]
    },
    {
      "name": "Cloudflare",
      "category": "hosting",
      "categoryLabel": "Hosting and CDN",
      "confidence": "high",
      "evidence": [
        {
          "kind": "header",
          "detail": "cf-ray: a2b9bac789d6779a-LHR"
        },
        {
          "kind": "header",
          "detail": "server: cloudflare"
        }
      ]
    },
    {
      "name": "Klaviyo",
      "category": "marketing",
      "categoryLabel": "Marketing",
      "confidence": "medium",
      "evidence": [
        {
          "kind": "asset-host",
          "detail": "static.klaviyo.com/onsite/js/vteivc/klaviyo.js"
        }
      ]
    }
  ],
  "registrationNumbers": [
    "06763257"
  ],
  "vatNumbers": [],
  "languages": [
    "en",
    "en-gb",
    "en-ie",
    "en-us",
    "ja-jp"
  ],
  "pagesRead": [
    "https://www.cambridgesatchel.com/",
    "https://www.cambridgesatchel.com/pages/contact-us",
    "https://www.cambridgesatchel.com/pages/privacy-policy",
    "https://www.cambridgesatchel.com/pages/about-us"
  ],
  "error": null,
  "confidence": 1,
  "status": "enriched",
  "checkedAt": "2026-08-15T16:55:56.198Z"
}
```

That row scored a `confidence` of 1 and still came back with `legalName`, `tagline`, `foundedYear` and `employeeRange` empty and no VAT number, because the site does not publish them. That is the normal shape of a good row.

### One charge per company, however big the site

The charge is decided by your input list, not by the target's site map. Read one page or twenty, find everything or find nothing, hit a site that is down: it is one charge per domain, so a list of 500 domains costs the same as any other list of 500 domains and a job can be priced before it is run.

That is also why `maxPagesPerDomain` is free to raise. More pages means more detail at no extra cost, and the budget is spent on contact and legal pages first because those are the pages that carry company facts.

### What status and confidence actually mean

| `status` | Meaning |
|---|---|
| `enriched` | The site answered and at least half the identity signals were found |
| `partial` | The site answered but published very little about itself |
| `unreachable` | The site's own content could not be read at all, and `error` says why |

`confidence` is the share of eight signals that were found: a declared name, a description, an address, a contact route, a social profile, a logo, a size or sector or founding year, and a registration or VAT number. It is a completeness score, not a truth score, and it exists so you can filter a CRM import on one comparable number.

An `unreachable` row is a real answer, not a failure. A run where every domain was unreachable still finishes successfully with those rows in the dataset, because "we looked and could not get in" is information you asked for.

A site that answers with an anti-bot challenge page rather than its own content is `unreachable` too, and `error` says so. The alternative is reading the challenge page as though it were the company, which is how a CRM ends up with a company called Cloudflare.

### How the technology detection stays honest

Every detection carries the **evidence** that produced it: a response header, an asset host, or a build artefact in the HTML. A `confidence` of `high` means a server header stated it or two independent signals agreed. `medium` means one build artefact implied it.

Nothing is inferred from a favicon, a logo in the footer, or the word appearing in page copy. A site that mentions Shopify in a blog post is not running Shopify, and a guess about a prospect's stack is worse than no guess when a rep opens with it.

### Limits worth knowing

It reads **public pages over plain HTTP**. There is no browser, so a site that renders everything in JavaScript with nothing in the served HTML returns less, and a site sitting behind an anti-bot challenge page comes back `unreachable` with the challenge named in `error` rather than with the challenge page's contents dressed up as a company. On the 30 domain sample above that was 3 domains. There is no paid enrichment database behind it either, so it finds what a company chose to publish about itself and nothing more.

Revenue figures, funding rounds and employee lists are not here, because companies do not publish those on their own websites in any consistent form, and inventing them is the failure mode this Actor is built to avoid.

No API keys, no accounts, no proxies.

### 💰 How much does it cost?

Charged **once per domain**, whatever the size of the site. That one charge covers the crawl, the identity extraction, the contact details, the socials, the technology detection and the legal numbers.

Company enriched, per domain:

| Free | Bronze | Silver | Gold | Platinum | Diamond |
|---|---|---|---|---|---|
| $0.0199 | $0.016915 | $0.01393 | $0.01194 | $0.00995 | $0.00796 |

A list of 10,000 domains is **$199.00** on the Free plan and **$169.15** on Bronze. A list of 1,000 domains is $19.90 on Free.

Every domain on your list is charged once, including one that comes back `unreachable`, because the lookup was still performed and the row still tells you something you did not know. Nothing else is charged: not a page, not a retry, not a field.

Apify also charges its standard Actor start event of $0.00005 per run, once per gigabyte of memory. This Actor is capped at 1 GB, because it needs no browser. The per run spend cap cannot be set below $0.02, which is one start plus one company, so a cap can never be too small to return anything.

### 🔌 Integrations

Send results straight to Google Sheets, Slack, Airtable, Zapier, Make, or your own webhook with [Apify integrations](https://docs.apify.com/platform/integrations). Schedule a run to re enrich a list weekly, or trigger one whenever a new domain lands in another tool. Every run also emits events you can hang a webhook on, so a finished enrichment can post itself into your CRM without anything in between.

### 🔗 Using Company Data Enrichment with the Apify API

```bash
curl -X POST "https://api.apify.com/v2/acts/spookyweb~company-enrichment/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"domains": ["monzo.com"], "maxPagesPerDomain": 8}'
```

Or with the Apify client:

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('spookyweb/company-enrichment').call({
  domains: ['monzo.com', 'octopus.energy'],
  maxPagesPerDomain: 8,
  pagePriority: ['contact', 'about', 'legal', 'team'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Full detail is in the [Apify API reference](https://docs.apify.com/api/v2), and the same run is callable from the [Python](https://docs.apify.com/api/client/python) and [JavaScript](https://docs.apify.com/api/client/js) clients.

### ❓ FAQ

#### Where does the company data come from?

The company's own website, and nowhere else. The order of preference is schema.org `Organization` markup, then Open Graph tags, then the about and contact pages, then the footer legal text. Structured markup wins because it is a statement the company makes about itself in machine readable form, rather than something inferred from prose.

#### How many pages does it read per company?

`maxPagesPerDomain` decides, default 8 and maximum 20. The homepage is always read, then the pages it links to in your `pagePriority` order, then the standard paths such as `/contact` and `/about` for anything the homepage did not link. Everything actually read comes back in `pagesRead`.

#### Does reading more pages cost more?

No. The charge is per company, so raising `maxPagesPerDomain` buys more detail for the same money.

#### Why is `industry` empty on most rows?

Because it is only returned when the site declares a specific schema.org business type, such as `ClothingStore`, `FinancialService` or `Dentist`. Most companies declare the generic `Organization` type, which states no sector, and guessing a sector from page copy would be inventing data. It filled on 1 of the 26 domains that answered when that was last measured, so treat it as a bonus rather than a field to plan around.

#### What happens if a website is down?

You get a row with `status` of `unreachable` and an `error` saying why, and the run finishes successfully. The same applies to a site that answers with an anti-bot challenge page instead of its own content, because that is a site we could not read rather than a company with nothing to say. The domain is still charged, because the lookup was still performed. Nothing is invented to fill the gap.

#### Can it find revenue, funding or employee lists?

No. Companies do not publish those on their own websites in any consistent form, so returning them would mean guessing. `employeeRange` is a size band from a declared employee count or a number stated on the site, and it is absent when neither exists, which is most of the time.

#### How accurate is the technology detection?

Every detection ships with the evidence that produced it, so you can check any of it. Response headers are the strongest signal because the server states them about itself. Asset hosts such as `js.stripe.com` are next. Nothing is guessed from a logo or a favicon, and a product mentioned only in page copy is never returned.

#### Can I turn parts of the output off?

Yes. `includeContacts`, `includeSocials` and `includeTechStack` each remove their section. The price is the same either way, so most people leave them on.

#### Does it work outside the UK?

Yes. The identity, contact, social and technology extraction is language independent because it reads structured markup and link targets. The registration and VAT patterns cover UK company numbers and EU VAT formats, so those two fields are strongest in the UK and Europe.

### ⚖️ Is it legal to enrich company data?

Company Data Enrichment reads pages a company has chosen to publish on its own website. Company names, registered addresses, registration numbers and switchboard numbers are business information rather than personal data, and public company registers publish most of it themselves.

Where a published address identifies a named person, UK GDPR and the EU GDPR apply and you become the data controller for whatever you do next. You need a lawful basis, usually legitimate interest for business to business contact, and you must honour opt outs. Apify's [ethical web scraping guide](https://blog.apify.com/is-web-scraping-legal/) covers the wider picture, and it is worth reading before an outreach campaign rather than after one.

### 👍 Your feedback

Found a site it reads badly, or want a field that is not here yet? Open an issue on the Actor's Issues tab with the domain that caused it. A bad extraction can be reproduced from the page that caused it, so a single URL is usually enough to get it fixed.

### 🔎 You might also like

Company Data Enrichment takes a domain, so [Company Domain Finder](https://apify.com/spookyweb/company-domain-finder) is what turns a list of company names into the domains to feed it, and [Company Jobs Scraper](https://apify.com/spookyweb/company-jobs) takes the same domain and returns what that company is hiring for. The three chain in that order.

| Actor | What it does |
|---|---|
| [Company Domain Finder](https://apify.com/spookyweb/company-domain-finder) | Company name in, the official website out, with a confidence score and the signals behind it |
| [Company Jobs Scraper](https://apify.com/spookyweb/company-jobs) | Open roles read straight from a company's own applicant tracking system, by domain |
| [Company Email Finder](https://apify.com/spookyweb/company-email-finder) | Contact addresses, the email naming convention behind them, and generated addresses for named people |
| [Website Contact Scraper](https://apify.com/spookyweb/website-contact-scraper) | Emails, phones, socials and addresses from company websites, one record per domain |
| [LinkedIn Jobs Scraper](https://apify.com/spookyweb/linkedin-jobs) | Job postings as LinkedIn carries them, searched by keyword and location rather than by company |
| [Wayback Machine Scraper](https://apify.com/spookyweb/wayback-machine-scraper) | Archived versions of any page, for seeing what a site used to say |

# Actor input Schema

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

The companies to enrich, one domain or full URL per line. The protocol and www are optional, so monzo.com and https://www.monzo.com/ are the same company. Each domain is charged once, whatever the outcome.

## `maxPagesPerDomain` (type: `integer`):

How many pages of each company website to read, homepage included. Contact, about and legal pages are read first, so a low budget still lands on the pages that carry company facts. The price does not change with this number.

## `pagePriority` (type: `array`):

The order to spend the page budget in. Contact and legal pages carry addresses, phone numbers and registration numbers. About and team pages carry the description and size. Careers and pricing are useful for qualifying a prospect.

## `includeContacts` (type: `boolean`):

Collect the postal addresses, phone numbers and email addresses the company publishes on its own website. Turn this off if you only want the identity and technology fields.

## `includeSocials` (type: `boolean`):

Collect the company profile on LinkedIn, X, Facebook, Instagram, YouTube, GitHub, TikTok, Crunchbase, Bluesky and Threads, one link per platform rather than every match on the page.

## `includeTechStack` (type: `boolean`):

Detect the CMS, framework, ecommerce platform, analytics, CRM, payment, support, hosting and server software the site runs, each returned with the evidence that produced the detection.

## Actor input object example

```json
{
  "domains": [
    "monzo.com",
    "octopus.energy"
  ],
  "maxPagesPerDomain": 8,
  "pagePriority": [
    "contact",
    "about",
    "legal",
    "team"
  ],
  "includeContacts": true,
  "includeSocials": true,
  "includeTechStack": true
}
```

# Actor output Schema

## `companies` (type: `string`):

One row per company enriched, with identity, contact details, socials and technology signals.

# 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": [
        "monzo.com",
        "octopus.energy"
    ]
};

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

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

```

## MCP server setup

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

```

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/q0c0kauT4gydVPGM4/builds/cgAfCEv78uRMP14W7/openapi.json
