Building a UK company directors list for a whole industry looks easy until you try it: the free Companies House bulk download has SIC codes but no directors, and the API needs a separate officers call for every company. For the full API tutorial, see How to Use the Companies House API Without Writing the Plumbing. This guide covers one job: a spreadsheet of directors for every company in one SIC code and area, using the Companies House Scraper on Apify, with no code.
Only need one company? You don't need a tool. Open the company on GOV.UK Find and update company information and select "People" to see its directors.
Why the free bulk download isn't enough
- The bulk snapshot is company data only. The free monthly CSV of live companies includes SIC codes but no directors. See Companies House data products.
-
Officers come one company at a time. Directors live behind the API endpoint
/company/{company_number}/officers, one call per company. - Rate limits turn it into a chore. The API allows 600 requests per 5 minutes per key. At scale you handle pauses, retries and pagination.
So the job has two steps: search companies by SIC code with the advanced company search, then fetch officers for each result. The scraper does both in one run.
What you need
- A free Companies House API key. See getting a free Companies House API key
- An Apify account to run it and download results.
- Your SIC code or codes. These are five-digit SIC 2007 codes.
Find your SIC code: search the Companies House SIC 2007 list by keyword. For example, 62012 is "Business and domestic software development".
Step-by-step: export directors for one industry
- Open the Companies House Scraper, click Try for free and sign in. Paste your key into Companies House API key (
apiKey). It is stored as a secret and never logged. - In SIC codes (
sicCodes), add your code, for example62012. Clear the pre-filled Tesco company number so the run only uses your search. - In Registered office location (
location), enter a town, region or postcode fragment, for exampleManchesterfor the Greater Manchester area. It is a fuzzy match on the registered office address, not an exact town filter (see the FAQ). - In Company status (
companyStatus), chooseactiveso dissolved companies stay out. - Switch on Include officers (
includeOfficers). Leave Include persons with significant control (includePsc) off; ownership data is covered in the parent article. - Set Max companies (
maxItems) to cap how many companies are returned and charged. Start small to test, then raise it (1 to 10,000) for a full list. - Click Start. When the run finishes, open its dataset in the Storage tab and click Export. Choose CSV or JSON.
Sample input
This is the input of the live run that produced the record below, with the API key replaced by a placeholder:
{
"apiKey": "YOUR_COMPANIES_HOUSE_API_KEY",
"sicCodes": ["62012"],
"location": "Manchester",
"companyStatus": ["active"],
"includeOfficers": true,
"maxItems": 5
}
includePsc and onlyNew were left at their defaults (off). companyStatus takes a list, so ["active"] returns active companies only. Leave it empty for any status.
Need the full list?
maxItems5 keeps a test run cheap. RaisemaxItems(it accepts 1 to 10,000) to export every matching company.
What a director record looks like
This record comes from a live run on 17 October 2026 at 14:58 (UTC+8) using the input above (sicCodes ["62012"], location "Manchester", companyStatus ["active"], includeOfficers true, maxItems 5). It is truncated, and officers' personal fields (name, date of birth, nationality, residence, occupation, appointment ID) are removed. The street part of the registered office address is shortened; other shown values are unchanged.
{
"companyNumber": "06575832",
"companyName": "ZIMAL CONSULTING LTD",
"companyStatus": "active",
"companyType": "ltd",
"dateOfCreation": "2008-04-24",
"sicCodes": ["62012"],
"registeredOfficeAddressText": "Stockport, Greater Manchester, England",
"accountsNextDue": "2027-01-31",
"confirmationStatementNextDue": "2027-05-08",
"officers": [
{ "officerRole": "secretary", "appointedOn": "2022-05-01", "resignedOn": null },
{ "officerRole": "director", "appointedOn": "2016-05-01", "resignedOn": null },
{ "officerRole": "director", "appointedOn": "2008-04-24", "resignedOn": null },
{ "officerRole": "secretary", "appointedOn": "2008-04-24", "resignedOn": "2016-05-01" },
{ "officerRole": "secretary", "appointedOn": "2016-05-01", "resignedOn": "2022-05-01" },
{ "officerRole": "corporate-director", "appointedOn": "2008-04-24", "resignedOn": "2008-04-28" }
],
"officersActiveCount": 3,
"officersResignedCount": 3,
"companyUrl": "https://find-and-update.company-information.service.gov.uk/company/06575832",
"licence": "Contains public sector information licensed under the Open Government Licence v3.0.",
"fetchedAt": "2026-10-17T06:58:31Z"
}
Officers include secretaries, corporate directors and leavers. Of these 6 entries, 3 have resigned (two secretaries and the corporate director). The 3 active officers in officersActiveCount are 2 current directors and 1 current secretary. Tip: to get current directors only, keep rows where officerRole is director and resignedOn is empty. Review corporate-director rows separately.
Turning it into one row per director
The CSV export has one row per company. Apify flattens nested fields into numbered columns, for example sicCodes/0, registeredOfficeAddress/postalCode, officers/0/officerRole, officers/0/appointedOn, officers/0/resignedOn, then officers/1/... for the next officer. Each officer slot has 11 columns, including name, nationality and three for date of birth (dateOfBirth, dateOfBirth/month, dateOfBirth/year).
So the column count depends on the most officers and SIC codes any company in the batch has. The run above returned 5 companies and 101 columns, because one company has 6 officers (officers/0 to officers/5) and another has 4 SIC codes (sicCodes/0 to sicCodes/3). If you don't need these personal fields, delete the officers/N/dateOfBirth..., officers/N/nationality, officers/N/countryOfResidence and officers/N/appointmentId columns before you share the file.
For one row per director, use Power Query in Excel on the JSON export (expand the officers list into rows) or these lines of Python:
import pandas as pd
companies = pd.read_json("dataset.json", dtype={"companyNumber": str})
companies = companies[companies["officers"].map(lambda o: isinstance(o, list))]
rows = pd.json_normalize(companies.to_dict("records"), record_path="officers", meta=["companyNumber", "companyName"])
current = rows[(rows["officerRole"] == "director") & (rows["resignedOn"].isna())]
current.to_csv("current_directors.csv", index=False)
Use cases (and what's off limits)
- Due diligence: see who runs every competitor or acquisition target in a sector, with appointment dates.
- KYB and supplier vetting: check the directors of a supplier pool, how long they have been in post and who has resigned recently.
- Market mapping and research: map director networks in an industry by region.
- Off limits: cold email and other unsolicited marketing. Officer data is personal data under UK GDPR. The tool's own guidance says you are the controller, you need a lawful basis (for example KYB, AML or due diligence) and you must not use it for unsolicited marketing. UK GDPR and PECR apply to any direct marketing. Don't use this list to email, call or message directors. See the ICO's guidance on lawful basis. This is not legal advice.
Cost
- $0.003 per company
- +$0.001 per company with officers
Worked example: 200 companies with officers = 200 x $0.004 = $0.80.
FAQ
How do I get a list of directors for a UK company?
For one company, open its page on Find and update company information (GOV.UK) and select "People". For many companies, use the Companies House API's officers endpoint per company, or a tool that runs it for you in batch.
Can I download all UK company directors in one file?
Not from the free monthly bulk snapshot: it contains company details and SIC codes but not directors. Director data comes from the API, one company at a time.
How do I find directors of companies by SIC code?
Search companies by SIC code with the Companies House advanced search, then fetch each company's officers. The Companies House Scraper does both in one run when includeOfficers is on.
Is there a Companies House officers search across all companies?
GOV.UK searches officers by name only. For an industry, search by SIC code, then fetch officers.
Does the location filter match an exact town?
No. It is a fuzzy match on the registered office address, so Manchester covers the Greater Manchester area rather than one exact town. In our run, Manchester also returned companies in Altrincham, Salford and Stockport. Check registeredOfficeAddressText and remove rows outside your area.
Does the director list include home addresses or full dates of birth?
No. Home and correspondence addresses are not returned, and dates of birth show month and year only.
Can I use this list for cold email to directors?
No. Officer data is personal data under UK GDPR, and the tool's guidance rules out unsolicited marketing. Use it for research, due diligence and KYB; take legal advice for anything else.
How much does it cost?
$0.003 per company plus $0.001 per company for officers, so $4 per 1,000 companies with directors.
Do I need an API key?
Yes, a free Companies House API key for SIC and location searches. Only the built-in Tesco demo runs without one.
Get started
Recap: to build a UK company directors list for one industry, pick a SIC code and area, switch on officers, run, export, then filter to current directors. Use the list for due diligence, KYB or research, not outreach. Try the Companies House Scraper on Apify, and for keys, code examples and PSC data, read the full API tutorial.
Contains public sector information licensed under the Open Government Licence v3.0. Source: Companies House. The scraper uses the Companies House public data API and is independent; it is not endorsed by Companies House.
Top comments (0)