# UK Companies House ID Verification Checker & Monitor (ECCTA) (`ukdatakit/uk-companies-house-id-verification`) Actor

Check UK company directors and PSCs for Companies House identity verification: verified, due or overdue, due dates, days left and flags. Bulk company numbers or names, plus a watchlist monitor that reports status changes. Official API, no key needed.

- **URL**: https://apify.com/ukdatakit/uk-companies-house-id-verification.md
- **Developed by:** [Christopher Brown](https://apify.com/ukdatakit) (community)
- **Categories:** Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$10.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

## UK Companies House ID Verification Checker & Monitor (ECCTA)

Paste UK company numbers or names. For each company you get **every director and person with significant control (PSC), with their Companies House identity verification status and due date**, taken straight from the official Companies House register. You also get flags such as *due before 18 Nov 2026* and *due within 30 days*. **Monitor mode** watches a client book and reports only what changed since your last run.

No API key needed. $0.01 per company checked, whatever the number of people.

### Why it matters

Under the Economic Crime and Corporate Transparency Act 2023, identity verification became a legal requirement on **18 November 2025**. Existing directors verify with their company's next confirmation statement, during a transition that ends on **18 November 2026**; PSCs have their own 14-day windows. Each person's due date is on the register, and this actor reads it. Sources: [GOV.UK: when you need to verify](https://www.gov.uk/guidance/when-you-need-to-verify-your-identity-for-companies-house), [GOV.UK news, rollout from 18 Nov 2025](https://www.gov.uk/government/news/companies-house-confirms-identity-verification-rollout-from-18-november-2025), [SI 2025/1118 reg. 4](https://www.legislation.gov.uk/uksi/2025/1118/regulation/4/made).

### Who uses this

- **Accountants, company secretaries and ACSPs**: build a chase list for the whole client book before confirmation statements are due.
- **KYC, onboarding and credit teams**: check whether a counterparty's directors are verified.
- **Lenders and investors**: monitor a portfolio and get alerts when verification is removed or overdue.

### Inputs

| Input | Default | Notes |
|---|---|---|
| Mode | `check` | `monitor` saves a snapshot per watchlist and then reports changes |
| Company numbers | `00445790`, `04366849` | Leading zeros added automatically; `SC`, `NI`, `OC` prefixes are fine |
| Company names | – | Uses the Companies House search; checks the top match (or more) |
| Flag due on or before | `2026-11-18` | Sets `dueBeforeCutoff` |
| Flag due within (days) | `30` | Sets `dueWithinDays` |
| Include PSCs / former / only outstanding | yes / no / no | |
| Watchlist name | `default` | Keep separate snapshots per client book |
| Max companies | `100` | Up to 2,000 per run. Default run timeout is 1 hour, which fits about 2,000 companies |
| Your own Companies House API key | – | Optional. Books over about 500 companies run faster with your own free Companies House key, because our key's rate limit is shared by everyone using this actor |

### Output

One item per company (the **Companies** view). The **People** view gives one row per person.

```json
{
  "companyNumber": "00445790", "companyName": "TESCO PLC", "companyStatus": "active", "overallStatus": "all-verified",
  "peopleInScope": 10, "verifiedCount": 10, "outstandingCount": 0, "overdueCount": 0,
  "earliestDueOn": null, "anyDueBeforeCutoff": false, "confirmationStatementNextDue": "2027-07-02",
  "statusCounts": {"not-required": 1, "verified": 10},
  "people": [
    {"name": "BETHELL, Melissa", "roleType": "officer", "role": "director", "verificationStatus": "verified",
     "verificationDueOn": null, "daysUntilDue": null, "dueBeforeCutoff": false, "dueWithinDays": false,
     "identityVerifiedOn": "2025-07-29", "verificationStatementSuppliedOn": "2026-07-01", "verifiedViaAgent": "DE PINNA LLP ACSP"},
    {"name": "TAYLOR, Christopher Jon", "roleType": "officer", "role": "secretary", "verificationStatus": "not-required"}
  ],
  "changeType": null, "searchQuery": null, "registerUrl": "https://find-and-update.company-information.service.gov.uk/company/00445790"
}
```

(Trimmed real output from a live run on 23 Oct 2026: the values shown match the sample file, but some fields and 9 of Tesco's 11 people are left out. `samples/sample_check_live_2026-10-23.json` has the full run: a live plc, a dissolved company, a company with overdue directors, a name search, an invalid number and a number that does not exist. `samples/sample_monitor_live_2026-10-23.json` is a real two-run monitor test. Nothing changed between the runs, so it shows a baseline and `unchanged` rows, not a change.)

**Person `verificationStatus`**

- `verified`: a verification statement is on the register.
- `due`: there is a due date and it has not passed.
- `overdue`: the due date has passed and there is no statement.
- `no-date-published`: in scope, but the register has no date yet. For directors, see the confirmation statement date.
- `verification-removed`: the statement was removed.
- `not-required`: for example, a secretary.
- `not-in-scope-yet`: corporate officers or corporate/legal PSCs. Companies House will phase these in later.
- `former`: resigned or ceased.

**Company `overallStatus`** is `all-verified`, `action-needed`, `overdue`, `no-people-in-scope` or `company-closed` (dissolved or closed: nobody needs to verify, so nobody is flagged).

Rows that could not be checked are free and carry an `error` message: `not-found` (no such company number), `invalid-number` (not 8 characters, so it is never sent to Companies House) or `error` (Companies House did not answer). For company names, `searchQuery` shows which name led to the company. The search always returns its closest match, so check the number is the one you meant.

**Monitor mode:** the first run of a watchlist saves a baseline and outputs every company with `changeType: "baseline"`. Later runs output only companies with changes (`changeType: "changed"`). Each change in `changes[]` is one of:

- `status-changed`
- `due-date-changed`
- `person-added`
- `person-removed`

Example (mock) change row, from the offline test data, not a real company:

```json
{"companyNumber": "00000001", "changeType": "changed", "changes": [{"name": "JONES, Bob", "role": "director",
  "change": "status-changed", "previousStatus": "due", "newStatus": "verified", "previousDueOn": "2026-11-14", "newDueOn": "2026-11-14"}]}
```

Schedule a weekly run under Apify → Schedules.

### What Companies House publishes (and what we use)

For each officer appointment and PSC notification, the official Public Data API returns `identity_verification_details` with these fields:

- `appointment_verification_statement_due_on`
- `appointment_verification_statement_date` (PSCs only: when their window opens)
- `appointment_verification_start_on`
- `appointment_verification_end_on`
- `identity_verified_on`
- `authorised_corporate_service_provider_name`

We report these fields as published and do not infer anyone's identity.

### Pricing

**$0.01 per company checked**, including all its directors and PSCs. Companies that are not found are free. There is no start fee and no platform usage charge. In monitor mode every company on the watchlist counts as checked on each run, even when nothing changed. A 200-client book checked weekly costs $2 per run.

### Speed and limits

Companies House allows 600 requests per 5 minutes. A company needs about 3 requests, so a run handles about 180 companies per 5 minutes. The actor paces itself and backs off automatically if it gets HTTP 429. The default input finishes in seconds. Runs are capped at 2,000 companies, and the default run timeout is 1 hour. The key is shared by all users, so books over about 500 companies run faster with your own free key (see Inputs).

### Lawful use and personal data

- Director and PSC details are **public register data** that Companies House publishes so the public can see who runs and controls UK companies.
- We keep only what is needed for the check: name, role, appointment or notification date, nature of control (for PSCs) and the verification fields above. We do **not** output addresses or dates of birth, even where the API provides them, and we do not add data from any other source.
- If you are subject to UK GDPR, you need your own lawful basis, typically **legitimate interests**, such as client compliance, KYC or due diligence. Use the output for that purpose only. Do not use it to profile individuals, for direct marketing to individuals, or to build people databases. Keep it no longer than you need. See Companies House's guidance on [using register data](https://www.gov.uk/government/organisations/companies-house/about/personal-information-charter).

### Licence, attribution and disclaimer

Contains public sector information from Companies House licensed under the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/). This actor is not affiliated with or endorsed by Companies House.

**Not legal advice.** Statuses reflect the register at the time of the run and can lag behind filings. For your own obligations, check GOV.UK or ask a professional adviser.

# Actor input Schema

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

Check returns every company with its directors and PSCs. Monitor saves a snapshot per watchlist and, on later runs, returns only companies where someone's verification status or due date changed, or a person was added or removed. Schedule it daily or weekly.

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

UK company numbers, e.g. 00445790 or SC123456. Leading zeros are added if missing.

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

Optional. Each name is looked up with the Companies House search; the top match(es) are checked. Check the returned company number is the one you meant.

## `searchResultsPerName` (type: `integer`):

How many search matches to check for each company name.

## `dueBefore` (type: `string`):

People with an unverified due date on or before this date get dueBeforeCutoff = true. Default: end of the 12-month transition, 18 Nov 2026.

## `dueWithinDays` (type: `integer`):

People due within this many days from today get dueWithinDays = true.

## `includePscs` (type: `boolean`):

Also check people with significant control.

## `onlyOutstanding` (type: `boolean`):

Drop verified and out-of-scope people from the people list (company counts then reflect only outstanding people).

## `includeFormer` (type: `boolean`):

Include former directors and PSCs (marked 'former').

## `watchlistName` (type: `string`):

Each watchlist keeps its own snapshot, so you can monitor several client books separately.

## `emitUnchanged` (type: `boolean`):

By default monitor runs output only baseline and changed companies.

## `maxCompanies` (type: `integer`):

Stop after this many companies (maximum 2,000). Runs go at about 180 companies per 5 minutes (Companies House rate limit), so 2,000 companies take close to an hour, which is the default run timeout. Split bigger books into several watchlists or runs.

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

Not needed. Leave empty to use ours. Books over about 500 companies run faster with your own free Companies House key (developer.company-information.service.gov.uk), because our key's rate limit is shared by everyone using this actor.

## `asOfDate` (type: `string`):

For what-if checks: compute overdue / days left as of this date instead of today.

## Actor input object example

```json
{
  "mode": "check",
  "companyNumbers": [
    "00445790",
    "04366849"
  ],
  "searchResultsPerName": 1,
  "dueBefore": "2026-11-18",
  "dueWithinDays": 30,
  "includePscs": true,
  "onlyOutstanding": false,
  "includeFormer": false,
  "watchlistName": "default",
  "emitUnchanged": false,
  "maxCompanies": 100
}
```

# Actor output Schema

## `results` (type: `string`):

One item per company with its directors and PSCs and their identity verification status (check mode), or baseline/changed companies (monitor mode).

## `people` (type: `string`):

Directors and PSCs flattened to one row per person.

# 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",
        "04366849"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ukdatakit/uk-companies-house-id-verification").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",
        "04366849",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("ukdatakit/uk-companies-house-id-verification").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",
    "04366849"
  ]
}' |
apify call ukdatakit/uk-companies-house-id-verification --silent --output-dataset

```

## MCP server setup

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

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/QWxN2BFZtpmpDufwY/builds/C2h2SLEr5a1l2sxE7/openapi.json
