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

Get UK Companies House profiles with officers, PSCs, charge counts and accounts category in one row from the live register, for $0.0032 a company. Look up by company number, register URL or name, or filter by SIC code, location, status, dates and company name. No login, no API key.

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

8

Total users

8

Monthly active users

3 days ago

Last modified

Share

What does UK Companies House Scraper do?

UK Companies House Scraper reads the live UK Companies House register and returns one detailed row per company. Each row carries the company's officers, persons with significant control, charge counts and accounts category. Its number, status, registered office, SIC codes and filing dates ride beside them.

You give it company numbers, register URLs, your file of numbers, search terms or a register filter. The profiles land in your dataset as they are read. You pay $3.20 per 1,000 companies; a company it cannot find costs you nothing, and its row says why.

Your first run, one company and one trade:

{
"companyNumbers": ["07109264"],
"searchQueries": ["green energy"],
"onlyNew": false,
"includeFilingHistory": false,
"filingHistoryLimit": 5,
"includeCharges": false
}

Who uses UK Companies House Scraper

WhoWhat they run it for
Sales and growth teamsA prospect list of UK companies by trade, town and filing dates.
Onboarding and complianceA counterparty's live status, officers and PSCs for your KYC file.
Credit and risk analystsAccounts dates, overdue flags and charge counts at list scale.
Investigators and data teamsStructured register profiles, deduplicated on the register page.

Features

  • Officers, PSCs, charge counts and accounts category in one row. Every profile counts the company's charges, names the kind of accounts it last filed, and lists its officers and persons with significant control.
  • Five ways in: company numbers, your file of numbers (CSV, text or Google Sheet, the column found for you), register page or search URLs, or register search terms.
  • Full profiles from a filter. Set SIC code, location, status, type or dates; every match returns the same complete profile a looked-up company gets.
  • A verdict on every entry: a number the register does not know or a link off its host is answered on a row showing what you gave it and why.
  • The run's memory stores company numbers alone, so a daily run returns just the companies your earlier runs have not returned.
  • A diff on your own output. Compare with a previous run and each profile says whether it is new, unchanged or changed, naming the register fields that moved.
  • Two switches add the latest filings and the charge list; each officer and PSC entry carries the register's identity-verification status.
  • A run reads at most 5,000 companies, one page at a time inside the limits Companies House publishes.

Why this one

UK Companies House ScraperMost-used alternative
Rows returned20, on the number plus the search term1, on the same number alone
Officer entriesnine appointments, each with name, role and datesone row, those fields empty
Officer identity verificationcarriedempty
Charges and accountscounts and a categorya flag
Price per 1,000 profiles$3.20$4.00
Run memorythe platform default1,024 MB

The most-used alternative on this platform ran company number 07109264 on 2026-09-26 and returned 1 row. This Actor's example run, that number plus the search term in the quick start, returned 20 rows.

  • Every entry on the test list resolved. A separate run over a list of 148 UK companies resolved every one into a profile, billed once each.

What data does UK Companies House Scraper return?

One profile per company, written to your dataset as the run goes. A data row carries 58 fields; rows that carry news about the run or an entry sit beside it with a reason instead. Part of a real row from a live run; the full row sits under Output below:

{
"company_name": "GREEN ENERGY LIMITED",
"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",
"officers_on_register": 9,
"psc_count": 1,
"has_charges": false,
"is_active": true,
"lead_score": 20,
"row_type": "ROW"
}

The fields it carries:

