UK Companies House Scraper: Officers, PSC, Charges
Pricing
from $1.73 / 1,000 company profile returneds
UK Companies House Scraper: Officers, PSC, Charges
Scrape UK Companies House company profiles by number, register URL, search term, or SIC code, location and date filters: status, registered office, SIC codes, accounts and confirmation dates, officers, persons with significant control, charges and filing history. One row per company. No login.
Pricing
from $1.73 / 1,000 company profile returneds
Rating
0.0
(0)
Developer
Pradio Actors
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 hours ago
Last modified
Categories
Share
What does UK Companies House Scraper do?
UK Companies House Scraper returns one company profile per row from the Companies House register, with its officers and persons with significant control. The profile carries the company's number, name, status, type, registered office, SIC codes, accounts and filing dates, and on request its charges and latest filings.
Give it a company name or a trade as a search query, or paste company page URLs and bare company numbers. You can also filter the whole register by SIC code, location, status, company type and incorporation or dissolution dates. The register's own search and company pages are read over plain HTTP: no login, no key, no browser.
A resolved company costs $0.0032; a miss costs nothing and its row says why. On a measured run over 148 companies it had never seen, every one resolved and was charged once.
Who uses UK Companies House Scraper
| Who | What they use it for |
|---|---|
| Sales and growth teams | A prospect's legal name, registered office, SIC codes and filing dates, straight from the UK register |
| Onboarding and compliance teams | A counterparty's live status, officers and PSCs for KYC and due-diligence checks |
| Credit and risk analysts | Accounts dates, overdue flags, charges and insolvency markers on the companies they score |
| Investigators and data teams | Structured profiles of UK companies at list scale, deduplicated on the register page |
Features
- Four ways in.
companyNumberstakes company numbers such as 07109264.startUrlstakes Companies House company page URLs and/search?q=results URLs.searchQueriestakes register search terms such as a company name or a trade. The filter inputs search the register by SIC code, location, status, type and dates. - The register's own search. Queries are answered by the Companies House search itself; no external engine and no key is involved. Officer hits in the results are skipped: a query returns companies, not people.
- Filter search with full profiles.
sicCodes,location,companyStatus,companyTypes,incorporatedFrom/incorporatedToanddissolvedFrom/dissolvedTorun the register's advanced company search. Every match comes back as the same full profile a looked-up company gets, officers and PSCs included. - Only new companies on a schedule.
onlyNewremembers which companies a filter search already returned and skips them next time. A daily run then returns just the newly registered or newly dissolved ones. - Filing history and charges on request.
includeFilingHistoryadds each company's latest filings;includeChargesadds its charges with status and persons entitled. Both are off by default and cost no extra event. - Name history and dissolution date.
previous_nameslists every earlier name with the period it was used, anddissolved_oncarries the date a company left the register. - The full register entry, not just the summary. Each resolved company's register document, officers tab and persons-with-significant-control tab are all read. A profile carries its people and its register counts, not just its summary line.
- One profile per company, once. Rows are deduplicated on the register page URL before anything is written or charged. A profile is written to the dataset first and billed second.
- Bounded and polite. Reads go one at a time with a pause between them. A refused read backs off; if the refusal holds, the run fails rather than push past a block.
- Proxy support.
proxyConfigurationsends every register read through your Apify proxy setup. - A verdict on every entry. A number the register has no company under comes back
not_found. A pasted link off the register's host comes backbad_url. Neither is charged.
What you can count on
- You pay only for profiles whose
row_statusreadsok. An entry the run cannot answer is pushed as an unchargedITEM_STATUSrow that names it and says why. - Every profile 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, never an empty dataset. - A spending limit stops the run cleanly, with a
STOPPED_EARLYrow saying how many profiles were returned and how many were not. - Every run writes a
RUN_SUMMARYentry withrowsFetched,rowsPushed,rowsCharged,rowsUncharged,duplicatesDroppedandstoppedEarly, so a short run and a broken one are told apart. - If the register changes what it answers, the run fails with the error in the log. It never returns rows full of nulls and calls it a success.
- No register value is invented: a field the register does not show is
null, and the fields that can stay empty are named under Limits. The few computed fields (lead_score, the*_countrollups and the*_on_registercounters) are derived from the register's own fields and say so in the field table.
Why this one
The most-used alternative on this platform was run against the same 20-company search on 2026-09-20, with its officer and PSC options switched on.
- Its person fields came back empty. All 20 of its rows left every officer-level field it declares empty. That covers names, roles, appointment and resignation dates, dates of birth, nationalities and service addresses. A profile from this Actor carries the officers and PSCs the register lists.
- Lower price. The most-used alternative on this platform charges $0.004 a profile; this Actor charges $0.0032, a fifth less per row.
- It resolves what it has never seen. On a separate measured run over 148 UK company numbers taken from an external list, this Actor resolved all 148, each charged once.
- A miss costs nothing and says why. An entry the register cannot answer comes back as an uncharged row naming it, with
not_found,bad_urlorbad_inputas the verdict. - The source URL is on every row.
pageUrlpoints back to the register page each profile was read from, so any value can be checked at the source.
What data does UK Companies House Scraper return?
One profile per resolved company, written to the dataset as the run goes. A data row carries 42 fields. This is a real row from a live run, with the officers list left out for length:
{"company_name": "GREEN ENERGY LIMITED","pageUrl": "https://find-and-update.company-information.service.gov.uk/company/07109264","entry_type": "company","company_number": "07109264","company_status": "Active","company_type": "Private Limited Company","registered_office_address": "BLACK SWAN HOUSE, 23 BALDOCK STREET, WARE, HERTFORDSHIRE, SG12 9DH","incorporated_on": "2009-12-21","dissolved_on": null,"previous_names": [{ "name": "GARSINGTON ENERGY LIMITED", "from": "2009-12-21", "to": "2012-10-25" }],"sic_codes": [{ "code": "35130", "description": "Distribution of electricity" },{ "code": "35140", "description": "Trade of electricity" }],"next_accounts_made_up_to": "2026-04-30","next_accounts_due_by": "2027-01-31","last_accounts_made_up_to": "2025-04-30","accounts_overdue": false,"accounts_summary": "Accounts: next accounts made up to 2026-04-30 due by 2027-01-31; last accounts made up to 2025-04-30 (filed as dormant)","confirmation_statement_next_date": "2026-12-19","confirmation_statement_due_by": "2027-01-02","confirmation_statement_last_date": "2025-12-19","confirmation_statement_overdue": false,"pscs": [{"name": "Green Energy (Uk) Plc","kind": "corporate-entity","status": "Active","notified_on": "2016-07-01","ceased_on": null,"natures_of_control": ["Ownership of shares – 75% or more","Ownership of voting rights - 75% or more","Right to appoint or remove directors"],"date_of_birth": null,"nationality": null,"country_of_residence": null,"correspondence_address": "Black Swan House, 23 Baldock Street, Ware, England, SG12 9DH"}],"listing_address": null,"search_query": null,"source": "url","has_charges": false,"has_insolvency_history": false,"officers_on_register": 9,"resignations_on_register": 6,"psc_statements_on_register": 0,"is_active": true,"officers_count": 9,"active_officers_count": 3,"resigned_officers_count": 6,"directors_count": 2,"psc_count": 1,"sic_code_list": ["35130", "35140"],"filing_history": null,"charges": null,"row_status": "ok","lead_score": 20,"row_type": "ROW"}
Each officers entry carries name, role, status, appointed and resigned dates, nationality and country of residence. It also carries month and year of birth and correspondence_address, the service address the register publishes. Every field the schema declares:
| Field | What it carries |
|---|---|
company_name | The registered company name, read from the register's company document or the search listing. |
pageUrl | The URL of the company's overview page on the register; also the run's deduplication key. |
entry_type | The register entry kind. Always company on a company profile row, the only kind of entry this Actor reads; null on a miss row and on a run-level row. |
company_number | The Companies House company number the profile was resolved under. |
company_status | The register's live status for the company, such as Active or Dissolved. |
company_type | The register's company category, such as Private Limited Company. |
registered_office_address | The registered office address as the register prints it, in one line. |
incorporated_on | The incorporation date, ISO YYYY-MM-DD; for an overseas entity or a UK establishment, the date it was registered or opened. |
dissolved_on | The date the register records the company as dissolved, ISO YYYY-MM-DD; null while the company is live. |
previous_names | Earlier registered names, newest first, each as name, from and to dates; null when the company never changed name. |
sic_codes | The company's filed SIC codes, each as a code and its description. The register's own codes are passed through as published, so a company still filed under the older SIC 2003 list carries a four-digit code. |
next_accounts_made_up_to | The period end the next accounts cover, from the register's accounts block. null on a dissolved company. |
next_accounts_due_by | The due date the register prints for the next accounts, ISO. null on a dissolved company, which files nothing more. |
last_accounts_made_up_to | The made-up-to date of the last filed accounts, ISO. |
accounts_overdue | true when the register marks the accounts overdue or the due date has passed; null where the register shows no accounts block, and on a dissolved company. |
accounts_summary | The accounts dates joined into one line, as the company page prints them. |
confirmation_statement_next_date | The date the next confirmation statement covers, from the register's confirmation block. null on a dissolved company. |
confirmation_statement_due_by | The due date the register prints for the next confirmation statement, ISO. null on a dissolved company. |
confirmation_statement_last_date | The last confirmation statement's made-up-to date, ISO. |
confirmation_statement_overdue | true when the register marks the statement overdue or its due date has passed; null where the register shows no confirmation block, and on a dissolved company. |
officers | The officers tab's appointments, each with name, role, status, dates and the identity fields the register prints. Each date_of_birth holds the month and year only, such as August 1960; the register withholds the day. null when none are listed. |
pscs | The PSC tab's entries, each with name, kind, status, dates and natures of control. A person's date_of_birth holds the month and year only. null whenever the tab lists no person: the register shows an exemption or another PSC statement instead (counted in psc_statements_on_register), the tab lists nothing at all (as on a company that closed before PSCs were recorded, where psc_statements_on_register is 0), or the register has no PSC page for the company. |
listing_address | The address the search listing printed; filled only on rows found through a search. |
search_query | The query the company was found under; filled only on rows found through searchQueries, a pasted /search?q= URL or the filter search, where it reads like SIC 56101; location EC2A; status active. |
source | How the company was reached: url for a company page in startUrls or a bare number in companyNumbers (a number is looked up the same way as its page), search for a hit from searchQueries or a pasted /search?q= URL, advanced_search for a filter match. A company reached two ways carries the first: url, then search, then advanced_search. Null on a miss row. |
has_charges | true when the register's document for the company carries mortgage charges. |
has_insolvency_history | true when the register shows an insolvency marker or an insolvency status word. |
officers_on_register | How many officer appointments the register lists for the company. The same value as officers_count. Both names hold the same count. |
resignations_on_register | How many of those appointments have ended, per the officers tab. The same value as resigned_officers_count. Both names hold the same count. |
psc_statements_on_register | How many PSC statements the register shows, including an exemption statement filed instead of a PSC list. |
is_active | true when the register's status for the company is Active; null where it shows no status. |
officers_count | The number of entries in this profile's officers list. The same value as officers_on_register, and both names hold the same count; 0 when officers is null. |
active_officers_count | Officers the register shows as serving: tagged Active, or untagged with no resignation on a company that is not dissolved. 0 on a dissolved company. |
resigned_officers_count | Officers whose appointment has ended. The same value as resignations_on_register. Both names hold the same count. On a dissolved company, the officers in office at dissolution are counted in neither this nor active_officers_count. |
directors_count | Active officers whose role is a director role. |
psc_count | The number of entries in this profile's pscs list; 0 when pscs is null. |
sic_code_list | The SIC code strings alone, for filtering or joining. The same codes as sic_codes, without the descriptions. |
lead_score | A 0-100 rollup of the register's own signals, added up as: active status 30, accounts not overdue 20, confirmation statement not overdue 15, at least one officer listed 15, at least one PSC listed 10, at least one SIC code 10. A dormant company (SIC 99999, or accounts filed as dormant) or one whose status is not active (dissolved, in liquidation, proposed for strike-off) scores at most 20 however complete its filings are; accounts_summary says "filed as dormant" when that is the reason. An overseas entity's "Registered" is its live status and is not capped. |
filing_history | With includeFilingHistory on: the latest filings, newest first, each with date, type (the form code, such as CS01) and description. null when the option is off. |
charges | With includeCharges on: each charge with charge_code (or title for an older charge), created_on, delivered_on, status, satisfied_on and persons_entitled. An empty list when the register has none; null when the option is off. |
row_status | The row's own verdict: ok on a profile; on an ITEM_STATUS row, the miss verdict the source returned (not_found, bad_url, bad_input). |
row_type | ROW on a profile; ITEM_STATUS on an uncharged per-entry miss; PROFILE_NOT_FOUND when the register answered with nothing; STOPPED_EARLY when a charge limit ended the run. |
reason | Status rows only: why the run returned no profiles, or why it stopped early. |
rowsFetched | Status rows only: how many rows the source produced before de-duplication and the cap. |
rowsReturned | Status rows only: how many rows were written to the dataset before this one, free miss rows included. It is the same count RUN_SUMMARY calls rowsPushed. |
rowsRemaining | Status rows only: how many fetched rows were not returned. |
How much does it cost?
Each company profile written to your dataset bills one profile-returned event: $0.0032.
| Profiles you ask for | Events billed | Cost |
|---|---|---|
| 100 | up to 100 | $0.32 |
| 1,000 | up to 1,000 | $3.20 |
| 10,000 | up to 10,000 | $32 |
A profile costs the same whichever way it was found. Filing history and charges add detail to the profile and no extra event; they only make each profile take a little longer to read.
Not charged: ITEM_STATUS miss rows (not_found, bad_url, bad_input), the PROFILE_NOT_FOUND and STOPPED_EARLY rows, and repeats dropped before anything is written.
Apify also bills its own apify-actor-start event on every run at $0.00005 per event, one event per GB of run memory with a minimum of one. That charge is the platform's; this Actor adds nothing on top.
At the measured rate, where every entry resolved, a list of 100 companies costs about $0.32 plus the $0.00005 start event, and 1,000 companies about $3.20 plus the start event.
How do I use UK Companies House Scraper?
- Open the Actor page and press Start. The input already carries a working query; there is no key and no login.
- Profiles land in the dataset as they are read. Export them as JSON, CSV or Excel, or pull them through the API.
The input that produced the sample row. The company number is read directly, so its row says source: "url"; the query adds the companies the search finds:
{"companyNumbers": ["07109264"],"searchQueries": ["green energy"]}
Or point it at companies directly. companyNumbers takes company numbers, and startUrls takes a company page URL or a /search?q= results URL:
{"companyNumbers": ["07109264", "00445790"],"startUrls": ["https://find-and-update.company-information.service.gov.uk/company/SC005336","https://find-and-update.company-information.service.gov.uk/search?q=green%20energy"]}
Through the API:
curl -X POST "https://api.apify.com/v2/acts/Pradio~companies-house/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" -H "Content-Type: application/json" -d "{\"searchQueries\":[\"green energy\"]}"
Input
| Input | Default | What it does |
|---|---|---|
companyNumbers | empty | Company numbers such as 07109264 or SC005336; each is read once. |
startUrls | empty | Companies House company page URLs or /search?q= results URLs; every company they resolve to is read once. |
searchQueries | ["green energy"] | Terms run through the register's own search; each company hit joins the lookup queue under the per-query cap. |
maxItems | none | The most rows one run returns; leave it unset for no cap. |
maxCompaniesPerSearchQuery | maxItems, else 20 | The most companies one search query, or the filter search as a whole, may add to a run. |
sicCodes | empty | Five-digit SIC codes such as 56101, one per entry. Each code is searched on its own and the matches merged without repeats. |
location | empty | Text the registered office address must contain: a town such as Leeds or a postcode start such as EC2A. |
companyStatus | empty (any) | One or more of active, dissolved, open, closed, converted-closed, removed, receivership, liquidation, administration, insolvency-proceedings, voluntary-arrangement. |
companyTypes | empty (any) | One or more register types such as ltd, plc, llp, limited-partnership or uk-establishment; the subtypes community-interest-company and private-fund-limited-partnership narrow them. |
incorporatedFrom | empty | Only companies incorporated on or after this date, YYYY-MM-DD. |
incorporatedTo | empty | Only companies incorporated on or before this date, YYYY-MM-DD. |
dissolvedFrom | empty | Only companies dissolved on or after this date, YYYY-MM-DD. |
dissolvedTo | empty | Only companies dissolved on or before this date, YYYY-MM-DD. |
onlyNew | false | Filter search only: skip companies an earlier run with the same filters already returned. |
includeFilingHistory | false | Add each company's latest filings as filing_history. |
filingHistoryLimit | 5 | How many filings to add per company, 1 to 100. |
includeCharges | false | Add each company's charges as charges. |
proxyConfiguration | none | Sends every register read through your Apify proxy setup. |
companyNumbers and startUrls
companyNumbers takes the register's own numbers, such as 07109264 or SC005336, one per entry. startUrls takes a company page URL copied from the register or a /search?q= results URL. A URL from any other host, or an entry that is none of these, comes back as an uncharged bad_url row naming the entry. A typo does not stop the run.
searchQueries
Each entry is run through the register's own search and its company hits are resolved in order; officer hits are skipped. One query reads at most 50 pages of results. maxCompaniesPerSearchQuery bounds how many hits one query may add: unset, it falls back to maxItems, or 20 when that is unset too.
maxItems and maxCompaniesPerSearchQuery
maxItems caps the whole run's output. maxCompaniesPerSearchQuery caps what a single query may contribute, so one broad term cannot spend the whole budget. The cap counts profiles and miss rows alike. A run that reaches your Apify spending limit stops cleanly with a STOPPED_EARLY row instead of charging past it.
Filter search: sicCodes, location, companyStatus, companyTypes and dates
Set any filter and the run searches the register's advanced company search, then reads a full profile for each match. Filters combine: a company must match all of them. This finds restaurants registered in the EC2A postcode that are still trading:
{"sicCodes": ["56101"],"location": "EC2A","companyStatus": ["active"],"maxItems": 50}
The register takes one SIC code per search, so each code in sicCodes is searched on its own and the results are merged. A company listed under two of your codes comes back once. A code must be five digits. Dates are YYYY-MM-DD. A value the register cannot take fails the run at the start with a message naming the input and the value, before anything is read or charged. The filter search adds at most maxCompaniesPerSearchQuery companies (or maxItems, or 20 when both are unset). startUrls and searchQueries still work beside it; clear them if you want filter matches only.
onlyNew
For a scheduled filter search. The run remembers the company numbers it returned for this exact set of filters, and the next run with the same filters skips them. Changing maxItems keeps the memory; changing any filter starts a new one. The memory lives in a named key-value store, companies-house-only-new, on your own Apify account, and keeps the latest 50,000 numbers per filter set. This returns only companies incorporated since the start of the month that no earlier run has returned:
{"incorporatedFrom": "2026-09-01","location": "Leeds","companyTypes": ["ltd"],"onlyNew": true,"maxItems": 200}
includeFilingHistory and filingHistoryLimit
Adds filing_history to every profile: the latest filings, newest first, with the date, the form type and the register's own description. Filed documents themselves are never downloaded.
{"companyNumbers": ["00445790"],"includeFilingHistory": true,"filingHistoryLimit": 10}
includeCharges
Adds charges to every profile. Each charge carries its code (or its title, for an older charge) and the created and delivered dates. It also carries the status with the date it was satisfied, and the persons entitled to it. A company with no charges gets an empty list without an extra read.
{"companyNumbers": ["07761462"],"includeCharges": true}
proxyConfiguration
Optional. When set, every register read goes through the configured Apify proxy. It is not a way past a refusal: a run the register refuses stops, whatever the proxy.
Worked examples
Use it to build a prospect list of new companies in one trade and town. This finds private limited software companies, incorporated this year, with an office in Manchester.
{"sicCodes": ["62012", "62020"],"location": "Manchester","companyTypes": ["ltd"],"companyStatus": ["active"],"incorporatedFrom": "2026-01-01","maxItems": 100}
Use it to get a daily feed of newly registered companies. Schedule this every morning; each run returns only companies the previous runs have not.
{"incorporatedFrom": "2026-09-01","companyStatus": ["active"],"onlyNew": true,"maxItems": 500}
Use it to put together a due-diligence pack on known counterparties: company numbers in, profiles out with their latest filings and every charge.
{"companyNumbers": ["00445790", "07109264"],"includeFilingHistory": true,"filingHistoryLimit": 10,"includeCharges": true}
Use it to list the companies that left the register: dissolutions in one postcode area over a month, with the date each was dissolved.
{"location": "EC2A","companyStatus": ["dissolved"],"dissolvedFrom": "2025-01-01","dissolvedTo": "2025-01-31","maxItems": 50}
Output
A run writes data rows with row_type: "ROW" and, when something needs saying, status rows. Everything lands in the default dataset.
ROW: a resolved company profile, charged after it is written.ITEM_STATUS: a per-entry miss, pushed so the miss is visible. A company number the register does not know comes backnot_found; an unusable entrybad_url; a run with no usable inputbad_input. Never charged.PROFILE_NOT_FOUND: the register answered and produced no company hits. One row, never charged, andreasonsays why.STOPPED_EARLY: the charge limit ended the run. One row, never charged, carryingrowsReturnedandrowsRemaining.
An empty result is an answer, not a failure: the run writes one PROFILE_NOT_FOUND row and charges nothing, rather than leaving an empty dataset.
RUN_SUMMARY in the default key-value store carries rowsFetched, rowsPushed, rowsCharged, rowsUncharged, duplicatesDropped and stoppedEarly for every run.
What can you do with the data?
- A sales team searches a trade such as "green energy" and gets UK companies with offices, SIC codes and filing dates for a prospect list.
- An onboarding analyst pastes a supplier's company number; the profile returns its live status, officers and PSCs for the KYC file.
- A credit analyst filters on
accounts_overdueandhas_insolvency_history, and reads the register's officer and PSC counts without opening each company page. - A data team pulls profiles for a whole sector and joins on
company_numberorsic_code_list.
Use UK Companies House Scraper with AI agents
Add this Actor to an MCP-capable client:
claude mcp add --transport http apify "https://mcp.apify.com?tools=Pradio/companies-house"
The agent can then read the input schema, start runs and pull the dataset on its own.
Personal data
Some rows name people. officers and pscs carry what Companies House publishes for inspection under the Companies Act 2006. An officer's or PSC's entry may carry a name, a service or correspondence address, month and year of birth, nationality and role. With includeCharges on, a charge's persons_entitled names the lender or trustee the register lists, usually a bank or a company and occasionally a private individual. The purpose this serves is company research, due diligence and compliance on UK companies.
- Only what the register publishes. No usual residential addresses, no day of birth (the register itself withholds it), and nothing enriched from other sources. Rows carry structured register fields only: no filed documents, no accounts text, no document images.
- Transparency. Every profile's
pageUrlpoints back to the register page it was read from, so any value can be checked at the source. - Controller and contact. Companies House controls the register's own publication; for the rows you export, you are the controller. Questions go through this Actor's Issues tab on the Apify Store.
- Deletion. A person named in a row can ask for deletion or correction through the same Issues tab, and the request is honoured. Companies House also runs its own protection process for the register itself.
- Reuse. Companies House material is reused under the Open Government Licence. Its one condition is credit: "Contains public sector information licensed under the Open Government Licence v3.0." Crown insignia are not reproduced.
Release notes
- 2026-09-25:
active_officers_countanddirectors_countno longer count the officers of a dissolved company as serving. On a dissolved company the next accounts and confirmation dates and both overdue flags are nownull, since it files nothing more. - 2026-09-24: filter search by SIC code, location, status, company type and incorporation or dissolution dates, with a full profile per match;
onlyNewfor scheduled filter runs; optionalfiling_historyandcharges; newprevious_namesanddissolved_onfields. Officers no longer carry an occupation, because the register's officers page stopped showing one. Register codes such astransform.status.removedare now written in the register's own words. 0.1, 2026-09-20: first public release. One company profile per row from the UK Companies House register: number, name, status, type, registered office, SIC codes, accounts and filing dates, officers and persons with significant control. Search terms, company page URLs or bare company numbers in; a miss costs nothing and says why.
Limits
- It reads the Companies House register only. A URL pasted from another host comes back as an uncharged
bad_urlrow naming it. - One profile per company. The register's filed documents, accounts text and document images are never returned; rows carry structured register fields only.
search_queryandlisting_addressare filled only on rows found through a search; a direct lookup has no query to echo and no listing to quote.pscsisnullwhenever the PSC tab lists no person. That happens in three cases: the register shows an exemption or another PSC statement instead, as on most large listed companies, and the statement is counted inpsc_statements_on_register; the tab lists nothing at all, as on a company that closed before PSCs were recorded, andpsc_statements_on_registeris 0; or the register has no PSC page for the company. In the measured 148-company run, 63 profiles carried a PSC list.- On a dissolved company the register tags no officer as serving, so
active_officers_countanddirectors_countare 0. The officers in office at dissolution are still listed inofficers, with no status and no resigned date. accounts_overdueandconfirmation_statement_overduearenullwhere the register shows no accounts or confirmation block;is_activeisnullwhere it shows no status.- Officer and PSC birth dates are month and year only; the register withholds the day, and it does not publish usual residential addresses at all.
- Reads are sequential with a pause between them, so a large run takes a while. A profile takes several page reads, and filing history and charges add one or more each. One query reads at most 50 search pages; a longer result list is cut there, and
maxItemscaps the whole run. - The filter search reads at most 5,000 matches per SIC code. Narrow the filters to reach the rest.
onlyNewremembers a company when its profile is built. A run stopped by your spending limit before every profile was written may leave a few remembered companies unreturned. Clear thecompanies-house-only-newstore to start over.- Officers carry no occupation: the register's officers page no longer shows one.
previous_namescomes from the register's company entry. Itsfromdate for the oldest name is the incorporation date.- A refused or changed page fails the run with the error in the log rather than returning rows of nulls. Wait a while and re-run.
- For bulk copies of the whole register, Companies House's own free bulk data products are the right source; this Actor is for looking companies up.
Troubleshooting
The run returned fewer profiles than I expected. maxItems caps the whole run and maxCompaniesPerSearchQuery caps one query, and the register's own list may end first. RUN_SUMMARY says which: rowsFetched against rowsPushed, with duplicatesDropped for repeats.
I got one PROFILE_NOT_FOUND row and nothing else. The register answered and no company hits matched. That is the answer, not an error, and it is not charged. Check the query's spelling, or try the register's own search page to see what it returns for the same term.
A company number came back not_found. The register has no company under that number; the row is not charged. Check the number on the register's own site.
The run failed with a refusal error. Companies House declined a read and the run stopped rather than push past a block. Wait a while and re-run with a smaller list.
The run failed straight away naming an input. A filter value the register cannot take stops the run before anything is read or charged. Examples are a four-digit SIC code, a date not written as YYYY-MM-DD or an unknown status. Fix the value named in the log and start again.
A scheduled onlyNew run returned nothing. Every match for those filters was already returned by an earlier run. That is the answer, and it is not charged.
pscs is null on a large listed company. The register shows an exemption statement there instead of a PSC list. The statement is counted in psc_statements_on_register. It is the register's answer, not a defect. If psc_statements_on_register is 0 as well, the PSC tab lists nobody and no statement, which is common on a company that closed before PSCs were recorded.
Something still off? Open an issue on this Actor's Issues tab on the Apify Store.
FAQ
Can I use integrations with UK Companies House Scraper? Yes. The dataset plugs into Apify integrations such as Make, Zapier and webhooks, and the API or an Apify schedule can run it on a loop.
Can I use UK Companies House Scraper with the Apify API? Yes. The curl line under "How do I use" is a working call; swap in your token and your input.
Can I use UK Companies House Scraper through an MCP server? Yes. The command under the AI agents heading adds it to an MCP client. An agent can then call it like any other tool.
What do duplicates and misses cost? Nothing. Say a query lists 50 company hits and three of them name companies another entry already gave. The run writes 47 profiles and charges 47 events; the repeats are dropped before anything is written. Every miss is an uncharged status row.
Is it legal to scrape Companies House? The register is public and published under the Companies Act 2006 for inspection. This Actor reads the same public pages a browser shows, one at a time and inside the register's published limits, and returns structured fields only. For the people named in rows, see the Personal data section; for bulk copies, use Companies House's free bulk data products.
See also
From the same publisher:
- Website Email Phone Contacts Scraper: the contact details a company's own website publishes, a complement to a register profile.
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.