# Company Intelligence Report (`spookyweb/company-intelligence-report`) Actor

🏷️ From $30 / 1K | Company name or domain in, one report per company out: its verified website with the evidence, firmographics, published emails and phones, the email naming convention and the decision makers with title, LinkedIn URL and a built email. Pay per report delivered.

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

## Pricing

from $30.00 / 1,000 company reports

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/actors/running/actors-in-store.md#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 Report

Give it company names or website domains and it returns one report per company: the company's own website with the evidence that it is theirs, what the company says about itself, the email addresses and phone numbers it publishes, the email naming convention it uses, and the people who run it, each with a title, a LinkedIn URL and a work email built from that convention. You pay only for reports that carry at least one person or one published contact.

### 🔍 What does Company Intelligence Report do?

Company Intelligence Report turns a name or a domain into a **researched company profile in one row**. For a name such as Monzo Bank it builds candidate domains from the name, reads each homepage through an evidence gate that accepts a site only when the page proves it belongs to the company asked for, and falls back to Wikidata's official website claims for the brands whose domain is not their name. For a domain such as wise.com it verifies the site answers and is not a parked page or a directory, then uses it as given.

Once the website is settled it reads the homepage and up to four more pages, the contact, about, team and legal pages, and pulls the **firmographics** the company publishes about itself: description, industry, headcount band, founding year, legal name, addresses, registration numbers and social profiles. It collects every **email address and phone number** on those pages, works out the **email naming convention** from the personal addresses it finds, then asks two public search engines for the LinkedIn profiles that name the company, keeps the people whose own listing says they work there, classifies each by department and seniority, and builds an address for each from the convention.

The easiest way to try it is to click **Try for free** and run it on the two companies already in the input box. Everything comes from the company's own website, Wikidata and public search listings. No LinkedIn page is ever fetched, no account is logged into and no purchased database sits behind it, so a report costs a few seconds and is priced accordingly.

### 🆚 What about the official route?

There is no single official route to this. Companies House publishes the registered name, number and office address of a UK company as open data, and it is a good register for what it holds, but it holds no website, no email, no phone and no current staff. LinkedIn's own company page and people search are the official route to the people, one company at a time, behind a login. The company's website is the only source for its contact details and its naming convention.

Doing this by hand means guessing the domain, checking it is really theirs, opening the contact page, copying the addresses, opening LinkedIn, filtering to the leadership, and pasting names into a sheet. Company Intelligence Report does all of it for a hundred companies in one run and hands back one row per company that joins straight onto the list you started with, with the evidence for every judgement it made: which route found the website and what the page proved, which field tied each person to the company, and how many published addresses the naming convention was read from.

### 📊 What data can I extract?

One row per company, whatever the outcome. Every field is present on every row.

