# UK Companies House Scraper - Company Search (`goat255/companies-house-scraper`) Actor

Search the public UK company register and get one clean row per company: number, name, previous names, incorporation or dissolution date, registered address and postcode. No sign-in and no API key.

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

## Pricing

from $1.50 / 1,000 company scrapeds

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

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## UK Companies House Scraper

Search the public UK company register and get one clean row per company. Company number, name, previous names, status, incorporation or dissolution date, registered address and postcode. No sign-in and no API key.

### What it does

- **Search by name or keyword.** One search per term, and results are deduplicated across all your terms, so a company matching two terms is delivered once and charged once.
- **Dates as real dates.** "27 November 1947" is returned as `1947-11-27`, so you can sort and filter instead of parsing text.
- **Previous names** where the register records them, which is how you follow a company through a rebrand.
- **Postcode split out** from the registered address, ready to join against other datasets.
- **Status only when the register states it.** See the note below, it matters.

Common uses: building company lists, sales and lead research, due diligence, checking a supplier or counterparty, corporate structure mapping, and keeping a company dataset current.

### Input

| Field | Type | Description |
|---|---|---|
| `searchTerms` | array | Company names, partial names or keywords. One search per entry. |
| `maxResultsPerTerm` | integer | Cap per term. Default 100. |
| `proxyConfiguration` | object | Optional. Enable to spread requests across IPs. |

#### Example input

```json
{
  "searchTerms": ["acme trading", "example holdings"],
  "maxResultsPerTerm": 300
}
```

### Output

Each item is one company.

```json
{
  "companyNumber": "00000001",
  "name": "ACME TRADING LIMITED",
  "previousNames": ["ACME SUPPLIES LIMITED"],
  "status": null,
  "statusLabel": "Incorporated on 27 November 1947",
  "incorporatedOn": "1947-11-27",
  "openedOn": null,
  "dissolvedOn": null,
  "registeredAddress": "1 Example Street, Example Town, EX1 2AB",
  "postcode": "EX1 2AB",
  "url": "https://find-and-update.company-information.service.gov.uk/company/00000001",
  "searchTerm": "acme trading"
}
```

### Notes

- **An active company is never labelled active.** The search listing states an incorporation date, or that a company was dissolved or closed, but it does not say "active". So `status` is filled in only when the register actually says so (`dissolved` or `closed`) and is `null` otherwise. The exact wording is always passed through in `statusLabel`. A `null` status means the register did not state one, not that the company is confirmed trading.
- **Overseas companies and UK establishments** are not incorporated in the UK, they open an establishment. That date is returned in `openedOn` rather than being passed off as an incorporation date.
- A small number of entries on the register carry only a company number, with no status wording and no address. Those rows keep their number, name and link, and return `null` for the rest rather than a guess.
- `postcode` is only filled when the registered address contains a UK postcode. Overseas registered addresses return `null`.
- Dissolved companies do not show an incorporation date in the search listing, so `incorporatedOn` is `null` for them while `dissolvedOn` is filled.

### Privacy

To improve our actors we collect anonymized usage telemetry (run stats and input patterns). No personal account data is collected.

# Actor input Schema

## `searchTerms` (type: `array`):

Company names, partial names or keywords. One search per entry.

## `maxResultsPerTerm` (type: `integer`):

Cap per search term. Results are deduplicated across terms.

## `proxyConfiguration` (type: `object`):

Optional. Enable to spread requests across IPs.

## Actor input object example

```json
{
  "searchTerms": [
    "holdings limited"
  ],
  "maxResultsPerTerm": 100
}
```

# Actor output Schema

## `records` (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 = {
    "searchTerms": [
        "holdings limited"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("goat255/companies-house-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 = { "searchTerms": ["holdings limited"] }

# Run the Actor and wait for it to finish
run = client.actor("goat255/companies-house-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "holdings limited"
  ]
}' |
apify call goat255/companies-house-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=goat255/companies-house-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/bDAcYfndDUS5p4FrY/builds/wDPupRjgCgFMD1JpD/openapi.json