FieldWhat it carries
Identitycompany_name, company_number, company_status (e.g. Active), company_type, entry_type (company on a profile), pageUrl (the page read from, the dedup key).
registered_office_addressThe registered office as the register prints it, one line.
Dates and namesincorporated_on (ISO YYYY-MM-DD), dissolved_on (null while live), previous_names with the dates each was used.
sic_codesThe filed SIC codes with their descriptions; a company on the older list carries a four-digit code. sic_code_list carries the code strings alone, for filtering or joining.
Accounts datesnext_accounts_made_up_to, next_accounts_due_by, last_accounts_made_up_to, accounts_overdue, accounts_summary; null on a dissolved company.
Accounts detailaccounts_category, such as MICRO or DORMANT, and accounting_reference_date as DD-MM.
Confirmation datesconfirmation_statement_next_date, confirmation_statement_due_by, confirmation_statement_last_date, confirmation_statement_overdue.
officersOfficer appointments: name, role, status, dates, nationality, country_of_residence, date_of_birth, correspondence_address, identity fields.
pscsPSC entries: name, kind, status, dates, natures_of_control, identity fields and a corporate PSC's registered details.
Search provenancelisting_address and search_query on search-found rows; source reads url, company_number, search or advanced_search.
has_chargestrue when the register's document carries mortgage charges; has_insolvency_history flags insolvency.
Officer countsofficers_on_register, resignations_on_register, active_officers_count, directors_count; also shipped as officers_count, resigned_officers_count.
PSC countspsc_count and psc_statements_on_register, including an exemption statement.
is_activetrue when the register's status is Active; is_dormant marks a dormant company.
lead_scoreA 0-100 rollup of the register's own signals; a dormant or non-trading company scores at most 20.
filing_historyWith the switch on: the latest filings, newest first, each date, type and description; null when off.
chargesWith the switch on: each charge's charge_code, dates, status, satisfied_on, persons_entitled; null when off.
Charge countscharges_total, charges_outstanding, charges_satisfied, charges_part_satisfied; 0 when none.
Address partspostcode, post_town, county, address_country, as the register prints them.
Identity countsofficers_identity_verified_count, officers_identity_overdue_count, psc_identity_overdue_count, serving people only.
row_statusThe row's verdict: ok on a profile; the miss verdict on an ITEM_STATUS row.
row_statenew, unchanged or changed with Compare set, null otherwise; changed_fields names the moved fields.
row_typeROW on a profile; ITEM_STATUS, PROFILE_NOT_FOUND or STOPPED_EARLY on a run row.
Status-row extrasreason, rowsFetched, rowsReturned, rowsRemaining, on status rows only.

An empty cell means the register does not publish that value for that company, so every row keeps the same shape. The listing address and the search query stay empty unless the company came through a search.

How much does it cost?

$3.20 per 1,000 companies. Each resolved profile is billed once, after its row is written to your dataset. Miss rows and dropped duplicates are never billed.

Companies you ask forProfiles billedCost
100up to 100$0.32
1,000up to 1,000$3.20
10,000 (over two runs; one run reads at most 5,000)up to 10,000$32.00

Filing history and charges add detail to a profile at the same single charge; they make each profile take a little longer to read. The platform meters the run as two events: profile-returned at $0.0032 a profile, billed after the row is written, and apify-actor-start at $0.00005 once a run at the default memory, which is all this Actor asks for. On a paid Apify plan each profile drops: $0.00269 on BRONZE, $0.00218 on SILVER and $0.00173 on GOLD, PLATINUM or DIAMOND.

How do I use UK Companies House Scraper?

  1. Press Start. The input already carries a working company number and search term; you need neither a key nor a login.
  2. Or give it your own. Company numbers, register page or search URLs, a link to your file of numbers, search terms, or a register filter.
  3. Profiles land in your dataset as they are read. Export them as JSON, CSV or Excel, pull them through the API, or wire the run to Make, Zapier or a webhook.

Worked examples

Use it to build a prospect list of new companies in one trade and town. 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 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
}

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
companyNumbers["07109264"]Company numbers such as 07109264, one per entry; a number missing its leading zeros reads in full.
companyNumbersFileUrlemptyA link to your CSV or text file of numbers, or a Google Sheet shared by link. One file up to 5 MB.
startUrlsemptyCompany page URLs or /search?q= results URLs; officer and appointment pages come back unbilled. A linked text file of numbers reads like the file input.
searchQueries["green energy"]Terms for the register's own search; each company hit resolves to a full profile.
maxItemsnone (5,000)The most rows a run returns, up to 5,000.
maxCompaniesPerSearchQuerymaxItems, else 20The most companies one query adds, up to 5,000.
sicCodesemptyFive-digit SIC codes; each is searched alone and the matches merge without repeats.
locationemptyText the registered office must contain: a town or a postcode start.
companyNameIncludesemptyKeep companies whose name carries every word; whole words, any case.
companyNameExcludesemptyLeave out companies whose name carries any of these words.
companyStatusempty (any)One or more register statuses, such as active or dissolved.
companyTypesempty (any)One or more register types, such as ltd, plc or llp.
incorporatedFromemptyOnly companies incorporated on or after this date, YYYY-MM-DD.
incorporatedToemptyOnly companies incorporated on or before this date.
dissolvedFromemptyOnly companies dissolved on or after this date.
dissolvedToemptyOnly companies dissolved on or before this date.
onlyNewfalseFilter search only: skip companies an earlier run with the same filters returned.
prevDatasetIdemptyAn earlier run's dataset id or URL: each profile says if it is new, unchanged or changed.
includeFilingHistoryfalseAdd the company's latest filings to the profile.
filingHistoryLimit5How many latest filings to add, 1 to 100.
includeChargesfalseAdd the company's charges to the profile.
proxyConfigurationnoneOne Apify proxy session for the run's register reads.

