UK Companies House Scraper: Officers, PSC, Charges avatar

UK Companies House Scraper: Officers, PSC, Charges

Pricing

from $1.73 / 1,000 company profile returneds

Go to Apify Store
UK Companies House Scraper: Officers, PSC, Charges

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

Pradio Actors

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 hours ago

Last modified

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

WhoWhat they use it for
Sales and growth teamsA prospect's legal name, registered office, SIC codes and filing dates, straight from the UK register
Onboarding and compliance teamsA counterparty's live status, officers and PSCs for KYC and due-diligence checks
Credit and risk analystsAccounts dates, overdue flags, charges and insolvency markers on the companies they score
Investigators and data teamsStructured profiles of UK companies at list scale, deduplicated on the register page

Features

  • Four ways in. companyNumbers takes company numbers such as 07109264. startUrls takes Companies House company page URLs and /search?q= results URLs. searchQueries takes 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/incorporatedTo and dissolvedFrom/dissolvedTo run 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. onlyNew remembers 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. includeFilingHistory adds each company's latest filings; includeCharges adds its charges with status and persons entitled. Both are off by default and cost no extra event.
  • Name history and dissolution date. previous_names lists every earlier name with the period it was used, and dissolved_on carries 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. proxyConfiguration sends 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 back bad_url. Neither is charged.

What you can count on

  • You pay only for profiles whose row_status reads ok. An entry the run cannot answer is pushed as an uncharged ITEM_STATUS row 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_FOUND row that says so, never an empty dataset.
  • A spending limit stops the run cleanly, with a STOPPED_EARLY row saying how many profiles were returned and how many were not.
  • Every run writes a RUN_SUMMARY entry with rowsFetched, rowsPushed, rowsCharged, rowsUncharged, duplicatesDropped and stoppedEarly, 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 *_count rollups and the *_on_register counters) 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_url or bad_input as the verdict.
  • The source URL is on every row. pageUrl points 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:

FieldWhat it carries
company_nameThe registered company name, read from the register's company document or the search listing.
pageUrlThe URL of the company's overview page on the register; also the run's deduplication key.
entry_typeThe 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_numberThe Companies House company number the profile was resolved under.
company_statusThe register's live status for the company, such as Active or Dissolved.
company_typeThe register's company category, such as Private Limited Company.
registered_office_addressThe registered office address as the register prints it, in one line.
incorporated_onThe incorporation date, ISO YYYY-MM-DD; for an overseas entity or a UK establishment, the date it was registered or opened.
dissolved_onThe date the register records the company as dissolved, ISO YYYY-MM-DD; null while the company is live.
previous_namesEarlier registered names, newest first, each as name, from and to dates; null when the company never changed name.
sic_codesThe 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_toThe period end the next accounts cover, from the register's accounts block. null on a dissolved company.
next_accounts_due_byThe due date the register prints for the next accounts, ISO. null on a dissolved company, which files nothing more.
last_accounts_made_up_toThe made-up-to date of the last filed accounts, ISO.
accounts_overduetrue 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_summaryThe accounts dates joined into one line, as the company page prints them.
confirmation_statement_next_dateThe date the next confirmation statement covers, from the register's confirmation block. null on a dissolved company.
confirmation_statement_due_byThe due date the register prints for the next confirmation statement, ISO. null on a dissolved company.
confirmation_statement_last_dateThe last confirmation statement's made-up-to date, ISO.
confirmation_statement_overduetrue 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.
officersThe 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.
pscsThe 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_addressThe address the search listing printed; filled only on rows found through a search.
search_queryThe 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.
sourceHow 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_chargestrue when the register's document for the company carries mortgage charges.
has_insolvency_historytrue when the register shows an insolvency marker or an insolvency status word.
officers_on_registerHow many officer appointments the register lists for the company. The same value as officers_count. Both names hold the same count.
resignations_on_registerHow 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_registerHow many PSC statements the register shows, including an exemption statement filed instead of a PSC list.
is_activetrue when the register's status for the company is Active; null where it shows no status.
officers_countThe 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_countOfficers 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_countOfficers 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_countActive officers whose role is a director role.
psc_countThe number of entries in this profile's pscs list; 0 when pscs is null.
sic_code_listThe SIC code strings alone, for filtering or joining. The same codes as sic_codes, without the descriptions.
lead_scoreA 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_historyWith 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.
chargesWith 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_statusThe 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_typeROW 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.
reasonStatus rows only: why the run returned no profiles, or why it stopped early.
rowsFetchedStatus rows only: how many rows the source produced before de-duplication and the cap.
rowsReturnedStatus 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.
rowsRemainingStatus 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 forEvents billedCost
100up to 100$0.32
1,000up to 1,000$3.20
10,000up 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?

  1. Open the Actor page and press Start. The input already carries a working query; there is no key and no login.
  2. 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

