The Companies House API gives you free access to every company on the UK register. Getting that data into a spreadsheet or pipeline is another job: authentication, pagination, rate limits and separate calls for officers and persons with significant control (PSC). This tutorial shows how to pull company profiles, with optional officers and PSC, into JSON or CSV using the Companies House Scraper on Apify, from the console or code. The data comes from the Companies House public data API under the Open Government Licence v3.0.
What the Companies House API gives you (and where it gets painful)
The REST API is free. You get an API key from the Companies House Developer Hub and send it with HTTP Basic authentication: the key is the username, the password is empty.
The friction starts with more than one company:
- Rate limit: 600 requests per 5-minute window per key (developer guidelines), then HTTP 429.
- Pagination: you loop over
start_indexyourself. - Separate endpoints: officers and PSC each need their own calls per company.
For a single UK company lookup, the free GOV.UK Find and update company information service is quickest. For whole-register dumps, use the free monthly bulk snapshot or the daily PSC snapshot. The scraper covers targeted lists in between.
What the Companies House Scraper does
Data you get per company
Company name, number, type, status, jurisdiction and incorporation date; registered office address; SIC codes; previous names; and accounts and confirmation statement due dates. Each record also has a Companies House link, the licence line and a fetchedAt timestamp.
Optional officers and PSC
Turn on includeOfficers and includePsc to attach officers and PSC to the same record. Both are off by default. Home and correspondence addresses are never returned, and birth dates are month and year only.
Built for reliability
- Stays under 600 requests per 5 minutes and retries automatically on 429.
- Your API key is a secret input, never written to logs, the dataset or key-value stores.
-
onlyNewskips companies already collected. TheSEEN-COMPANIESstore holds company numbers only. -
runStatsreports HTTP totals, the busiest 5-minute window, 429s and retries.
How to get a free Companies House API key
Searching by company name, company number or any filter requires your own free Companies House API key. Without a key, the only run that works is the built-in demo: company number 00445790 (Tesco PLC) with no other filters.
From the Companies House developer docs (How to create an application):
- Register a Companies House user account and sign in to the Developer Hub at developer.company-information.service.gov.uk.
- Create an application: add a name and description, choose a live application (test applications use the sandbox), and select 'Create'.
- Open the application and select 'Create new key'.
- Name the key, choose the API key client type (not a stream key or OAuth web client) and select 'Create'.
- Paste it into
apiKey. In code, use a placeholder likeYOUR_COMPANIES_HOUSE_API_KEYand load the real key from an environment variable or secret store.
Step-by-step: run it in the Apify console
- Open the Companies House Scraper page and click Try for free. Sign in to Apify.
- The Input tab is pre-filled with
00445790(Tesco PLC). Run it as-is to see a sample record (the only keyless run). - Paste your API key into apiKey.
- Choose how to search: add companyNumbers, companyNameKeywords, or filters (sicCodes, location, incorporatedFrom / incorporatedTo, companyStatus).
- Optional: switch on includeOfficers and/or includePsc (each +$0.001 per company).
- Set maxItems to cap records written and charged.
- Optional: tick onlyNew for recurring runs.
- Click Start, then open the dataset for your Companies House data export. Apify datasets export to JSON, CSV, XML, Excel, HTML table, RSS or JSONL. Pick CSV for Companies House to CSV spreadsheet imports.
- Optional: schedule it daily with
onlyNewto monitor new registrations.
A number lookup with both add-ons:
{ "apiKey": "YOUR_COMPANIES_HOUSE_API_KEY", "companyNameKeywords": [], "companyNumbers": ["00445790"], "sicCodes": [], "location": "", "companyStatus": [], "includeOfficers": true, "includePsc": true, "maxItems": 100, "onlyNew": false } companyStatus accepts any of: active, dissolved, liquidation, receivership, administration, voluntary-arrangement, converted-closed, insolvency-proceedings, registered, removed, closed, open. Leave it empty for any status. maxItems accepts 1 to 10,000 (default 100).
Step-by-step: run it via API (Python / JavaScript / cURL)
For a Companies House API Python workflow, use the Apify Python client. This lists London companies under SIC 47110 incorporated in H1 2026, with officers:
from apify_client import ApifyClient client = ApifyClient("YOUR_APIFY_TOKEN") run_input = { "apiKey": "YOUR_COMPANIES_HOUSE_API_KEY", "sicCodes": ["47110"], "location": "London", "incorporatedFrom": "2026-01-01", "incorporatedTo": "2026-06-30", "includeOfficers": True, "includePsc": False, "maxItems": 100, "onlyNew": False } run = client.actor("kingly_apple/companies-house-scraper").call(run_input=run_input) for item in client.dataset(run.default_dataset_id).iterate_items(): print(item) The JavaScript client works the same way. From a terminal, use the Apify CLI or cURL:
# Apify CLI echo '{"apiKey":"YOUR_COMPANIES_HOUSE_API_KEY","companyNumbers":["00445790"]}' \ | apify call kingly_apple/companies-house-scraper --silent --output-dataset # cURL (Apify API, returns the dataset items) curl -X POST "https://api.apify.com/v2/acts/kingly_apple~companies-house-scraper/run-sync-get-dataset-items" \ -H "Authorization: Bearer YOUR_APIFY_TOKEN" \ -H "Content-Type: application/json" \ -d '{"apiKey":"YOUR_COMPANIES_HOUSE_API_KEY","companyNumbers":["00445790"]}' The Actor page also shows an Apify MCP server config for AI agents.
Filtering: search by name, number, SIC code, location, date and status
- Name keywords alone use
/search/companies. Combined with other filters, they becomecompany_name_includeson advanced search. - Companies House advanced search by SIC code: SIC 2007 codes in
sicCodes, a town, region or postcode fragment inlocation, dates inincorporatedFrom/incorporatedTo. - Company numbers are normalised (spaces removed, uppercased, short numeric ones left-padded to 8 digits). Invalid ones are skipped.
- If
incorporatedFromis later thanincorporatedTo, the run fails before any request.
Sample output
From a live run of the Tesco demo on Apify (15 October 2026), trimmed, values unchanged. officers and psc are null because the demo skips the add-ons.
{ "companyNumber": "00445790", "companyName": "TESCO PLC", "companyStatus": "active", "companyType": "plc", "jurisdiction": "england-wales", "dateOfCreation": "1947-11-27", "sicCodes": ["47110"], "registeredOfficeAddressText": "Tesco House, Shire Park, Kestrel Way, Welwyn Garden City, United Kingdom, AL7 1GA", "previousCompanyNames": [ { "name": "TESCO STORES (HOLDINGS) PUBLIC LIMITED COMPANY", "effectiveFrom": "1981-12-14", "ceasedOn": "1983-08-25" }, { "name": "TESCO STORES (HOLDINGS) LIMITED", "effectiveFrom": "1947-11-27", "ceasedOn": "1981-12-14" } ], "accountsNextDue": "2027-08-26", "accountsLastMadeUpTo": "2026-02-28", "confirmationStatementNextDue": "2027-07-02", "confirmationStatementLastMadeUpTo": "2026-06-18", "companyUrl": "https://find-and-update.company-information.service.gov.uk/company/00445790", "officers": null, "psc": null, "source": "Companies House Public Data API", "licence": "Contains public sector information licensed under the Open Government Licence v3.0.", "fetchedAt": "2026-10-15T01:07:11Z" } With includeOfficers on, each officer entry has name, officerRole, appointedOn, resignedOn, nationality, occupation, countryOfResidence, dateOfBirth (month and year) and appointmentId. With includePsc on, each PSC entry has name, kind, naturesOfControl, notifiedOn, ceasedOn, nationality, countryOfResidence, dateOfBirth (month and year) and, for corporate PSCs, identification.
Use cases
- Lead generation (company-level): list companies by SIC code, location and incorporation date; schedule with
onlyNewfor a daily new company registrations UK list. Officer and PSC data must not be used for unsolicited marketing, and UK GDPR and PECR apply to outreach. - KYC / KYB / AML: get profile, officers and PSC in one call to check status and control. You determine your own lawful basis.
- Due diligence: batch-check numbers for status, overdue filings, previous names and controllers, and re-run on a schedule to refresh the data.
- Market research: list incorporations by sector, region and date.
Pricing
- $0.003 per company
- +$0.001 per company with officers
- +$0.001 per company with PSC
Failed lookups, 404s and duplicates are not charged.
Example calculation: 1,000 companies with officers and PSC = 1,000 x ($0.003 + $0.001 + $0.001) = $5.00.
Data licence and personal data
Contains public sector information licensed under the Open Government Licence v3.0. Source: Companies House. The scraper is independent and not endorsed by Companies House.
Officer and PSC details are personal data under UK GDPR. You are the data controller, need a lawful basis (KYB, AML, due diligence) and must not use it for unsolicited marketing. No home or correspondence addresses are returned; birth dates are month and year only. See the ICO guidance on lawful basis. This is not legal advice.
FAQ
Is the Companies House API free?
Yes, with a free key from the Developer Hub, rate-limited to 600 requests per 5 minutes. The scraper uses your own key and charges only per company returned.
How do I get a Companies House API key?
Register a Companies House account, sign in to the Developer Hub, create a live application, select 'Create new key' and choose the API key type. Paste it into apiKey, where it is stored as a secret and never logged.
Can I get directors and officers data from Companies House?
Yes. The Companies House officers API endpoint is /company/{company_number}/officers. The scraper adds officers when includeOfficers is on (+$0.001 per company), without addresses and with month/year birth dates.
What is PSC data?
"Persons with significant control": who owns or controls a UK company. Persons with significant control data is available per company via the API or as a free daily snapshot. The scraper attaches it when includePsc is on (+$0.001 per company).
How much does the Companies House Scraper cost?
$0.003 per company, plus $0.001 per company with officers and $0.001 per company with PSC. Failed lookups, 404s and duplicates are not charged.
Can I search Companies House by SIC code or location?
Yes. SIC codes, location, status and incorporation dates go to the advanced search endpoint, and you can add name keywords.
What is the Companies House API rate limit?
600 requests per 5 minutes per key, with HTTP 429 beyond that. The scraper stays under the Companies House API rate limit and retries on 429.
Is it legal to use Companies House officer and PSC data?
It is public, OGL v3.0 data, but officer and PSC details are personal data under UK GDPR. You need a lawful basis, and the tool's guidance rules out unsolicited marketing. This is not legal advice.
Get started
You get flexible filters, officers and PSC in one record, and no rate-limit, retry or pagination code to maintain. Try it on the Tesco PLC example, then add your own API key: Companies House Scraper on Apify.
Need French companies too? See France Company Search (SIRENE) on Apify.

