UK Companies House Scraper avatar

UK Companies House Scraper

Pricing

from $1.00 / 1,000 companies

Go to Apify Store
UK Companies House Scraper

UK Companies House Scraper

Stream the full UK Companies House data snapshot and filter 5M+ companies by SIC code, status, location, and incorporation date. Fast, free, server-side filtering at scale.

Pricing

from $1.00 / 1,000 companies

Rating

0.0

(0)

Developer

ParseBird

ParseBird

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

UK Companies House Scraper

UK Companies House Scraper streams the official Companies House free company data snapshot — 5 million+ UK companies — and filters it server-side by SIC code, company status, legal type, postcode, county, and incorporation date, so you never have to download or parse the raw 500 MB file yourself.

Filter the entire UK company register by up to ten criteria at once — SIC code prefix, SIC keyword, status, legal type, postcode/town/county/country, and incorporation date range — and get clean, structured JSON back in minutes.

Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor: Actor ID parsebird/uk-companies-house-scraper on Apify. Call it with the ApifyClient (from apify_client import ApifyClient; client = ApifyClient("<APIFY_TOKEN>"); run = client.actor("parsebird/uk-companies-house-scraper").call(run_input={"companyStatuses": ["Active"], "sicCodePrefixes": ["62", "63"], "postTowns": ["LONDON"], "maxResults": 5000}); items = client.dataset(run["defaultDatasetId"]).list_items().items) — key inputs are snapshotMonth (string, default latest), companyStatuses (array, default ["Active"]), companyCategories (array), sicCodePrefixes (array of strings, e.g. ["62","63"]), sicKeywords (array of strings), nameContains (string), postCodePrefixes/postTowns/counties/countries (arrays), incorporatedSince/incorporatedBefore (YYYY-MM-DD), and maxResults (integer, 0 = unlimited); each output record has companyName, companyNumber, status, category, incorporationDate, address, sicCodes, accounts, mortgages, previousNames, confirmationStatement, url, and apiUrl; API docs at https://apify.com/parsebird/uk-companies-house-scraper/api and a token at https://console.apify.com/settings/integrations.

What does UK Companies House Scraper do?

Companies House publishes a free bulk snapshot of every live UK company, but it's a single ~500 MB ZIP containing a ~2 GB CSV with 5 million+ rows — not something you can filter by hand, and the Companies House REST API only supports per-company lookups, so scanning a whole industry sector means one HTTP request per company.

This actor solves both problems. It streams the ZIP straight from Companies House, decompresses and parses the CSV on the fly, applies your filters row-by-row, and stops as soon as it has enough matches — so a narrow query (a SIC code plus a city) can finish in a couple of minutes without ever downloading the full snapshot.

  • 🔍 Filter by SIC code prefix or free-text keyword — industry classification down to the sub-code
  • 📍 Filter by postcode prefix, post town, county, or country — from a single postcode district to all of Scotland
  • 🏢 Filter by company status and legal type (Ltd, PLC, LLP, CIC, and 15+ others)
  • 📅 Filter by incorporation date range — find newly registered companies or long-established ones
  • 📛 Filter by company name substring
  • Stops early once maxResults is reached instead of always scanning the full register
  • 📊 Full company profiles: registered address, SIC codes, accounts and confirmation statement dates, mortgage/charge counts, and previous company names
  • 🔗 Direct links to each company's Companies House page and REST API endpoint
  • 📅 Runs on Apify's scheduler for recurring extracts, with full API access and export to JSON, CSV, or Excel

What data can you extract from Companies House?

FieldDescription
companyNameRegistered company name
companyNumberUnique Companies House registration number
statuse.g. Active, Liquidation, In Administration
categoryLegal type, e.g. Private Limited Company, Limited Liability Partnership
incorporationDateDate of incorporation (YYYY-MM-DD)
dissolutionDateDissolution date, if applicable
addressRegistered office address (line 1/2, post town, county, country, postcode)
sicCodesUp to 4 SIC industry classification codes with descriptions
accountsAccounts filing category, reference date, next/last due dates
returns / confirmationStatementAnnual return / confirmation statement due dates
mortgagesCounts of charges (total, outstanding, part-satisfied, satisfied)
previousNamesPrior company names with the date each change took effect
url / apiUrlDirect links to the public register page and the Companies House REST API

How to use UK Companies House Scraper

  1. Open the actor's Input tab on Apify.
  2. Choose your filters — for example, set SIC code prefixes to 62,63 for IT companies and Post towns to LONDON.
  3. Set Company status to Active (the default) to skip liquidated or dissolved-in-progress companies.
  4. Set Max results — start low (e.g. 1000) to preview matches before running an unlimited extraction.
  5. Click Start and watch the run log for scan progress.
  6. Open the Dataset tab and export your results as JSON, CSV, or Excel — or pull them via the Apify API.

Input parameters

ParameterTypeRequiredDefaultDescription
snapshotMonthstringNolatestSnapshot month, format YYYY-MM. Companies House only keeps the current month online; an unavailable month throws an error listing what's actually available.
companyStatusesarrayNo["Active"]Keep only these statuses. Empty = all statuses.
companyCategoriesarrayNo[]Keep only these legal types. Empty = all types.
sicCodePrefixesarrayNo[]OR-matched SIC code prefixes, e.g. ["62","63"].
sicKeywordsarrayNo[]OR-matched, case-insensitive substrings in SIC descriptions.
nameContainsstringNo""Case-insensitive substring match on company name.
postCodePrefixesarrayNo[]OR-matched UK postcode outward-code prefixes, e.g. ["EC","SW1"].
postTownsarrayNo[]Exact (case-insensitive) match on registered post town.
countiesarrayNo[]Substring match on registered county.
countriesarrayNo[]Substring match on registered country (ENGLAND, SCOTLAND, WALES, NORTHERN IRELAND).
incorporatedSincestringNo""Only companies incorporated on/after this date, YYYY-MM-DD.
incorporatedBeforestringNo""Only companies incorporated on/before this date, YYYY-MM-DD.
maxResultsintegerNo0Stop after this many matches. 0 = scan the full snapshot.
logEveryNRowsintegerNo100000How often to log scan progress.

