# UK Companies House Company List Builder (No API Key) (`zaidistudio/uk-companies-house-bulk-filter`) Actor

Build UK B2B lead lists from the official Companies House register (5.7M companies). Filter by SIC code, postcode, town, status, incorporation date and company size. New-company feeds with 'only new since last run'. No API key, no login, $0.75 per 1,000 companies.

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

## Pricing

from $0.75 / 1,000 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.

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 Company List Builder: filter all 5.7M UK companies by SIC code, postcode and incorporation date

**Build UK B2B lead lists and market maps from the official Companies House register, with no API key, no login and no proxies.**
Pick an industry (SIC code or keyword), an area (postcode area/district or town), a status and an incorporation-date window. You get clean JSON/CSV/Excel rows with each company's name, number, registered office, SIC codes, accounts category, filing due dates and a link to its register page.

> Keywords: Companies House scraper, UK company list, UK companies by SIC code, newly incorporated UK companies, UK B2B leads, UK company database export, Companies House API alternative, Companies House bulk data.

### What you can do with it

- **New-company lead lists.** For example, every software company incorporated in the last 90 days. Useful for accountants, banks, insurers, web agencies and payroll/SaaS sellers.
- **Local market maps.** For example, all active dental practices in Manchester (M postcode area), or all licensed restaurants in EC/WC London.
- **Size proxy.** Filter by accounts category (MICRO ENTITY, SMALL, FULL…) to target by company size.
- **Monthly refresh.** Schedule a run each month after Companies House publishes its new snapshot.

### Example input

```json
{
  "sicCodes": ["62012"],
  "companyStatuses": ["Active"],
  "incorporatedWithinDays": 90,
  "maxResults": 100000
}
```

| Field | Meaning |
|---|---|
| `sicCodes` | SIC code prefixes (`"62"` = all IT, `"56101"` = licensed restaurants) |
| `sicKeywords` | Words matched against SIC descriptions (`"dental"`) |
| `postcodePrefixes` | Letters only = postcode **area** (`"M"` matches M1–M99, not ME/ML). A district (`"E1"`) matches E1 and E1W, not E14 |
| `postTowns` | Exact post town (`"LEEDS"`) |
| `companyStatuses` | Default `["Active"]`. Use `[]` for any status |
| `excludeStrikeOffProposals` | Default `true`. Drops "Active – Proposal to Strike off" companies |
| `companyCategories`, `accountsCategories` | Exact values as they appear on the register |
| `incorporatedFrom` / `incorporatedTo` / `incorporatedWithinDays` | Incorporation date window |
| `nameContains` | Substrings of the company name |
| `maxResults` | Stops after this many matches. The source is ordered by company name, so a low cap returns an alphabetical slice |
| `includePreviousNames` | Adds former names with their change dates |

### Example output (one row)

```json
{"companyNumber":"06054123","companyName":"151 DENTAL LTD","companyStatus":"Active",
 "companyCategory":"Private Limited Company","incorporationDate":"2007-01-16",
 "registeredOffice":{"addressLine1":"151 AYRES ROAD","addressLine2":"OLD TRAFFORD","postTown":"MANCHESTER","postCode":"M16 9WR"},
 "sicCodes":[{"code":"86230","description":"Dental practice activities"}],
 "accountsCategory":"TOTAL EXEMPTION FULL","accountsNextDue":"2027-04-30",
 "confirmationStatementNextDue":"2027-01-30","mortgageCharges":2,
 "registerUrl":"https://find-and-update.company-information.service.gov.uk/company/06054123",
 "snapshotDate":"2026-10-01","source":"Companies House Free Company Data Product"}
```

### Why it is reliable and cheap

- Reads the **official free bulk snapshot** that Companies House publishes for exactly this purpose: https://download.companieshouse.gov.uk/en_output.html. It makes no page scraping requests, so it is never rate-limited or blocked.
- **Streams** the seven ZIP parts. It never loads the 2.3 GB of CSV into memory: peak memory was about 20 MB in tests, and a full scan of 5.7M rows took 61–71 s.
- Retries with backoff on every download. A failed part is reported in `RUN_REPORT`; the run does not die silently.

### Limits (read before buying)