| Field | What it holds |
|---|---|
| 🏢 `companyName` | The company as named in the report: your name, else the site's own name, else the domain |
| 📥 `input` | The entry exactly as you supplied it |
| 🚦 `status` | `reported`, `empty` or `unresolved`. Only reported rows are charged |
| 📝 `reason` | Why a row is unresolved or empty, in words you can act on |
| 🌐 `domain`, `website` | The registrable domain judged to be the company's own, and the homepage URL that answered |
| 🧭 `resolutionMethod` | `website-verified`, `slug-exact`, `slug-corroborated` or `wikidata` |
| ✅ `resolutionEvidence` | What the homepage proved: name-legal, name-core, registry, postcode, town, country. A domain you supplied carries supplied-website |
| 🎯 `resolutionConfidence` | Confidence in the website match from 0 to 1 |
| 🚫 `rejectedCandidates` | Up to five domains tried and refused, each with the reason |
| 🏷️ `siteName`, `legalName`, `tagline` | What the site calls itself, its declared legal name and strapline |
| 📄 `description` | The company's own description of itself |
| 🏭 `industry` | The industry the site declares |
| 👥 `employeeRange` | Headcount band from 1-10 to 10001+ |
| 📅 `foundedYear` | The founding year the site states |
| 🖼️ `logoUrl` | The logo the site declares |
| 📍 `addresses` | Postal addresses published on the site, structured where the markup allows |
| 🆔 `registrationNumbers`, `vatNumbers` | Company and VAT numbers printed on the site |
| 🗣️ `languages` | Languages the homepage declares |
| 📣 `socials` | One link per platform: linkedin, twitter, facebook, instagram, youtube, github, tiktok, crunchbase, bluesky, threads |
| ✉️ `emails` | Published addresses, each with its `type` (role, personal or unclassified), `isFreeProvider` and `onSiteDomain` |
| 📞 `phones` | Published numbers, each with its `source` (tel-link or text) and `onSiteContext`, false when the page attributes it to someone else |
| 🔤 `emailPattern` | The naming convention read from the site: first.last, first\_last, first-last or flast |
| 📈 `emailPatternConfidence`, `emailPatternBasedOn` | The share of published personal addresses that follow it, and how many there were |
| 🧾 `searchedAs` | The company name the people search was run with |
| 👤 `people` | Each person's `name`, `firstName`, `lastName`, `title`, `roleCategory`, `seniority`, `linkedinUrl`, `location`, `employerEvidence`, `evidence`, `email`, `emailCandidates` and `source` |
| 🔢 `peopleCount`, `contactCount` | How many people, and how many published emails and own phone numbers, the report carries |
| 📚 `pagesRead` | The pages of the company site that were read |
| ⚠️ `searchEngineChallenged` | True when every engine challenged the people search, so the people section may be short |
| 💳 `charged` | Whether the row was charged. True only for reported rows |
| 🕒 `retrievedAt` | When the report was produced, ISO 8601 UTC |

### 💡 Why build a company intelligence report?

- **Account research before a call.** One row tells you what the company says it does, how big it says it is, where it is, who leads it and how to reach them.
- **A target account list into a contact list.** Paste fifty company names and get the website, the switchboard, the published mailboxes and the leadership team for each, joined onto your list by the `input` field.
- **CRM enrichment.** A record that holds only a company name comes back with a domain, a description, an industry, a headcount band, social profiles and named people.
- **Due diligence on a supplier or a prospect.** The legal name, registration number and VAT number as printed on their own site, next to the address and the people, with the evidence for the website match.
- **Partnerships and press.** Find the person who runs partnerships or communications, with an address built from the company's own convention, rather than writing to info@.
- **Recruiting research.** See who runs engineering or people at a company, what the company says about itself, and where it is.

### 🚀 How do I use Company Intelligence Report?

1. Paste company names or domains, one per line, up to 100. Names are matched to their own website; domains are verified and used as given.
2. Pick the departments for the people section. Leadership is the default and returns founders, chief officers, managing directors, vice presidents and directors.
3. Set how many people you want per report, up to 20, and whether to include published contacts and firmographics.
4. Run it. Each row is one company. Download as JSON, CSV or Excel, or read it over the API.

### ⬇️ Input

```json
{
  "companies": ["Monzo Bank", "wise.com", "Octopus Energy"],
  "roles": ["leadership", "sales"],
  "maxPeoplePerCompany": 5,
  "includeContacts": true,
  "includeFirmographics": true
}
```

- **companies**: names or domains, up to 100 per run. A name goes through the evidence gate and Wikidata. A domain is verified rather than guessed past.
- **roles**: leadership, sales, marketing, engineering, product, finance, operations, hr, any. Choose up to three; a longer list is refused by name so nothing is silently skipped.
- **maxPeoplePerCompany**: 1 to 20. The price per report is the same however many people it carries.
- **includeContacts**: collect published emails and phones. The naming convention is read from the same pages either way.
- **includeFirmographics**: collect the description, industry, size, founding year, legal name, addresses, registration numbers and social profiles.

### ⬆️ Output

#### Table view