InputDefaultWhat it does
companyNumbersemptyCompany numbers such as 07109264 or SC005336; each is read once.
startUrlsemptyCompanies 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.
maxItemsnoneThe most rows one run returns; leave it unset for no cap.
maxCompaniesPerSearchQuerymaxItems, else 20The most companies one search query, or the filter search as a whole, may add to a run.
sicCodesemptyFive-digit SIC codes such as 56101, one per entry. Each code is searched on its own and the matches merged without repeats.
locationemptyText the registered office address must contain: a town such as Leeds or a postcode start such as EC2A.
companyStatusempty (any)One or more of active, dissolved, open, closed, converted-closed, removed, receivership, liquidation, administration, insolvency-proceedings, voluntary-arrangement.
companyTypesempty (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.
incorporatedFromemptyOnly companies incorporated on or after this date, YYYY-MM-DD.
incorporatedToemptyOnly companies incorporated on or before this date, YYYY-MM-DD.
dissolvedFromemptyOnly companies dissolved on or after this date, YYYY-MM-DD.
dissolvedToemptyOnly companies dissolved on or before this date, YYYY-MM-DD.
onlyNewfalseFilter search only: skip companies an earlier run with the same filters already returned.
includeFilingHistoryfalseAdd each company's latest filings as filing_history.
filingHistoryLimit5How many filings to add per company, 1 to 100.
includeChargesfalseAdd each company's charges as charges.
proxyConfigurationnoneSends 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 back not_found; an unusable entry bad_url; a run with no usable input bad_input. Never charged.
  • PROFILE_NOT_FOUND: the register answered and produced no company hits. One row, never charged, and reason says why.
  • STOPPED_EARLY: the charge limit ended the run. One row, never charged, carrying rowsReturned and rowsRemaining.

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_overdue and has_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_number or sic_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 pageUrl points 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_count and directors_count no 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 now null, 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; onlyNew for scheduled filter runs; optional filing_history and charges; new previous_names and dissolved_on fields. Officers no longer carry an occupation, because the register's officers page stopped showing one. Register codes such as transform.status.removed are 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_url row 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_query and listing_address are filled only on rows found through a search; a direct lookup has no query to echo and no listing to quote.
  • pscs is null whenever 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 in psc_statements_on_register; the tab lists nothing at all, as on a company that closed before PSCs were recorded, and psc_statements_on_register is 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_count and directors_count are 0. The officers in office at dissolution are still listed in officers, with no status and no resigned date.
  • accounts_overdue and confirmation_statement_overdue are null where the register shows no accounts or confirmation block; is_active is null where 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 maxItems caps the whole run.
  • The filter search reads at most 5,000 matches per SIC code. Narrow the filters to reach the rest.
  • onlyNew remembers 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 the companies-house-only-new store to start over.
  • Officers carry no occupation: the register's officers page no longer shows one.
  • previous_names comes from the register's company entry. Its from date 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:

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.