# UK Companies House Data — Enriched (Region, Size, Risk Signals) (`knobby_woodworker_aig/uk-companies-house-snapshot`) Actor

Every live UK company (5.7M) from the official Companies House register, enriched at no extra cost: ONS region, council, ward & lat/long, industry section, size band, age, overdue/charge/strike-off risk signals and virtual-office detection. Optional live API check. No personal data. $1.50/1,000.

- **URL**: https://apify.com/knobby_woodworker_aig/uk-companies-house-snapshot.md
- **Developed by:** [Reval](https://apify.com/knobby_woodworker_aig) (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.50 / 1,000 enriched companies

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 Data — Enriched (Region, Council, Size, Risk Signals)

Every live UK company on the **official Companies House register** (~5.7 million companies), filtered the way you actually prospect and research — and **enriched on every row** with fields the register itself does not give you:

| Enrichment (every row, no extra cost) | Where it comes from |
|---|---|
| **ONS region, local authority (+ GSS code), ward, parliamentary constituency, rural/urban class, latitude/longitude** | Registered-office postcode matched against the official ONS postcode directory |
| **Industry section** (A–U, e.g. "Construction") from the up-to-4 SIC codes | ONS UK SIC 2007 structure |
| **Size band** — micro / small / medium / large-or-group / dormant / no-accounts-yet | The accounts category each company last filed |
| **Company age** in days, years and bands (0–30 days … 10+ years) | Incorporation date |
| **Compliance & risk signals** — accounts overdue, confirmation statement overdue, days until next filing, outstanding secured charges, proposal to strike off, insolvency/administration, renamed in last 12 months | Register filing dates, charge counts and status |
| **Formation-agent / virtual-office detection** — how many companies share the registered postcode (e.g. EC1V 2NX hosts ~72,000) | Computed across the whole register |
| **Jurisdiction** — England & Wales, Scotland, Northern Ireland, overseas entity | Company-number prefix |
| A plain-English **`signals`** column, e.g. `new company (<90 days); accounts overdue; outstanding secured charges` | All of the above |

**Optional live check:** add your own free Companies House API key and the first N rows are re-checked against the live register (current status, insolvency history, charges, overdue flags, disputed or undeliverable registered office, last accounts, latest filing).

**Company-level data only.** No directors, officers, persons with significant control (PSC), emails, phone numbers or any other personal data. The "care of" name in the registered address is deliberately dropped.

### Pricing: $1.50 per 1,000 companies, enrichment included

You pay **$0.0015 per company returned**, which is **$1.50 per 1,000**. Every row includes all of the enrichment above at no extra cost.

| | This Actor | Raw snapshot exports on the Store | Live-API scrapers |
|---|---|---|---|
| Price per 1,000 companies | **$1.50** | about $1.40–$1.50 | about $3–$11 |
| ONS region, council, ward, constituency, lat/long | ✅ | ❌ | ❌ |
| Industry section, size band, company age | ✅ | ❌ | partial |
| Overdue / charges / strike-off / insolvency flags + `signals` | ✅ | ❌ | partial |
| Virtual-office / formation-agent detection and filter | ✅ | ❌ | ❌ |
| Filter by ONS region/council, size band, overdue filings, charges | ✅ | ❌ | ❌ |
| Optional live check with your own free API key | ✅ | ❌ | ✅ |
| Personal data (directors, PSC, emails) | none, by design | none | often |

You get the same per-row price as a raw dump, with about 30 extra columns per row. Because filtering happens before anything is charged, you pay only for the companies that match. Set `maxItems` or a maximum total charge to cap spend. Example: 2,000 new construction companies in the North West cost **$3.00**.

### Why this Actor instead of a raw Companies House export

- **Filter by what matters:** region, council, industry section, size band, overdue filings, secured charges, "exclude virtual offices", alongside SIC code, incorporation date, postcode, status, type and name.
- **Accurate geography:** the register's own address county/country is free text and blank for ~900k companies; we resolve region and council from the postcode using official ONS data, so "all construction companies in Leeds" actually works.
- **Lead lists without the noise:** turn on *Exclude formation-agent / virtual-office addresses* to drop the hundreds of thousands of companies registered at accountants' and virtual-office addresses.
- **Risk at a glance:** overdue accounts, outstanding charges, strike-off proposals and insolvency in one filterable table, with no extra API calls.
- **Official sources only:** Companies House monthly snapshot (<https://download.companieshouse.gov.uk/en_output.html>) plus the ONS postcode directory. No website scraping and no proxies. An API key is only needed for the optional live check.
- **Fast and reliable:** the ~470 MB of official ZIPs are streamed and filtered row by row. A full-register scan with enrichment takes about 1 minute at ~250 MB RAM. Downloads that drop are resumed.
- **Monthly new-company lists:** turn on `onlyNew` and schedule monthly to receive only companies you have not had before for the same filters.

### Typical uses

- **New-business prospecting:** e.g. construction (section F) companies in the North West incorporated in the last 90 days, excluding virtual offices
- **Territory planning:** every small/medium manufacturer by council, with lat/long ready for a map
- **Credit and risk screening:** companies with accounts overdue or outstanding charges in your region
- **Market sizing:** count companies by industry section × region × size band
- **Accountants and compliance services:** companies whose accounts or confirmation statement are overdue or due soon (`daysUntilAccountsDue`)

### Input

| Field | Example | Notes |
|---|---|---|
| `sicSections` | `["F"]` | Industry sections A–U |
| `sicCodes` | `["62012"]`, `["41","43"]` | Prefix match against any of the up to 4 SIC codes |
| `sizeBands` | `["small","medium"]` | From the accounts category filed |
| `excludeDormant` | `true` | Drops dormant companies |
| `incorporatedWithinDays` | `90` | Rolling window from run date |
| `incorporatedFrom` / `incorporatedTo` | `2026-01-01` | Absolute dates |
| `companyStatuses` / `companyCategories` / `nameContains` | `["Active"]` | Exact or substring, case-insensitive |
| `regions` | `["North West","Scotland"]` | ONS regions and nations |
| `localAuthorities` | `["Manchester","Leeds"]` | ONS local authority names |
| `postcodePrefixes` | `["BS"]`, `["M1 "]` | Add a space after the outward code to be exact |
| `excludeSharedOffices` | `true` | Drops postcodes hosting 250+ companies |
| `overdueFilter` | `"either"` | `any`, `accounts`, `confirmationStatement`, `either` or `none` |
| `chargesFilter` | `"outstanding"` | `any`, `outstanding` or `none` |
| `maxItems` | `100` | Run stops when reached |
| `onlyNew` | `false` | Skip companies already delivered for the same filters |
| `geoEnrich` | `true` | Exact ONS geography per postcode (default on) |
| `companiesHouseApiKey` | *(secret)* | Optional. Free key from developer.company-information.service.gov.uk |
| `liveCheckMaxItems` | `100` | Cap on live checks (about 250 companies per 4.5 min under the official rate limit) |

Example: established construction firms in Greater Manchester councils with secured charges, no virtual offices:

```json
{
  "sicSections": ["F"],
  "localAuthorities": ["Manchester", "Salford", "Trafford", "Stockport"],
  "sizeBands": ["small", "medium", "large-or-group"],
  "chargesFilter": "outstanding",
  "excludeSharedOffices": true,
  "maxItems": 1000
}
```

### Output (one row per company)

Dataset views: **Enriched overview**, **Geography (map-ready)**, **Live check** and the original **Overview**. Export to CSV, Excel, JSON or Google Sheets.

Sample row (abridged):

```json
{
  "companyNumber": "06930633",
  "companyName": "100 PERCENT GROUP LIMITED",
  "companyStatus": "Active",
  "incorporationDate": "2009-06-11",
  "companyAgeYears": 17.3,
  "companyAgeBand": "10+ years",
  "sicCode1": "43999",
  "sicDescription1": "Other specialised construction activities n.e.c.",
  "sicSection": "F",
  "sicSectionName": "Construction",
  "accountsCategory": "MEDIUM",
  "sizeBand": "medium",
  "accountsNextDueDate": "2026-09-30",
  "accountsOverdue": true,
  "confirmationStatementOverdue": false,
  "daysUntilAccountsDue": -31,
  "mortgageChargesOutstanding": 1,
  "hasOutstandingCharges": true,
  "regAddressPostcode": "M41 7LY",
  "companiesAtRegisteredPostcode": null,
  "sharedRegisteredOffice": false,
  "region": "North West",
  "localAuthority": "Trafford",
  "localAuthorityCode": "E08000009",
  "ward": "Lostock & Barton",
  "parliamentaryConstituency": "Stretford and Urmston",
  "ruralUrbanClass": "Urban: Nearer to a major town or city",
  "latitude": 53.46535,
  "longitude": -2.333573,
  "signals": "accounts overdue; outstanding secured charges",
  "companiesHouseUrl": "https://find-and-update.company-information.service.gov.uk/company/06930633",
  "snapshotDate": "2026-10-01"
}
```

All fields: the official register columns (`companyNumber`, `companyName`, `companyStatus`, `companyCategory`, `incorporationDate`, `sicCode1..4` + descriptions, registered address, accounts and confirmation-statement dates, mortgage charge counts, previous names, `companiesHouseUrl`) **plus** the enrichment columns `registeredJurisdiction, companyAgeDays, companyAgeYears, companyAgeBand, sicSection, sicSectionName, sicSections, sizeBand, isDormant, accountsOverdue, confirmationStatementOverdue, daysUntilAccountsDue, daysUntilConfirmationStatementDue, hasOutstandingCharges, proposalToStrikeOff, inInsolvencyProcess, renamedInLast12Months, postcodeOutward, postcodeArea, companiesAtRegisteredPostcode, sharedRegisteredOffice, signals, signalCount, region, localAuthority, localAuthorityCode, ward, parliamentaryConstituency, ruralUrbanClass, latitude, longitude, geoSource`. When an API key is set, the `live*` and `latestFiling*` columns are added as well.

A `RUN_SUMMARY` record reports rows scanned, rows output, enrichment counts and timings.

### How the enrichment is calculated

- **Overdue flags** compare the register's next-due dates with the snapshot date (the data is compiled to the previous month end). `daysUntil…Due` counts from the day you run the Actor. Use the live check for up-to-the-day status.
- **Size band** is a proxy based on the accounts regime the company chose. It is not a turnover or headcount figure.
- **Geography** uses the current ONS postcode directory. About 0.5% of register postcodes are retired or mistyped. Those rows fall back to the outcode-level region/council, and `geoSource` says which method was used.
- **Shared-office counts** are rebuilt from the full register. `companiesAtRegisteredPostcode` is filled when 100+ companies share the postcode, and `sharedRegisteredOffice` is true at 250+.

### Data freshness and limits

- Companies House publishes the snapshot within 5 working days of each month end. It covers **live companies** compiled to the end of the previous month, and dissolved companies are not included. For same-day changes, use the optional live check or follow `companiesHouseUrl`.
- Files are ordered alphabetically by company name, so a selective filter scans the whole register (about 1–3 minutes). Broad filters stop early at `maxItems`.
- Addresses are as filed by the company. Companies House does not verify them.

### Source and reuse

Source: Companies House — Free Company Data Product, <https://download.companieshouse.gov.uk/en_output.html>. Optional live check: Companies House Public Data API (company profile and filing history endpoints only).

Geography: ONS postcode directory via [postcodes.io](https://postcodes.io), released under the Open Government Licence. Contains OS data © Crown copyright and database right. Contains Royal Mail data © Royal Mail copyright and database right. Contains National Statistics data © Crown copyright and database right.

Companies House states that it makes public-register information available under s.47 of the Copyright, Designs and Patents Act 1988 and Schedule 1 of the Database Regulations (SI 1997/3032) and "imposes no rules or requirements on how the information on the public register is used" ([GOV.UK](https://www.gov.uk/guidance/companies-house-data-products)). The Companies House snapshot is **not** released under the Open Government Licence. You are responsible for complying with data protection (UK GDPR), copyright and other applicable law when you use the data — e.g. direct-marketing rules (PECR) for any outreach. This Actor is independent and not affiliated with or endorsed by Companies House.

# Actor input Schema

## `sicSections` (type: `array`):

Optional. Broad industries — e.g. F = Construction, J = Information & communication, M = Professional services. A company matches if any of its SIC codes falls in a selected section. Use "SIC codes" below for finer detail.

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

Optional. UK SIC 2007 codes or prefixes, e.g. "62012" (business software), "62" (all IT), "41" (construction of buildings), "43" (specialised construction). A company matches if any of its up to 4 SIC codes starts with one of these. Empty = all.

## `sizeBands` (type: `array`):

Optional. Derived from the accounts category each company last filed with Companies House: micro, small, medium, large-or-group, subsidiary, dormant, no-accounts-yet (new companies), unknown.

## `excludeDormant` (type: `boolean`):

Drops companies filing dormant accounts or with SIC 99999 (Dormant Company).

## `incorporatedWithinDays` (type: `integer`):

Optional rolling window, e.g. 90 = companies incorporated in the last 90 days (relative to run date). Combined with the absolute dates below, the later start date wins. Note: the snapshot is compiled to the end of the previous month.

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

Optional. Earliest incorporation date (YYYY-MM-DD).

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

Optional. Latest incorporation date (YYYY-MM-DD).

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

Optional, exact match (case-insensitive). The snapshot only contains live companies; common values: "Active", "Active - Proposal to Strike off", "Liquidation", "In Administration", "Voluntary Arrangement", "Live but Receiver Manager on at least one charge". Empty = all.

## `companyCategories` (type: `array`):

Optional, exact match (case-insensitive), e.g. "Private Limited Company", "PRI/LTD BY GUAR/NSC (Private, limited by guarantee, no share capital)", "Public Limited Company", "Limited Liability Partnership", "Limited Partnership", "Community Interest Company", "Charitable Incorporated Organisation". Empty = all.

## `nameContains` (type: `string`):

Optional case-insensitive substring of the company name, e.g. "DRYWALL".

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

Optional. ONS region / nation of the registered office, resolved from the postcode via the ONS postcode directory. Works even when the register's own address country/county is blank.

## `localAuthorities` (type: `array`):

Optional. ONS local authority district names, e.g. "Manchester", "Leeds", "Bristol, City of", "Westminster", "Glasgow City", "Belfast". Exact per-postcode check.

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

Optional. Matches the start of the registered office postcode, e.g. "BS", "EC1A", "M1". Without a space, "M1" also matches M11–M19; add a space after the outward code to be exact ("M1 " or "M1 1"). Empty = all.

## `excludeSharedOffices` (type: `boolean`):

Drops companies whose registered office postcode hosts 250+ companies on the register (formation agents, accountants' and virtual-office addresses, e.g. EC1V 2NX hosts ~72k). Useful when you want companies that actually operate locally.

## `overdueFilter` (type: `string`):

Optional. Keep only companies whose accounts and/or confirmation statement were overdue at the snapshot date — or only those fully up to date.

## `chargesFilter` (type: `string`):

Optional. Filter on outstanding or part-satisfied charges registered against the company.

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

Stop after this many matching companies. Keeps runs cheap. The full register is ~5.8M rows; a run that scans all of it takes several minutes even if few rows match.

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

When on, skips companies this Actor already returned for the same filter set in earlier runs (state kept in a named key-value store). Turn on for monthly schedules; leave off for one-off pulls.

## `geoEnrich` (type: `boolean`):

Adds region, local authority (+ GSS code), ward, parliamentary constituency, rural/urban class and latitude/longitude for each output row from the ONS postcode directory (free, ~100 postcodes per request). Turn off only if you want the fastest possible raw export — the outcode-level region is still filled.

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

Optional. Your own free key from developer.company-information.service.gov.uk. When set, the first N output rows are re-checked against the live official register: current status, insolvency history, charges, overdue flags, disputed/undeliverable office, last accounts and the latest filing. Company-level endpoints only — no officers or PSC.

## `liveCheckMaxItems` (type: `integer`):

Cap on live API checks per run (2 calls per company, throttled under the 600 requests / 5 min limit ≈ 4.5 min per 250 companies).

## `stateStoreName` (type: `string`):

Named key-value store that remembers delivered company numbers. Change it to keep separate histories.

## `maxPartsToScan` (type: `integer`):

Advanced/testing. The official snapshot is split into ~7 ZIP parts ordered alphabetically by company name. 0 = all parts.

## Actor input object example

```json
{
  "sicCodes": [
    "62012"
  ],
  "excludeDormant": false,
  "incorporatedWithinDays": 90,
  "excludeSharedOffices": false,
  "overdueFilter": "any",
  "chargesFilter": "any",
  "maxItems": 20,
  "onlyNew": false,
  "geoEnrich": true,
  "liveCheckMaxItems": 100,
  "stateStoreName": "uk-ch-snapshot-state",
  "maxPartsToScan": 0
}
```

# Actor output Schema

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

No description

## `geo` (type: `string`):

No description

## `all` (type: `string`):

No description

## `summary` (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 = {
    "sicCodes": [
        "62012"
    ],
    "incorporatedWithinDays": 90,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("knobby_woodworker_aig/uk-companies-house-snapshot").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"],
    "incorporatedWithinDays": 90,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("knobby_woodworker_aig/uk-companies-house-snapshot").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"
  ],
  "incorporatedWithinDays": 90,
  "maxItems": 20
}' |
apify call knobby_woodworker_aig/uk-companies-house-snapshot --silent --output-dataset

```

## MCP server setup

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

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/HmoXkCprQ7V37v9vw/builds/hBNkGrmTHFRuPCrFW/openapi.json
