# UK Companies House — Directors, Owners (PSC) & Filings (`powerfully_goliath/uk-company-officers`) Actor

UK company profiles, directors, persons with significant control (owners) and filing history from the official Companies House API. Look up by number, name or advanced search (SIC code, location, status, incorporation date). Uses your own free API key. Pay per record.

- **URL**: https://apify.com/powerfully_goliath/uk-company-officers.md
- **Developed by:** [Richie Ellis](https://apify.com/powerfully_goliath) (community)
- **Categories:** Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 officer, psc or filing returneds

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 — Companies, Directors, Owners (PSC) & Filings

Pull **UK company data straight from the official Companies House API**: company
profiles, **directors and secretaries**, **persons with significant control (the owners)**
and **filing history**. Look companies up by **number** or **name**, or find them with
**advanced search** (SIC code, location, status, incorporation date), for example every
restaurant incorporated in Leeds in the last 30 days, with its directors.

It runs on **your own free Companies House API key**, so you get Companies House's full
rate allowance (600 requests per 5 minutes) for your runs, with no shared key and no
scraping.

**$3 per 1,000 companies · $1.50 per 1,000 officer, owner or filing rows.**

***

### Get your free API key (2 minutes)

1. Go to **https://developer.company-information.service.gov.uk/** and register (free).
2. **Create an application**, choose the **Live** environment.
3. **Create new key** → type **REST**. Copy the key.
4. Paste it into **Companies House API key** in this actor's input. Apify stores it
   encrypted. The actor never logs it and never writes it to the output.

Without a key the run stops at once with a message saying how to get one, and nothing is
charged.

### What you can do with it

- **KYC / due diligence**: directors, owners and filing status for a list of company
  numbers.
- **Lead generation**: new companies by SIC code and town, with director names, for
  accountants, banks, insurers, web designers, payroll and formation agents.
- **Compliance monitoring**: accounts and confirmation statements due or overdue across a
  portfolio.
- **Ownership research**: persons with significant control and their natures of control.
- **Filing alerts**: the latest filings for each company, with links to the documents.

### Input

| Field | What it does |
|---|---|
| **Companies House API key** | Your own free REST key (required). |
| **Company numbers** | `00612172`, `SC123456`, `OC301234` (leading zeros may be left off). |
| **Company name searches** + **Matches per name search** | Look companies up by name; take the best match or the top N. |
| **Advanced search**: name includes, SIC codes, location, status, incorporated from/to | Find companies by filters (up to 10,000 per run). |
| **Company profile / Officers / PSCs / Filing history** | Choose which row types to return. |
| **Include resigned officers / ceased PSCs** | Off by default: current ones only. |
| **Filing categories, Max filings per company** | e.g. accounts and confirmation statements, newest 25. |
| **Maximum rows** | A hard cap across all row types. |

#### Example input

Directors and owners of two companies:

```json
{
  "apiKey": "YOUR-COMPANIES-HOUSE-KEY",
  "companyNumbers": ["00612172", "SC123456"],
  "includeOfficers": true,
  "includePscs": true
}
```

New restaurants and takeaways incorporated in Leeds in the last 30 days, with directors:

```json
{
  "apiKey": "YOUR-COMPANIES-HOUSE-KEY",
  "sicCodes": ["56101", "56103"],
  "location": "Leeds",
  "companyStatuses": ["active"],
  "incorporatedFrom": "30 days",
  "includePscs": false,
  "maxItems": 2000
}
```

### Output

Each row has a `recordType` (`company`, `officer`, `psc` or `filing`) and always carries
`companyNumber`, `companyName` and `foundBy`. The dataset has ready-made views for
**Companies**, **Officers and PSCs** and **Filings**. Download as CSV, Excel, JSON or XML.
The example rows below are made up, to show the format:

```json
{
  "recordType": "company",
  "companyNumber": "01234567",
  "companyName": "EXAMPLE TRADING LIMITED",
  "companyStatus": "active",
  "companyType": "ltd",
  "dateOfCreation": "2015-03-02",
  "registeredOfficeAddress": "1 Example Street, Leeds, LS1 4DT, England",
  "sicCodes": "56101, 56102",
  "accountsNextDue": "2027-03-31",
  "confirmationStatementNextDue": "2027-03-16",
  "hasInsolvencyHistory": false,
  "companyUrl": "https://find-and-update.company-information.service.gov.uk/company/01234567"
}
```

```json
{
  "recordType": "officer",
  "companyNumber": "01234567",
  "companyName": "EXAMPLE TRADING LIMITED",
  "personName": "EXAMPLE, Alice Jane",
  "personRole": "director",
  "startedOn": "2015-03-02",
  "nationality": "British",
  "occupation": "Director",
  "countryOfResidence": "England",
  "birthMonth": "1980-05",
  "personUrl": "https://find-and-update.company-information.service.gov.uk/officers/AAA111/appointments"
}
```

PSC rows add `naturesOfControl` (for example "ownership of shares 75 to 100 percent").
Filing rows carry `filingDate`, `filingType` (CS01, AA...), `filingDescription`,
`filingPages` and `filingDocumentUrl`.

The **OUTPUT** record gives the query (without your key), rows delivered, events charged,
API calls made and any company numbers that were not found.

### Pricing

| Event | Price |
|---|---|
| Company profile returned | **$0.003** ($3 per 1,000) |
| Officer, PSC or filing returned | **$0.0015** ($1.50 per 1,000) |
| Actor start | Apify's minimum ($0.00005 per run) |

A company with three directors and one owner costs **$0.009**. You are charged only for
rows delivered, never past **Maximum rows** or your spending limit.

### Good to know

- Companies House paces API keys at 600 requests per 5 minutes. The actor stays under that
  and waits automatically if it is ever told to slow down.
- Dates of birth are published by Companies House as month and year only, and so are they
  here.
- Officer and PSC data is personal data. UK GDPR applies to how you use it.
- 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 independent and not endorsed by Companies House.

### Related UK open-data actors

- **UK Charity Register**: every registered charity in England & Wales, with income,
  contacts, causes and trustees.
- **UK Government Contracts (Contracts Finder)**: public-sector tenders and awards, with
  buyer contacts.
- **UK Food Hygiene Ratings (FSA)**: every food business's hygiene rating.

# Actor input Schema

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

Your own free REST API key from https://developer.company-information.service.gov.uk/ (register, create an application, add a REST key). Stored encrypted; never logged or written to the output.

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

8-character Companies House numbers, e.g. 00612172, SC123456, OC301234. Leading zeros may be left off.

## `searchQueries` (type: `array`):

Company names to look up; each takes the top match(es) from Companies House search.

## `searchResultsPerQuery` (type: `integer`):

How many search matches to take for each name (1 = best match only).

## `nameIncludes` (type: `string`):

Advanced search: company names containing this text.

## `sicCodes` (type: `array`):

Advanced search: nature-of-business codes, e.g. 56101 (restaurants), 62012 (software), 41202 (house building).

## `location` (type: `string`):

Advanced search: registered office location, e.g. 'Leeds' or 'LS1'.

## `companyStatuses` (type: `array`):

Advanced search: e.g. active only.

## `incorporatedFrom` (type: `string`):

Advanced search: e.g. '30 days' for new companies.

## `incorporatedTo` (type: `string`):

Advanced search: latest incorporation date.

## `includeCompanyProfile` (type: `boolean`):

One 'company' row per company: status, type, dates, registered office, SIC codes, accounts and confirmation-statement dates.

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

One 'officer' row per current officer.

## `includeResignedOfficers` (type: `boolean`):

Also return officers who have resigned.

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

One 'psc' row per current person or entity with significant control.

## `includeCeasedPscs` (type: `boolean`):

Also return PSCs that have ceased.

## `includeFilings` (type: `boolean`):

One 'filing' row per filing (newest first) with a link to the document.

## `filingCategories` (type: `array`):

Only these filing categories. Leave empty for all.

## `maxFilingsPerCompany` (type: `integer`):

Newest filings first.

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

Stop after this many rows of any type. You are charged only for rows delivered.

## Actor input object example

```json
{
  "companyNumbers": [
    "00612172"
  ],
  "searchResultsPerQuery": 1,
  "includeCompanyProfile": true,
  "includeOfficers": true,
  "includeResignedOfficers": false,
  "includePscs": true,
  "includeCeasedPscs": false,
  "includeFilings": false,
  "maxFilingsPerCompany": 25,
  "maxItems": 20
}
```

# Actor output Schema

## `overview` (type: `string`):

Every row with its type.

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

Company profile columns.

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

Directors, secretaries and persons with significant control.

## `runSummary` (type: `string`):

The OUTPUT record: query (without your key), rows delivered, events charged, API calls and companies not found.

# 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": [
        "00612172"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("powerfully_goliath/uk-company-officers").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": ["00612172"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("powerfully_goliath/uk-company-officers").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": [
    "00612172"
  ],
  "maxItems": 20
}' |
apify call powerfully_goliath/uk-company-officers --silent --output-dataset

```

## MCP server setup

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

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/geaEPRxOyyMUbtq9C/builds/D2FPOmmMcLhR08Pdw/openapi.json
