SKILLMERC tools

Companies House Monitor - UK Filing, Director & PSC Alerts

Watch UK companies and officers on Companies House. Get one row, webhook or Slack message per change: new filings, director moves, PSC, charges, status, address, name. $0.02 per alert.

USD 20 per 1,000 alerts on Apify (pay per event)

Open in Apify StoreExample: Watch UK companies for director and owner changes


Watch a list of UK companies and get told only when something changes. Each run compares the live Companies House register against the snapshot from the previous run and writes one row per change: a new filing, a director appointed or resigned, a new person with significant control, a charge registered or satisfied, a status change such as liquidation or dissolution, a registered office move, or a name change.

Nothing changed? The run writes nothing and you pay almost nothing. Data comes from the official Companies House REST API, not from scraped HTML. A built-in API key is included, so there is no setup.

Common uses

What it watches

| Watch option | Alert types produced | | - -| - -| | new_filings | new_filing (any document added to the filing history, with a PDF link) | | officers | officer_appointed, officer_resigned | | psc | psc_added, psc_ceased, psc_changed (natures of control changed) | | status | status_change (active, liquidation, administration, dissolved, receivership and so on) | | registered_office | registered_office_change | | charges | charge_created, charge_status_change (for example outstanding to fully-satisfied) | | name_change | name_change |

You can also watch people. Add Companies House officer IDs in officerIds and you get officer_new_appointment and officer_appointment_resigned alerts whenever that person joins or leaves the board of any company.

How to schedule it

  1. Run the actor once with your company numbers and a watchlistName. The first run saves a baseline and reports nothing, unless you set initialLookbackDays (see below).
  2. In Apify Console open the actor, click Schedule, and pick an interval. Daily is enough for most watchlists; Companies House updates the register during UK working hours. Hourly works too.
  3. Optional: put a Slack incoming webhook URL or your own HTTPS endpoint in the input to receive each run's alerts as a push message.

Every scheduled run reuses the same watchlistName, so it always compares against the previous run. The snapshot lives in a key-value store named companies-house-monitor-<watchlistName> in your account. Delete that store to start over.

If you leave watchlistName empty, the name is derived from the list of company numbers. That means editing the list starts a fresh baseline, so naming the watchlist is better.

Initial lookback

Set initialLookbackDays to a number such as 30 and the first run also reports everything dated within that window: filings, appointments, resignations, PSC notifications, charges, dissolutions and past name changes. This gives you a useful first result straight away and lets you check the output format before scheduling. Later runs ignore this setting and report only what is new since the previous run.

Input

| Field | Type | Default | Description | | - -| - -| - -| - -| | companyNumbers | array | | Company numbers to watch, for example 00102498. | | officerIds | array | [] | Optional officer IDs (the part after /officers/ in a Companies House URL). | | watch | array | all | Which change types raise alerts. | | initialLookbackDays | integer | 0 | On the first run, also report changes dated within this many days. | | watchlistName | string | | Name of the watchlist. Keeps the snapshot between runs. | | webhookUrl | string | | HTTPS endpoint that receives a JSON POST per run with the summary and alerts. | | slackWebhookUrl | string | | Slack incoming webhook. One message per run. | | maxAlertsPerRun | integer | 500 | Upper bound on alerts delivered and charged in a single run. | | apiKey | string | | Optional. Your own Companies House API key if you want your own rate limit. |

Output

One dataset row per change. Example (a real row from a test run):

{
  "watchlist": "my-portfolio",
  "company_number": "00102498",
  "company_name": "BP P.L.C.",
  "company_url": "https://find-and-update.company-information.service.gov.uk/company/00102498",
  "change_type": "new_filing",
  "summary": "New filing SH04: capital sale or transfer treasury shares with date currency capital figure",
  "before": null,
  "after": {
    "type": "SH04",
    "category": "capital",
    "date": "2026-10-02",
    "description": "capital sale or transfer treasury shares with date currency capital figure"
  },
  "filing_type": "SH04",
  "filing_date": "2026-10-02",
  "filing_url": "https://find-and-update.company-information.service.gov.uk/company/00102498/filing-history/MzU0NjI4NTM1MmFkaXF6a2N4/document?format=pdf&download=0",
  "detected_at": "2026-10-06T07:02:24.569Z",
  "run_id": "abc123"
}

An officer change looks like this:

{
  "company_number": "00102498",
  "company_name": "BP P.L.C.",
  "change_type": "officer_resigned",
  "summary": "Officer resigned: ASHDOWN, Hannah (secretary) on 2020-05-31",
  "before": { "name": "ASHDOWN, Hannah", "role": "secretary", "appointed_on": "2018-01-01", "resigned_on": null },
  "after": { "name": "ASHDOWN, Hannah", "role": "secretary", "appointed_on": "2018-01-01", "resigned_on": "2020-05-31" },
  "filing_date": "2020-05-31"
}

before and after hold the old and new values for the thing that changed. filing_url is present for filing alerts and opens the document on the Companies House website.

The run also stores a summary in the OUTPUT record of the run's key-value store:

{
  "watchlist": "my-portfolio",
  "baseline": false,
  "companies_checked": 4,
  "not_found": [],
  "changes_detected": 3,
  "alerts_delivered": 3,
  "alerts_skipped": 0
}

Webhook payloads

webhookUrl receives one POST per run: the summary above plus run_id and an alerts array of the rows. Nothing is sent when a run has no alerts (except the first baseline run, which sends the summary).

slackWebhookUrl receives a short message listing up to 20 changes with document links.

Pricing

You pay per alert, not per company. Each change row written to the dataset costs USD 0.02. Each run also costs USD 0.001 to start, which covers checking your whole list when nothing changed. Platform usage is included.

Example: a daily schedule watching 50 companies that together produce 10 changes a month costs about USD 0.20 for the alerts plus USD 0.03 for the 30 runs. The first baseline run writes no alert rows and is charged only the start fee, unless you use initialLookbackDays.

Limits and notes


Run it on Apify Apify's free plan includes monthly platform credit, so small runs cost little or nothing to try.