Company numbers from a file

Give the run a link to your CSV, text file or shared Google Sheet. It reads the numbers column for you, and a number that lost its leading zeros reads in full. A file of numbers linked under Start URLs reads the same way. A private file, or a link that answers with a web page, comes back as a row saying why.

Search queries and filters

Each query runs through the register's own search and its company hits resolve in order (officer hits are skipped). Any filter switches the run to the register's advanced search, reading a full profile per match. Filters combine; each SIC code searches on its own, and name filters match whole words in any case. A value the register cannot take stops the run at the start, naming it, before anything is read or billed. One query adds at most the per-query cap, or 20 companies with no bound set.

Only new since the last run

For a scheduled filter search: the run remembers the numbers it returned for this exact filter set and skips them next time. The saved numbers live in a named key-value store on your Apify account. Changing any filter starts a new memory, and clearing the store starts it over.

Compare with a previous run

Give a run the dataset id of an earlier one. Each profile then says whether it is new, unchanged or changed, and the changed-fields list names what moved. It reads your stored rows alone, adds nothing to the bill, and works on lookups and searches alike. A dataset the run cannot read stops it with the reason rather than treating every row as new.

Proxy

Optional: one Apify proxy session for the whole run. A place to read from, not a way past a refusal: a refused read stops the run whatever the proxy.

Output

Data rows come first; rows that carry news about the run or an entry follow. Every row says which it is:

row_typeWhat the row isBilled
ROWA resolved company profileonce, after the row is written
ITEM_STATUSAn entry with no profile, the verdict on the row (not_found, bad_url, bad_input, blocked, fetch_failed, removed, duplicate, not_reached)$0
PROFILE_NOT_FOUNDThe register answered and nothing matched$0
STOPPED_EARLYYour spending limit ended the run; the row says what came back and what was left$0

A run that finds nothing writes one PROFILE_NOT_FOUND row. Every run also writes a summary to the default key-value store: rows fetched, written, billed and dropped. A short run reads differently from a broken one.

A full data row from a live run:

