# UK Company Officer Changes: Director & PSC Alerts (`offerastudio/uk-company-officer-changes`) Actor

Watch up to 2,000 UK companies for director appointments and resignations, PSC (owner) changes, registered office, status and filing changes from the official Companies House API. First run saves a baseline, later runs return only changes. For KYC, AML and credit monitoring.

- **URL**: https://apify.com/offerastudio/uk-company-officer-changes.md
- **Developed by:** [Offera Studio](https://apify.com/offerastudio) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 company checkeds

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

### What does UK Company Officer Changes do?

**UK Company Officer Changes** watches a **list of UK companies** (up to 2,000) and tells you **when something changes** at **Companies House**: directors appointed or resigned, **persons with significant control (PSCs, the owners)** added or ceased, **changes to the nature of control**, a **new registered office**, a **change of company status** (for example **active to liquidation**), and **new filings** (accounts, confirmation statements, charges). It uses the **official Companies House Public Data API**: no scraping.

How it works: the **first run saves a baseline** of each company (officers, PSCs, registered office, status, recent filings) in a **named key-value store in your account**. **Every later run** compares each company with its saved baseline and returns **only the changes**.

### Who is it for?

- **KYC and AML teams**: be told when a customer's directors or owners change, instead of re-checking everyone.
- **B2B credit risk and supplier monitoring**: overdue accounts, a change of status or a new charge on a customer or supplier.
- **M\&A and private equity watchlists**: ownership (PSC) and board changes at targets and competitors.
- **Law firms and compliance consultants**: scheduled change alerts for clients' counterparties.

### How to use it

1. Click **Start** with the default input: five large UK companies (Tesco, BP, Barclays, HSBC Holdings, Unilever). The first run returns one **baseline saved** row for each.
2. Put your own **company numbers** (or **names**) in the list. Numbers are best: they are exact.
3. **Schedule** the Actor (daily is typical). From the second run on, you get a row **only for companies that changed**. Connect the dataset to Slack, e-mail or a webhook.

You need a free **Companies House API key** (developer.company-information.service.gov.uk), or use the owner's default key if the Actor has one. Without any key, the Actor returns an explanation and three made-up sample rows.

### What counts as a change?

| `changeTypes` value | Meaning |
| --- | --- |
| `officer-appointed` | A new director, secretary or other officer. |
| `officer-resigned` | An officer resigned (or an officer who was appointed and resigned between two runs). |
| `psc-added` | A new person or entity with significant control. |
| `psc-ceased` | A PSC ceased to be one. |
| `nature-of-control-changed` | The kind of control changed (for example shares from 25 to 50 percent to 50 to 75 percent), with `added` and `removed`. |
| `registered-office-changed` | New registered office address (`from` and `to`). |
| `status-changed` | Company status or status detail changed (for example `active` to `liquidation`). |
| `name-changed` | The company was renamed. |
| `accounts-overdue` | Accounts became overdue. |
| `confirmation-statement-overdue` | The confirmation statement became overdue. |
| `new-filing` | A new accounts, confirmation statement or charges (mortgage) filing; choose the categories with `watchFilings`. |

### Input example

```json
{
    "companyNumbers": ["00445790", "00102498", "SC123456"],
    "companyNames": ["Example Holdings"],
    "watchFilings": ["accounts", "confirmation-statement", "charges"],
    "includeUnchanged": false,
    "includeOfficerBirthMonth": false,
    "monitorName": "customers"
}
```

| Field | Meaning |
| --- | --- |
| `companyNumbers` | Companies House numbers. Leading zeros are added if you leave them out. |
| `companyNames` | Looked up with the Companies House search; the best match is used (active first, all words must appear in its name). The row says which name it came from. |
| `watchFilings` | `accounts`, `confirmation-statement`, `charges` (default all three). |
| `includeUnchanged` | Also return a row for companies with no changes (off by default; **on in the example input** so a first try shows rows). You pay for every checked company either way. |
| `includeOfficerBirthMonth` | Save and show officers' **month and year** of birth (never the day). Off by default. |
| `monitorName` | Names the key-value store (`uk-officer-changes-<name>`). Use different names for separate watchlists. |
| `apiKey` | Your free Companies House key (optional if the Actor has a default key). |

### Output example

The **first run** returns a baseline row per company. The **example below was produced by a local run against a stand-in for the Companies House API with made-up data** (a fictional company "EXAMPLE HOLDINGS PLC"): the live API needs a key that was not available when this README was written. The row format is the real one.

Baseline row (first run):

```json
{
    "companyNumber": "ZZ000001",
    "companyName": "EXAMPLE HOLDINGS PLC",
    "changeStatus": "baseline",
    "summary": "Baseline saved: 3 current officers, 2 persons with significant control, status active.",
    "changeTypes": [],
    "changes": [],
    "companyStatus": "active",
    "registeredOffice": "1 Example Street, London, ZZ99 1AA, England",
    "activeOfficers": 3,
    "activePscs": 2,
    "officers": [
        { "name": "EXAMPLE, Alex", "role": "director", "appointedOn": "2015-01-12", "birthMonth": null },
        { "name": "SAMPLE, Robin", "role": "secretary", "appointedOn": "2018-06-01", "birthMonth": null },
        { "name": "DEMO, Sam", "role": "director", "appointedOn": "2020-09-15", "birthMonth": null }
    ],
    "pscs": [
        { "name": "Example Parent Holdings Ltd", "notifiedOn": "2016-04-06", "natures": ["ownership-of-shares-25-to-50-percent"] },
        { "name": "Mr Alex Example", "notifiedOn": "2016-04-06", "natures": ["right-to-appoint-and-remove-directors", "voting-rights-25-to-50-percent"] }
    ],
    "accountsOverdue": false,
    "confirmationStatementOverdue": false,
    "previousCheckedAt": null,
    "companiesHouseUrl": "https://find-and-update.company-information.service.gov.uk/company/ZZ000001"
}
```

A later run in which an officer resigned and the company went into liquidation (shortened):

```json
{
    "companyNumber": "ZZ000001",
    "changeStatus": "changed",
    "summary": "DEMO, Sam resigned as director on 2026-10-05; Company status changed from active to liquidation",
    "changeTypes": ["officer-resigned", "status-changed"],
    "changes": [
        { "type": "officer-resigned", "summary": "DEMO, Sam resigned as director on 2026-10-05", "name": "DEMO, Sam", "role": "director", "date": "2026-10-05" },
        { "type": "status-changed", "summary": "Company status changed from active to liquidation", "from": "active", "to": "liquidation" }
    ],
    "companyStatus": "liquidation",
    "activeOfficers": 2,
    "previousCheckedAt": "2026-10-06T06:00:00.000Z"
}
```

The company numbers of the five default companies (Tesco 00445790, BP 00102498, Barclays 00048839, HSBC Holdings 00617987, Unilever 00041424) were checked against the public Companies House website on 7 October 2026.

### How much does it cost?

This Actor uses **pay per event**:

| Event | Price |
| --- | --- |
| Company checked (profile, officers, PSCs and filings read and compared) | **$0.002** |
| Info rows, error rows, companies that could not be checked, sample data | **free** |

- You pay for **every company checked**, whether or not it changed: a daily run for **100 companies costs $0.20 a day** (about $6 a month); **2,000 companies cost $4 per run**.
- A company that does not exist, a name that cannot be matched and a failed lookup are free.
- The Companies House API is free. Apify also charges a tiny standard start fee per run.
- Set **Maximum cost per run** and the Actor stops when it is reached.

### Limits and good practice

- **Speed**: Companies House allows **600 requests per 5 minutes** per key. Each company needs about **4 requests** (profile, officers, PSCs, filings), so a 2,000-company run takes about **1 hour 10 minutes**. Set the run timeout to at least 2 hours for big lists. The Actor waits and retries on HTTP 429.
- Runs of different watchlists that share one key share its rate limit.
- **Names are ambiguous**: for important lists use company numbers.

### Data and privacy

- Everything comes from the **public register** and nothing is added. The Actor does **not** return or store officers' addresses, nationality, occupation or day of birth.
- Officer **names and roles** are personal data under UK GDPR even though they are public. They are needed to say who was appointed or resigned. Use them for a lawful purpose (KYC, AML, credit checks) and follow your own data protection rules.
- **Month and year of birth** (as Companies House publishes them) are saved only if you turn `includeOfficerBirthMonth` on, and appear only in baseline rows.
- Snapshots are stored in a **named key-value store in your own Apify account**. Delete it to remove them.

### Limitations

- The **baseline** is what Companies House shows on the first run. Changes made before then are not reported.
- Only changes **between two runs** are visible: several edits between runs appear together.
- Filings are limited to the **newest 100** per company; the watched categories are accounts, confirmation statements and charges. Accounts and confirmation statement **overdue** flags come from the company profile.
- Companies House can correct or remove records; an officer that vanishes from the list is reported as no longer listed.
- **Not legal, credit or compliance advice.** Always check the original record on Companies House.

### FAQ

#### Is this official data?

Yes. It comes from the Companies House Public Data API.

#### Do I need an API key?

A free key from the Companies House Developer Hub, or the Actor owner's default key. Without one you only see sample data.

#### Why did I get a "baseline saved" row?

Because it was the first time the Actor saw that company (or you changed `watchFilings` or `includeOfficerBirthMonth`, which changes what is saved). It stores what it sees now and compares from the next run.

#### Why did my daily run return no rows?

Nothing changed. You are still charged for the companies checked. Turn on `includeUnchanged` to see a row per company.

#### Can I add companies to the list later?

Yes. New companies get a baseline row; the others keep their snapshots (as long as you use the same `monitorName`).

### More tools from the same developer

All pay-per-result, no proxy or login needed, built and maintained by the same developer:

**Website audits**

- [Website Accessibility Checker: WCAG 2.2 & EAA](https://apify.com/offerastudio/website-accessibility-audit): accessibility issues with fixes, SEO basics and security headers.
- [Cookie & Tracker Audit: GDPR Consent Checker](https://apify.com/offerastudio/cookie-tracker-audit): cookies and tracking tags that load before consent.
- [AI Crawler Access Checker: robots.txt & llms.txt](https://apify.com/offerastudio/ai-crawler-access-audit): which AI crawlers a site allows, plus llms.txt.
- [Structured Data Validator: Schema & Rich Results](https://apify.com/offerastudio/structured-data-validator): JSON-LD and Microdata checked against Google's rich result rules.
- [Website Change Monitor: Diffs, Prices & Alerts](https://apify.com/offerastudio/website-change-monitor): get a row only when a page changes, with a clean diff.
- [Policy Change Monitor: Privacy & Terms Tracker](https://apify.com/offerastudio/policy-change-monitor): privacy policy and terms changes, classified clause by clause.
- [SaaS Pricing Monitor: Track Competitor Plans](https://apify.com/offerastudio/saas-pricing-monitor): competitor pricing plans as structured data, with price-change diffs.
- [Sitemap Change Monitor: New & Removed URLs](https://apify.com/offerastudio/sitemap-change-monitor): new, removed and changed URLs from a site's sitemaps.
- [Site SEO Crawler: Broken Links & On-Page Audit](https://apify.com/offerastudio/site-seo-crawler-audit): site-wide crawl for broken links, redirects and on-page SEO issues.
- [Website Tech Stack Detector: Bulk Lead Filters](https://apify.com/offerastudio/website-tech-stack-detector): technologies used by websites, with filters for lead lists.
- [Domain Availability & Expiry Checker (RDAP)](https://apify.com/offerastudio/domain-whois-availability): domain availability, registrar and expiry dates from RDAP.
- [Status Page SLA Monitor: Uptime & Incidents](https://apify.com/offerastudio/status-page-sla-monitor): SaaS vendor uptime, incidents and a monthly SLA table from public status pages.

**Company data and compliance**

- [Company Contact Finder: Emails, Phones & Socials](https://apify.com/offerastudio/company-contact-finder): contact details published on company websites.
- [UK New Companies Feed: Companies House Daily](https://apify.com/offerastudio/uk-new-companies-feed): newly incorporated UK companies with sector filters.
- [EU VAT Number Validator: Bulk VIES Checker](https://apify.com/offerastudio/eu-vat-number-validator): bulk VAT checks with name, address and consultation number.
- [LEI Corporate Tree: GLEIF Parents & Subsidiaries](https://apify.com/offerastudio/gleif-lei-corporate-tree): LEI lookup with parents, subsidiaries and a KYC summary.
- [UK Company Distress Watch: Insolvency Alerts](https://apify.com/offerastudio/uk-company-distress-watch): administrations, liquidations and winding-up petitions from The Gazette.
- [IBAN Validator: Bulk Check & Bank Lookup](https://apify.com/offerastudio/iban-bank-validator): IBAN format and checksum, plus bank name and BIC where open data exists.
- [Sanctions Screening: OFAC, EU, UN & UK Lists](https://apify.com/offerastudio/sanctions-screening): names screened against official sanctions lists, with match scores.
- [OSHA & EPA Violation Monitor: Fines by Company](https://apify.com/offerastudio/osha-epa-violation-monitor): US OSHA and EPA enforcement cases and penalties by company.
- [Email List Precheck: Syntax, MX & Disposable Check](https://apify.com/offerastudio/email-list-precheck): cheap email list hygiene before a real verification.
- [FDA Warning Letters Monitor: By Company & Subject](https://apify.com/offerastudio/fda-warning-letters-monitor): FDA warning letters by company and subject, with cited regulations.
- [Supplier Risk Report: Sanctions, VAT & Insolvency](https://apify.com/offerastudio/supplier-risk-report): one risk row per supplier from eight official registers, with changes since last run.
- [Brand Impersonation Domain Monitor: Look-alikes](https://apify.com/offerastudio/brand-impersonation-domain-monitor): look-alike domains and certificates that imitate your brand, with a risk score.

**Media and AI**

- [Audio & Video Transcriber: Podcasts, SRT, Speakers](https://apify.com/offerastudio/audio-video-transcriber): audio, video, podcasts and social links to text, SRT and VTT.
- [Podcast Mention Alerts: Brand Mentions by Second](https://apify.com/offerastudio/podcast-mention-alerts): where your brand is said in new podcast episodes, with the exact second.
- [News Brand Mentions Monitor: New Articles Only](https://apify.com/offerastudio/news-brand-mentions-monitor): new news articles about your brand, people or topics.
- [YouTube Channel Monitor: New Videos & Growth](https://apify.com/offerastudio/youtube-channel-monitor): new videos and view growth of the channels you watch.

**Market signals**

- [US WARN Layoff Notices: 12 States Daily Feed](https://apify.com/offerastudio/us-warn-layoff-notices): layoff and plant closure notices from official state sources.
- [US Product Recalls Monitor: FDA & CPSC Feed](https://apify.com/offerastudio/us-product-recalls-monitor): FDA and CPSC recalls in one feed, with severity.
- [EU Tenders Feed: TED Public Procurement Alerts](https://apify.com/offerastudio/eu-tender-feed): EU public tenders from TED with CPV, country and value filters.
- [Liquor License Openings: New Bars & Stores (US)](https://apify.com/offerastudio/liquor-license-openings): new US liquor licences from official state open data.
- [Clinical Trials Change Monitor: Status & Updates](https://apify.com/offerastudio/clinicaltrials-change-monitor): status, enrollment and results changes on ClinicalTrials.gov studies.
- [Career Site Jobs Monitor: ATS Jobs & New Roles](https://apify.com/offerastudio/career-site-jobs-monitor): open roles from company career sites, with new and closed roles since the last run.
- [App Reviews Monitor: App Store & Google Play](https://apify.com/offerastudio/app-store-reviews-monitor): app reviews from both stores, only new ones in monitor mode.
- [US Federal Contracts Feed: SAM.gov & USAspending](https://apify.com/offerastudio/us-federal-contracts-feed): SAM.gov contract opportunities with the buyer's award history.
- [Grants.gov Opportunities: US Federal Grants Feed](https://apify.com/offerastudio/grants-gov-opportunities): US federal grant opportunities by keyword, eligibility and agency.
- [Federal Register Monitor: US Rules & Notices Feed](https://apify.com/offerastudio/federal-register-monitor): new US rules, proposed rules and notices by agency or topic.
- [B2B Sales Trigger Feed: Hiring + Tech Leads](https://apify.com/offerastudio/b2b-sales-trigger-feed): companies hiring for a role and using (or not using) a technology, with contacts.
- [Local Business Leads: OpenStreetMap, No Website](https://apify.com/offerastudio/local-business-leads-osm): local businesses by city and category, including those with no website.
- [Solana Token Pair Monitor: New & Trending Pairs](https://apify.com/offerastudio/solana-token-pair-monitor): new and trending Solana pairs with liquidity, volume and safety flags.

### Feedback

Missing a field you want to track? Open an issue on the **Issues** tab.

# Changelog

This Actor's version history is a separate document: https://apify.com/offerastudio/uk-company-officer-changes/changelog.md

# Actor input Schema

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

Your free REST API key from the Companies House Developer Hub (developer.company-information.service.gov.uk: register, create an application, create an API key). It is stored encrypted. Leave it empty to use the Actor owner's default key if one is set, or to see sample data.

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

Companies House numbers, 8 characters such as 00445790 or SC123456 (leading zeros are added if you leave them out). Up to 2,000 numbers and names together.

## `companyNames` (type: `array`):

Names are looked up with the Companies House search; the best match is used, active companies first, and all words you type must appear in its name. The row says which name it came from. Use numbers when you can: names can be ambiguous.

## `watchFilings` (type: `array`):

Report new filings in these categories. Accounts overdue and confirmation statement overdue are always reported.

## `includeUnchanged` (type: `boolean`):

Also return a row for companies with no changes (you pay for every checked company either way). Off for scheduled monitoring, so you only get rows when something changed. On in the example input so a first try always shows rows.

## `includeOfficerBirthMonth` (type: `boolean`):

Companies House publishes officers' month and year of birth (never the day). Off by default: it is personal data under UK GDPR. When on, it appears in the baseline row's officer list.

## `monitorName` (type: `string`):

Names the key-value store that holds the snapshots (uk-officer-changes-<name>). Use different names for separate watchlists. Leave empty for the default store: adding companies to the list never resets the others.

## `useSampleDataWithoutKey` (type: `boolean`):

Without an API key, return three made-up sample rows that show the output format (free).

## Actor input object example

```json
{
  "companyNumbers": [
    "00445790",
    "00102498",
    "00048839",
    "00617987",
    "00041424"
  ],
  "watchFilings": [
    "accounts",
    "confirmation-statement",
    "charges"
  ],
  "includeUnchanged": true,
  "includeOfficerBirthMonth": false,
  "useSampleDataWithoutKey": true
}
```

# Actor output Schema

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

No description

## `changes` (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",
        "00102498",
        "00048839",
        "00617987",
        "00041424"
    ],
    "includeUnchanged": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("offerastudio/uk-company-officer-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",
        "00102498",
        "00048839",
        "00617987",
        "00041424",
    ],
    "includeUnchanged": True,
}

# Run the Actor and wait for it to finish
run = client.actor("offerastudio/uk-company-officer-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",
    "00102498",
    "00048839",
    "00617987",
    "00041424"
  ],
  "includeUnchanged": true
}' |
apify call offerastudio/uk-company-officer-changes --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,offerastudio/uk-company-officer-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/gf7XCCmZCTC839dmt/builds/VwQqd7HgQbaQ1v0GG/openapi.json