- **Freshness:** the snapshot runs to the end of the previous month and is published within 5 working days of month end. It does not include companies incorporated in the last few days. `snapshotDate` is on every row.
- **Company-level data only.** There are no directors, PSCs, emails or phone numbers. Officer data is personal data, so this actor deliberately leaves it out.
- You are responsible for lawful use (UK GDPR / PECR) when contacting companies.

### Data licence

Companies House: *"We impose no rules or requirements on how the information on the public register is used… You are responsible for complying with any applicable data protection, copyright and other legislation."* (https://www.gov.uk/guidance/companies-house-data-products). Contains public sector information from Companies House.

### Integrations

Use the Apify API, schedules, webhooks, and the Make / Zapier / n8n / Google Sheets integrations. The actor can also be called from AI agents through Apify MCP.

### Only new companies since your last run

Turn on **Only new since last run** and schedule the actor weekly or monthly. It remembers every company it has already given you for the same filters (or the same **Watch name**) and returns only companies you haven't seen. Companies House refreshes the free snapshot monthly, so a monthly schedule is usually enough.

### Pricing (pay per event)

- $0.02 per run
- $0.00075 per company returned ($0.75 per 1,000)

Set a **maximum cost per run** and the actor stops adding results once it reaches your budget, so you never pay more than you choose.

# Actor input Schema

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

Match companies whose SIC codes start with any of these, e.g. "62" (all IT), "56101" (licensed restaurants). Leave empty for any.

## `sicKeywords` (type: `array`):

Match if any SIC description contains one of these words (case-insensitive), e.g. "dental".

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

Registered-office postcode starts with any of these, e.g. "M1", "EC1", "BT". Spaces ignored.

## `postTowns` (type: `array`):

Exact registered-office post town, case-insensitive, e.g. "LEEDS".

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

Exact statuses to keep, e.g. "Active". Empty = any status.

## `excludeStrikeOffProposals` (type: `boolean`):

Drop 'Active - Proposal to Strike off' companies even if 'Active' prefixes are used.

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

e.g. "Private Limited Company", "PRI/LTD BY GUAR/NSC (Private, limited by guarantee, no share capital)". Empty = any.

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

Incorporated on or after (YYYY-MM-DD)

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

Incorporated on or before (YYYY-MM-DD)

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

Shortcut for 'new companies'. Counted back from the snapshot date.

## `nameContains` (type: `array`):

Any of these substrings, case-insensitive.

## `accountsCategories` (type: `array`):

e.g. "MICRO ENTITY", "FULL", "TOTAL EXEMPTION FULL". Useful as a size proxy.

## `maxResults` (type: `integer`):

Stop after this many matches. The snapshot is ordered by company name, so a low cap gives an alphabetical slice.

## `onlyNewSinceLastRun` (type: `boolean`):

Remember the companies returned for these filters and return only companies you have not received before. Great for scheduled weekly or monthly runs. Companies House refreshes the snapshot monthly.

## `watchName` (type: `string`):

Optional label for the 'only new' memory, so you can change filters and keep the same history. Leave empty to key it on the filters.

## `includePreviousNames` (type: `boolean`):

Include previous names

## `snapshotPageUrl` (type: `string`):

Snapshot index page (advanced)

## `localZipPaths` (type: `array`):

Skip download and read these local snapshot zips.

## Actor input object example

```json
{
  "sicCodes": [
    "62"
  ],
  "companyStatuses": [
    "Active"
  ],
  "excludeStrikeOffProposals": true,
  "incorporatedWithinDays": 90,
  "maxResults": 100,
  "onlyNewSinceLastRun": false,
  "includePreviousNames": false,
  "snapshotPageUrl": "https://download.companieshouse.gov.uk/en_output.html"
}
```

# Actor output Schema

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

Companies matching your filters

## `runReport` (type: `string`):

Counts, timings and any errors for this run

# 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": [
        "62"
    ],
    "incorporatedWithinDays": 90,
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("zaidistudio/uk-companies-house-bulk-filter").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": ["62"],
    "incorporatedWithinDays": 90,
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("zaidistudio/uk-companies-house-bulk-filter").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": [
    "62"
  ],
  "incorporatedWithinDays": 90,
  "maxResults": 100
}' |
apify call zaidistudio/uk-companies-house-bulk-filter --silent --output-dataset

```

## MCP server setup

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

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/cUkazuUT0cY9hpHk3/builds/6tA9Y4oj06p0AASXA/openapi.json
