# UK Company Due Diligence Pack (Companies House) (`fixpack/uk-company-due-diligence`) Actor

One row per UK company: profile, officers, PSC, charges and risk flags from the official Companies House API.

- **URL**: https://apify.com/fixpack/uk-company-due-diligence.md
- **Developed by:** [Renier Gerber](https://apify.com/fixpack) (community)
- **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 packs

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 Company Due Diligence Pack (Companies House)

Turn a list of UK company numbers or names into **one clean row per company**: status, key dates, registered office, SIC codes, active officers, persons with significant control (PSC), charges, and a ready-made `risk_flags` array. Data comes straight from the **official Companies House Public Data REST API**, not from scraping web pages.

### Who it's for

- **KYB / compliance teams**: quick first-pass checks on counterparties, with beneficial-ownership (PSC) data included.
- **B2B sales and RevOps**: qualify and screen UK leads (is the company active, are accounts overdue, is it newly incorporated?).
- **Procurement and supplier checks**: monitor suppliers for dissolution, insolvency, overdue filings and outstanding charges.

### What it does

1. Accepts company numbers (e.g. `00445790`) and/or company names. Names are resolved with the Companies House search endpoint: an exact name match on an active company wins, then an exact match on an inactive one, then the top active result. The result records `match_confidence` (`exact`, `exact_inactive`, `fuzzy`, or `company_number` if you supplied a number). Always review `fuzzy` matches.
2. Fetches the profile, and optionally officers, PSC and charges.
3. Computes risk flags and outputs one dataset item per company.
4. Throttles requests below the documented API limit (600 requests per 5 minutes) and retries on HTTP 429 and 5xx with backoff.

### Input

| Field | Description |
|---|---|
| `apiKey` | Your free Companies House API key (secret). Or set env `CH_API_KEY`. |
| `companyNumbers` | List of company numbers (short numeric ones are zero-padded). |
| `companyNames` | List of names to resolve. |
| `includeOfficers` / `includePSC` / `includeCharges` | Default `true`. Turn off to reduce API calls. |
| `maxItems` | Max companies processed (default 100). |

You need your own free API key from the Companies House developer hub (register an application and create a REST key).

### Output fields

`company_number`, `company_name`, `status`, `status_detail`, `type`, `date_of_creation`, `date_of_cessation`, `registered_office`, `registered_office_in_dispute`, `sic_codes`, `accounts_next_due`, `accounts_overdue`, `confirmation_statement_next_due`, `confirmation_statement_overdue`, `has_insolvency_history`, `active_officers_count`, `officers` (name, role, appointed\_on), `resignations_last_12_months`, `psc` (name, kind, natures\_of\_control), `charges_total`, `outstanding_charges`, `risk_flags`, `match_input`, `match_confidence`, `source_urls`, `fetched_at`.

#### Risk flags

`dissolved`, `liquidation`, `administration`, `receivership`, `voluntary-arrangement`, `insolvency_history`, `accounts_overdue`, `confirmation_statement_overdue`, `outstanding_charges`, `recently_incorporated` (under 12 months), `no_active_officers`, `frequent_officer_changes` (3 or more resignations in the last 12 months), `registered_office_dispute`.

Flags are automated indicators derived from public data, not a credit rating or legal advice.

### Example output

```json
{
  "company_number": "00445790",
  "company_name": "TESCO PLC",
  "status": "active",
  "type": "plc",
  "date_of_creation": "1947-11-27",
  "accounts_overdue": false,
  "confirmation_statement_overdue": false,
  "active_officers_count": 12,
  "officers": [{ "name": "EXAMPLE, Jane", "role": "director", "appointed_on": "2020-01-01" }],
  "psc": [],
  "charges_total": 0,
  "outstanding_charges": 0,
  "risk_flags": [],
  "match_confidence": "company_number",
  "source_urls": ["https://api.company-information.service.gov.uk/company/00445790"],
  "fetched_at": "2026-01-01T00:00:00.000Z"
}
```

(Illustrative; values are not a live snapshot.)

### Pricing (pay per event)

- **$0.01 per company pack** (event `company-pack`), charged once per company successfully returned.
- Failed lookups (not found, no name match, API errors) are **not charged**.
- The run stops gracefully when your maximum charge limit is reached.

### Data source and licence

Data comes from the official [Companies House Public Data API](https://developer.company-information.service.gov.uk/).

**Contains public sector information licensed under the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/).** Companies House material is Crown copyright. Under OGL v3.0 it may be reused, including commercially, provided the source is acknowledged ([Companies House: public task, copyright and Crown copyright](https://www.gov.uk/government/publications/companies-house-accreditation-to-information-fair-traders-scheme/public-task-copyright-and-crown-copyright)).

Officer and PSC records include personal data (names, month and year of birth, nationality). You are responsible for using the output lawfully, e.g. under UK GDPR, for your own purpose. This Actor is not affiliated with or endorsed by Companies House.

### Limits

- Requires your own API key; the shared limit is 600 requests per 5 minutes per key. A company with all sections needs up to 4 requests (plus 1 for a name search), so about 120 to 150 companies per 5 minutes.
- Officers and PSC use the first 100 records only; charges use the API's default page.
- Covers companies registered at Companies House (England and Wales, Scotland, Northern Ireland). Not financial statements or filing documents.
- Data is as current as Companies House's API at run time.

### FAQ

**Do I need a Companies House account?** Yes, a free developer account and API key.
**Can I search by name?** Yes; check `match_confidence`.
**Are you scraping?** No, only the official REST API.
**Is a flag a guarantee?** No, it is an automated signal from public records; verify important decisions at source.

# Actor input Schema

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

Free key from the Companies House developer hub (REST API key). Alternatively set the CH\_API\_KEY environment variable.

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

Companies House company numbers, e.g. 00445790. Numbers with fewer than 8 characters are zero-padded.

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

Names are resolved through the search endpoint (exact name match preferred, then active company). Match confidence is recorded.

## `includeOfficers` (type: `boolean`):

Fetch officers and active officer count.

## `includePSC` (type: `boolean`):

Fetch persons with significant control.

## `includeCharges` (type: `boolean`):

Fetch charges summary.

## `maxItems` (type: `integer`):

Upper limit of companies processed.

## Actor input object example

```json
{
  "companyNumbers": [
    "00445790",
    "SC123456"
  ],
  "companyNames": [
    "Tesco PLC"
  ],
  "includeOfficers": true,
  "includePSC": true,
  "includeCharges": true,
  "maxItems": 100
}
```

# Actor output Schema

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

No description

## `allFields` (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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("fixpack/uk-company-due-diligence").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"] }

# Run the Actor and wait for it to finish
run = client.actor("fixpack/uk-company-due-diligence").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"
  ]
}' |
apify call fixpack/uk-company-due-diligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fixpack/uk-company-due-diligence"
        }
    }
}
```

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/bEcXtNe9ecPRJNm0x/builds/r53Bv1vwVxMYktXcy/openapi.json
