Companies House New Companies Scraper: Daily Feed avatar

Companies House New Companies Scraper: Daily Feed

Pricing

from $2.16 / 1,000 company returneds

Go to Apify Store
Companies House New Companies Scraper: Daily Feed

Companies House New Companies Scraper: Daily Feed

Get newly incorporated UK companies from Companies House over a rolling window of recent days, incorporation date on every row. Schedule daily with only new companies on for a feed. One flag drops dormant shells, never charged. Filter by SIC codes, place, name or type, or read numbers from a file.

Pricing

from $2.16 / 1,000 company returneds

Rating

0.0

(0)

Developer

Pradio Actors

Pradio Actors

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

13 days ago

Last modified

Share

What does Companies House New Companies Scraper do?

Companies House New Companies Scraper returns newly incorporated UK companies from a rolling window of the last few days. The window is counted from the day each run starts, so there are no dates to edit. Each company comes back as one row of 43 fields: its number, name, live status, type, incorporation date, registered office, SIC codes, charges and previous names. There is no login, no API key and no browser.

The default input has onlyNew off and returns up to 100 UK companies incorporated in the last 7 days that are still active. The register's search cannot sort by date: a capped run returns the companies it lists first, not the newest, and a second run the same day returns the same companies. Each returned row costs $0.004, and every row links to the register page it was read from.

For a daily feed, put it on a daily schedule with onlyNew on and a maxItems above the companies a day brings under your filters. Each run then sends each company once, and again when its register status changes.

Who uses Companies House New Companies Scraper

WhoWhat they run it for
Accountants taking on new clientsA weekly feed of newly incorporated companies, with SIC codes to pick the ones that fit
Insurance brokersNew employers the week they register, in time to quote the compulsory cover every UK employer must carry
Banks and onboarding teamsA counterparty's registration date and live register status, straight from the source
B2B sellers to brand-new businessesCompany leads from the register itself, weeks before scraped databases carry them

Features

  • A rolling window, never a date to edit. daysBack is a rolling window: each scheduled run reads the last few days counted from the day it runs. Put the Actor on a daily or weekly schedule and it never needs a date edited. Fixed dates are there too (incorporatedFrom, incorporatedTo) when you want a set period.
  • Each company once, and again when its status changes. With onlyNew on, a scheduled run sends each new company once. It sends it again when its register status changes, such as dissolved (turn on includeDissolved for the dissolution window). The Actor remembers each company it emits for 31 days, so you never get the same list twice. With it off, the default, every run returns the window's first maxItems companies, the same ones each time.
  • New UK companies by default. The default run reads companies incorporated in the last daysBack days that are still active. It leaves out overseas companies, UK establishments and overseas entities (ukCompaniesOnly).
  • Dissolutions on request. Turn on includeDissolved to read companies dissolved in the window beside the incorporations, tagged dissolved. Or set dissolvedFrom and dissolvedTo for a dissolution window of your own; given without incorporation dates, the run returns dissolutions only.
  • The register's own filters. location, the two name boxes, companyTypes, companyStatus and the incorporatedFrom and incorporatedTo dates go to the register's advanced search. The run then pages only through companies that match. sicCodes is sent too when every entry is a full five-digit code. If any entry is a shorter prefix such as 43, no code is sent. The whole list then filters the returned companies instead.
  • Filter by company name. companyNameIncludes keeps names with your words, such as bakery. companyNameExcludes leaves out names with others, such as holdings. Both are the register's own name boxes.
  • Dormant shells left out, never charged. Turn on excludeDormant to drop companies the register marks dormant. They declared SIC 99999, Dormant Company, or file dormant accounts. They are read and dropped, never charged. Every row also carries is_dormant, so you can sort them out yourself instead.
  • Flat columns for your CRM. address_line_2 and county sit beside address_line_1, city and postcode. Every row also carries company_age_days and sic_code_count, so a spreadsheet needs no parsing.
  • Your own filters as URLs. Paste a Companies House advanced-search results URL into startUrls. The run reads that list instead, tagged matched_filter. Any other link is not read and comes back as a free bad_url row naming it.
  • One company by number. companyNumbers takes register numbers or company page URLs and returns one detailed row each, tagged lookup. A number the register does not know comes back as an uncharged not_found row.
  • Your list from a file or a Google Sheet. companyNumbersFromFile takes pasted numbers, one per line, or one link to a .txt or .csv file, a Google Sheet or a Google Drive file. It reads the column headed like a company-number column (Company number, Company No, CRN, Registration no. and the like). It pads numbers a spreadsheet stripped of their leading zeros and returns one detailed row per company. An entry that is not a company number comes back as an uncharged not_found row naming it.
  • Charges, previous names and late filings. Every row carries charges_count and charges_outstanding, previous_names, the last made-up dates of the accounts and the confirmation statement, and accounts_overdue and confirmation_statement_overdue. All come from the register data the run already reads for each company, at no extra request. With includeOfficers on, director_count says how many directors are serving; with it off, the field is null.
  • SIC code and text filter. sicCodes takes full codes like 56101 and prefixes like 43. searchQueries also matches words in the description like restaurant. Every company row carries sic_codes as plain codes and sic_descriptions as the register's text for each; sic_descriptions is null on a row where only the codes were read.
  • Directors and PSCs when you ask. includeOfficers, includePsc and includeFilings each add one register tab read per company. Each fills its matching fields. All three are off until you tick them, in the Console form and over the API, so no person is named unless you ask.
  • Dissolutions first under a cap. When maxItems cuts a run short, dissolutions come back before the long incorporation list. With onlyNew on, so do status changes.
  • Proxy support. proxyConfiguration sends every register read through your Apify proxy setup, on one proxy session for the whole run. A refused read is never tried again from another address.
  • A feed that does not get cut off. The run stays inside the register's own pace, so a scheduled run finishes instead of being refused for reading too fast. A company the register refuses comes back as a named blocked row and is never charged. One run returns at most 10,000 companies, so it is never a copy of the whole register.
  • The register's own URLs. Every link a row carries points at Companies House, so each value checks back to the source page.

