# UK Companies House Feed: New Companies, Directors, Insolvency (`longlever/uk-companies-house-feed`) Actor

New UK companies filtered by SIC code and region, plus director appointments and resignations, insolvency cases and overdue accounts, straight from the official Companies House APIs with your own free key. Built for scheduled runs.

- **URL**: https://apify.com/longlever/uk-companies-house-feed.md
- **Developed by:** [Todd Handler](https://apify.com/longlever) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 new company returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Feed: new companies by SIC code and region, plus director, insolvency and overdue-accounts events

Get every **new UK company** in the industries and regions you care about, plus **director appointments and resignations**, **insolvency cases** and **overdue accounts**, straight from the official Companies House APIs. Schedule it and each run returns only what is new since the last one.

- **Official sources only.** The Companies House REST API for new incorporations, the Companies House Streaming API for changes. No website scraping, so nothing breaks when a page changes.
- **Your own free key.** Companies House keys are free. You keep full control of your quota, and your data never passes through a shared key.
- **Filter the way sales teams think.** SIC codes or SIC prefixes (`62` = all software), UK regions, postcode areas or districts, company types, a watchlist of company numbers.
- **Built for schedules.** New companies are returned once, even when Companies House indexes them a day late. Change feeds resume from the exact point the last run stopped.
- **Personal data kept to what you need.** Officer output defaults to name, role and dates. See "UK GDPR and lawful use" below.
- **Pay per result.** From $1.50 per 1,000 new companies, no subscription.

### Who uses it

- **B2B sales and lead-gen teams** reaching newly formed companies in their target sectors and regions
- **Accountants, banks, insurers, web and IT agencies** who sell to new businesses in their first weeks
- **Credit, risk and compliance teams** watching customers and suppliers for insolvency, director churn or overdue accounts
- **Researchers and journalists** tracking business formation by industry and place
- **AI agents and automations** that need a clean, structured UK company event feed (n8n, Make, Zapier, Clay)

### Step 1: get your free Companies House keys (5 minutes)

1. Create a free account at [developer.company-information.service.gov.uk](https://developer.company-information.service.gov.uk/) and choose "Create an application" (choose the live environment).
2. Add a **REST** key. Paste it into **Companies House REST API key**. Needed for new incorporations.
3. For the change feeds, add a **Streaming** key to the same or a second application and paste it into **Companies House Streaming API key**. Companies House treats them as different key types; a REST key does not work on the streams.
4. Leave the key's "restricted IPs" and "JavaScript domains" empty. Apify runs come from changing IP addresses, so an IP-restricted key is rejected.

Keys are stored encrypted by Apify (secret input fields) and are only sent to Companies House.

### Quick start

**New software companies in London and the North West, every morning**

```json
{
    "apiKey": "YOUR_REST_KEY",
    "sicCodes": ["62"],
    "regions": ["london", "north-west"]
}
```

Schedule it daily. The first run returns companies incorporated today and in the 3 days before. Every later run returns only companies it has not returned before.

**Everything that changes at a list of customers**

```json
{
    "streamKey": "YOUR_STREAMING_KEY",
    "includeIncorporations": false,
    "includeOfficerChanges": true,
    "includeInsolvency": true,
    "includeOverdue": true,
    "companyNumbers": ["00445790", "SC123456"]
}
```

Schedule it hourly or daily. See "How the change feeds work" for what the first run does.

### Feeds

| Feed | Event types | Source | Key |
|---|---|---|---|
| New incorporations | `incorporation` | REST advanced company search | REST |
| Directors and officers | `officer_appointed`, `officer_resigned`, optional `officer_updated` | Officers stream | Streaming |
| Insolvency | `insolvency` (new case or case update, with dates and practitioners) | Insolvency cases stream | Streaming |
| Overdue filings | `accounts_overdue`, `confirmation_statement_overdue` | Company profile stream, or the REST API for a watchlist | Streaming (REST for watchlists) |

### Filters

| Input | Applies to | Notes |
|---|---|---|
| SIC codes | all feeds | Full 5-digit codes are sent to Companies House's own search. Shorter prefixes (`62`, `561`) are matched by the Actor. |
| Regions | all feeds | The 12 UK regions, matched by registered office postcode area. Areas that straddle a border (for example KT, DA, CH, SY) count for every region they touch. |
| Postcode prefixes | all feeds | Area (`M`), district (`M1`, `SW1A`) or sector (`LS1 4`). Combined with Regions as either-or. |
| Location text | incorporations | Free text matched by Companies House against the registered office address. |
| Company status, Company types | incorporations | Status defaults to `active`. Types use Companies House codes such as `ltd`, `llp`, `plc`. |
| Watchlist of company numbers | change feeds | Only these companies. Needs no extra lookups. |

**How SIC and region filters work on officer and insolvency events.** Those stream events carry no company details, so the Actor looks up each company once with your REST key (cached for 30 days, capped by **Max company lookups per run**). Companies House allows 600 REST calls per 5 minutes per key, and the Actor stays under that. If a run needs more lookups than the cap, it stops reading at that point and the next run continues from there, so nothing is skipped. Overdue events carry company details already and need no lookups.

**Volume to expect.** Companies House publishes about 100,000 officer events a day, and roughly 40% of them are appointments or resignations that need a lookup when you filter by SIC or region. That is around 40,000 lookups a day nationally, more than one key gets through comfortably. For filtered officer events, schedule the Actor **hourly** (each run then needs a few hundred to about 1,500 lookups) or use a watchlist. Scottish and Northern Irish companies are ruled in or out by their company number (SC, NI and so on) without a lookup.

### How the change feeds work

The Streaming API is a live feed of every change Companies House publishes. Each event has a position (a timepoint). The Actor saves the last position it processed, and the next run asks Companies House to replay from there.

- **First run with given filters:** there is no saved position yet, so it listens to live events for about a minute and saves its place. Your schedule then picks up everything from that moment on.
- **Later runs:** read from the saved position until they catch up with the present (or hit **Max seconds per stream**), then save.
- **Gaps:** Companies House replays a limited window (at least 10 days when tested in October 2026). If runs are further apart than that, the run says so in the summary (`gap`) and restarts from live. Daily or more frequent schedules are safe.
- **Once only:** a resignation, appointment or insolvency update is returned once. An overdue flag is returned once and again only after the company files and later lapses.

**Overdue filings.** Companies House stream records carry due dates but no overdue flag, and a company that silently misses a deadline publishes nothing. So the Actor remembers the due dates of every company inside your filters that it sees on the stream (up to 60,000 companies) and checks them again on every run, flagging each one the day after its deadline passes. Coverage therefore builds up from your first run: a company enters the list the first time its record changes. **For an exact check of specific companies, add them as a watchlist and give your REST key:** the Actor then reads each company's profile directly, where Companies House states whether it is overdue.

- **Two connections per key:** Companies House allows two open stream connections per key, so the Actor reads its streams one after another. Do not run two tasks with the same Streaming key at the same time.

**Officer events.** Companies House republishes an officer record whenever anything on it changes. The Actor reports `officer_appointed` when the appointment date is within **Appointment counts as new within days** (default 30), `officer_resigned` when a resignation date is present, and skips other record edits unless **Also report other officer record edits** is on.

### Output

One dataset, one schema for every event type. Example rows:

```json
{
    "event_type": "incorporation",
    "event_id": "6f1c3b0a9d2e4c7f8a1b",
    "event_date": "2026-10-20",
    "company_number": "16000001",
    "company_name": "ALPHA CODE LTD",
    "company_status": "active",
    "company_type": "ltd",
    "date_of_creation": "2026-10-20",
    "sic_codes": ["62012"],
    "address_text": "1 Example Street, London, EC2A 4NE, England",
    "postcode": "EC2A 4NE",
    "postcode_area": "EC",
    "regions": ["london"],
    "registered_office": {"address_line_1": "1 Example Street", "locality": "London", "postal_code": "EC2A 4NE", "country": "England"},
    "officer": null,
    "insolvency": null,
    "company_url": "https://find-and-update.company-information.service.gov.uk/company/16000001",
    "source": "rest:advanced-search",
    "fetched_at": "2026-10-21T07:00:02Z"
}
```

```json
{
    "event_type": "officer_resigned",
    "event_date": "2026-10-19",
    "company_number": "16000002",
    "company_name": "MANCUNIAN APPS LTD",
    "officer": {"name": "EXAMPLE, Eve", "officer_role": "director", "appointed_on": "2021-01-01", "resigned_on": "2026-10-19", "is_corporate": false},
    "source": "stream:officers",
    "published_at": "2026-10-20T09:14:51"
}
```

`insolvency` holds `status` and `cases` (number, type such as `creditors-voluntary-liquidation`, dated milestones, and practitioners with appointment dates). `accounts` and `confirmation_statement` hold `next_due`, `next_made_up_to` and `overdue`. Fields a feed does not have are `null`. The run's `SUMMARY` record shows, per feed, events read, rows returned, why reading stopped and how many events were skipped and why.

### Pricing

Pay per event, no monthly fee:

| Event | Price |
|---|---|
| New company returned | $0.0015 ($1.50 per 1,000) |
| Change event returned (officer, insolvency, overdue) | $0.0025 ($2.50 per 1,000) |
| Feed checked (once per feed per run) | $0.002 |

Higher Apify plans get lower per-row prices. For example, software companies (SIC 62) in London and the North West came to about 130 a day in October 2026, so a daily run costs about $0.20. Set a maximum charge per run in Apify and the Actor stops cleanly at it; anything not delivered comes back on the next run.

Runs with no key return a free sample of 10 new companies so you can see the output.

### UK GDPR and lawful use

Company data is not personal data, but **officer data is**: names of directors and secretaries, and at the detail levels you choose, nationality, occupation, country of residence, month and year of birth and correspondence address. Companies House publishes it on the public register, and being public does not take it outside UK GDPR. This is general information, not legal advice.

**What this Actor does**

- Outputs only fields Companies House itself publishes. Companies House never publishes usual residential addresses or full dates of birth, and the Actor drops the day of birth even if it appears.
- Defaults to the minimum: name, role, appointment and resignation dates. Nationality, occupation, residence, birth month and year and correspondence address are only output when you choose a higher **Officer detail level**.
- Adds nothing from other sources. No emails, phone numbers or social profiles are looked up or inferred.
- Keeps no officer data between runs beyond short event fingerprints used to avoid returning the same event twice.

**What you are responsible for as the controller of the data you collect**

- **A lawful basis.** For most B2B uses this is legitimate interests. Write a short legitimate interests assessment for your use, and only collect the detail level it needs.
- **Transparency.** If you contact or profile individuals, UK GDPR Article 14 generally requires telling them where you got their data, within a month of obtaining it.
- **Rights and retention.** Honour objections (always, for direct marketing) and erasure requests, keep data accurate (the register changes, so refresh it), and delete it when you no longer need it.
- **Direct marketing rules (PECR).** Marketing emails and texts to individuals, including sole traders and partnerships, generally need prior consent. Emails to limited companies' corporate addresses do not, but must offer an opt-out. Screen calls against the TPS and CTPS. A correspondence address on the register is not consent to marketing.
- **Licence.** Companies House data is reusable under the Open Government Licence v3.0, which does **not** cover personal data, so officer data reuse rests on data protection law, not on the licence. Attribute as: "Contains public sector information licensed under the Open Government Licence v3.0. Source: Companies House."
- **Never** use the data for fraud, identity theft, harassment or unlawful discrimination, and do not republish officer data in bulk without a lawful basis.

See the ICO's guidance on [legitimate interests](https://ico.org.uk/for-organisations/uk-gdpr-guidance-and-resources/lawful-basis/legitimate-interests/) and [direct marketing](https://ico.org.uk/for-organisations/direct-marketing-and-privacy-and-electronic-communications/).

### For AI agents

- Call with `includeIncorporations` and filters for new-company leads; with `companyNumbers` and the change feeds to monitor a portfolio.
- Each row has a stable `event_id` for de-duplication and a `company_url` for a human to check.
- Read `SUMMARY` from the default key-value store to see whether a feed stopped early (`stopReason`) and needs another run.

### Limits and good practice

- **Rate limits** are Companies House's: 600 REST calls per 5 minutes per key, two stream connections per key. The Actor stays inside both. If you run other tools on the same key, lower **Max company lookups per run**.
- **Indexing delay.** Companies House's search can show a new company a day or two after registration. Keep **Days to look back** at 3 or more with **Only companies not returned before** on, and late arrivals still come through once.
- **Very broad runs.** With no filters, the officers stream carries about 100,000 events a day (about 40,000 appointments and resignations). Use filters or a watchlist unless you want the whole register.
- Changing filters starts a fresh baseline (a new saved state). Use **State key** to control this.

### Support

Open an issue on the Actor's Issues tab with the run ID and what you expected. Feature requests welcome, for example PSC (persons with significant control) or charges feeds.

# Actor input Schema

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

Your own free key from developer.company-information.service.gov.uk (create an application, then a REST key). Needed for new incorporations, and for SIC or region filtering of officer and insolvency events. Stored encrypted by Apify.

## `streamKey` (type: `string`):

Your own free Streaming key from the same developer hub (a separate key type; REST keys do not work here). Needed for officer, insolvency and overdue-accounts events.

## `includeIncorporations` (type: `boolean`):

Companies newly registered at Companies House, from the advanced company search. Needs the REST key.

## `includeOfficerChanges` (type: `boolean`):

From the officers stream. Needs the Streaming key.

## `includeInsolvency` (type: `boolean`):

New and updated insolvency cases (liquidations, administrations, voluntary arrangements) from the insolvency stream. Needs the Streaming key.

## `includeOverdue` (type: `boolean`):

Companies whose accounts or confirmation statement Companies House marks as overdue, tracked from the company profile stream (needs the Streaming key). With a watchlist and the REST key, each listed company is checked directly instead.

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

Keep companies with any of these SIC codes. Use full 5-digit codes (62012) or shorter prefixes (62 for all computer programming and consultancy). Leave empty for every industry.

## `regions` (type: `array`):

Keep companies whose registered office postcode is in any of these UK regions. Matching is by postcode area, so areas on a border count for both regions.

## `postcodePrefixes` (type: `array`):

Keep companies whose registered office postcode starts with any of these, for example M, LS1, EC2A or SW1. Combined with Regions as either-or.

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

Free text that Companies House matches against the registered office address, for example a town name. Applied by Companies House's own search.

## `companyStatus` (type: `array`):

Company statuses to include. New companies are almost always active.

## `companyTypes` (type: `array`):

Limit to these Companies House company types, for example ltd, llp, plc, private-limited-guarant-nsc. Leave empty for all types.

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

Only return officer, insolvency and overdue events for these companies, for example 00445790 or SC123456. Overrides the SIC and region filters for those feeds and needs no company lookups.

## `onlyNew` (type: `boolean`):

Skip new incorporations an earlier run with the same filters already returned, so a schedule gives you each company once. Turn off for a full list of the window every run.

## `lookbackDays` (type: `integer`):

Search companies incorporated today and this many days before. Companies House search can index a company a day or two after it is registered, so 3 or more catches late arrivals; with Only new on, they are still returned once.

## `maxIncorporations` (type: `integer`):

0 means no limit. Newest companies first. With Only new on, companies over the limit are returned by the next run.

## `officerDetail` (type: `string`):

How much officer data to output. Minimal is name, role and dates. Standard adds nationality, occupation and country of residence. Full adds month and year of birth and the correspondence address. All of it is published by Companies House; only output what your use needs (see the README on UK GDPR).

## `appointmentRecencyDays` (type: `integer`):

An officer record edit is reported as an appointment only if the appointment date is within this many days. Older records that change (for example an address update) are skipped unless the option below is on.

## `includeOfficerUpdates` (type: `boolean`):

Report edits to existing officer records (address, name or occupation changes) as officer_updated events.

## `lookupCompanyDetails` (type: `boolean`):

Look up the company name, SIC codes and address for each event. This happens anyway when SIC or region filters are set. Uses your REST key and quota.

## `maxCompanyLookups` (type: `integer`):

Cap on REST lookups for officer and insolvency events (Companies House allows 600 calls per 5 minutes per key). When filtering needs more, the run stops reading and the next run continues from there. Lookups are cached for 30 days.

## `maxStreamSeconds` (type: `integer`):

Time limit for reading each stream in one run, including company lookups. A stream stops earlier once it has caught up with the present. The next run continues where this one stopped.

## `stateKey` (type: `string`):

Optional name for the saved progress. By default it comes from your filters, so changing them starts fresh. Set the same key in two tasks only if they should share progress.

## Actor input object example

```json
{
  "includeIncorporations": true,
  "includeOfficerChanges": false,
  "includeInsolvency": false,
  "includeOverdue": false,
  "sicCodes": [
    "62012",
    "62020",
    "62090"
  ],
  "companyStatus": [
    "active"
  ],
  "onlyNew": true,
  "lookbackDays": 3,
  "maxIncorporations": 20,
  "officerDetail": "minimal",
  "appointmentRecencyDays": 30,
  "includeOfficerUpdates": false,
  "lookupCompanyDetails": false,
  "maxCompanyLookups": 2000,
  "maxStreamSeconds": 600
}
```

# Actor output Schema

## `events` (type: `string`):

New incorporations and change events in one schema.

## `summary` (type: `string`):

Per feed: events read, rows returned, why reading stopped, skipped counts and errors.

# 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 = {
    "sicCodes": [
        "62012",
        "62020",
        "62090"
    ],
    "lookbackDays": 3,
    "maxIncorporations": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("longlever/uk-companies-house-feed").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 = {
    "sicCodes": [
        "62012",
        "62020",
        "62090",
    ],
    "lookbackDays": 3,
    "maxIncorporations": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("longlever/uk-companies-house-feed").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 '{
  "sicCodes": [
    "62012",
    "62020",
    "62090"
  ],
  "lookbackDays": 3,
  "maxIncorporations": 20
}' |
apify call longlever/uk-companies-house-feed --silent --output-dataset

```

## MCP server setup

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

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/pBSjxDEuFY4QGXz0c/builds/8nL12W4jM0HmSFqSV/openapi.json