| Company | Status | Domain | Description | Industry | Size | Contacts | People | Email pattern | Evidence | Reason |
|---|---|---|---|---|---|---|---|---|---|---|
| Monzo Bank | reported | monzo.com | Making money work for everyone | | | 0 | 2 | | name-legal+registry | |
| Wise | reported | wise.com | 150+ countries, 40 currencies, one account. | | | 1 | 1 | | supplied-website | |

#### JSON

A real row from a run of the prefill, nulls included, so you can see what a large site with a quiet contact page actually returns:

```json
{
  "companyName": "Wise",
  "input": "wise.com",
  "status": "reported",
  "reason": null,
  "domain": "wise.com",
  "website": "https://wise.com/",
  "resolutionMethod": "website-verified",
  "resolutionEvidence": "supplied-website",
  "resolutionConfidence": 1,
  "rejectedCandidates": [],
  "siteName": "Wise",
  "legalName": null,
  "description": "150+ countries, 40 currencies, one account. Save when you send, spend and manage your money internationally.",
  "tagline": "Wise: The international account. Money without borders",
  "industry": null,
  "employeeRange": null,
  "foundedYear": 2011,
  "logoUrl": "https://wise.com/public-resources/assets/logos/wise-personal/logo.png",
  "addresses": [],
  "registrationNumbers": [],
  "vatNumbers": [],
  "languages": [
    "de",
    "de-at",
    "de-ch",
    "en",
    "en-ae",
    "en-au",
    "en-bg",
    "en-ca",
    "en-dk",
    "en-ee",
    "en-fi",
    "en-gb",
    "en-gr",
    "en-hk",
    "en-hr",
    "en-ie",
    "en-il",
    "en-in",
    "en-kr",
    "en-my",
    "en-nl",
    "en-no",
    "en-nz",
    "en-ph",
    "en-se",
    "en-sg",
    "en-us",
    "en-za",
    "es",
    "es-cl",
    "es-mx",
    "fr",
    "fr-be",
    "fr-lu",
    "hu",
    "id",
    "it",
    "ja",
    "pl",
    "pt",
    "pt-br",
    "ro",
    "ru",
    "th",
    "tr"
  ],
  "socials": {
    "linkedin": "https://www.linkedin.com/company/wiseaccount",
    "twitter": "https://twitter.com/wise",
    "facebook": "https://www.facebook.com/wise",
    "instagram": "https://www.instagram.com/wiseaccount",
    "youtube": "https://www.youtube.com/c/wiseaccount"
  },
  "emails": [
    {
      "email": "ouvidoria@wise.com",
      "type": "unclassified",
      "isFreeProvider": false,
      "onSiteDomain": true
    }
  ],
  "phones": [
    {
      "phone": "08008782802",
      "source": "tel-link",
      "onSiteContext": false
    }
  ],
  "emailPattern": null,
  "emailPatternConfidence": null,
  "emailPatternBasedOn": 0,
  "searchedAs": "Wise",
  "people": [
    {
      "name": "Steve Naudé",
      "firstName": "Steve",
      "lastName": "Naudé",
      "title": "Managing Director of Wise Platform",
      "roleCategory": "leadership",
      "seniority": "c-level",
      "linkedinUrl": "https://www.linkedin.com/in/steve-naude",
      "location": "United Kingdom",
      "employerEvidence": "Wise",
      "evidence": "experience",
      "email": "steve.naude@wise.com",
      "emailCandidates": [
        "steve.naude@wise.com",
        "stevenaude@wise.com",
        "snaude@wise.com",
        "steve_naude@wise.com",
        "steve-naude@wise.com",
        "steven@wise.com",
        "steve@wise.com",
        "naude@wise.com"
      ],
      "source": "brave"
    }
  ],
  "peopleCount": 1,
  "contactCount": 1,
  "pagesRead": [
    "https://wise.com/",
    "https://wise.com/us/business/contact/",
    "https://wise.com/us/about/our-story",
    "https://wise.com/gb/about/wise-reviews",
    "https://wise.com/en/legal/terms-and-conditions"
  ],
  "searchEngineChallenged": false,
  "charged": true,
  "retrievedAt": "2026-08-27T10:07:16.673Z"
}
```