What you can count on

  • You pay only for rows whose row_status reads ok. An entry the run cannot answer is pushed as an uncharged ITEM_STATUS row naming it and saying why: a number the register does not know, a pasted link that is not a results page, or a read that kept failing.
  • A row is charged only after it is written to your dataset. A row you cannot see is never billed.
  • A run that finds nothing returns one PROFILE_NOT_FOUND row that says so. You never get a silent empty dataset.
  • A spending limit stops the run cleanly. One STOPPED_EARLY row reports how many rows were returned and how many were not.
  • Every run writes a RUN_SUMMARY entry with rowsFetched, rowsPushed, rowsCharged and duplicatesDropped. A short run and a broken one are easy to tell apart.
  • A refusal or an error fails loudly, never as a row full of nulls called a success. If the register refuses the search page before any company is read, the run fails with the error in the log. If it refuses a company or a tab mid-run, the reading stops for that run. The companies already read are returned, and each one not read comes back as a free blocked row. A company whose tab cannot be read comes back whole, never with those fields silently empty.
  • No value is invented. A field the register does not show is null. The opt-in fields first_director, director_count, officers, persons_with_significant_control and latest_filing stay null until you turn on their tab read. dissolution_date is null on every active company. accounts_category, accounts_last_made_up_to and confirmation_statement_last_made_up_to are null on a company too new to have filed, which is nearly every row of a new-companies window.

What data does Companies House New Companies Scraper return?

The first row of a live run of the default input. includeOfficers, includePsc and includeFilings were off, so every opt-in field is null and no person is named on this page:

{
"company_number": "17472260",
"register_page_url": "https://find-and-update.company-information.service.gov.uk/company/17472260",
"company_name": "HIGH STREET BRANDS 4 LESS LIMITED",
"row_status": "ok",
"event": "newly_registered",
"registrar": "Companies House",
"jurisdiction": "England and Wales",
"company_status": "Active",
"company_type": "Private Limited Company",
"country_of_origin": "United Kingdom",
"incorporation_date": "2026-09-22",
"company_age_days": 6,
"dissolution_date": null,
"registered_office_address": {
"AddressLine1": "61A BRIDGE STREET",
"PostTown": "KINGTON",
"Country": "UNITED KINGDOM",
"Postcode": "HR5 3DJ"
},
"address_line_1": "61A BRIDGE STREET",
"address_line_2": null,
"city": "KINGTON",
"county": null,
"postcode": "HR5 3DJ",
"country": "UNITED KINGDOM",
"accounts_due": "2028-06-22",
"confirmation_statement_due": "2027-10-05",
"accounts_category": null,
"accounts_last_made_up_to": null,
"confirmation_statement_last_made_up_to": null,
"accounts_overdue": false,
"confirmation_statement_overdue": false,
"charges_count": 0,
"charges_outstanding": 0,
"previous_names": [],
"is_dormant": false,
"sic_codes": [
"47190",
"47910"
],
"sic_code_count": 2,
"sic_descriptions": [
"Other retail sale in non-specialised stores",
"Retail sale via mail order houses or via Internet"
],
"register_urls": [
"https://find-and-update.company-information.service.gov.uk/company/17472260",
"https://data.companieshouse.gov.uk/doc/company/17472260.json"
],
"filing_history_url": "https://find-and-update.company-information.service.gov.uk/company/17472260/filing-history",
"first_director": null,
"director_count": null,
"officers": null,
"persons_with_significant_control": null,
"latest_filing": null,
"search_metadata": {
"query": "https://find-and-update.company-information.service.gov.uk/advanced-search/get-results?incorporationFromDay=21&incorporationFromMonth=9&incorporationFromYear=2026&incorporationToDay=28&incorporationToMonth=9&incorporationToYear=2026&status=active",
"event": "newly_registered"
},
"row_type": "ROW"
}

Every data row carries the same full field set. The opt-in fields fill only when you turn on the matching input flag; the rest are read on every run.