{
"company_name": "GREEN ENERGY AND EPC SERVICES LTD",
"pageUrl": "https://find-and-update.company-information.service.gov.uk/company/13030942",
"entry_type": "company",
"company_number": "13030942",
"company_status": "Active",
"company_type": "Private Limited Company",
"registered_office_address": "123B BARKBY ROAD, LEICESTER, ENGLAND, LE4 9LG",
"incorporated_on": "2020-11-19",
"dissolved_on": null,
"previous_names": null,
"sic_codes": [
{
"code": "41202",
"description": "Construction of domestic buildings"
},
{
"code": "43220",
"description": "Plumbing, heat and air-conditioning installation"
},
{
"code": "43390",
"description": "Other building completion and finishing"
},
{
"code": "74901",
"description": "Environmental consulting activities"
}
],
"next_accounts_made_up_to": "2026-11-30",
"next_accounts_due_by": "2027-08-31",
"last_accounts_made_up_to": "2025-11-30",
"accounts_overdue": false,
"accounts_summary": "Accounts: next accounts made up to 2026-11-30 due by 2027-08-31; last accounts made up to 2025-11-30",
"confirmation_statement_next_date": "2027-09-19",
"confirmation_statement_due_by": "2027-10-03",
"confirmation_statement_last_date": "2026-09-19",
"confirmation_statement_overdue": false,
"officers": [
{
"name": "TABASSUM, Waqas Ali",
"role": "Director",
"status": "Active",
"appointed_on": "2020-11-19",
"resigned_on": null,
"nationality": "Pakistani",
"country_of_residence": "England",
"date_of_birth": "December 1985",
"correspondence_address": "123b, Barkby Road, Leicester, England, LE4 9LG",
"identity_verification_status": "verified",
"identity_verification_overdue": null,
"identity_verification_as_of": null,
"identity_verification_due_from": null,
"identity_verification_due_by": null
}
],
"pscs": [
{
"name": "Waqas Ali Tabassum",
"kind": "individual",
"status": "Active",
"notified_on": "2020-11-19",
"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": "December 1985",
"nationality": "Pakistani",
"country_of_residence": "England",
"correspondence_address": "123b, Barkby Road, Leicester, England, LE4 9LG",
"legal_form": null,
"governing_law": null,
"place_registered": null,
"registration_number": null,
"incorporated_in": null,
"identity_verification_status": "verified",
"identity_verification_overdue": null,
"identity_verification_as_of": null,
"identity_verification_due_from": null,
"identity_verification_due_by": null
}
],
"listing_address": "123b, Barkby Road, Leicester, England, LE4 9LG",
"search_query": "green energy",
"source": "search",
"has_charges": false,
"has_insolvency_history": false,
"officers_on_register": 1,
"resignations_on_register": 0,
"psc_statements_on_register": 0,
"is_active": true,
"officers_count": 1,
"active_officers_count": 1,
"resigned_officers_count": 0,
"directors_count": 1,
"psc_count": 1,
"sic_code_list": [
"41202",
"43220",
"43390",
"74901"
],
"filing_history": null,
"charges": null,
"row_status": "ok",
"lead_score": 100,
"charges_total": 0,
"charges_outstanding": 0,
"charges_satisfied": 0,
"charges_part_satisfied": 0,
"accounts_category": "MICRO",
"accounting_reference_date": "30-11",
"is_dormant": false,
"postcode": "LE4 9LG",
"post_town": "LEICESTER",
"county": null,
"address_country": "ENGLAND",
"officers_identity_verified_count": 1,
"officers_identity_overdue_count": 0,
"psc_identity_overdue_count": 0,
"changed_fields": null,
"row_state": null,
"row_type": "ROW"
}

Use UK Companies House Scraper with AI agents

An MCP-capable client can register this Actor with claude mcp add --transport http apify "https://mcp.apify.com?tools=Pradio/companies-house". Your agent can then read the input, start runs and pull your dataset on its own.

Personal data

Some rows name people, so the categories of personal data a row can carry are the officer and PSC entries Companies House publishes for inspection under the Companies Act 2006: a name, role with status and dates, nationality, country of residence, month and year of birth and the filed service address. Each entry adds the register's identity-verification status and due dates (identity_verification_as_of, identity_verification_overdue), and a person still in place is past the register's identity verification due date as of identity_verification_as_of when identity_verification_overdue reads true. A PSC entry adds its natures of control; a corporate PSC adds its registered details. The day of birth and the usual residential address are never returned; the register withholds both, and nothing is filled in from anywhere else. With charges on, a persons-entitled entry names the lender or trustee the register lists, usually a bank or company, occasionally a private individual.

  • Register facts only. Rows carry structured register fields; filed documents, accounts text and document images stay on the register. A filing-history entry carries only the filing's date, form type and the register's own description.
  • Companies, not people. Only company pages and company search hits are read. Officer searches, a person's appointments and the disqualified-officer register stay out of every run.
  • Every row shows its source. Each profile links back to the register page it was read from.
  • Controller and contact. The publisher is the controller for the rows a run returns; contact runs through this Actor's Issues tab. For rows you export you are a controller in your own right: you need a lawful basis, and where the law asks it you tell the people concerned. If you contact them, the electronic marketing rules apply to you.
  • Correction and removal. A person named in a row can ask for correction or removal through the same Issues tab, though the request needs the company number and role, not a name or address. The publisher's removal list ships with the Actor and every run reads it first: a listed person stays off later rows, and a company that asks is left unread entirely (a removed row naming only its number). Rows you already exported stay under your own control. Companies House also runs its own protection process for the register itself.
  • Reuse credit. 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 stay unreproduced.