### 🧭 How the website is found

A name is never handed to a search engine and the first hit taken. Candidate domains are built from the name itself, monzobank.com, monzo-bank.com and so on, and each homepage is read through the evidence gate: the page has to carry the company name, has to not be a parked domain or a business directory, and where the name appears without its legal form has to carry something else that ties it to this company. A name the slug route cannot settle goes to Wikidata, which states official websites as a claim rather than inferring them; a registry claim counts as corroboration, and the homepage still has to answer and carry the name. A domain that passes the gate for two different companies in one run is a site that publishes company data, not anybody's own website, and it is refused for the second one.

Every rejected candidate comes back in `rejectedCandidates` with the reason, and a company nothing resolved comes back `unresolved` with the reason in words, so an unresolved row is a finding rather than a blank. A domain you supply is verified rather than guessed past: it has to answer with a real page, not a parked domain, a directory or an anti-bot interstitial.

### ✉️ How the people and their emails are built

Two public search engines are asked for LinkedIn profiles that name the company, in the departments you chose. A profile is kept only when the company appears as a whole phrase in the listing's Experience field, in the current headline with no former or previously in front of it, or in the person's own profile summary. A listing whose Experience field names a different employer is dropped whatever the rest says, and so is a search result that is an article or an event page rather than the profile itself. Where the name is shared by several firms in the hit set, only the Experience field counts. The `evidence` field on each person says which signal matched, and experience is the one to trust most.

The naming convention comes from the company's own site. Every published address is collected, role mailboxes such as info@ and sales@ are set aside, and the personal ones reveal the convention by shape: jane.smith is first.last, jane\_smith is first\_last, j.smith is flast. The convention that explains the most addresses is applied to each person and `emailPatternConfidence` is the share it explained. Most company sites publish only role addresses, in which case first.last is assumed because it is the most common convention, `emailPattern` is null to say so, and each person's `emailCandidates` lists every convention so you can verify or try the alternatives. Treat the address as a strong first guess to verify, not as a verified fact.

### 📏 Limits

**Run timeout.** A run stops starting new work shortly before its own time limit and finishes cleanly with whatever it has, naming what it did not reach. The Actor's default is 3600 seconds, which is enough for the largest input it accepts. If you set a shorter limit in your own run settings, integration or API call, expect fewer results and a note in the run's status message saying so. You pay per delivered result rather than per minute, so a generous timeout costs you nothing.

- Up to 100 companies per run, 20 people per report, 3 departments per company.
- Each company takes roughly 15 to 60 seconds depending on how many candidate domains had to be tried and how many departments were searched. The run stops starting new companies a minute before its own timeout and the status message says how many were not attempted, so give a long list a timeout of an hour or split it across runs.
- Firmographics are what the company publishes on its own pages. A site with no schema.org markup and no about page returns fewer of them.
- People come from public search listings. A company with few profiles that name it, or a very common name, returns fewer. Search engines occasionally challenge a busy address; the query is retried once through Apify Proxy on a fresh address at no extra cost to you, and if both engines still challenge, `searchEngineChallenged` is set on the row.
- Emails are built, not verified. The confidence and the candidate list are there so you can verify with the tool of your choice.
- Runs stop cleanly at your per run spending cap. Everything delivered before the cap is kept.

### ⏱️ How long does a run take?

Measured on real runs, so you can tell a normal run from one that has stalled.

| Input size | Typical run time |
|---|---|
| 2 companies | about 20 seconds |
| 20 companies | about 3 minutes |

The first few seconds of any run are the container starting rather than the work. A run is never silently stuck: progress is logged as it goes, and if it runs out of time it stops early, keeps everything collected so far and says in the status message what was left.

### 💰 How much does it cost?

| Event | Price |
|---|---|
| Company report | $0.05 |
| Actor start | $0.00005 per run |

