Companies House New Companies Scraper: Daily Feed
Pricing
from $2.16 / 1,000 company returneds
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
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
13 days ago
Last modified
Categories
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
| Who | What they run it for |
|---|---|
| Accountants taking on new clients | A weekly feed of newly incorporated companies, with SIC codes to pick the ones that fit |
| Insurance brokers | New employers the week they register, in time to quote the compulsory cover every UK employer must carry |
| Banks and onboarding teams | A counterparty's registration date and live register status, straight from the source |
| B2B sellers to brand-new businesses | Company leads from the register itself, weeks before scraped databases carry them |
Features
- A rolling window, never a date to edit.
daysBackis 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
onlyNewon, a scheduled run sends each new company once. It sends it again when its register status changes, such as dissolved (turn onincludeDissolvedfor 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 firstmaxItemscompanies, the same ones each time. - New UK companies by default. The default run reads companies incorporated in the last
daysBackdays that are still active. It leaves out overseas companies, UK establishments and overseas entities (ukCompaniesOnly). - Dissolutions on request. Turn on
includeDissolvedto read companies dissolved in the window beside the incorporations, taggeddissolved. Or setdissolvedFromanddissolvedTofor 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,companyStatusand theincorporatedFromandincorporatedTodates go to the register's advanced search. The run then pages only through companies that match.sicCodesis sent too when every entry is a full five-digit code. If any entry is a shorter prefix such as43, no code is sent. The whole list then filters the returned companies instead. - Filter by company name.
companyNameIncludeskeeps names with your words, such asbakery.companyNameExcludesleaves out names with others, such asholdings. Both are the register's own name boxes. - Dormant shells left out, never charged. Turn on
excludeDormantto drop companies the register marks dormant. They declared SIC99999, Dormant Company, or file dormant accounts. They are read and dropped, never charged. Every row also carriesis_dormant, so you can sort them out yourself instead. - Flat columns for your CRM.
address_line_2andcountysit besideaddress_line_1,cityandpostcode. Every row also carriescompany_age_daysandsic_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, taggedmatched_filter. Any other link is not read and comes back as a freebad_urlrow naming it. - One company by number.
companyNumberstakes register numbers or company page URLs and returns one detailed row each, taggedlookup. A number the register does not know comes back as an unchargednot_foundrow. - Your list from a file or a Google Sheet.
companyNumbersFromFiletakes 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 unchargednot_foundrow naming it. - Charges, previous names and late filings. Every row carries
charges_countandcharges_outstanding,previous_names, the last made-up dates of the accounts and the confirmation statement, andaccounts_overdueandconfirmation_statement_overdue. All come from the register data the run already reads for each company, at no extra request. WithincludeOfficerson,director_countsays how many directors are serving; with it off, the field is null. - SIC code and text filter.
sicCodestakes full codes like56101and prefixes like43.searchQueriesalso matches words in the description likerestaurant. Every company row carriessic_codesas plain codes andsic_descriptionsas the register's text for each;sic_descriptionsis null on a row where only the codes were read. - Directors and PSCs when you ask.
includeOfficers,includePscandincludeFilingseach 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
maxItemscuts a run short, dissolutions come back before the long incorporation list. WithonlyNewon, so do status changes. - Proxy support.
proxyConfigurationsends 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
blockedrow 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_statusreadsok. An entry the run cannot answer is pushed as an unchargedITEM_STATUSrow 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_FOUNDrow that says so. You never get a silent empty dataset. - A spending limit stops the run cleanly. One
STOPPED_EARLYrow reports how many rows were returned and how many were not. - Every run writes a
RUN_SUMMARYentry withrowsFetched,rowsPushed,rowsChargedandduplicatesDropped. 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
blockedrow. 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 fieldsfirst_director,director_count,officers,persons_with_significant_controlandlatest_filingstaynulluntil you turn on their tab read.dissolution_dateisnullon every active company.accounts_category,accounts_last_made_up_toandconfirmation_statement_last_made_up_toarenullon 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.
| Field | What it is |
|---|---|
row_status | The 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. |
event | Why the company is in this run: newly_registered, dissolved, registered_and_dissolved, matched_filter or lookup (a company you named by number). |
company_name | The registered name, as the register prints it. |
company_number | The Companies House company number. Rows are de-duplicated on it inside a run; with onlyNew on, also across runs. |
registrar | The register the company sits on: Companies House on every row. |
jurisdiction | Registration 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_status | The register's live status in its own words, such as Active, Dissolved, Liquidation, In Administration, Open or Removed. |
company_type | The register's company category in its own words, such as Private Limited Company or UK establishment company. |
country_of_origin | The register's country of origin: United Kingdom on UK companies. |
incorporation_date | Incorporation 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_date | Dissolution date as ISO YYYY-MM-DD; null unless the register marks the company dissolved. |
registered_office_address | The 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_1 | First 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_2 | Second line of the registered office address; null when the address has none. |
city | The registered office post town. |
county | The registered office county, as the company wrote it; null when the address carries no county line, which is common. |
postcode | The registered office postcode. |
country | The 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_due | Next accounts due date, ISO. null when the register gives none, as on dissolved rows and limited partnerships. |
confirmation_statement_due | Next confirmation statement due date, ISO. null when the register gives none, as on dissolved rows and limited partnerships. |
accounts_category | The 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_to | The date the last filed accounts were made up to, ISO. null until a company has filed accounts. |
accounts_overdue | true 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_to | The date the last confirmation statement was made up to, ISO. null until a company has filed one. |
confirmation_statement_overdue | true when confirmation_statement_due is before the day of the run. false on or before it; null with no due date. |
charges_count | How many charges (mortgages and other security) are registered against the company. 0 when the register lists none. |
charges_outstanding | How many of those charges are still outstanding. 0 when the register lists none. |
previous_names | Names the company was registered under before, newest first, each with name and changed_on. An empty list when it has none. |
sic_codes | SIC codes as five-digit strings, such as ["56101"]. An empty list when the register holds none. |
sic_code_count | How many SIC codes the company declared: 0 when it declared none. |
sic_descriptions | The register's description of each SIC code, in the same order, such as ["Licensed restaurants"]. |
is_dormant | true 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_days | Whole days from incorporation_date to the day of the run. |
register_page_url | The company's overview URL on the register. The register does not publish the company's own site. |
register_urls | Both register URLs for the company: the overview page and its structured data document. |
filing_history_url | URL of the company's filing-history page on the register. |
first_director | Opt-in. null until includeOfficers is on: the first officer with a director role who has not resigned. |
director_count | Opt-in. null until includeOfficers is on: how many directors on the officers tab have not resigned. |
officers | Opt-in. null until includeOfficers is on: every officers-tab appointment, with name, role, appointed and resigned dates and status. |
persons_with_significant_control | Opt-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_filing | Opt-in. null until includeFilings is on: the newest filing's date, type and description, never the document itself. |
search_metadata | Which register read produced the row: the exact results URL, or the company page on a lookup row, and its event tag. |
row_type | ROW 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:
| Field | What it is |
|---|---|
reason | On a status row only: why no data rows came back, or why the run stopped early. |
rowsFetched | On a status row only: how many rows the source handed over before de-duplication and the cap. |
rowsReturned | On 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. |
rowsRemaining | On 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 returned | Charged events | Cost |
|---|---|---|
| 100 | 100 | $0.40 |
| 1,000 | 1,000 | $4.00 |
| 10,000 | 10,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?
- Open the Actor page and press Start. The form is ready as it opens: no keys, no URLs, no setup. Tick
includeOfficersif you also want each company's directors. - Rows land in the dataset as they are read. Export them as JSON, CSV or Excel, or pull them through the API.
- Put the Actor on a daily or weekly Apify schedule with
onlyNewon. 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
| Input | Default | What it does |
|---|---|---|
daysBack | 7 | How many days back the incorporation window (and the dissolution window, when on) reaches. |
maxItems | 100 | The most company rows one run returns, up to 10,000. |
onlyNew | false | Turns 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. |
onlyChanged | false | The 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. |
suppress | empty | Entries 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. |
clearSuppressions | false | Empties 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. |
companyTypes | empty | Company types to keep, such as ltd, plc, llp or community-interest-company. Empty means every UK type. |
ukCompaniesOnly | true | Leaves out overseas companies, UK establishments and overseas entities. When companyTypes is set, the types you name decide instead. |
sicCodes | empty | Five-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. |
location | empty | Text the registered office address must contain: a town, a county or a postcode fragment such as EC2A. |
companyNameIncludes | empty | Words the company name must contain, such as bakery. Sent to the register's search; applies to the built-in windows, not to pasted startUrls. |
companyNameExcludes | empty | Words 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. |
excludeDormant | false | Leaves 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. |
incorporatedFrom | none | Earliest incorporation date, YYYY-MM-DD. With incorporatedTo it replaces the daysBack window. |
incorporatedTo | none | Latest incorporation date, YYYY-MM-DD. |
includeDissolved | false | Also read companies dissolved in the window, tagged dissolved. |
dissolvedFrom | none | Earliest dissolution date, YYYY-MM-DD. Setting a dissolution date reads the dissolution window; given without incorporation dates, the run returns dissolutions only. |
dissolvedTo | none | Latest dissolution date, YYYY-MM-DD. |
startUrls | empty | Pasted advanced-search results URLs replace the built-in windows. |
companyNumbers | empty | Company numbers or company page URLs; each returns one detailed row. When this is the only input given, no window or search is read. |
companyNumbersFromFile | empty | Pasted 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. |
maxItemsPerStartUrl | none | Caps how many companies each pasted startUrls entry may contribute, so one long list cannot spend the whole maxItems budget. |
searchQueries | empty | A 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. |
includeOfficers | false | Also 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. |
includePsc | false | Also read each company's PSC tab; fills persons_with_significant_control. Adds personal data: each PSC's name. |
includeFilings | false | Also read each company's filing history; fills latest_filing. |
proxyConfiguration | none | Send 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 withrow_status: "not_found". A company on the removal list comes back withrow_status: "removed". A pastedstartUrlslink that is not an advanced-search results URL comes back withrow_status: "bad_url". A company the register refused, or one not read after a refusal, comes back withrow_status: "blocked", and one whose read kept failing withrow_status: "fetch_failed". An entry the run'smaxItemsstopped before it was read comes back withrow_status: "not_reached". Never charged.PROFILE_NOT_FOUND: the register answered and nothing matched. One row, not charged, andreasonsays why.STOPPED_EARLY: your charge limit ended the run. One row, not charged, carryingrowsReturnedandrowsRemaining.
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.
includeOfficersandincludePscare 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_urlpoints 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_controlandfirst_director. A company that asks to be left out is not read at all. It comes back as one uncharged row whoserow_statusreadsremoved, 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,daysBackandonlyNewis 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
suppresslist 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 freeremovedrow;clearSuppressionsempties it.onlyChanged, the watchlist diff: companies named undercompanyNumbersorcompanyNumbersFromFileare emitted only when their row content changed since your last run. - 2026-09-28:
companyNameIncludesandcompanyNameExcludes, the register's own name boxes.excludeDormantleaves out companies that declared SIC99999or file dormant accounts. New columns:address_line_2,county,accounts_category,is_dormant,company_age_daysandsic_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 unchargedremovedrow.natures_of_control, inside eachpersons_with_significant_controlentry, now carries only the register's nature-of-control lines.companyNumbersFromFilereads 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_overdueandconfirmation_statement_overdue, plusdirector_countwithincludeOfficers. Runs withincludeOfficerson 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 freeblockedrow. A read that keeps failing costs only that company, as a freefetch_failedrow. A company whose tab cannot be read is left out whole instead of returned with those fields empty.maxItemsgoes up to 10,000, and a proxy keeps one session for the whole run.includeOfficersis off in the Console form and over the API, so no person is named unless you tick it. A pastedstartUrlslink that is not an advanced-search results URL no longer fails the run: it comes back as a freebad_urlrow naming it. ARetry-Afterfrom 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
onlyNewinput, 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. TurnonlyNewon 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:
jurisdictionnow 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 withincludeDissolved.company_statusandcompany_typealways carry the register's words.sic_codesis now a list of plain codes, with the text in the newsic_descriptions.incorporation_dateis 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
companyNumbersis not fetched.companyNameIncludesnarrows 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_urlandregister_urlsare the register's URLs for the company, not the company's site. - No filing documents.
latest_filingcarries 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
onlyNewon, 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
blockedrows (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.