All filters other than companyStatuses/companyCategories combine with AND logic; values within an array filter (e.g. multiple SIC prefixes) combine with OR logic.

Output example

{
"companyName": "ACME TECHNOLOGIES LIMITED",
"companyNumber": "12345678",
"status": "Active",
"category": "Private Limited Company",
"incorporationDate": "2020-06-01",
"dissolutionDate": null,
"address": {
"line1": "10 Fintech Square",
"line2": null,
"postTown": "LONDON",
"county": null,
"country": "UNITED KINGDOM",
"postCode": "EC2A 1AB"
},
"sicCodes": ["62012 - Business and domestic software development"],
"accounts": {
"referenceDay": "30",
"referenceMonth": "6",
"nextDueDate": "2025-03-31",
"lastMadeUpDate": "2024-06-30",
"category": "TOTAL EXEMPTION FULL"
},
"mortgages": { "numCharges": 0, "numOutstanding": 0, "numPartSatisfied": 0, "numSatisfied": 0 },
"previousNames": [],
"confirmationStatement": { "nextDueDate": "2026-06-14", "lastMadeUpDate": "2025-06-01" },
"url": "https://find-and-update.company-information.service.gov.uk/company/12345678",
"apiUrl": "https://api.company-information.service.gov.uk/company/12345678"
}

Use cases

  • Sales prospecting — pull every active company in a target industry (SIC prefix) and city for cold outreach or CRM import
  • Market sizing — count how many companies of a given legal type or sector exist in a region
  • New-business monitoring — filter by incorporatedSince to find recently registered companies before competitors reach them
  • Investor and compliance research — list all active PLCs, LLPs, or CICs nationwide
  • Data enrichment — cross-reference a list of company names or postcodes against the full register
  • Academic and journalistic research — analyze company formation and dissolution trends by sector or region

How it works

  1. Snapshot discovery — the actor reads the Companies House download index page and resolves the requested (or latest) BasicCompanyDataAsOneFile-YYYY-MM-DD.zip snapshot.
  2. Streaming download — the ZIP is streamed directly from Companies House; nothing is written to disk.
  3. Streaming decompression — the CSV inside is decompressed on the fly, in lockstep with the download, so the actor can start emitting matches before the ZIP has finished downloading.
  4. Row-by-row filtering — each row is tested against every active filter (status, category, SIC, name, postcode, town, county, country, incorporation date) as it's parsed.
  5. Batch dataset writes — matching rows are normalized and pushed to the Apify dataset in batches of 500.
  6. Early stop — once maxResults matches are saved, the actor closes the download immediately instead of scanning the remaining rows.

Because filtering happens while streaming, a narrow query (a SIC code plus a postcode prefix, for example) can finish in a couple of minutes. An unfiltered run has to scan and save every one of the 5 million+ rows on the register, which can take up to 20+ minutes and produce a multi-million-row dataset — start with a low maxResults to preview your filter first.

How much does it cost to scrape Companies House data?

This actor uses the Pay-Per-Event model — you're charged only for company records actually saved to your dataset, not for rows scanned.

EventPrice per eventPrice per 1,000
company-extractedfrom $0.001from $1.00

Pricing scales down with your Apify plan tier (Free, Bronze, Silver, Gold — see the actor's Pricing tab for exact tier rates). Pulling 5,000 active IT companies in London, for example, costs roughly $5–7 depending on your plan. Apify's platform usage credits apply on top of any plan you're already on.

Yes. Companies House publishes this data specifically as a free, open bulk data product under the Open Government Licence, intended for exactly this kind of bulk reuse. This actor reads only that public snapshot — no login, scraping of rendered pages, or bypassing of access controls is involved. For general web scraping legality, see Apify's guide on the legality of web scraping. Always comply with UK GDPR and your own applicable data protection obligations when using extracted data for marketing or outreach.

FAQ

How often does the snapshot update? Companies House republishes the full snapshot around the 1st of each month. This actor always resolves to whichever snapshot is currently live unless you set snapshotMonth.

Can I get dissolved companies? No — the Companies House bulk snapshot only contains companies still on the live register, so there's no "Dissolved" status to filter by. For a specific dissolved company's history, use the Companies House REST API directly.

Why is my run scanning millions of rows even with a low maxResults? The actor has to scan from the start of the file in company-name order, so a very narrow or rare filter combination (an obscure SIC code with rare status/location combinations) can require scanning further before finding enough matches. Broaden a filter or raise the log frequency to monitor progress.

Can I schedule recurring runs? Yes — use Apify's scheduler to re-run this actor daily, weekly, or monthly and catch newly incorporated companies automatically.

Can I access this via API? Yes — every run, dataset, and input is available through the Apify API and official client libraries for Python and JavaScript.

from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("parsebird/uk-companies-house-scraper").call(run_input={
"companyStatuses": ["Active"],
"sicCodePrefixes": ["62", "63"],
"postTowns": ["LONDON"],
"maxResults": 5000,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["companyName"], item["companyNumber"])
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<APIFY_TOKEN>' });
const run = await client.actor('parsebird/uk-companies-house-scraper').call({
companyStatuses: ['Active'],
sicCodePrefixes: ['62', '63'],
postTowns: ['LONDON'],
maxResults: 5000,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Found an issue or have a feature request? Use the actor's Issues tab on Apify — feedback shapes what gets built next.