FieldWhat it is
row_statusThe row's own verdict: ok on a data row; not_found, removed, bad_url, blocked, fetch_failed or not_reached (maxItems was spent before the entry was read) on an uncharged miss. The register's verdict on the company lives in company_status.
eventWhy the company is in this run: newly_registered, dissolved, registered_and_dissolved, matched_filter or lookup (a company you named by number).
company_nameThe registered name, as the register prints it.
company_numberThe Companies House company number. Rows are de-duplicated on it inside a run; with onlyNew on, also across runs.
registrarThe register the company sits on: Companies House on every row.
jurisdictionRegistration jurisdiction from the number prefix: England and Wales, Scotland, Northern Ireland, an overseas company or a Societas Europaea. Limited partnerships are read too: LP England and Wales, SL Scotland, NL Northern Ireland. null on a rarer prefix whose jurisdiction the table does not carry, such as a royal charter's RC.
company_statusThe register's live status in its own words, such as Active, Dissolved, Liquidation, In Administration, Open or Removed.
company_typeThe register's company category in its own words, such as Private Limited Company or UK establishment company.
country_of_originThe register's country of origin: United Kingdom on UK companies.
incorporation_dateIncorporation date as ISO YYYY-MM-DD. For an overseas company, UK establishment or overseas entity, the date it was registered or opened in the UK.
dissolution_dateDissolution date as ISO YYYY-MM-DD; null unless the register marks the company dissolved.
registered_office_addressThe register's own address object, passed through with the register's own keys, such as AddressLine1 and PostTown: address lines, post town, county, country and postcode. The same address is also in the flat snake_case columns beside it: address_line_1, address_line_2, city, county, postcode and country.
address_line_1First line of the registered office address. On a company at the register's default address this is the register's own Companies House Default Address line, verbatim.
address_line_2Second line of the registered office address; null when the address has none.
cityThe registered office post town.
countyThe registered office county, as the company wrote it; null when the address carries no county line, which is common.
postcodeThe registered office postcode.
countryThe registered office country line, as the company wrote it on the register, so a UK office can read UNITED KINGDOM, ENGLAND, WALES, SCOTLAND or NORTHERN IRELAND; null when the register's address has no country line, as on a Companies House default address and some limited partnerships.
accounts_dueNext accounts due date, ISO. null when the register gives none, as on dissolved rows and limited partnerships.
confirmation_statement_dueNext confirmation statement due date, ISO. null when the register gives none, as on dissolved rows and limited partnerships.
accounts_categoryThe kind of accounts the company last filed, in the register's words, such as FULL, MICRO ENTITY or DORMANT. null until a company has filed accounts.
accounts_last_made_up_toThe date the last filed accounts were made up to, ISO. null until a company has filed accounts.
accounts_overduetrue when accounts_due is before the day of the run: the accounts are late. false on or before it; null with no due date.
confirmation_statement_last_made_up_toThe date the last confirmation statement was made up to, ISO. null until a company has filed one.
confirmation_statement_overduetrue when confirmation_statement_due is before the day of the run. false on or before it; null with no due date.
charges_countHow many charges (mortgages and other security) are registered against the company. 0 when the register lists none.
charges_outstandingHow many of those charges are still outstanding. 0 when the register lists none.
previous_namesNames the company was registered under before, newest first, each with name and changed_on. An empty list when it has none.
sic_codesSIC codes as five-digit strings, such as ["56101"]. An empty list when the register holds none.
sic_code_countHow many SIC codes the company declared: 0 when it declared none.
sic_descriptionsThe register's description of each SIC code, in the same order, such as ["Licensed restaurants"].
is_dormanttrue when the register marks the company dormant: it declared SIC 99999 (Dormant Company) or its accounts category reads DORMANT. false when the register shows neither. null when the run read neither the SIC codes nor the accounts category.
company_age_daysWhole days from incorporation_date to the day of the run.
register_page_urlThe company's overview URL on the register. The register does not publish the company's own site.
register_urlsBoth register URLs for the company: the overview page and its structured data document.
filing_history_urlURL of the company's filing-history page on the register.
first_directorOpt-in. null until includeOfficers is on: the first officer with a director role who has not resigned.
director_countOpt-in. null until includeOfficers is on: how many directors on the officers tab have not resigned.
officersOpt-in. null until includeOfficers is on: every officers-tab appointment, with name, role, appointed and resigned dates and status.
persons_with_significant_controlOpt-in. null until includePsc is on: PSC tab entries. Each entry carries name, notified_on, natures_of_control (a list of the register's nature-of-control lines) and status.
latest_filingOpt-in. null until includeFilings is on: the newest filing's date, type and description, never the document itself.
search_metadataWhich register read produced the row: the exact results URL, or the company page on a lookup row, and its event tag.
row_typeROW on a data row. Status rows carry ITEM_STATUS, PROFILE_NOT_FOUND or STOPPED_EARLY.

The opt-in fields first_director, director_count, officers, persons_with_significant_control and latest_filing fill only when their flag is on. All three flags are off unless you set them, in the Console form and over the API. Such a run returns every one null. dissolution_date is null on every active company by design. The Console's Overview tab shows the fields this source fills. All fields and every export carry the whole set, so the empty columns stay visible where you want them.

Status rows carry fields of their own:

FieldWhat it is
reasonOn a status row only: why no data rows came back, or why the run stopped early.
rowsFetchedOn a status row only: how many rows the source handed over before de-duplication and the cap.
rowsReturnedOn a status row only: how many rows were pushed before it, company rows and uncharged ITEM_STATUS misses together (0 on a zero result). It is the same count as RUN_SUMMARY.rowsPushed, which every run writes whether or not a status row appears.
rowsRemainingOn a status row only: how many fetched rows were not returned.

How much does it cost?

The price is $0.004 per company row written to your dataset, charged as one company-returned event per row. Apify also charges its standard apify-actor-start event at $0.00005 per run start: one event per GB of run memory, with a minimum of one. This Actor's runs sit under a gigabyte, so it is exactly one start event per run, and this Actor adds nothing on top.

Company rows returnedCharged eventsCost
100100$0.40
1,0001,000$4.00
10,00010,000$40.00

Priced in the unit you feed it, where one pasted advanced-search URL or one filtered window is one search. On the platform a run over 161 entries wrote 98 company rows (60.9%); 61 of them hit the run's own maxItems cap before they were read and 2 pasted searches added no new company, every miss named and uncharged. Measured locally on 18 searches the Actor had not seen, 16 returned rows (88.9%):

  • 100 searches: about 89 answer, 779 company rows in all, about $3.12 plus the start.
  • 1,000 searches: about 889 answer, 7,779 company rows, about $31.12 plus the start.

On Apify's paid plans the same row is cheaper: $0.00336 on Bronze, $0.00272 on Silver, and $0.00216 on Gold, Platinum and Diamond.

Not charged: PROFILE_NOT_FOUND, STOPPED_EARLY and ITEM_STATUS status rows, and duplicates dropped inside the run. With onlyNew on, companies an earlier run already sent you are not returned, so they are not charged either.

A scheduled run with onlyNew on emits only what is new, so a quiet week costs little. A narrow status or place filter can go a week without a new filing. A run whose search matches none charges nothing beyond the start.

How do I use Companies House New Companies Scraper?

  1. Open the Actor page and press Start. The form is ready as it opens: no keys, no URLs, no setup. Tick includeOfficers if you also want each company's directors.
  2. Rows land in the dataset as they are read. Export them as JSON, CSV or Excel, or pull them through the API.
  3. Put the Actor on a daily or weekly Apify schedule with onlyNew on. The built-in memory then keeps each run to what is new.

The default input needs nothing changed. It returns UK companies incorporated in the last 7 days that are still active, the same window on every run:

{
"daysBack": 7,
"maxItems": 100,
"companyStatus": ["active"],
"ukCompaniesOnly": true
}

For a daily schedule, turn on onlyNew. Each day's run then returns only companies no earlier run of yours returned in the last 31 days. Companies whose status changed come back too:

{
"daysBack": 2,
"maxItems": 500,
"companyStatus": ["active"],
"onlyNew": true
}

To filter the feed to the trades you serve, add five-digit sicCodes. The register searches each one directly. Switch on any tab reads you need:

{
"daysBack": 7,
"maxItems": 100,
"sicCodes": ["43220", "56101"],
"includeOfficers": true
}

Or feed it a filtered results page straight from the register's advanced search:

{
"startUrls": [
{ "url": "https://find-and-update.company-information.service.gov.uk/advanced-search/get-results?incorporationFromDay=8&incorporationFromMonth=9&incorporationFromYear=2026&incorporationToDay=15&incorporationToMonth=9&incorporationToYear=2026" }
]
}

Or name the companies directly; each comes back as one detailed row:

{
"companyNumbers": ["00000006", "SC327447"]
}

Through the API:

curl -X POST "https://api.apify.com/v2/acts/Pradio~new-company-filings/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" -H "Content-Type: application/json" -d "{\"daysBack\": 7, \"maxItems\": 100}"

Input

InputDefaultWhat it does
daysBack7How many days back the incorporation window (and the dissolution window, when on) reaches.
maxItems100The most company rows one run returns, up to 10,000.
onlyNewfalseTurns the run into a feed for a daily or weekly schedule: it returns only companies no earlier run of yours returned in the last 31 days, plus any whose status changed. Off, every run returns the window's companies. Companies named in companyNumbers are always returned.
onlyChangedfalseThe watchlist diff for companyNumbers and companyNumbersFromFile: with it on, a company you named is emitted only when its row content changed since your last run that emitted it. Status, address, officers, accounts, charges, SIC, filings and names are diffed. An unchanged watched company is not pushed; the run's summary counts it.
suppressemptyEntries kept out of every run. An entry that reads as a company number suppresses that company; any other entry matches the registered-office address, so a formation agent's address suppresses every company registered to it. A suppressed company is never read for detail and comes back as one free removed row naming it. The list persists between runs.
clearSuppressionsfalseEmpties the stored suppression list before this run's suppress entries merge in. That is the way to stop suppressing entries sent on earlier runs.
companyStatus["active"]Register statuses to keep in the incorporation window: active, dissolved, liquidation, administration, receivership, voluntary-arrangement, insolvency-proceedings, converted-closed, open, closed, removed. An empty list takes every status.
companyTypesemptyCompany types to keep, such as ltd, plc, llp or community-interest-company. Empty means every UK type.
ukCompaniesOnlytrueLeaves out overseas companies, UK establishments and overseas entities. When companyTypes is set, the types you name decide instead.
sicCodesemptyFive-digit SIC codes searched on the register, one search per code, so only those companies are read. A shorter prefix such as 56 turns the whole list into a filter on the returned companies. Codes only.
locationemptyText the registered office address must contain: a town, a county or a postcode fragment such as EC2A.
companyNameIncludesemptyWords the company name must contain, such as bakery. Sent to the register's search; applies to the built-in windows, not to pasted startUrls.
companyNameExcludesemptyWords the company name must not contain, such as holdings. Sent to the register's search; applies to the built-in windows, not to pasted startUrls.
excludeDormantfalseLeaves out companies the register marks dormant (SIC 99999 or dormant accounts). They are read and dropped, never charged. Companies named in companyNumbers are always returned.
incorporatedFromnoneEarliest incorporation date, YYYY-MM-DD. With incorporatedTo it replaces the daysBack window.
incorporatedTononeLatest incorporation date, YYYY-MM-DD.
includeDissolvedfalseAlso read companies dissolved in the window, tagged dissolved.
dissolvedFromnoneEarliest dissolution date, YYYY-MM-DD. Setting a dissolution date reads the dissolution window; given without incorporation dates, the run returns dissolutions only.
dissolvedTononeLatest dissolution date, YYYY-MM-DD.
startUrlsemptyPasted advanced-search results URLs replace the built-in windows.
companyNumbersemptyCompany numbers or company page URLs; each returns one detailed row. When this is the only input given, no window or search is read.
companyNumbersFromFileemptyPasted company numbers, one per line, or one link to a .txt or .csv file, a Google Sheet or a Google Drive file shared so anyone with the link can view it. Each number returns one detailed row, like companyNumbers.
maxItemsPerStartUrlnoneCaps how many companies each pasted startUrls entry may contribute, so one long list cannot spend the whole maxItems budget.
searchQueriesemptyA SIC filter, not a name search: a SIC code prefix or SIC description text applied to the returned companies. Unlike sicCodes, it never narrows the register search: the run pages through the window and drops what does not match. It also matches description words.
includeOfficersfalseAlso read each company's officers tab; fills officers and first_director. Adds personal data: each officer's name. Off unless you set it, in the Console form and over the API.
includePscfalseAlso read each company's PSC tab; fills persons_with_significant_control. Adds personal data: each PSC's name.
includeFilingsfalseAlso read each company's filing history; fills latest_filing.
proxyConfigurationnoneSend every register read through an Apify proxy.

startUrls

Only one kind of link works here: a results URL from the register's own advanced search. Set your filters on the Companies House site, copy the address bar on the results page and paste it in. Anything else, such as an officer search, an officer's appointments, a PSC page or another site, is not read. It comes back as one free row with row_status bad_url naming the link, and the other entries still run. Rows from a pasted search are tagged matched_filter in event.

Each pasted URL is read as its own list. With several pasted, set maxItemsPerStartUrl to give every entry its own bound. Otherwise the longest list can spend the shared maxItems budget first.

companyNumbers

For a company you already know, give its register number, 00000006, or paste its company page URL. Each entry comes back as one detailed row tagged lookup in event. It carries the same fields a feed row carries, including the opt-in tabs when their flags are on. A number the register has no company under comes back as an uncharged not_found row with the reason. A named company is emitted every time you ask for it, because the run-to-run memory of onlyNew only dedupes the feed. A number that also turns up in a pasted search keeps its lookup tag.

For a watchlist, pair companyNumbers (or companyNumbersFromFile) with onlyChanged. Each named company is then emitted only when something on its row changed since your last run that emitted it: a new status, a moved registered office, a changed officer or PSC list, new charges, different accounts dates. An unchanged company is not pushed, and the run's summary says how many were left out.

companyNumbersFromFile

For a longer list, paste the numbers one per line, or give one link to the file that holds them. The file can be a .txt or .csv, a Google Sheet, or a Google Drive file shared so anyone with the link can view it. In a table, the column headed Company number, Company No or CRN is read; without such a header, the column holding the most company numbers. A number a spreadsheet stripped of its leading zeros, such as 445790, is read as 00445790. Each number returns one detailed row tagged lookup, the same as companyNumbers, and the two lists are merged without repeats. An entry that is not a company number comes back as an uncharged not_found row naming it. A link that answers with an error, or with a sign-in page instead of the file, fails the run at once with a message naming the link.

{
"companyNumbersFromFile": "https://docs.google.com/spreadsheets/d/YOUR_SHEET_ID/edit",
"includeOfficers": true
}

suppress

Your own list of companies and addresses to keep out of every run: numbers you own, or a formation agent's registered-office address you do not want filings for. An entry that reads as a company number (00000006) suppresses that company; any other entry matches against the registered-office address, so 71 Shelton Street suppresses every company registered there. A suppressed company is never read for detail. It comes back as one free removed row naming the number and the entry that caught it. The list persists between runs in the Actor's own store, so you send an entry once; clearSuppressions empties the stored list.

The register's filters

companyStatus, companyTypes, location, companyNameIncludes, companyNameExcludes and the four date inputs are the register's own advanced-search filters. The run pages only through companies that match them, instead of reading everything and throwing rows away. sicCodes is one of them while every entry is a full five-digit code. The register searches one full code at a time, so three codes mean three searches, merged and de-duplicated. Add one shorter prefix and no code is sent. The run then reads the whole window and keeps the companies whose codes match any entry. A status filter narrows the incorporation window only. The dissolution window always holds dissolved companies. This reads active limited companies in Manchester incorporated in the first half of September:

{
"incorporatedFrom": "2026-09-01",
"incorporatedTo": "2026-09-15",
"companyStatus": ["active"],
"companyTypes": ["ltd"],
"location": "Manchester",
"maxItems": 200
}

To find new bakeries that are not cake shops, and skip dormant shells:

{
"incorporatedFrom": "2026-09-01",
"incorporatedTo": "2026-09-22",
"companyNameIncludes": "bakery",
"companyNameExcludes": "cake",
"excludeDormant": true,
"maxItems": 50
}

A bad date or an unknown status or type fails the run at once. So does a SIC entry that is not digits, or a name box given as anything but text. The message names the refused value.

searchQueries

Each entry is matched against the company's SIC lines. A prefix matches codes, so 43 keeps 43220 - Plumbing, heat and air-conditioning installation. Plain text matches the description, so restaurant keeps 56101 - Licensed restaurants. Companies with no SIC match are dropped before output. It filters SIC lines only; to filter by company name, use companyNameIncludes and companyNameExcludes.

The include flags

Each flag adds one register read per company, so all three together send four reads per company instead of one. That is why all three are off until you set them, in the Console form and over the API. includeOfficers and includePsc also add people's names to the rows. They are read only when you ask. Each flag makes a run longer by one read per company. If a tab cannot be read, that company comes back as one free blocked or fetch_failed row naming the tab, never as a row with the tab's fields empty. So [] means the register lists none, and null means the option was off or the register has no such page for the company.

Output

A run pushes data rows with row_type: "ROW" plus status rows when something needs saying: one run-level row (PROFILE_NOT_FOUND or STOPPED_EARLY), and one ITEM_STATUS row per entry that needs naming. That can be a pasted search that answered empty or a link that was refused. Everything lands in the default dataset.

  • ROW: a company the run emitted. Charged after it is pushed.
  • ITEM_STATUS: a per-item miss, pushed so you see the verdict. A company number the register does not know, a file entry that is not a company number, or a pasted results page that added no new company to the run comes back with row_status: "not_found". A company on the removal list comes back with row_status: "removed". A pasted startUrls link that is not an advanced-search results URL comes back with row_status: "bad_url". A company the register refused, or one not read after a refusal, comes back with row_status: "blocked", and one whose read kept failing with row_status: "fetch_failed". An entry the run's maxItems stopped before it was read comes back with row_status: "not_reached". Never charged.
  • PROFILE_NOT_FOUND: the register answered and nothing matched. One row, not charged, and reason says why.
  • STOPPED_EARLY: your charge limit ended the run. One row, not charged, carrying rowsReturned and rowsRemaining.

A zero result is an answer, not a failure: the run pushes one PROFILE_NOT_FOUND row and charges nothing. On a schedule with onlyNew on it usually means an earlier run already sent everything the window held.

RUN_SUMMARY in the default key-value store carries rowsFetched, rowsPushed, rowsCharged and duplicatesDropped for every run.

What can you do with the data?

An accountant sets a Monday-morning schedule with onlyNew on, sicCodes for the trades the firm serves, and maxItems above the number of companies those trades register in a week. Each company in those trades incorporated in the last 7 days then arrives once, with its SIC codes, registered office and incorporation date, ready for a welcome letter.

An insurance broker watches the same feed for new employers. A company that just registered is close to needing the compulsory cover every UK employer must carry. The register row is the earliest reliable signal.

An onboarding team pastes the register's own filtered search URL as startUrls. It gets a deduplicated list of counterparties with live status and registration dates for KYC checks.

A data team runs the feed daily with includeDissolved on and watches the dissolved and registered_and_dissolved rows. Those are companies leaving the register the week it happens, not after the next database refresh.

Worked examples

Use it to find new restaurants and pubs in London this week, with their directors.

{
"daysBack": 7,
"sicCodes": ["56101", "56302"],
"location": "London",
"includeOfficers": true,
"maxItems": 100
}

Use it to get new construction companies from last month, anywhere in the UK. A prefix keeps every code that starts with it. The register does not list by date, so a cap below the month's count returns part of the month: raise maxItems, up to one search's 10,000 companies. A month with more new construction companies than that is cut at 10,000 (see Limits).

{
"incorporatedFrom": "2026-08-01",
"incorporatedTo": "2026-08-31",
"sicCodes": ["41", "42", "43"],
"maxItems": 500
}

Use it to track new and dissolved LLPs and community interest companies on a weekly schedule.

{
"daysBack": 7,
"companyTypes": ["llp", "community-interest-company"],
"companyStatus": [],
"includeDissolved": true,
"onlyNew": true
}

Use it to list the companies dissolved in a set fortnight, for a data cleaning job.

{
"dissolvedFrom": "2026-09-01",
"dissolvedTo": "2026-09-14",
"maxItems": 1000
}

Use Companies House New Companies Scraper with AI agents

Paste this line to give an MCP-capable agent this Actor:

claude mcp add --transport http apify "https://mcp.apify.com?tools=Pradio/new-company-filings"

The agent can then read the input schema, start runs and pull the dataset on its own.

Personal data

Some rows name people. officers, persons_with_significant_control and first_director carry a person's name in their business capacity only. Beside the name they carry the role or nature of control, the appointment or notification date, and the status. They never carry an address, a date of birth, a nationality or a place of residence, even where the register's page shows them beside the name. No filing documents, PDFs or statement text are ever reproduced. The Actor takes companies in and never a person. No input searches or filters by a person's name, and it never links one person's appointments across companies.

  • Names only when you ask. includeOfficers and includePsc are off in the Console form and over the API. A run that does not tick them returns no names at all. Ticking either adds personal data to the rows.
  • Where the names come from. Every name comes from the Companies House public register, which publishes the names of directors and persons with significant control under the Companies Act 2006. Each row's register_page_url points back to the register page it was read from.
  • Removal. A person named in a row can ask to have their name removed from this Actor's output through its Issues tab on the Apify Store. Their name goes on the Actor's removal list, which every run checks before it returns a row. From the next run it is left out of officers, persons_with_significant_control and first_director. A company that asks to be left out is not read at all. It comes back as one uncharged row whose row_status reads removed, naming only its number. Companies House also runs its own suppression process for the register itself.
  • Your use of the names. Companies House controls the register's own publication. For the rows you export, you are the controller. You are responsible for how you use the rows and for your own lawful basis for using officers' names. A new small company's registered office is often its director's home. A daily feed of new companies by location, daysBack and onlyNew is a list of people as much as of companies. If you use the rows to contact people, you must give them your own privacy notice and follow UK GDPR and the PECR direct-marketing rules. Honour an objection from anyone who asks you to stop. Do not use the rows to track or profile individuals, or to rate a director by their company's late filings or charges: those columns are facts about the company.
  • Terms. The register is published under statute, and Companies House's terms do not prohibit reading it this way. Reads stay per company and sequential. A refusal is never retried from this or another address and ends the reading. A run returns at most 10,000 companies, and no bulk copy of the register is made. Between runs the Actor's run memory keeps only company numbers and a content fingerprint of each emitted row. It never keeps a name, so a correction on the register shows in the next run. Two lists sit apart from that memory by design. The removal list keeps the names of people who asked to be left out. Your own suppress list keeps the numbers or address fragments you gave it.

Release notes

  • 2026-10-01: suppress, your own persistent suppression list: company numbers or registered-office fragments (a formation agent's address) kept out of every run. Each comes back as one free removed row; clearSuppressions empties it. onlyChanged, the watchlist diff: companies named under companyNumbers or companyNumbersFromFile are emitted only when their row content changed since your last run.
  • 2026-09-28: companyNameIncludes and companyNameExcludes, the register's own name boxes. excludeDormant leaves out companies that declared SIC 99999 or file dormant accounts. New columns: address_line_2, county, accounts_category, is_dormant, company_age_days and sic_code_count. A removal list: a person who asks is left out of the officer and PSC columns. A company that asks comes back as one uncharged removed row. natures_of_control, inside each persons_with_significant_control entry, now carries only the register's nature-of-control lines. companyNumbersFromFile reads a pasted list of numbers, or one link to a .txt or .csv file, a Google Sheet or a Drive file. New columns from the register data the run already reads: charges_count, charges_outstanding, previous_names, accounts_last_made_up_to, confirmation_statement_last_made_up_to, accounts_overdue and confirmation_statement_overdue, plus director_count with includeOfficers. Runs with includeOfficers on are faster: the company's register data and its officers page sit on two different register sites. Each site now keeps its own pause, so one no longer waits for the other. Still one request at a time. A refused read is no longer retried and ends the reading: companies already read are returned, and each one not read comes back as a free blocked row. A read that keeps failing costs only that company, as a free fetch_failed row. A company whose tab cannot be read is left out whole instead of returned with those fields empty. maxItems goes up to 10,000, and a proxy keeps one session for the whole run. includeOfficers is off in the Console form and over the API, so no person is named unless you tick it. A pasted startUrls link that is not an advanced-search results URL no longer fails the run: it comes back as a free bad_url row naming it. A Retry-After from the register is honoured before any retry.
  • 2026-09-25: the run-to-run diff, on in every run since the first public build, is now opt-in through the new onlyNew input, off by default. A run now returns every company in its window. A second run of the same input the same day returns the same companies instead of an empty result. Turn onlyNew on for a schedule that returns only new or status-changed companies. It now keeps reading past companies already sent until it has enough new ones or the window ends.
  • 2026-09-25: jurisdiction now reads limited partnerships (LP, SL, NL) and Northern Ireland registered societies (NP). It also reads older Northern Ireland companies (R) and England and Wales EEIGs (GE). A Scottish registered society (SP) now reads Scotland instead of England and Wales.
  • 2026-09-24: the register's own filters (sicCodes, location, companyTypes, companyStatus, incorporation and dissolution dates). The default run is now new UK companies that are still active; dissolutions come with includeDissolved. company_status and company_type always carry the register's words. sic_codes is now a list of plain codes, with the text in the new sic_descriptions. incorporation_date is filled for overseas companies, UK establishments and overseas entities with the date they were registered in the UK.
  • 2026-09-18: first public build. It had the incorporation and dissolution windows, the run-to-run diff, the SIC filter, direct company-number lookup and the three opt-in tab reads.

Limits

  • It reads the register's own lists and the company numbers you name. A company outside the window, outside your pasted filters and not in companyNumbers is not fetched. companyNameIncludes narrows a window by name, but there is no name lookup across the whole register.
  • The register lists far more than 100 new companies on a working day, and its list is not in date order. Measured on a 7-day window, the first 100 rows came from the window's first two days. So a default run of 100 rows covers only part of the window, not all 7 days, and usually not the latest. Raise maxItems, or narrow the run with the filters above, to read the whole window.
  • No contact details. The register does not publish a company's own website, email or phone. register_page_url and register_urls are the register's URLs for the company, not the company's site.
  • No filing documents. latest_filing carries the filing's date, type and description and nothing more, by design.
  • Officers, PSC and filing tabs cost one extra read per company each. All three flags on a big window mean a long run.
  • One search tops out at 10,000 companies before the register's own list ends. A window wider than that is cut there.
  • With onlyNew on, memory lasts 31 days. A company that appears again after that is emitted once more, which is correct for a filings feed: a second appearance is a new event.
  • After a refusal the run reads nothing more: the companies not yet read come back as free blocked rows (see What you can count on). One run returns at most 10,000 companies.

Troubleshooting

My scheduled run returned far fewer rows than maxItems. With onlyNew on, an earlier run already sent the rest. Otherwise the window held fewer companies, or your SIC filter left fewer. To see which, open the run's Log tab: one line gives how many companies were in scope and how many were returned. The same counts are in RUN_SUMMARY, under the run's Storage tab.

I got one PROFILE_NOT_FOUND row and nothing else. That is an answer, not an error: the register answered and nothing matched. It is not charged. With onlyNew on, a second run over the same window usually means the first run already sent everything.

officers, persons_with_significant_control and latest_filing are all null. They fill only when the matching input flag is on. Set includeOfficers, includePsc or includeFilings and re-run.

Some rows say blocked or fetch_failed. Companies House declined a read (blocked), or a read kept failing (fetch_failed). Neither is charged. After a refusal the Actor reads nothing more rather than scrape through a block; wait a while and re-run for the companies it names.

The run failed with a "refused" error. Companies House refused the search page before any company was read. Wait a while and re-run. A pasted startUrls link that is not an advanced-search results URL does not fail the run: it comes back as a free bad_url row naming it.

Something still off? Open an issue on this Actor's Issues tab on the Apify Store.

FAQ

Can I use integrations with Companies House New Companies Scraper? Yes. The dataset plugs into Apify integrations such as Make, Zapier and webhooks, and an Apify schedule is the natural way to run it. A weekly schedule turns this Actor into a standing new-companies feed.

Can I use Companies House New Companies Scraper with the Apify API? Yes. Start runs, read the dataset and manage schedules over the API. The curl line under "How do I use" is a working example; swap in your token and your input.

Can I use Companies House New Companies Scraper through an MCP server? Yes. The command under "Use Companies House New Companies Scraper with AI agents" adds it to an MCP client. An agent can then call it like any other tool.

Is it legal to scrape Companies House? The register is public and published under statutory obligation. Its terms do not prohibit reading it this way. Rows carry register facts only, and the Personal data section covers the people named in them. You are responsible for having the right to read what you give it and for how you use the rows.

If this Actor saved you time, a review on the Store helps other buyers find it; problems go to the Issues tab.

Not affiliated

This Actor is not affiliated with, associated with, endorsed by or sponsored by Companies House or the UK government. It reads public pages of the UK company register and returns what they show.