Limits

  • It reads the UK Companies House register. A URL pasted from another host is written up as a bad_url row naming what you gave.
  • One profile per company, and a run reads at most 5,000 companies. Reads run one page at a time with a pause between, so a large run takes a while. For the whole register or a large slice, use Companies House's free bulk data products or its API rather than repeated runs.
  • A refused read stops the run at once and is never retried, through a proxy session or otherwise. A proxy changes where a read comes from, never whether the register answers it. The profiles read before the refusal are already in your dataset: wait, then re-run the rest with a smaller list.
  • A company read that fails mid-run costs only that company. A fetch_failed row names the number and the failure while the rest read on. You can re-run the named numbers.
  • An empty PSC list is the register's own answer: an exemption filed instead (counted on the row), nothing listed, or no PSC page. On a dissolved company no officer is tagged as serving, so serving counts read 0 and next-due dates stay empty.
  • A live overseas entity or UK establishment reads Registered rather than Active, so is_active is false while the company still trades. Identity-verification fields repeat what the register prints; they stay empty on most resigned appointments and corporate officers.
  • Officer and appointment pages stay out of every read. Given as a start URL or a file line, one comes back a miss row naming it.

Troubleshooting

One row says nothing matched. The register answered with zero hits. That is the register's answer, not a fault. Check the term's spelling, or try the register's own search with it.

A company came back as a failed read. That company's pages failed mid-run. The fetch_failed row names its number, the rest read on, and you can re-run the named numbers.

The run failed before reading anything. A filter value the register cannot take stops it at the start. That is a four-digit SIC code, a wrongly shaped date or an unknown status. Fix the value the log names and start again.

A scheduled only-new run returned nothing. Every match for those filters was already returned by an earlier run. Nothing new is the honest result there. Clear the only-new store to start over.

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

FAQ

What do misses and duplicates cost? Nothing. Say a search lists 50 company hits and three of them name companies another entry already gave. The run writes 47 profiles and bills 47; each repeat comes back a duplicate row naming the company it matched. Every miss is a free row that says why.

Can I feed it a spreadsheet? Yes. Share the sheet by link, or export it as CSV hosted anywhere a link can reach. Then give the run the link under Company numbers from a file. The numbers column is found for you, and a number that lost its leading zeros reads in full.

Can I use it through integrations, the API or an MCP server? Yes to all three. The dataset plugs into Make, Zapier and webhooks and runs on a schedule. The curl line under "How do I use" is a working API call, and the MCP command under the AI agents heading registers it as a tool.

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. It reads one page at a time inside the register's published limits and returns structured fields. A refused read stops the run; it is never pushed past. For the people named in rows, see Personal data above, and for bulk copies use Companies House's free bulk data products. You are responsible for having the right to read the pages you give it, and for how you use the rows.

How fresh is the data? Each run reads the register's live pages, so a profile is as fresh as Companies House itself at that moment. The register updates as companies file. To see what moved between two runs of yours, the compare mode marks every row new, unchanged or changed and names the fields that moved.

Do I need an account or login? No. The register's company pages are public and the Actor reads those, not the API. You need an Apify account to run it, nothing on Companies House itself: no account there, no API key, no sign in.

Feedback

A problem or a missing field goes to this Actor's Issues tab on the Apify Store, answered within two days. If it saved you time, a review on the Store helps other buyers find it.

Release notes

  • 2026-09-30: each profile can be compared with your earlier dataset and says whether it is new, unchanged or changed, naming the register fields that moved. A company whose own read fails mid-run now returns a fetch_failed row while the rest read on.
  • 2026-09-28: a removal list read before every run. Your file of company numbers is read from CSV, text or a shared Google Sheet, and leading zeros are restored. Corporate PSCs carry their registered details, officers and PSCs carry identity-verification status and due dates, and every run reads at most 5,000 companies.
  • 2026-09-24: filter search by SIC code, location, status, type and dates; only-new for scheduled runs; optional filings and charges; previous names and the dissolved date.
  • 0.1, 2026-09-20: first release.

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.