UK Company Check: Companies House Risk Flags avatar

UK Company Check: Companies House Risk Flags

Pricing

from $5.00 / 1,000 company records

Go to Apify Store
UK Company Check: Companies House Risk Flags

UK Company Check: Companies House Risk Flags

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.

Pricing

from $5.00 / 1,000 company records

Rating

0.0

(0)

Developer

Kesav Kumar Jayakumar

Kesav Kumar Jayakumar

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Share

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 getHow it worksThe test that backs it
Risk flags that name their fieldEach 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 companyThe 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 inputNumbers 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 companiesOne 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 trialWith 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 limitOne 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 secretapiKey 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 countsOfficers 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 getOne 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:

FieldTypeWhat it holds
statusstringok, not-found, failed, skipped, removed or no-results. (invalid is reserved and not written today.)
input, matchedBystringWhat you typed, and how it was matched: company-number, exact-name, closest-name, name-search or new-companies-search.
companyNumber, companyNamestringThe register's 8-character number and the company name.
companyStatus, companyStatusDetailstringSuch as active, dissolved, liquidation, and details such as active-proposal-to-strike-off.
companyType, companySubtype, jurisdictionstringSuch as ltd, plc, llp, and england-wales or scotland.
dateOfCreation, dateOfCessation, ageYearsstring, string, numberIncorporation and dissolution dates, and the age in years to one decimal.
sicCodes, sicDescriptionsarraySIC 2007 codes and their descriptions from the condensed list Companies House publishes.
registeredOfficeLocality, registeredOfficePostcode, registeredOfficeCountrystringThe town, postcode and country of the registered office. Address lines are left out.
lastAccountsMadeUpTo, lastAccountsTypestringThe last accounts and their type, such as full, group, micro-entity or dormant.
nextAccountsDue, nextAccountsMadeUpTo, accountsOverduestring, string, booleanWhen the next accounts are due, and whether the register marks them overdue.
confirmationStatementLastMadeUpTo, confirmationStatementNextDue, confirmationStatementOverduestring, string, booleanThe same for the confirmation statement.
hasInsolvencyHistory, hasBeenLiquidatedbooleanThe register's own insolvency fields.
registeredOfficeInDispute, undeliverableRegisteredOfficeAddressbooleanWhether the office address is disputed, or post to it comes back.
chargesChecked, chargesTotal, chargesOutstanding, chargesPartSatisfied, chargesSatisfiedboolean, numberCharges (secured lending) registered against the company, and how many are not satisfied.
activeOfficers, activePersonsWithSignificantControlnumberCounts only.
filingActivityChecked, filingsLast12Months, filingsLast12MonthsIsMinimum, latestFilingDate, latestFilingType, latestFilingCategoryboolean, number, stringWith Include filing activity on: filings of the last 12 months and the latest one.
flags, flagDetailsarrayThe risk flags, and one sentence per flag naming its source field.
companyUrlstringThe company's page on the Companies House service.
error, errorCodestringWhy a row is not ok, as a sentence and as a short code.

The flags and the field each one reads:

FlagRaised when
dissolvedcompany_status is dissolved.
closedcompany_status is converted-closed, closed or removed.
in_liquidationcompany_status is liquidation.
insolvency_proceedingscompany_status is administration, receivership, voluntary-arrangement or insolvency-proceedings.
insolvency_historyhas_insolvency_history is true.
has_been_liquidatedhas_been_liquidated is true.
proposal_to_strike_offcompany_status_detail is active-proposal-to-strike-off.
accounts_overdueaccounts.overdue is true.
confirmation_overdueconfirmation_statement.overdue is true.
outstanding_chargescharges.total_count minus charges.satisfied_count is above 0. Only when charges were read.
dormant_accountsaccounts.last_accounts.type is dormant.
recently_incorporateddate_of_creation is less than 12 months before the day of the check (London date).
registered_office_in_disputeregistered_office_is_in_dispute is true.
undeliverable_office_addressundeliverable_registered_office_address is true.
no_active_officersThe 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.

errorCodeMeaning
not-foundCompanies House has no company with that number.
no-exact-name-matchNo company has exactly that name. The row lists the three closest names with their numbers.
duplicateThe company is already in your list, so it was checked once.
removed-on-requestThe company was removed from this Actor's output on request.
no-resultsNo company was incorporated in the window with your filters.
trial-limitThe built-in trial key reached its cap of 25 companies or 500 rows for this run. Add your own key in apiKey.
run-limitYour own key reached the cap of 5,000 companies or 10,000 rows for one run.
max-resultsThe run reached your maximum number of rows (maxResults).
charge-limitThe run reached your maximum cost per run.
run-time-limitThe run reached its time limit.
rate-limitedCompanies House answered "too many requests" (HTTP 429) three times in a row.
key-refusedCompanies House refused the API key (HTTP 401).
repeated-failuresFive companies in a row failed with a server or network error, so the run stopped.
search-reachThe search reaches only the first 10,000 companies of one query.
abortedThe run was stopped.
server-error, http-error, bad-requestCompanies House answered with an error status.
network-error, timeoutCompanies House could not be reached, or did not answer within 30 seconds.
too-large, bad-response, unexpected-redirectAn answer over 20 MB, an answer the Actor could not read, or a redirect to another site.
otherAny 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:

{
"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.

EventWhen it is chargedPrice
companyOne company row delivered with status ok$0.006 (Free, Bronze), $0.0055 (Silver), $0.005 (Gold)
Actor startOnce 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:

[
{
"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