# UK Companies House Change-Monitor (`nerolabs/uk-companies-house-monitor`) Actor

Watch a portfolio of UK companies on Companies House and get notified the moment something changes: a new filing, an officer or PSC change, a status change.

- **URL**: https://apify.com/nerolabs/uk-companies-house-monitor.md
- **Developed by:** [Adam Pearce](https://apify.com/nerolabs) (community)
- **Categories:** Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 company lookups

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

**Wondering if anything's changed at a company you're watching, without checking Companies House by hand every week?** Point this Actor at one or more UK company numbers and it tells you: a new filing, an officer appointed or resigned, a PSC (person with significant control) added or ceased, or a status change like active to dissolved. Run it once for a clean snapshot, or schedule it to run daily or weekly and it only reports what's actually new.

Data comes straight from [Companies House](https://find-and-update.company-information.service.gov.uk/), the UK's official company registry, via their own REST API. No scraping, no HTML parsing to break when a page redesigns.

### Why use UK Companies House Change-Monitor?

- **Credit and compliance teams** watching a portfolio of suppliers or counterparties for status changes (dissolution, administration, liquidation) before they become a problem.
- **KYB/due-diligence checks** that need a current director and PSC list, not a stale one.
- **Sales and recruiting** watching a target list of companies for new-officer signals (a new CFO or a hiring-relevant appointment).
- **Journalists and researchers** tracking filing activity around companies of interest.
- Runs on Apify's schedule, proxy, and API infrastructure, so it fits into an existing pipeline (webhook, Zapier, n8n, or a raw API call) without you writing any Companies House integration code yourself.

### How to use UK Companies House Change-Monitor

1. Click **Try for free** (or **Start**) on this page.
2. Enter one company number in **Company number**, or a list in **Company numbers** for bulk/Monitor mode.
3. For a one-time snapshot, leave **Monitor mode** off. For ongoing tracking, turn it on and schedule the Actor (Apify Console → Schedules) to run daily or weekly with the same company numbers and **Watchlist ID**.
4. Run it. Results land in the dataset, downloadable as JSON, CSV, Excel, or HTML.

### Input

- **Company number** (`companyNumber`) — a single 8-character Companies House number for a one-off lookup, e.g. `03977902`.
- **Company numbers** (`companyNumbers`) — a list of company numbers, for bulk lookups or Monitor mode.
- **Monitor mode** (`monitorMode`) — when on, the Actor remembers each company's filings, officers, and PSCs from the last run and reports only what changed. Off by default (plain lookup).
- **Watchlist ID** (`watchlistId`) — only needed if you're running more than one independent watchlist from the same account and want their history kept separate.

See the Input tab for the full schema.

### Output

One dataset item per company checked. Example, in Monitor mode, after a real change:

```json
{
    "companyNumber": "03977902",
    "companyName": "GOOGLE UK LIMITED",
    "companyStatus": "active",
    "companiesHouseUrl": "https://find-and-update.company-information.service.gov.uk/company/03977902",
    "notFound": false,
    "monitorMode": true,
    "isFirstCheck": false,
    "changeDetected": true,
    "changeSummary": "New filing: AP04 on 2026-06-01 (appoint-corporate-secretary-company-with-name-date).",
    "changes": ["New filing: AP04 on 2026-06-01 (appoint-corporate-secretary-company-with-name-date)."],
    "checkedAt": "2026-08-13T17:46:44.591Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Data table

| Field | Description |
|---|---|
| `companyNumber` | The Companies House number checked |
| `companyName` | Registered company name |
| `companyStatus` | Current status (`active`, `dissolved`, `liquidation`, etc.) |
| `companiesHouseUrl` | Direct link to the company's public Companies House page |
| `notFound` | `true` if the company number doesn't exist on the register |
| `monitorMode` | Whether this run used Monitor mode |
| `isFirstCheck` | `true` if this is the first time this company has been checked on this watchlist (baseline, not a real change) |
| `changeDetected` | `true` if something genuinely changed since the last check |
| `changeSummary` | Plain-English summary of what changed |
| `changes` | The same information as a list, one entry per change |
| `checkedAt` | Timestamp of this check |

### How much does it cost to monitor UK companies?

Pay-per-event pricing, no subscription:

- **$0.01** per company lookup (Monitor mode off).
- **$0.05** per change detected (Monitor mode on, something genuinely new).
- **$0.002** per no-change confirmation (Monitor mode on, nothing changed).

Watching 10 companies weekly in Monitor mode, with an average of one real change a month among them, costs roughly $0.002 × 10 × 4 + $0.05 × 1 ≈ **$0.13/month**. A one-off bulk lookup of 50 companies costs **$0.50**.

### Tips

- The first Monitor mode run on a new company establishes a baseline and won't report existing filings/officers/PSCs as "changes", that would just be noise. The one exception: a company that's already non-active (dissolved, in liquidation, etc.) on day one is flagged immediately, since that's real, actionable information.
- Keep the same **Watchlist ID** across scheduled runs, changing it starts a fresh baseline.
- Bulk lookups and Monitor mode both accept the same `companyNumbers` list, no need to run this Actor once per company.

### FAQ

**Is this legal?** Yes. Companies House explicitly makes this data available via a free public API for exactly this kind of reuse, commercial use included. This Actor doesn't scrape or store anything beyond what's needed to detect changes between runs.

**Does this cover Scotland and Northern Ireland companies?** Yes, Companies House is the single registry for all of the UK.

**What if a company number doesn't exist?** The result comes back with `notFound: true` rather than an error, so a bad number in a bulk list doesn't stop the rest of the run.

**Something looks off, or you need a different registry?** Open an issue on this Actor's Issues tab, checked daily. If you need a similar monitor for a different country's registry, mention it there too.

If this monitor caught something real for you, a review helps a lot and helps decide what to build next.

# Actor input Schema

## `companyNumber` (type: `string`):

Exact 8-character Companies House number, e.g. 03977902. Use this for a single-record lookup.

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

A list of exact Companies House numbers. Required for Monitor mode (that's what gives each company a stable identity to track over time). Also the fastest way to check many known companies in one run.

## `monitorMode` (type: `boolean`):

When true, the Actor remembers each company's filings, officers, and PSCs from the last run and reports only what's new: a new filing, an officer appointed or resigned, a PSC added or ceased, or a status change (e.g. active to dissolved). Returns a cheap no-change confirmation otherwise. Schedule this Actor to run daily or weekly with the same companyNumbers and watchlistId for ongoing monitoring. Requires companyNumber and/or companyNumbers.

## `watchlistId` (type: `string`):

Only needed if you're running more than one independent monitored watchlist from the same Apify account (e.g. one per client) and want their change history kept separate. Leave as default otherwise.

## Actor input object example

```json
{
  "companyNumber": "03977902",
  "companyNumbers": [],
  "monitorMode": false,
  "watchlistId": "default"
}
```

# Actor output Schema

## `dataset` (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 = {
    "companyNumber": "03977902"
};

// Run the Actor and wait for it to finish
const run = await client.actor("nerolabs/uk-companies-house-monitor").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 = { "companyNumber": "03977902" }

# Run the Actor and wait for it to finish
run = client.actor("nerolabs/uk-companies-house-monitor").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 '{
  "companyNumber": "03977902"
}' |
apify call nerolabs/uk-companies-house-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nerolabs/uk-companies-house-monitor"
        }
    }
}

```

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/OmTdThY8Dhj0OjPGt/builds/VjZBN6eQcY0w3Ca5T/openapi.json
