# UK Director & Ownership Changes (Companies House) (`best_actors/uk-director-ownership-changes`) Actor

Watch UK companies for new or departing directors and secretaries, and for changes of owner (PSC). One row per change with dates and details. Pay only for changes found.

- **URL**: https://apify.com/best_actors/uk-director-ownership-changes.md
- **Developed by:** [Lewis O'Rorke](https://apify.com/best_actors) (community)
- **Categories:** Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/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 Director & Ownership Changes (Companies House)

**Track new and departing directors and changes of owner at UK companies,
either for a watchlist you choose or across the whole UK, filtered by area and
industry. One row per change, with the date, the person and their role, straight
from the official Companies House register.**

A new director is a new decision-maker. A departing one can mean a change of
direction. A new owner can mean a takeover. If you sell to, lend to, insure or
monitor UK companies, these are the moments that matter, and Companies House
publishes every one of them. This Actor works two ways:

- **Watchlist:** checks the companies you list and tells you exactly what
  changed since the date you choose.
- **Market-wide feed:** reads every change across the UK in the last 1 to 48
  hours from Companies House's live data stream, and keeps the ones in your
  area and industries. Thousands of changes happen every day.

***

### At a glance

| | |
|---|---|
| **You give it** | A list of company numbers to watch, or nothing at all for the whole-UK daily feed |
| **You get** | One row per director appointment or resignation, or owner (PSC) added or removed, with dates |
| **Price** | $0.01 per change; $0.03 per feed scan (you only pay for results) |
| **Data source** | Companies House (official UK register and its live streaming feed) |
| **Best for** | KYC and compliance checks, sales triggers, investor monitoring |

***

### Who it is for

- **Banks, lenders and insurers** keeping customer records current (KYC and ongoing due diligence)
- **Accountants and solicitors** watching client companies
- **B2B sales teams** who want to reach a new director in their first weeks
- **Investors and analysts** tracking boards and ownership
- **Compliance teams** monitoring suppliers and counterparties

***

### What you get for each change

| Field | What it means |
|---|---|
| `change_type` | `officer_appointed`, `officer_resigned`, `owner_added` or `owner_removed` |
| `change_date` | When it happened |
| `person_name` | The person or company, in normal "First Last" order |
| `role` | Director, secretary, LLP member, or person with significant control (owner) |
| `natures_of_control` | For owners: how they control the company, e.g. "ownership of shares 75 to 100 percent" |
| `nationality`, `country_of_residence`, `birth_month_year`, `occupation` | As published by Companies House |
| `appointed_on`, `resigned_on` | The person's full dates at the company |
| `company_name`, `company_number`, `company_status`, `registered_office`, `postcode`, `sic_codes` | The company |
| `companies_house_url` | The company's official page |

"Owner" here means a **person with significant control (PSC)**: anyone who
holds more than 25% of the shares or votes, can appoint or remove the board,
or otherwise controls the company.

***

### How to use it: market-wide feed

1. Set **Mode** to **Market-wide feed**.
2. Choose **Changes in the last N hours** (up to 48; default 24).
3. Narrow it with **Town or city**, **Postcode areas**, **Country**,
   **Industries** or **SIC codes**, and pick which changes you want.
4. Click Start. Reading a day of changes takes a few minutes; matches then
   appear in the Output tab, newest first.
5. Schedule it daily with a 24-hour look-back and you'll see every new director
   and owner in your patch, every morning.

**Example: every new director and owner in London in the last 24 hours**

```json
{ "mode": "feed", "hoursBack": 24, "locality": "London", "changeTypes": ["officer_appointed", "owner_added"], "maxChanges": 500 }
```

***

### How to use it: watchlist

#### 1. List your companies

Paste company numbers (`00445790`, `SC095000`) or Companies House links, one
per line. Numbers without leading zeros are fine (`445790`). Up to 1,000 per run.

#### 2. Choose the period

**Changes in the last N days** (default 30), or a **Changes since** date.

#### 3. (Optional) Choose which changes

Leave empty for all four, or pick only appointments, resignations, or owner changes.

#### 4. Click Start

Results appear in the Output tab, newest first. A watchlist of 100 companies
usually takes about two minutes.

#### 5. Run it on a schedule

Create a weekly schedule with **Changes in the last 7 days** and connect it to
email, Slack, Google Sheets or your CRM. You only hear about real changes.

***

### Ready-made examples

**FTSE retailers, last 12 months**

```json
{ "companyNumbers": ["00445790", "00185647", "04256886", "04412362", "07098618"], "daysBack": 365 }
```

**Board changes at UK banks since 1 January 2025**

```json
{ "companyNumbers": ["00048839", "00617987", "SC095000", "SC045551"], "since": "2025-01-01", "changeTypes": ["officer_appointed", "officer_resigned"] }
```

**Ownership changes only, your client list, last 90 days**

```json
{ "companyNumbers": ["<your client company numbers>"], "daysBack": 90, "changeTypes": ["owner_added", "owner_removed"] }
```

***

### Sample output

One row from a real run, trimmed to the main fields. Names and contact details here are made-up examples. Every field is described above.

```json
{
  "company_name": "EXAMPLE TECH LTD",
  "company_number": "12345678",
  "locality": "London",
  "change_type": "officer_appointed",
  "change_date": "2026-11-01",
  "person_name": "Alex Taylor",
  "role": "director",
  "appointed_on": "2026-11-01",
  "companies_house_url": "https://find-and-update.company-information.service.gov.uk/company/12345678"
}
```

***

### One-click examples

Open one of these ready-made tasks, check the inputs, and click **Start**. Each is a good starting point you can change.

- [Board changes at major UK banks (12 months)](https://apify.com/best_actors/uk-director-ownership-changes/uk-banks-board-changes)
- [Board changes at UK supermarkets (12 months)](https://apify.com/best_actors/uk-director-ownership-changes/uk-supermarkets-board-changes)
- [Director changes at FTSE companies (90 days)](https://apify.com/best_actors/uk-director-ownership-changes/ftse-sample-director-changes)
- [Ownership (PSC) changes: UK retailers](https://apify.com/best_actors/uk-director-ownership-changes/uk-retail-ownership-changes)
- [Weekly check: what changed at my companies](https://apify.com/best_actors/uk-director-ownership-changes/weekly-watchlist-check)
- [New directors in the last 30 days](https://apify.com/best_actors/uk-director-ownership-changes/new-directors-this-month)
- [Board changes at BT and Vodafone](https://apify.com/best_actors/uk-director-ownership-changes/uk-telecoms-board-changes)
- [Board changes at UK insurers](https://apify.com/best_actors/uk-director-ownership-changes/uk-insurers-board-changes)

***

### Pricing

| Event | Price |
|---|---|
| Change | $0.01 |
| Feed scan | $0.03 |

For example, 50 changes cost $0.50; a whole-UK feed run that finds changes adds one $0.03 feed scan.

You pay **per change found**. Market-wide feed runs also have one small
**feed scan** charge, only when the run finds at least one change, because each
one reads a full day of Companies House's live data. You are never charged for companies with no
changes, company numbers that don't exist, or a run that finds nothing. Set a
maximum cost per run and the Actor stops cleanly when it's reached.

No Companies House account or API key needed. Works with AI agents, including
x402 pay-per-call payments.

***

### Honest limits

- **Dates are the dates Companies House records,** which is when the change
  took effect, not when it was filed. A change filed late appears with its
  real (earlier) date.
- **The feed reaches back 48 hours at most,** because Companies House's live
  stream only keeps a few days of history. A change filed today but dated
  earlier than the window isn't included.
- **Feed runs with tight area filters take longer,** because each change's
  company is looked up to check its location.
- **Very large companies are capped** at 1,000 officers and 1,000 owners per
  list, which covers almost every company.
- **Owner statements** (for example "the company knows of no PSC") are not
  reported as changes.
- **Companies House does not publish full dates of birth or home addresses,**
  and this Actor does not try to find them.

***

### FAQ

**Does it find new directors across a whole town or industry?**
Yes, use the market-wide feed. It covers the last 48 hours at most, so run it
daily for a continuous record.

**Why is a secretary listed under officer_appointed?**
Directors, secretaries and LLP members are all "officers" at Companies House.
Use the `role` field to tell them apart.

**Something is wrong or missing.**
Open an issue on the Issues tab with your run link.

# Actor input Schema

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

Watchlist checks the companies you list. The market-wide feed reads every change across the UK in the last hours, filtered by area and industry.

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

Watchlist mode: company numbers (e.g. 00445790, SC095000) or Companies House links, one per line. Up to 1,000.

## `daysBack` (type: `integer`):

Ignored if you set a date below.

## `since` (type: `string`):

Optional. Report changes on or after this date.

## `changeTypes` (type: `array`):

Leave empty for all four.

## `hoursBack` (type: `integer`):

Market-wide feed only. Up to 48 hours. Run it daily on a schedule to never miss a change.

## `locality` (type: `string`):

Market-wide feed only. Registered office town, e.g. Bristol. Fastest way to target an area.

## `postcodePrefixes` (type: `array`):

Market-wide feed only. Postcode areas or districts, e.g. M, SK, BS1. A single district (M14) is fast; whole areas (M) work but are slower.

## `country` (type: `string`):

Market-wide feed only. Optional.

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

Market-wide feed only. Leave empty for all trading industries. Shells, holding companies and property vehicles are always left out.

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

Market-wide feed only. Specific SIC codes, e.g. 43220 for plumbers. Combined with the industries above.

## `maxChanges` (type: `integer`):

Market-wide feed only. The run stops once this many changes are delivered. You pay per change.

## `companiesHouseApiKey` (type: `string`):

Not needed. A free key from developer.company-information.service.gov.uk gives very large watchlists their own rate limit.

## Actor input object example

```json
{
  "mode": "watchlist",
  "companyNumbers": [
    "00445790",
    "00185647",
    "04256886"
  ],
  "daysBack": 30,
  "hoursBack": 24,
  "industries": [
    "trades"
  ],
  "sicCodes": [],
  "maxChanges": 100
}
```

# Actor output Schema

## `changes` (type: `string`):

No description

## `all` (type: `string`):

No description

# 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 = {
    "companyNumbers": [
        "00445790",
        "00185647",
        "04256886"
    ],
    "industries": [
        "trades"
    ],
    "sicCodes": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("best_actors/uk-director-ownership-changes").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 = {
    "companyNumbers": [
        "00445790",
        "00185647",
        "04256886",
    ],
    "industries": ["trades"],
    "sicCodes": [],
}

# Run the Actor and wait for it to finish
run = client.actor("best_actors/uk-director-ownership-changes").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 '{
  "companyNumbers": [
    "00445790",
    "00185647",
    "04256886"
  ],
  "industries": [
    "trades"
  ],
  "sicCodes": []
}' |
apify call best_actors/uk-director-ownership-changes --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,best_actors/uk-director-ownership-changes"
        }
    }
}
```

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/a5tnbNY6StwcmlWrW/builds/JbYCspDKgr8Ir9kes/openapi.json