Charged once per report delivered. A report is delivered when the company resolved to its own website and the report carries at least one person or at least one published email or own phone number. A company that could not be matched to its own website comes back unresolved with the reason and costs nothing. A website that resolved but carried nobody and no contact comes back with whatever firmographics it did have, marked `empty`, and costs nothing either. The price per report is the same whether it carries one person or twenty, one page or five.

So one report costs **$0.05005** including the run start, and a list of 100 companies that all come back reported costs **$5.00005**.

Paid Apify plans pay less per report: **$0.0425** on Bronze, **$0.035** on Silver, **$0.03** on Gold, **$0.025** on Platinum and **$0.02** on Diamond. The Apify listing always shows the current rates.

### 🔌 Integrations

Schedule it to refresh a target account list weekly, feed it from a Google Sheet of company names, and send the rows to Google Sheets, Airtable, Slack, Make, Zapier or a webhook through Apify integrations. Each row's `domain` is the input for [Company Jobs](https://apify.com/spookyweb/company-jobs) when you want the vacancies as well, and each person's `firstName`, `lastName` and `domain` fit the people input of [Company Email Finder](https://apify.com/spookyweb/company-email-finder) with verifyMx on, which checks the domain can receive mail.

AI agents can call it through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) as `spookyweb/company-intelligence-report`. The input schema is the tool definition, the output schema tells the agent where the rows are, and every row carries its evidence fields so the agent can judge the website match and each person's attribution itself. An agent asked to research a company gets the whole answer from one call.

### 🔗 Using Company Intelligence Report with the Apify API

```bash
curl -X POST "https://api.apify.com/v2/acts/spookyweb~company-intelligence-report/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"companies": ["Monzo Bank", "wise.com"], "roles": ["leadership"], "maxPeoplePerCompany": 5}'
```

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

