# UK Company Check: Companies House Risk Flags (`lone_rachis/uk-company-check`) Actor

Check UK companies on the official Companies House register: status, age, SIC codes, accounts and confirmation deadlines, insolvency, charges, officer and PSC counts, and risk flags that name the field they come from. Or get a daily feed of new companies by SIC code.

- **URL**: https://apify.com/lone_rachis/uk-company-check.md
- **Developed by:** [Kesav Kumar Jayakumar](https://apify.com/lone_rachis) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 company records

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

### What does UK Company Check do?

**UK Company Check** reads the official Companies House register for UK companies and returns one row per company with the facts a credit, compliance or sales team checks first: status, age, SIC codes with their descriptions, registered office locality and postcode, the last accounts and their type, when the next accounts and confirmation statement are due and whether they are overdue, insolvency history, charges registered and how many are still outstanding, and how many active officers and persons with significant control the company has. Each row ends with a list of risk flags, and every flag names the register field it comes from.

It has two modes. **Check** takes company numbers or names you give it. **New companies** lists every company incorporated in a date window, by default yesterday, filtered by SIC code, location and company type, so a daily schedule gives you a feed of new UK companies in your industry.

The Actor uses the Companies House public data API, never the website. It keeps one request a second, waits when the API key's 5-minute allowance runs low, and rows hold company facts and counts only: no officer or owner names, birth dates, nationalities or addresses. The data is Companies House data, used under the Open Government Licence v3.0 (https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/). The Actor is not affiliated with Companies House.

### Why use UK Company Check?

The register holds the facts, but reading them means opening several pages per company and knowing which fields matter. A company can show "active" while its accounts are a year late, a proposal to strike it off is open, or lenders still hold charges over its assets. This Actor reads those fields for you and writes them as columns you can sort and filter, with the flags already worked out.

What you get:

- **Risk flags that say where they come from.** 15 flags such as `accounts_overdue`, `confirmation_overdue`, `proposal_to_strike_off`, `in_liquidation`, `insolvency_history`, `outstanding_charges`, `dormant_accounts` and `recently_incorporated`, each with a sentence naming the field and its value.
- **Charges counted for every company.** The register's own `has_charges` field said false for every company read while this Actor was built, including Tesco with 2 outstanding charges, so the Actor reads the charges list itself.
- **One row for every input.** A number that is not on the register, a name with no exact match and a repeat in your list each get a clear free row, so you can see what happened to every line you sent.
- **A daily feed of new companies.** Pick SIC codes (exact or by prefix, such as `62` for all computer programming), a location and company types, and schedule it.
- **Your own key, or a trial.** Add your own free Companies House API key for up to 5,000 companies or 10,000 rows a run. Without one, the Actor's built-in key gives a small trial per run.

Each claim above has a test behind it:

| What you get | How it works | The test that backs it |
| --- | --- | --- |
| **Risk flags that name their field** | Each flag is one rule over one field of the Companies House answer, and its sentence in `flagDetails` quotes that field and its value. | "every case of the recorded companies comes out with the flags its fields call for", "every flag the fixtures raise names its field in its detail", and one test per flag in `flags.test.mjs`, such as "outstanding_charges counts total minus satisfied, and is not raised when charges were not looked up". Checked by hand against the live API for Tesco, Urdeals Ltd and Maze Inc Limited on 13 Oct 2026. |
| **Charges for every company** | The charges list is read with one item a page, which gives the total, satisfied and part-satisfied counts in one request. | "the prefill checks Tesco, BP and Vodafone in 4 requests each, charging one event per company", and the live test "live: the prefill checks Tesco, BP and Vodafone in 12 requests, and charges are found where has_charges says false" (13 Oct 2026). |
| **A row for every input** | Numbers are padded the way the register pads them (`445790` is `00445790`). A name is looked up in the register's search and used only on an exact match of the name, unless you allow the closest one. | "a number that is not on the register gets a free not-found row, and a repeat is checked once", "names: an exact match is used, a near one is not, unless the user allows the closest match". |
| **A daily feed of new companies** | One search over the window, paged 5,000 at a time. A window with more companies than the run may deliver is read day by day, so a run that stops early stops at the end of a day and tells you where to continue. | "new companies: SIC 62020 on 12 Oct comes in three pages of 50, one charge per company", "new companies: a window over the cap is read day by day, so the stop falls on a day boundary". |
| **Your own key, or a trial** | With your key in `apiKey`, a run checks up to 5,000 companies or 10,000 rows. Without it, the Actor's built-in key stops at 25 companies or 500 rows and writes a free row that explains how to add yours. | "C1 the built-in key checks 25 companies per run; the 26th gets a free row saying how to add a key", "new companies: the built-in key stops at 500 rows with a way to add a key; the own key goes on". |
| **Inside the Companies House rate limit** | One request a second. Before each request the Actor reads how many requests the key has left in its 5-minute window, and below 20 it waits for the window to reset. Three answers of HTTP 429 in a row stop the run. | "N3 with fewer than 20 requests left in the window the run waits for the reset instead of running into 429s", "N1 three 429s in a row stop every request; what was not reached gets one free row". |
| **Your key stays secret** | `apiKey` is a secret input, encrypted by Apify. The Actor never writes it to a row, the summary or the log. | "K4 no row, summary, log line or stored file holds the key, whichever way it came", "no error message, redacted header copy or printed client holds the key". |
| **People only as counts** | Officers and persons with significant control are read as counts from the register's `active_count`, never as names. | "no row key can hold a person: there are counts of officers and PSCs, and nothing else about them". |
| **Charged only for what you get** | One charge per company row with status `ok`. Every other row is free, and the run stops before it would charge past your maximum cost per run. A run that restarts reads its own rows first. | "P6 the maximum cost per run stops delivery cleanly, before the next company is read", "B2 a run killed after some rows resumes from its own rows: nothing is read, delivered or charged twice". |

Plus what the Apify platform adds around it:

- **API access.** Start runs and read results with the Apify API or the JavaScript and Python clients.
- **Scheduling.** Run the new-companies feed every morning and get yesterday's companies each time.
- **Integrations.** Send rows to Make, Zapier, Google Sheets, Slack or any webhook.
- **Monitoring.** Run history, logs and alerts for failed runs.

Typical uses are a check of new suppliers or customers before an account is opened, a weekly review of a client list for overdue filings and insolvency, a lead list of companies incorporated yesterday in one industry for a sales team, and a research sample of companies by SIC code.

### What data can UK Company Check extract?

Each company becomes one row in the dataset. The most useful fields:

| Field | Type | What it holds |
| --- | --- | --- |
| `status` | string | `ok`, `not-found`, `failed`, `skipped`, `removed` or `no-results`. (`invalid` is reserved and not written today.) |
| `input`, `matchedBy` | string | What you typed, and how it was matched: `company-number`, `exact-name`, `closest-name`, `name-search` or `new-companies-search`. |
| `companyNumber`, `companyName` | string | The register's 8-character number and the company name. |
| `companyStatus`, `companyStatusDetail` | string | Such as `active`, `dissolved`, `liquidation`, and details such as `active-proposal-to-strike-off`. |
| `companyType`, `companySubtype`, `jurisdiction` | string | Such as `ltd`, `plc`, `llp`, and `england-wales` or `scotland`. |
| `dateOfCreation`, `dateOfCessation`, `ageYears` | string, string, number | Incorporation and dissolution dates, and the age in years to one decimal. |
| `sicCodes`, `sicDescriptions` | array | SIC 2007 codes and their descriptions from the condensed list Companies House publishes. |
| `registeredOfficeLocality`, `registeredOfficePostcode`, `registeredOfficeCountry` | string | The town, postcode and country of the registered office. Address lines are left out. |
| `lastAccountsMadeUpTo`, `lastAccountsType` | string | The last accounts and their type, such as `full`, `group`, `micro-entity` or `dormant`. |
| `nextAccountsDue`, `nextAccountsMadeUpTo`, `accountsOverdue` | string, string, boolean | When the next accounts are due, and whether the register marks them overdue. |
| `confirmationStatementLastMadeUpTo`, `confirmationStatementNextDue`, `confirmationStatementOverdue` | string, string, boolean | The same for the confirmation statement. |
| `hasInsolvencyHistory`, `hasBeenLiquidated` | boolean | The register's own insolvency fields. |
| `registeredOfficeInDispute`, `undeliverableRegisteredOfficeAddress` | boolean | Whether the office address is disputed, or post to it comes back. |
| `chargesChecked`, `chargesTotal`, `chargesOutstanding`, `chargesPartSatisfied`, `chargesSatisfied` | boolean, number | Charges (secured lending) registered against the company, and how many are not satisfied. |
| `activeOfficers`, `activePersonsWithSignificantControl` | number | Counts only. |
| `filingActivityChecked`, `filingsLast12Months`, `filingsLast12MonthsIsMinimum`, `latestFilingDate`, `latestFilingType`, `latestFilingCategory` | boolean, number, string | With **Include filing activity** on: filings of the last 12 months and the latest one. |
| `flags`, `flagDetails` | array | The risk flags, and one sentence per flag naming its source field. |
| `companyUrl` | string | The company's page on the Companies House service. |
| `error`, `errorCode` | string | Why a row is not `ok`, as a sentence and as a short code. |

The flags and the field each one reads:

| Flag | Raised when |
| --- | --- |
| `dissolved` | `company_status` is `dissolved`. |
| `closed` | `company_status` is `converted-closed`, `closed` or `removed`. |
| `in_liquidation` | `company_status` is `liquidation`. |
| `insolvency_proceedings` | `company_status` is `administration`, `receivership`, `voluntary-arrangement` or `insolvency-proceedings`. |
| `insolvency_history` | `has_insolvency_history` is true. |
| `has_been_liquidated` | `has_been_liquidated` is true. |
| `proposal_to_strike_off` | `company_status_detail` is `active-proposal-to-strike-off`. |
| `accounts_overdue` | `accounts.overdue` is true. |
| `confirmation_overdue` | `confirmation_statement.overdue` is true. |
| `outstanding_charges` | `charges.total_count` minus `charges.satisfied_count` is above 0. Only when charges were read. |
| `dormant_accounts` | `accounts.last_accounts.type` is `dormant`. |
| `recently_incorporated` | `date_of_creation` is less than 12 months before the day of the check (London date). |
| `registered_office_in_dispute` | `registered_office_is_in_dispute` is true. |
| `undeliverable_office_address` | `undeliverable_registered_office_address` is true. |
| `no_active_officers` | The company is `active` and `officers.active_count` is 0. |

The **Overview** view shows status, flags, age, due dates, outstanding charges and the postcode. The **New companies** view shows the type, incorporation date, SIC codes and location.

Every row that is not `ok` carries one of these codes in `errorCode`, so you can count rows by reason without reading the sentence. The sentence in `error` can be reworded in a later version. The code stays.

| `errorCode` | Meaning |
| --- | --- |
| `not-found` | Companies House has no company with that number. |
| `no-exact-name-match` | No company has exactly that name. The row lists the three closest names with their numbers. |
| `duplicate` | The company is already in your list, so it was checked once. |
| `removed-on-request` | The company was removed from this Actor's output on request. |
| `no-results` | No company was incorporated in the window with your filters. |
| `trial-limit` | The built-in trial key reached its cap of 25 companies or 500 rows for this run. Add your own key in `apiKey`. |
| `run-limit` | Your own key reached the cap of 5,000 companies or 10,000 rows for one run. |
| `max-results` | The run reached your maximum number of rows (`maxResults`). |
| `charge-limit` | The run reached your maximum cost per run. |
| `run-time-limit` | The run reached its time limit. |
| `rate-limited` | Companies House answered "too many requests" (HTTP 429) three times in a row. |
| `key-refused` | Companies House refused the API key (HTTP 401). |
| `repeated-failures` | Five companies in a row failed with a server or network error, so the run stopped. |
| `search-reach` | The search reaches only the first 10,000 companies of one query. |
| `aborted` | The run was stopped. |
| `server-error`, `http-error`, `bad-request` | Companies House answered with an error status. |
| `network-error`, `timeout` | Companies House could not be reached, or did not answer within 30 seconds. |
| `too-large`, `bad-response`, `unexpected-redirect` | An answer over 20 MB, an answer the Actor could not read, or a redirect to another site. |
| `other` | Any other reason. The sentence in `error` says what happened. |

### How to check UK companies and get new ones every day

1. Open the Actor in Apify Console and select the **Input** tab.
2. The form is prefilled with check mode and three companies (Tesco, BP and Vodafone), so you can press **Start** to see a result straight away. On 13 Oct 2026 that run took 12 seconds and flagged outstanding charges at Tesco and Vodafone.
3. Add your own free Companies House API key in **Your Companies House API key** (`apiKey`). It takes three steps:
   1. Open the Companies House Developer Hub at https://developer.company-information.service.gov.uk and select **Sign in / Register** to create a free account.
   2. Select **Create an application**, give it a name and a description, and choose **Live** (not the test sandbox).
   3. Open the application, select **Create new key**, name it, choose **API key** as the client type and select **Create**. Copy the key into `apiKey`. Leave any IP or domain restriction empty, because runs come from Apify's servers.
4. For a check, put company numbers or exact names in **Companies to check**, one per line. Turn on **Include filing activity** if you want the filings of the last 12 months.
5. For a feed, set **What to do** to new companies, then pick SIC codes, a location or company types. Leave the dates empty to get yesterday's companies.
6. Press **Start**. A check takes about 4 seconds per company. A feed takes a few seconds for a day.
7. Open the **Output** tab for the table, and export it as JSON, CSV or Excel. For a daily feed, create a schedule with the same input, for example every morning at 7:00 London time.

To run it from code, send the same input to the Actor through the API:

```json
{
    "mode": "new-companies",
    "sicCodes": ["62"],
    "location": "Manchester",
    "companyTypes": ["ltd"],
    "apiKey": "your-companies-house-api-key"
}
```

### How to send new companies to Slack or Google Sheets (Make, Zapier, no code)

A scheduled feed holds only the companies of the day it reads, so you can pass every run's results straight on.

**Slack, built in.** On the Actor's **Integrations** tab, add **Slack**, connect your workspace, pick a channel and choose the event "Run succeeded". Each finished run posts a message with a link to its results.

**Google Sheets with Make.com.**

1. In Make, create a scenario and add the Apify module that watches for finished Actor runs, set to this Actor.
2. Add the Apify module that gets dataset items, and map the run's default dataset ID.
3. Add Google Sheets "Add a Row" and map the fields you want, for example `companyName`, `companyNumber`, `dateOfCreation`, `sicDescriptions`, `registeredOfficeLocality` and `companyUrl`.
4. Optional: add a filter so only rows with a flag you care about, such as `accounts_overdue`, reach the sheet.

**Google Sheets or Slack with Zapier.** Use the Apify trigger for a finished Actor run, then the Apify step that fetches dataset items, then a Google Sheets "Create Spreadsheet Row" or a Slack "Send Channel Message" action. A Zapier filter step works the same way as the Make filter.

**Your own code.** Add a webhook on the **Integrations** tab for the event "Run succeeded", and read the dataset from the URL in the payload.

Set the schedule first (see the steps above), so that each run, and each message or row, covers one new day.

### How much does it cost to check UK companies?

You pay per company delivered, and the Apify platform usage for the run is included. A company costs $0.006 on the Free and Bronze plans, so 1,000 companies cost $6.

| Event | When it is charged | Price |
| --- | --- | --- |
| `company` | One company row delivered with status `ok` | $0.006 (Free, Bronze), $0.0055 (Silver), $0.005 (Gold) |
| Actor start | Once per run, scaled by memory (Apify standard event) | $0.00005 per GB of memory |

Rows with the status `not-found`, `failed`, `skipped`, `removed` or `no-results` cost nothing, and a company that appears twice in your list is charged once. You can cap a run with the **Maximum cost per run** setting or with `maxResults`, and the Actor stops cleanly at that limit.

#### How much does one company cost?

One company costs $0.006 on the Free and Bronze plans, $0.0055 on Silver and $0.005 on Gold, in both modes. A run adds a start fee of about $0.0000125 at the default memory of 256 MB. As a guide: a check of 500 companies costs $3.00, and a daily feed of SIC 62020 (information technology consultancy) brought 2,477 companies in the 30 days to 12 Oct 2026, which is $14.86 for the month.

#### How do I keep a run within budget?

Set **Maximum cost per run** when you start it or in the schedule, or set **Maximum rows per run** (`maxResults`) in new-companies mode. The run stops before it would charge past that amount, and the companies it did not deliver get one free `skipped` row with the code `charge-limit` or `max-results`. In new-companies mode the row tells you the first day it did not finish, so the next run can start there.

#### Do I need my own API key?

For more than a quick try, yes. The Actor's built-in key is shared by every user, so a run on it stops at 25 companies or 500 rows. With your own free key the caps are 5,000 companies and 10,000 rows a run, and you have Companies House's allowance of 600 requests per 5 minutes to yourself. The price is the same either way.

### Input

Open the **Input** tab to see every setting with a short description. Every field is optional except what the mode needs. The form has three groups:

- **Check companies:** `mode`, `companies`, `acceptClosestNameMatch`, `skipCharges` and `includeFilingActivity`.
- **New companies feed:** `incorporatedFrom`, `incorporatedTo`, `incorporatedInLastDays` (1 by default, up to 31), `sicCodes`, `location`, `companyTypes` and `maxResults`.
- **Your Companies House key:** `apiKey`, a secret field.

`companies` takes company numbers (`00445790`, `445790`, `SC123456`, `NI629682`) or names. A name is used only when a company has exactly that name, with `Limited` and `Ltd`, `PLC` and `Public Limited Company` read as the same. Set `acceptClosestNameMatch` to take the top search result instead, and check the `matchedBy` column afterwards.

`skipCharges` saves one request per company by not reading the charges list. The charge fields are then empty, which means unknown, not none, and `outstanding_charges` is never raised. Use it only when you do not need charges.

`includeFilingActivity` reads up to 3 pages of the filing history per company (300 filings), which adds 1 to 3 requests. When the last 12 months hold more filings than that, `filingsLast12MonthsIsMinimum` is true.

`incorporatedFrom` and `incorporatedTo` are London dates. Leave both empty for the last `incorporatedInLastDays` full days, ending yesterday. With only `incorporatedFrom`, the window runs to yesterday. A window may be up to 366 days long. `sicCodes` takes 5-digit codes from the Companies House condensed SIC list, or 2 to 4 digits for every code under them (`62` for computer programming and consultancy). `location` is matched by Companies House against the registered office, such as a town or a postcode district. `companyTypes` takes the values in the form, such as `ltd`, `plc` and `llp`.

`maxResults` caps the rows of one new-companies run, up to 10,000.

### Output

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. A run also writes a `SUMMARY` record to its key-value store with the mode, which key was used (`own` or `built-in`, never the key itself), the caps, the counts of companies checked, delivered, not found, failed, skipped and removed, the charged rows, the reason the run stopped early if it did, and the requests sent. A run in which every company failed, or in which the key was refused, ends with the status Failed and the reason in its message, and the rows stay in the dataset.

A checked company and a number that is not on the register look like this:

```json
[
    {
        "status": "ok",
        "errorCode": null,
        "error": null,
        "input": "00445790",
        "matchedBy": "company-number",
        "companyNumber": "00445790",
        "companyName": "TESCO PLC",
        "companyStatus": "active",
        "companyStatusDetail": null,
        "companyType": "plc",
        "companySubtype": null,
        "jurisdiction": "england-wales",
        "dateOfCreation": "1947-11-27",
        "dateOfCessation": null,
        "ageYears": 78.8,
        "sicCodes": ["47110"],
        "sicDescriptions": ["Retail sale in non-specialised stores with food, beverages or tobacco predominating"],
        "registeredOfficeLocality": "Welwyn Garden City",
        "registeredOfficePostcode": "AL7 1GA",
        "registeredOfficeCountry": "United Kingdom",
        "lastAccountsMadeUpTo": "2026-02-28",
        "lastAccountsType": "group",
        "nextAccountsDue": "2027-08-26",
        "nextAccountsMadeUpTo": "2027-02-26",
        "accountsOverdue": false,
        "confirmationStatementLastMadeUpTo": "2026-06-18",
        "confirmationStatementNextDue": "2027-07-02",
        "confirmationStatementOverdue": false,
        "hasInsolvencyHistory": false,
        "hasBeenLiquidated": false,
        "registeredOfficeInDispute": false,
        "undeliverableRegisteredOfficeAddress": false,
        "chargesChecked": true,
        "chargesTotal": 9,
        "chargesOutstanding": 2,
        "chargesPartSatisfied": 0,
        "chargesSatisfied": 7,
        "activeOfficers": 11,
        "activePersonsWithSignificantControl": 0,
        "filingActivityChecked": false,
        "filingsLast12Months": null,
        "filingsLast12MonthsIsMinimum": null,
        "latestFilingDate": null,
        "latestFilingType": null,
        "latestFilingCategory": null,
        "flags": ["outstanding_charges"],
        "flagDetails": ["outstanding_charges: 2 of 9 registered charges are not satisfied (charges.total_count 9, charges.satisfied_count 7)"],
        "companyUrl": "https://find-and-update.company-information.service.gov.uk/company/00445790",
        "checkedAt": "2026-10-13T15:02:11.204Z"
    },
    {
        "status": "not-found",
        "errorCode": "not-found",
        "error": "Companies House has no company with the number 99999999. Check the number (8 characters, such as 00445790 or SC123456). Nothing was charged.",
        "input": "99999999",
        "companyNumber": "99999999",
        "companyName": null,
        "flags": null
    }
]
```

The second row is shortened here. Every row carries every field, with `null` where a value does not apply, so exports keep the same columns. Tesco shows 0 persons with significant control because companies listed on a regulated market are exempt from that register.

### Tips for faster runs and lower costs

- Give company numbers, not names. A name costs one extra request and can miss a company whose registered name differs from the trading name.
- Leave **Include filing activity** off unless you use it. It adds 1 to 3 requests per company, and a check of 25 large companies took 147 seconds with it against 108 without.
- For a daily feed, keep the default window of 1 day (yesterday, London time) and schedule the run once a day. Each run reads whole days, so a second run on the same day returns the same companies and charges for them again.
- A check runs at about one company every 4 seconds, so 500 companies take about 35 minutes. Give long lists a run timeout to match. A run that reaches its limit lists the companies it did not reach in one free `skipped` row.
- Split very large lists over several runs. One run checks at most 5,000 companies.

### FAQ, disclaimers and support

#### Where does the data come from, and may I use it?

From the Companies House public data API. The register is public, and Companies House publishes it for reuse. Contains public sector information licensed under the Open Government Licence v3.0. The licence is at https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/. How you may use what you collect depends on your purpose and your country, so check that for your use case. This is general information, not legal advice.

#### Is this an official Companies House tool?

No. The Actor is an independent tool, not affiliated with, made, endorsed or checked by Companies House. The data comes as the register holds it: if a filing is late to be processed, the row repeats what the register shows on the day of the run. Check the company's page on the Companies House service before you act on a flag.

#### Can I download the whole register with it?

No. The Actor is made for checking the companies you name and for a daily feed of new companies, and the caps per run keep it that way. Companies House publishes its own free bulk data files for whole-register use, and its guidance says the online service is not meant as a source for bulk downloads.

#### Is personal data involved?

The Actor is built to return company facts only. Officers and persons with significant control appear as counts, never as names, birth dates, nationalities or addresses, and corporate officers are counted, not named. Address lines of the registered office are left out. Still, for a small company with one officer, the registered office postcode can be close to that person's home, and a company name can carry a person's name. Under the UK GDPR and similar laws you are the controller of what you collect, so keep and use it for a lawful reason.

If a row is about you or your company and you want it out of this Actor's output, open an issue on the **Issues** tab with the company number. The company is then left out of all future output: a check returns a free `removed` row, and the new-companies feed skips it. The record stays on the public register, which only Companies House can change.

#### How reliable are the flags?

Each flag repeats one field of the register, so it is as current as the register on the day of the run. Things to know:

- **`outstanding_charges`** counts every charge not marked satisfied, part-satisfied ones included. A loan repaid without a statement of satisfaction filed at Companies House still counts. The register's own `has_charges` field said false for every company read while this Actor was built, including Tesco (9 charges, 2 outstanding), Vodafone (6, 5 outstanding) and AstraZeneca (1 outstanding), so the Actor reads the charges list instead. With `skipCharges` on, the charge fields are empty and the flag is never raised.
- **`accounts_overdue` and `confirmation_overdue`** use the register's own overdue fields. Accounts that were filed but not yet processed can still show as overdue until Companies House processes them.
- **`no_active_officers`** counts corporate officers too, so it means the register lists no current officer of any kind.
- **`dormant_accounts`** reads the type of the last accounts only. A company can trade again after dormant accounts.
- **New-companies rows** come from the search answer alone, so they carry no accounts, charges or officer counts, and only the flags that rest on the status and the incorporation date can be raised. Check a company in check mode for the full set.

#### What happens when Companies House limits the requests?

Companies House allows 600 requests per 5 minutes per key. The Actor sends one a second, reads how many requests the key has left before each one, and below 20 waits for the window to reset. A "too many requests" answer (HTTP 429) is waited out, and three in a row stop the run. The companies it did not reach get one free `skipped` row with the code `rate-limited`. On the built-in key the allowance is shared by every user of the Actor, which is one more reason to add your own key.

#### What happens when a run reaches its time limit?

The Actor reads the time limit of the run from the platform and starts no new company in the last 30 seconds. What it did not reach gets one free `skipped` row with the code `run-time-limit`.

#### What if something looks wrong?

Open the Issues tab on the Actor page and describe your input and what you expected. A run link helps. Issues are answered within two days.

### Other Actors by the same developer

- [SEC Form D Feed](https://apify.com/lone_rachis/sec-form-d-raises-feed): new private fundraising rounds filed with the SEC on Form D, with amounts and industry.
- [US Trademark Status and Watch](https://apify.com/lone_rachis/us-trademark-status-watch): USPTO status and upcoming deadlines for US trademarks, and what changed since your last run for marks you watch.
- [SEC EDGAR Filing Monitor](https://apify.com/lone_rachis/sec-edgar-filing-monitor): new SEC filings for the tickers or CIKs you watch.
- [SEC XBRL Fundamentals](https://apify.com/lone_rachis/sec-xbrl-fundamentals): revenue, EPS, cash flow and other reported figures per company and period, from SEC XBRL filings.
- [New Scholarly Papers Watch](https://apify.com/lone_rachis/scholarly-papers-watch): papers new since your last run for the keywords, ORCID authors, journals, funders or DOIs you watch, from Crossref.
- [Full Page Website Screenshot](https://apify.com/lone_rachis/full-page-website-screenshot): full-page PNG or JPEG screenshots, including pages that load content as you scroll.

# Actor input Schema

## `mode` (type: `string`):

check: one row per company you list below, by number or name. new-companies: one row per company incorporated in a date window, filtered by SIC code, location and company type; run it daily on a schedule for a feed of new UK companies.

## `companies` (type: `array`):

Check mode. Company numbers (8 characters, such as 00445790, SC123456 or OC447623; shorter numbers are padded with zeros) or exact company names, one per line. A name is looked up in Companies House's name search and must match a registered name exactly, apart from case, punctuation and LIMITED or LTD. Each company costs 4 requests (3 with Skip charges), so with the built-in key a run checks at most 25.

## `acceptClosestNameMatch` (type: `boolean`):

Check mode. When a name has no exact match on the register, use the first result of the name search instead of returning a free not-found row. The row then says matchedBy closest-name. Off by default, because the first result can be a different company.

## `skipCharges` (type: `boolean`):

Check mode. Leave out the charges lookup, saving 1 request per company. The charge fields are then empty, chargesChecked is false, and the outstanding_charges flag cannot be raised. Off by default: the profile's own has_charges field was false on every profile read on 13 Oct 2026, also for companies with outstanding charges, so the Actor reads the charges list itself.

## `includeFilingActivity` (type: `boolean`):

Check mode. Also count the filings of the last 12 months and report the date and form type of the latest one. Costs 1 more request per company, up to 3 for very busy companies (more than 100 filings a year; the count is then a minimum). Off by default.

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

New-companies mode. First incorporation date of the window, YYYY-MM-DD. Leave both dates empty for the last full days set below, which is what a daily schedule wants. With only this date set, the window runs to yesterday.

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

New-companies mode. Last incorporation date of the window, YYYY-MM-DD, at most today (London time). Today's companies are still being added during the day, so a window that ends yesterday is complete.

## `incorporatedInLastDays` (type: `integer`):

New-companies mode. When both dates are empty, read the last this many full days before today, London time. 1 means yesterday; 7 means the last week.

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

New-companies mode. Keep companies with at least one of these SIC 2007 codes, one per line. Use a 5-digit code from Companies House's condensed list, such as 62020 (information technology consultancy), or 2 to 4 digits for every code under them, such as 62 for computer programming and consultancy. Leave empty for every industry.

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

New-companies mode. Keep companies whose registered office address matches this text, such as Manchester or London. Matched by Companies House's search, without regard to case. Leave empty for anywhere.

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

New-companies mode. Keep companies of these types. Leave empty for every type. About 97% of new companies are private limited companies (ltd).

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

New-companies mode. Optional. Stop after delivering this many companies. Leave empty for the cap of your key: 500 rows with the built-in trial key, 10,000 with your own. Use Maximum cost per run to cap spending.

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

Optional, and recommended. A REST API key from your own free Companies House developer account (the README shows how to get one in three steps). With it the run uses your own share of the rate limit (600 requests per 5 minutes) and checks up to 5,000 companies or 10,000 rows. Without it the run uses the Actor's built-in key, shared by every user, capped at 25 companies or 500 rows per run. The key is stored encrypted and is never written to the output or the log.

## Actor input object example

```json
{
  "mode": "check",
  "companies": [
    "00445790",
    "00102498",
    "01833679"
  ],
  "acceptClosestNameMatch": false,
  "skipCharges": false,
  "includeFilingActivity": false,
  "incorporatedInLastDays": 1,
  "sicCodes": [],
  "companyTypes": []
}
```

# Actor output Schema

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

Dataset with one row per company: status, number, name, register status, age, SIC codes, registered office postcode, accounts and confirmation deadlines, insolvency, charges, officer and PSC counts, and risk flags with their source fields.

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

Counts of companies checked, delivered, not found and failed, the charged rows, the key source (your own or the built-in trial key, never the key itself), the caps, and the requests sent to Companies House.

# 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 = {
    "mode": "check",
    "companies": [
        "00445790",
        "00102498",
        "01833679"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("lone_rachis/uk-company-check").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 = {
    "mode": "check",
    "companies": [
        "00445790",
        "00102498",
        "01833679",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("lone_rachis/uk-company-check").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 '{
  "mode": "check",
  "companies": [
    "00445790",
    "00102498",
    "01833679"
  ]
}' |
apify call lone_rachis/uk-company-check --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lone_rachis/uk-company-check"
        }
    }
}
```

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/dnsszlRLxdjTg3Ebs/builds/yqn6D38dyGO43eAwR/openapi.json
