# Companies House In-Depth Scraper (`best_actors/companies-house-in-depth-scraper`) Actor

Every new UK company registered on the days you pick, filtered by industry and postcode, with the director, a website check, the director's other companies and email addresses. Pay only for leads delivered.

- **URL**: https://apify.com/best_actors/companies-house-in-depth-scraper.md
- **Developed by:** [Lewis O'Rorke](https://apify.com/best_actors) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$10.00 / 1,000 leads

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

## Companies House In-Depth Scraper

**Find brand-new UK businesses the day after they register, filtered to the
industries and areas you sell to, with the director's name, a website check,
the director's other companies, and email addresses.**

Over 2,000 limited companies register at Companies House every working day.
Every one of them is about to need a bank account, an accountant, insurance, a
website, a phone line, a logo, signage and a card machine. This Actor turns the
official register into a clean, ready-to-use lead list, so you reach them
before your competitors do.

***

### Who it is for

- **Web designers and marketing agencies**: new companies with no website yet
- **Accountants and bookkeepers**: every new Ltd needs year-end accounts and a tax return
- **Insurance brokers**: trades, hospitality and retail need cover before they open
- **Business banks, card machine and payment providers**
- **Sign makers, printers, vehicle wrap and workwear suppliers**
- **Recruiters, IT support and telecoms providers**
- **Anyone researching new business activity** in a sector or region

***

### What you get for each company

| Field | What it means |
|---|---|
| `company_name`, `company_number` | As registered at Companies House |
| `incorporated_on` | The day the company was registered |
| `company_type`, `company_status` | e.g. `ltd`, `active` |
| `sic_codes`, `industry` | The company's declared business activity, and which of our industry groups it falls into |
| `address`, `locality`, `postcode`, `country` | Registered office address |
| `director_name` | The first director, in normal "First Last" order |
| `director_nationality`, `director_occupation`, `director_appointed_on` | As filed |
| `other_officers` | Any other directors or secretaries |
| `website_found`, `website_url` | Whether an obvious website exists for the company name |
| `director_other_active_companies` | How many other active companies the director runs |
| `director_other_company_name`, `director_other_company_website` | One of those companies, and its website if we can find one |
| `email_domain`, `email_domain_active`, `email_provider` | The most likely email domain, whether it actually receives email, and who hosts it (Google Workspace, Microsoft 365...) |
| `emails_found` | Real addresses published on the company's (or the director's other company's) website |
| `email_guesses` | Likely addresses built from the director's name and the domain (unverified) |
| `companies_house_url` | The company's official page |
| `google_search_url`, `linkedin_company_search_url`, `linkedin_director_search_url` | One-click searches for finding phone numbers, social pages and the director's profile |

#### Why the "director's other companies" field matters

A company registered yesterday almost never has a website or a public email
yet. But many directors already run another business that does. The Actor
looks up every other active company the director is appointed to, finds a
website for one of them, and scrapes it for contact details. In testing, this
was the most reliable route to a real email address for a brand-new company.

***

### How to use it (step by step)

#### 1. Open the Actor and fill in the form

You only need to set what matters to you. Everything else has sensible defaults.

**When were they registered?**

- **Days back**: `1` means yesterday only. `7` means the last week.
- Or set **From date** and **To date** for an exact range. These override Days back.

**What kind of business?**

- Pick one or more **Industries**, or leave it empty for every trading business.
- Add **Extra SIC codes** to target one trade precisely (see the cheat sheet below).

**Where?**

- **Postcode areas**: the letters at the start of a postcode, e.g. `M` for
  Manchester, `BS` for Bristol. You can be more precise with a district such as `BS1`.
- **Town or city**: matches the registered office town, e.g. `Leeds`.
- **Country**: England, Scotland, Wales or Northern Ireland.

**How many and how much detail?**

- **Maximum leads**: the run stops when it has delivered this many.
- **Only companies with no website**: tick this if you sell websites or marketing.
- **Look up the director's other companies** and **Find email addresses**: on by
  default. Turn them off if you only need names and addresses; the run will be much faster.

#### 2. Click Start

Leads appear in the **Output** tab as each one is finished, so you can watch
them arrive. A run of 50 fully enriched leads usually takes 3 to 8 minutes. With the extra lookups turned off it takes seconds.

#### 3. Download or connect your results

From the Output tab, export as **Excel, CSV, JSON or HTML**. Or send them
straight to Google Sheets, HubSpot, a CRM or email tool using Apify's
integrations (Zapier, Make, n8n, webhooks) or the API.

#### 4. (Optional) Run it every morning automatically

Go to **Schedules**, create a schedule (for example 08:00 every weekday), and
choose this Actor with `"daysBack": 1`. Each morning you get yesterday's new
companies. Add an integration to have them delivered to a spreadsheet or your inbox.

***

### Ready-made examples

Paste any of these into the **JSON** view of the input.

**New trades in Greater Manchester with no website, last 7 days**

```json
{
  "daysBack": 7,
  "industries": ["trades"],
  "postcodePrefixes": ["M", "SK", "OL", "BL", "WN", "WA"],
  "excludeCompaniesWithWebsite": true,
  "maxLeads": 100
}
```

**Every new restaurant, cafe and takeaway in London yesterday**

```json
{
  "sicCodes": ["56101", "56102", "56103"],
  "postcodePrefixes": ["EC", "WC", "W", "N", "NW", "SW", "SE", "E"],
  "maxLeads": 200
}
```

**New hair and beauty businesses across Scotland this month**

```json
{
  "dateFrom": "2026-10-01",
  "dateTo": "2026-10-11",
  "industries": ["beauty"],
  "country": "Scotland",
  "maxLeads": 300
}
```

**Fast, names and addresses only: all new UK companies yesterday**

```json
{
  "maxLeads": 2000,
  "checkWebsite": false,
  "findDirectorOtherCompanies": false,
  "findEmails": false
}
```

***

### Cheat sheets

#### Industry groups

| Industry | Includes |
|---|---|
| Trades and construction | Builders, electricians, plumbers, joiners, plasterers, painters, roofers, scaffolders, cleaning, landscaping |
| Retail shops | Every kind of shop and market stall |
| Restaurants, cafes, pubs, hotels | Restaurants, cafes, takeaways, catering, pubs, bars, hotels, holiday lets |
| Hair, beauty, wellbeing | Hairdressers, barbers, beauty salons, spas, therapists |
| Professional services | Solicitors, accountants, consultants, architects, engineers, advertising, photographers |
| Health and care | Clinics, dentists, care homes, social care |
| Fitness and sport | Gyms, personal trainers, sports clubs and facilities |
| Online shops | Retail via internet or mail order |
| Motor trade | Car sales, garages, parts, motorcycles |

#### Popular SIC codes

| Business | SIC | Business | SIC |
|---|---|---|---|
| Plumbers / heating | 43220 | Hairdressers | 96021 |
| Electricians | 43210 | Barbers | 96022 |
| Joiners / carpenters | 43320 | Restaurants | 56101 |
| Plasterers | 43310 | Cafes | 56102 |
| Painters / decorators | 43341 | Takeaways | 56103 |
| Roofers | 43910 | Pubs and bars | 56302 |
| Domestic building | 41202 | Dentists | 86230 |
| Garages / repairs | 45200 | Online retail | 47910 |

Full list: [resources.companieshouse.gov.uk/sic](https://resources.companieshouse.gov.uk/sic/)

#### City postcode areas

| City | Postcode areas |
|---|---|
| London (central) | EC, WC, W, N, NW, SW, SE, E |
| Manchester | M, SK, OL, BL, WN, WA |
| Birmingham | B |
| Leeds | LS |
| Liverpool | L, CH |
| Bristol | BS |
| Newcastle | NE |
| Sheffield | S |
| Glasgow | G |
| Edinburgh | EH |
| Cardiff | CF |
| Belfast | BT |
| Nottingham | NG |
| Leicester | LE |

A postcode area matches only that area: `M` is Manchester and does **not**
include Milton Keynes (`MK`), Motherwell (`ML`) or Medway (`ME`).

***

### Pricing

You pay **per lead delivered**. You are never charged for:

- companies removed by your filters
- companies skipped because they already have a website (when you ask for that)
- a company that fails to process
- a search that finds nothing

Set a **maximum cost per run** in the run options and the Actor stops cleanly
when it reaches it, keeping every lead delivered so far.

***

### Companies House API key (optional)

The Actor works without one. If you run large or frequent jobs, add your own
free key so you get your own rate limit (600 requests per 5 minutes):

1. Register at [developer.company-information.service.gov.uk](https://developer.company-information.service.gov.uk/).
2. Create an application, then create a **REST** API key.
3. Paste it into **Your Companies House API key**. It is stored encrypted and never shown in logs.

***

### Tips for better results

- **Small areas need wider dates.** One postcode area over one day may have
  only a handful of new companies. Use 7 to 30 days.
- **Companies often file their SIC code late.** Companies with no SIC code are
  kept rather than thrown away, so you do not miss real businesses.
- **Check `email_domain_active` before emailing guesses.** If it is `false`, the
  domain does not receive email and the guesses will bounce.
- **Prefer `emails_found` over `email_guesses`.** Found addresses were published
  on a real website.
- **Use the LinkedIn and Google links** to find a phone number or social page in one click.

***

### Honest limits

- **The website check is a best guess.** It tries the obvious domains for the
  company name (`.co.uk`, `.com`, `.uk`, `.org.uk`, `.net`). It can match an
  unrelated business with the same name, and it misses websites on unusual domains.
- **Email guesses are not verified.** They follow the most common patterns.
- **Companies House does not publish director email addresses or phone numbers.**
  This Actor never claims to have them.
- **Only active companies are returned.** Dormant shells, holding companies,
  nominee and property or finance vehicles are always excluded, because they
  almost never buy anything.

***

### FAQ

**How fresh is the data?**
It is read live from the official Companies House API on every run. Yesterday's
registrations are available the next morning.

**Can I get companies from further back?**
Yes, any date range. Longer ranges just take longer to read.

**Why did I get fewer leads than my maximum?**
There were not that many matching companies in your date range and area.
Widen the dates, add postcode areas, or remove the "no website" option.

**Is this legal to use?**
The data is the public register, published by Companies House for reuse. In
the UK, contacting limited companies about business products is generally
allowed under legitimate interest, provided you say who you are, give a clear
way to opt out, and honour it. Sole traders and partnerships have stronger
protection. You are responsible for how you use the results.

**Something is wrong or missing.**
Open an issue on the Issues tab with your run link and I will look at it.

# Actor input Schema

## `daysBack` (type: `integer`):

Companies registered in the last N days, ending yesterday. Ignored if you set dates below.

## `dateFrom` (type: `string`):

Optional. First registration date (YYYY-MM-DD).

## `dateTo` (type: `string`):

Optional. Last registration date, inclusive (YYYY-MM-DD).

## `industries` (type: `array`):

Leave empty for all trading industries. Shells, holding companies and property vehicles are always left out.

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

Specific SIC codes, e.g. 43220 for plumbers. Combined with the industries above.

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

Registered office postcode starts with any of these, e.g. M, SK, BS1.

## `locality` (type: `string`):

Registered office town contains this text, e.g. Bristol.

## `country` (type: `string`):

Optional.

## `maxLeads` (type: `integer`):

Stops once this many leads are delivered. You pay per lead.

## `checkWebsite` (type: `boolean`):

Tries the obvious domains for the company name (.co.uk, .com, .uk...).

## `excludeCompaniesWithWebsite` (type: `boolean`):

Leave out companies that already have a matching website. Useful if you sell websites or marketing.

## `findDirectorOtherCompanies` (type: `boolean`):

Counts the director's other active companies and finds a website for one of them. Often the best route to an email address.

## `findEmails` (type: `boolean`):

Checks whether the company's domain receives email, scrapes addresses from any website found, and lists likely addresses from the director's name. Guesses are unverified.

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

Optional. A free key from developer.company-information.service.gov.uk gives you your own rate limit, so large runs go faster.

## Actor input object example

```json
{
  "daysBack": 7,
  "industries": [
    "trades"
  ],
  "sicCodes": [],
  "postcodePrefixes": [
    "M",
    "SK"
  ],
  "maxLeads": 20,
  "checkWebsite": true,
  "excludeCompaniesWithWebsite": false,
  "findDirectorOtherCompanies": true,
  "findEmails": true
}
```

# Actor output Schema

## `leads` (type: `string`):

One row per new company, enriched.

## `leadsAllFields` (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 = {
    "daysBack": 7,
    "industries": [
        "trades"
    ],
    "sicCodes": [],
    "postcodePrefixes": [
        "M",
        "SK"
    ],
    "maxLeads": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("best_actors/companies-house-in-depth-scraper").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 = {
    "daysBack": 7,
    "industries": ["trades"],
    "sicCodes": [],
    "postcodePrefixes": [
        "M",
        "SK",
    ],
    "maxLeads": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("best_actors/companies-house-in-depth-scraper").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 '{
  "daysBack": 7,
  "industries": [
    "trades"
  ],
  "sicCodes": [],
  "postcodePrefixes": [
    "M",
    "SK"
  ],
  "maxLeads": 20
}' |
apify call best_actors/companies-house-in-depth-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,best_actors/companies-house-in-depth-scraper"
        }
    }
}
```

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/tXycRMNFbWbITvtfI/builds/I3DZ6yEitPntLhtvL/openapi.json