const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('spookyweb/company-intelligence-report').call({
  companies: ['Monzo Bank', 'wise.com', 'Octopus Energy'],
  roles: ['leadership', 'sales'],
  maxPeoplePerCompany: 5,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

See the [Apify API documentation](https://docs.apify.com/api/v2) for scheduling, webhooks and dataset exports.

### ❓ FAQ

#### Does it log in to LinkedIn or use a paid database?

No. It never fetches a LinkedIn page and there is no purchased database behind it. The people come from what public search engines already list about public profiles, and everything else comes from the company's own website and from Wikidata.

#### Why did a company come back unresolved?

Either no candidate domain built from the name answered with a page that proved it belongs to that company, or Wikidata holds no official website claim for it, or the domain it would have resolved to already belongs to another company in your list. The `reason` field says which and `rejectedCandidates` lists every domain that was tried. Supplying the domain instead of the name resolves it directly.

#### Why was a report marked empty and not charged?

The website resolved but the pages read carried no email, no phone attributed to the company itself, and the search engines listed nobody whose profile ties them to the company in the departments you chose. The firmographics that were found are still on the row. Try the any department, or the company's most common trading name, or check whether the site keeps its contact details behind a script.

#### How accurate are the emails?

They are built, not verified against the mail server. When the site publishes personal addresses the convention is read from them and `emailPatternConfidence` is the share of addresses it explained. When it does not, which is the usual case, each address is the first.last guess and `emailPattern` is null. Either way `emailCandidates` gives you the alternatives, and an email verification tool is the right next step before sending.

#### What does resolutionEvidence mean?

Which signals on the homepage proved the site belongs to the company. name-legal means the full name including its legal form was on the page. name-core means the name without its legal form was on the page and something else corroborated it: registry means a Wikidata claim, and postcode, town and country mean those were found too. A domain you supplied is website-verified with confidence 1.

#### Can I give it a mix of names and domains?

Yes. Each entry is judged on its own: anything that looks like a domain is verified and used, anything else is resolved as a name. The `input` field carries the entry as you gave it so the rows line back up with your list.

#### What happens at my spending cap?

The run charges up to the cap and stops. Every report delivered before the cap is kept, a report that could not be billed is withheld rather than delivered unpaid, and the status message says how many companies were not attempted.

### ⚖️ Is it legal to build a company intelligence report?

It collects information companies publish on their own websites, official website claims from Wikidata, and information people publish on a public professional profile that search engines index. That is generally lawful to collect. Personal data is still personal data: if you contact the people it finds, you are responsible for having a lawful basis, honouring opt outs, and complying with GDPR, the UK PECR rules, CAN-SPAM or whichever regime applies to you and to them. Use it for business contact, not for anything a person would find intrusive.

### 👍 Your feedback

If a company resolves to the wrong website, comes back with the wrong people, or a naming convention is read wrongly, open an issue on the Issues tab with the company and what you expected. Custom versions, a different output shape, or an integration built for your pipeline are all possible: get in touch.

### 🔎 You might also like

- [Company Domain Finder](https://apify.com/spookyweb/company-domain-finder): company name in, website out, with the evidence.
- [Company Data Enrichment](https://apify.com/spookyweb/company-enrichment): firmographics and technology stack from a company domain.
- [Decision Maker Finder](https://apify.com/spookyweb/decision-maker-finder): one row per person at a company, with a built email.
- [Company Email Finder](https://apify.com/spookyweb/company-email-finder): the addresses a company publishes, its naming convention and an MX check.
- [Lead List Enricher](https://apify.com/spookyweb/lead-list-enricher): a pasted company list enriched with website, contacts and firmographics in one run.
- [Website Contact Scraper](https://apify.com/spookyweb/website-contact-scraper): emails, phones and socials from any website.

# Actor input Schema

## `companies` (type: `array`):

One company per line, as a company name (Monzo Bank) or a website domain (wise.com). A name is matched to its own website through an evidence gate and Wikidata; a domain is verified and used as given. Up to 100 per run. A company that cannot be matched to its own website comes back as an unresolved row with the reason and is not charged.

## `roles` (type: `array`):

Which people to include in each report. leadership means founders, chief officers, managing directors, vice presidents and directors of any department, which is the usual meaning of decision maker. The department options return everyone found in that function at any level. any returns every person found. Choose up to three departments; a longer list is refused with a message rather than trimmed silently.

## `maxPeoplePerCompany` (type: `integer`):

The most people to include in one company's report, from 1 to 20. People are taken in the order the search engines rank them, which puts the strongest associations with the company first. The price per report is the same however many people it carries.

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

Collect the email addresses and phone numbers the company publishes on its own website, with the page each one came from. The email naming convention is read from the same pages either way. Turn this off if you only want the website, the firmographics and the people.

## `includeFirmographics` (type: `boolean`):

Collect the description, industry, employee range, founding year, legal name, postal addresses, registration numbers and social profiles the company publishes on its own site. Turn this off if you only want the website, the contacts and the people.

## Actor input object example

```json
{
  "companies": [
    "Monzo Bank",
    "wise.com"
  ],
  "roles": [
    "leadership"
  ],
  "maxPeoplePerCompany": 5,
  "includeContacts": true,
  "includeFirmographics": true
}
```

# Actor output Schema

## `reports` (type: `string`):

One row per company: status, the resolved website with its method, evidence and confidence, firmographics, published emails and phones, social profiles, the email naming convention with its confidence, and the people array with title, seniority, LinkedIn URL and built email.

# 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 = {
    "companies": [
        "Monzo Bank",
        "wise.com"
    ],
    "roles": [
        "leadership"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("spookyweb/company-intelligence-report").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 = {
    "companies": [
        "Monzo Bank",
        "wise.com",
    ],
    "roles": ["leadership"],
}

# Run the Actor and wait for it to finish
run = client.actor("spookyweb/company-intelligence-report").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 '{
  "companies": [
    "Monzo Bank",
    "wise.com"
  ],
  "roles": [
    "leadership"
  ]
}' |
apify call spookyweb/company-intelligence-report --silent --output-dataset

```

## MCP server setup

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

```

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/pcBEgHOfQpzeqaRvE/builds/9pG7nsFOuMzwkEZKh/openapi.json
