# UK Decision Maker Finder: Directors and Owners from Domains (`oski/uk-decision-maker-finder`) Actor

Turn UK company websites into named decision makers from the official Companies House register: current directors with roles and appointment dates, owners with their share bands, company status, SIC code and registered address, plus the contacts published on the site. No guessed emails.

- **URL**: https://apify.com/oski/uk-decision-maker-finder.md
- **Developed by:** [Oski](https://apify.com/oski) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $29.10 / 1,000 company with decision makers

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## UK Decision Maker Finder: Directors & Owners from Domains

Paste a list of UK company websites and get back the people who run each company, taken from the official Companies House register: named directors with roles and appointment dates, owners (persons with significant control) with their share bands, and the company's status, type, incorporation date, SIC code and registered address. You also get the emails, phones, social profiles and contact form published on the website. Built for agencies, B2B sales teams and recruiters who need the name of the person who signs off. In a test on 67 real UK small-business websites, 51 of 52 default-setting matches named the right company.

> **Part of the UK B2B lead suite.** [UK Planning Applications Scraper](https://apify.com/oski/uk-planning-applications-scraper) finds the building job, [Website Contact Finder](https://apify.com/oski/website-contact-finder) finds a company's published contacts, and **UK Decision Maker Finder** names the director who signs off.

### What you can use it for

- **Agencies** turning a list of local business websites into outreach addressed to a named director instead of "Dear Sir or Madam".
- **B2B sales teams** adding the named director and company number to every account in the CRM.
- **Recruiters and headhunters** finding who owns and runs a target employer.
- **Suppliers and wholesalers** checking a trade customer is an active company before extending credit.
- **Researchers** mapping ownership, SIC codes and company age across a sector.

### How to use it

1. Paste UK company websites under **Company websites**, one per line. Email addresses and Companies House links work too.
2. Or add **Companies House numbers** (`04948988`, `4948988` or `SC123456`); leading zeros are added for you.
3. Keep **Minimum match confidence** at Medium and click **Start**.
4. When it finishes, open the **Output** tab and download as CSV, Excel or JSON. The `status` and `notes` columns explain every row.

While it runs, the status line at the top of the run page shows progress (for example "Company 8 of 20. 6 matched with named decision makers so far."). When it finishes, the same line says what was found and explains anything that was skipped, so you never have to read the log.

### How much does it cost?

A $0.005 start fee per run, then **$0.03 per company matched with at least one named director or LLP member** at your chosen confidence. Parked domains, unmatched sites, below-confidence matches and companies with no active directors are returned for your records and never charged. Each row has a `charged` field so you can see exactly what you paid for.

| Companies matched with a named director | Cost |
|---|---|
| 100 | about $3.00 |
| 1,000 | about $30.00 |
| 10,000 | about $300.00 |

The maths: $0.005 + (1,000 x $0.03) = $30.005. Because misses are free, paste the whole list. In our 67-site test, 52 sites matched at the default setting, so 1,000 similar domains would cost roughly $23.

### Tested accuracy

On 67 real UK small-business websites with known company numbers:

| Match type | Matches | Correct |
|---|---|---|
| High confidence | 42 | 42 |
| Medium confidence | 10 | 9 |
| Low confidence (opt-in only) | 11 | 5 |

Every company number printed on a site was matched correctly (22 of 22). UK companies must print their registered number on their website; when a site does, the match is exact. When it does not, the register is searched by the site's name, the postcode on the site is checked against the registered office, and companies in liquidation, administration or strike-off are skipped. Low confidence matches are off by default because they were right only about half the time.

**No guessed emails.** You get only the addresses and numbers the company publishes on its own site. Nothing is invented, so nothing bounces because it was made up.

### Input

| Field | What it does |
|---|---|
| `domains` | UK company websites, one per line. Email addresses and Companies House links work too. |
| `companyNumbers` | Companies House numbers such as `04948988`, `4948988`, `SC123456`, or a Companies House link. |
| `minConfidence` | `high`, `medium` (default) or `low`. Controls which matches return directors and get charged. |
| `includeOwners` | Adds persons with significant control. On by default. |
| `includeSecretaries` | Lists company secretaries under officers. They never count as decision makers. |
| `includeResigned` | Also lists former directors and owners. Off by default. |
| `maxPagesPerDomain`, `maxSecondsPerDomain` | Advanced. Crawl budget per website, so one slow site cannot hang a run. |
| `proxyConfiguration` | Advanced. Used only for company websites. The register is read directly at a polite rate. |

A real job is a few hundred websites in this shape:

```json
{
  "domains": [
    "pdhcars.com",
    "heneagecars.com",
    "https://www.southernmotion.co.uk",
    "ukmgparts.com"
  ],
  "companyNumbers": ["14948988"],
  "minConfidence": "medium",
  "includeOwners": true
}
```

### Output

One record per website or company number:

```json
{
  "input": "torqueoxford.com",
  "domain": "torqueoxford.com",
  "status": "matched",
  "match_method": "name_search",
  "match_confidence": "medium",
  "company_number": "14948988",
  "company_name": "TORQUE (OXFORD) LTD",
  "company_status": "Active",
  "incorporated_on": "20 June 2023",
  "sic_codes": ["45112 - Sale of used cars and light motor vehicles"],
  "primary_decision_maker": "Ella Marie Willcox",
  "primary_decision_maker_role": "Director",
  "decision_makers": [
    {"name": "Ella Marie Willcox", "role": "Director", "appointed_on": "23 June 2023"},
    {"name": "Jeremy David Willcox", "role": "Director", "appointed_on": "20 June 2023"}
  ],
  "decision_maker_count": 2,
  "owners": [{"name": "Mrs Ella Marie Willcox", "natures_of_control": ["Ownership of shares: More than 25% but not more than 50%"]}],
  "website_emails": [],
  "companies_house_url": "https://find-and-update.company-information.service.gov.uk/company/14948988",
  "charged": true
}
```

Rows also include `company_type`, `registered_address`, `officers`, `website_phones`, `website_socials`, `linkedin_company`, `contact_form_url`, `number_found_on`, `notes` and `scraped_at`. `status` is one of `matched`, `matched_no_decision_makers`, `below_confidence`, `unmatched`, `blocked`, `unreachable`, `invalid` or `error`. The `notes` field explains anything unusual, such as a parked domain or a namesake company skipped because it is in liquidation.

### Tips for bigger runs

- **Paste hundreds of domains at once.** You pay only for matches, so there is no need to clean the list first.
- **Use company numbers when you have them.** A number goes straight to the register, skips the website crawl and always matches with high confidence if it exists.
- **Allow time for long lists.** Websites are processed one at a time, about 5 seconds each in our test, so 1,000 sites takes roughly 1.5 hours. Set the run timeout to match.
- **Keep Medium confidence** for outreach. Switch to High for compliance or credit checks where every row must be exact.
- **Set a per-run cost cap** in the run options for a hard budget. The actor stops cleanly when it is reached.

### Scheduling and integrations

Save a task and run it on an Apify schedule, then send results to Google Sheets, a webhook, Make, Zapier or your CRM through the Apify API. A minimal API call:

```bash
curl -X POST "https://api.apify.com/v2/acts/oski~uk-decision-maker-finder/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"domains": ["pdhcars.com", "heneagecars.com"], "minConfidence": "medium"}'
```

The sync endpoint waits up to 5 minutes. For long lists, start the run with `/runs` and read the dataset when it finishes.

### If something looks wrong

The status line at the end of every run explains anything that was skipped or came back empty. The common messages:

| Message | What to do |
|---|---|
| Input problem: ... | Something in the input needs changing, and the message says what. The run stopped before anything was charged. |
| N matched a company but not surely enough | Lower **Minimum match confidence** to Low to include weaker matches (check them by hand). |
| N could not be matched to a registered UK company | The site does not name its company clearly. Add the company number instead. |
| "..." is not a Companies House number | Numbers are 8 characters: digits, or two letters then six digits (SC123456). |
| N had websites that could not be opened | The site is down or blocks automated visits. Add its company number instead. |

Still stuck? Open an issue on the actor page with the run link and it gets looked at quickly.

### FAQ

**Is it legal?** Director and owner names are public on the Companies House register, and contacts come from the company's own public website. Dates of birth, nationalities and personal addresses are deliberately not collected. If you use the results for marketing, you are responsible for complying with UK GDPR and PECR, including your lawful basis and honouring opt-outs.

**Do I need an account or a Companies House API key?** Only an Apify account. No API key is needed.

**Why were some sites not matched?** The site may be parked, may not print a company number, or its trading name may be too far from the registered name to match safely. Those rows say why in `notes` and are free. Sole traders and partnerships are not on the register at all.

**How fresh is the data?** The register and the website are both read live at run time.

**Does it work outside the UK?** No. It covers companies and LLPs registered at Companies House (England, Wales, Scotland and Northern Ireland).

**What if it breaks?** Open an issue on the actor page and it gets fixed fast.

### Other scrapers from Oski

- [Website Contact Finder](https://apify.com/oski/website-contact-finder): emails, phones and socials for any list of websites worldwide. Only sites with a contact are charged.
- [UK Planning Applications Scraper](https://apify.com/oski/uk-planning-applications-scraper): fresh local building jobs by postcode or council, tagged by trade.
- [LinkedIn Ad Library Scraper](https://apify.com/oski/linkedin-ad-library-scraper) and [Google Ads Transparency Scraper](https://apify.com/oski/google-ads-transparency-scraper): see what a prospect is advertising before you call.

# Actor input Schema

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

UK company websites, one per line: acme.co.uk, www.acme.co.uk or a full link. Email addresses and Companies House links work too. Paste hundreds at once: you only pay for companies matched with a named director, about $30 for 1,000.

## `companyNumbers` (type: `array`):

Optional. Look companies up directly by Companies House number, one per line: 04948988, 4948988, SC123456, or a Companies House link. Leading zeros are added for you.

## `minConfidence` (type: `string`):

How sure the match between a website and a registered company must be before directors are returned and the company is charged. High: the site prints its company number, or the name and postcode both match. Medium adds strong name matches. Low adds weak name-only matches, which are wrong about half the time in testing.

## `includeOwners` (type: `boolean`):

Add the people and companies registered as owning or controlling the company, with their share and voting bands.

## `includeSecretaries` (type: `boolean`):

Company secretaries are listed in the officers field. Only directors and LLP members count as decision makers either way.

## `includeResigned` (type: `boolean`):

Also list people who have left the company. Off by default, because outreach to former directors is rarely useful.

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

Pages crawled per website to find published contacts and the company number: the homepage, contact and about pages, and up to two legal pages when the number is not on the homepage.

## `maxSecondsPerDomain` (type: `integer`):

Hard stop per website so one slow site can never hang the run.

## `proxyConfiguration` (type: `object`):

Used only for crawling company websites. The Companies House register is read directly at a polite rate.

## Actor input object example

```json
{
  "domains": [
    "torqueoxford.com",
    "monzo.com"
  ],
  "companyNumbers": [
    "14948988"
  ],
  "minConfidence": "medium",
  "includeOwners": true,
  "includeSecretaries": true,
  "includeResigned": false,
  "maxPagesPerDomain": 5,
  "maxSecondsPerDomain": 45,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

One row per website: registered company, match confidence, lead decision maker and role, company status, published emails and phones, and the Companies House link.

## `allFields` (type: `string`):

Every field for each company, including all officers, owners and SIC codes, as raw JSON.

# 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": [
        "pdhcars.com",
        "heneagecars.com",
        "southernmotion.co.uk",
        "ukmgparts.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("oski/uk-decision-maker-finder").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": [
        "pdhcars.com",
        "heneagecars.com",
        "southernmotion.co.uk",
        "ukmgparts.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("oski/uk-decision-maker-finder").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": [
    "pdhcars.com",
    "heneagecars.com",
    "southernmotion.co.uk",
    "ukmgparts.com"
  ]
}' |
apify call oski/uk-decision-maker-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,oski/uk-decision-maker-finder"
        }
    }
}
```

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/H8w0BMb4f2ccjOmPy/builds/o6vswiHDdfB9XgoTj/openapi.json
