This is the whole method, written so you can actually follow it. The register is free and public. The filtering is a spreadsheet job. Two of the steps carry a real cost, one in money and one in hours, and this says plainly which two and what they come to, because a version that pretended it was all easy would waste your afternoon.
Winnowed sells finished lists. It would be easy to keep the method vague and let that look like magic. It is not magic, it is arithmetic and patience, and anyone who wants to do it themselves should be able to.
By step 5 you will have every number required to work out what your own time costs. That is how to decide whether to build it or buy it.
The register records what a company does, not who works there. Getting this step right is most of the work, and it is the cheapest place to change your mind.
| By | What it means | Use it when |
|---|---|---|
| Industry code | The 5-digit code a company declares for its trade | You know exactly which trades you want and need every company in them |
| Trade or industry name | Plain words ("plumbers", "care homes") matched to the codes behind them | You know the trade but not the codes. This is how most people start. |
| Company number | A specific list of companies you already have | You have a list of names and want the contact details filled in |
Every company on the register declares at least one 5-digit Standard Industrial Classification code (SIC code) describing its trade. It is how the government classifies what a business does. The full list is published by the Office for National Statistics and there are just over 700 codes in active use.
A company picks its own codes when it registers and can declare up to 4. Nobody checks them, so they are a good guide and not a guarantee.
A trade is often several codes, not one. "Accountants" looks like a single
category and is actually 3, and picking only the obvious one loses you 28% of the market.
⚠ Then do not add them up. A company may declare up to 4 trade codes,
and thousands of accountancy firms declare 2 of these 3. Adding the codes counts those firms
twice: 72,995 against 54,208 real companies, 34.7% too many. Count the company numbers and
deduplicate them: SELECT COUNT(DISTINCT CompanyNumber), not a sum of 3 counts.
We published the summed figure ourselves until 28 September 2026.
| Code | Description | Companies |
|---|---|---|
| 69201 | Accounting and auditing activities | 39,262 |
| 69202 | Bookkeeping activities | 22,247 |
| 69203 | Tax consultancy | 11,486 |
| Added up | ⚠ wrong: it counts a firm once per code | 72,995 |
| All 3, counted | What most people mean by "accountants" | 54,208 |
Two more worked examples, so you can see the shape:
| Code | Trade | Companies |
|---|---|---|
| 43220 | Plumbing, heat and air-conditioning installation | 47,075 |
| 45112 | Sale of used cars and light motor vehicles | 32,965 |
| 45200 | Maintenance and repair of motor vehicles | 54,591 |
You can target "used car dealers" because that is a thing a company is. You cannot target "marketing directors" or "companies with more than 10 staff" directly, because the register holds neither.
That does not make this useless to you. The register is still the fastest way to get a complete, current list of the companies worth approaching: every active business in your trade, in your area, with its website. Finding the right person inside those companies is a second job, usually done on a professional network, and it is far easier once you have a defensible list of which companies to bother with.
Count your market before you build anything. If it comes back at 40,000, the question becomes which 2,000. That is a decision about geography or size, not about data. If it comes back at 400, that is small enough to work through by phone.
Even then the count is worth having: you almost certainly cannot name all 400, and the ones you cannot name are the ones nobody else is calling either. Our free count does this in a few seconds: type a trade, get the number, no account needed.
The whole United Kingdom company register is published free, in full, once a month. Most people do not know this, and it is the single most useful fact in this guide.
It is here: download.companieshouse.gov.uk/en_output.html
Take the single-file version. It is a zipped CSV of roughly 2.6GB unpacked, about 5.7 million rows, and it contains every company currently on the register: active, dormant, in liquidation and proposed for strike off. Dissolved companies have been removed and are not in it. It is a complete snapshot, not a list of changes, so you never need to stitch months together.
| You get | You do not get |
|---|---|
| Company number and registered name | Any email address |
| Registered address, town and postcode | Any website |
| Up to 4 trade codes | Any phone number |
| Company status and type | Turnover, headcount or any trading detail |
| Incorporation date | Names of staff below director level |
The register tells you who exists. It never tells you how to reach them. Everything from step 4 onwards exists to close that gap, and it is the reason list-building is a job rather than a download.
The address on the register is where the company is registered, which for a large number of small companies is their accountant's office. It is not necessarily where they trade. Treat it as a rough geography, useful for "within 25 miles of here" and not much more.
A spreadsheet will not open 5.7 million rows. Here is how to do it without one, and it is about 10 minutes if you have never done it before.
SQLite comes preinstalled on macOS and most Linux systems and is a free download on Windows. From a terminal, in the folder with the unzipped CSV:
| Type this | What it does |
|---|---|
sqlite3 register.db | Creates an empty database and opens it |
.mode csv | Tells it the file is comma-separated |
.import BasicCompanyData.csv companies | Loads all 5.7 million rows into a table called companies. Takes a couple of minutes. |
The file has over 50 columns and you will use 6 of them. They are named exactly like this, dots included:
CompanyName: the registered nameCompanyNumber: the unique identifierCompanyStatus: Active, Dissolved, Liquidation and so onCompanyCategory: the company typeSICCode.SicText_1 through _4: the trade codes, as "69201 - Accounting and auditing activities"RegAddress.PostTown and RegAddress.PostCode: geography
The code columns are not codes. They hold the code and its description in
one string ("69201 - Accounting and auditing activities"), so match on the
start of the text rather than testing for equality.
CompanyStatus = 'Active' only.
Dissolved, liquidation and in-administration companies are all in the file and all a
waste of a send.99999, and across the trades above they are roughly 7 to 10% of each code.CompanyCategory.For the 3 accountancy codes, active companies only, no dormant, in Dorset:
SELECT CompanyName, CompanyNumber, "RegAddress.PostTown", "RegAddress.PostCode"
FROM companies
WHERE CompanyStatus = 'Active'
AND ("SICCode.SicText_1" LIKE '6920%' OR "SICCode.SicText_2" LIKE '6920%')
AND "SICCode.SicText_1" NOT LIKE '99999%'
AND CompanyCategory LIKE '%Private Limited%'
AND "RegAddress.PostCode" LIKE 'DT%';
Change 6920% for your own codes and DT% for your own postcode area.
To write the result to a file, type .mode csv then
.output mylist.csv before running it.
The register goes out of date while you are working on it. Measured across one 2-month gap on our own copy: 3.8% of in-scope companies had stopped being active (147,487 of them) and 3.3% were new. A list built on a file from March is a photograph of March. If you are going to reuse it, rebuild it at least quarterly.
This is the first of the 2 steps that stop being a spreadsheet job. There are 3 ways to do it and they differ by about a factor of a hundred in effort.
| Route | What it costs | Sensible up to |
|---|---|---|
| By hand | About 20 seconds a company, searching and pasting | ~200 companies |
| Build it | A day or so of code, then a few pounds per 2,000 in search fees | any size |
| Use a tool | Ours, or a competitor's | any size |
200 companies by hand is about an hour and there is nothing wrong with it. Below that number, stop reading this step and just do it.
The obvious move is to guess: take the registered name, strip "LIMITED", remove the
spaces, try .co.uk then .com. It is free and instant, and it works
less often than anyone expects.
| Trade | Guessing the domain from the name |
|---|---|
| Sale of used cars and light motor vehicles | 7.5% |
| Accounting and auditing activities | 13.3% |
Both figures are end-to-end (name in, working contactable website out), measured on
real cohorts. VANSTOCK NORTHWEST LIMITED trades at vanstocknw.co.uk,
and no rule working from the legal name arrives at that abbreviation.
A guesser that falls back to the first word of the name will hand you
london.com for LONDON & ESSEX CONTRACTORS LIMITED. That is not a miss, it
is a confident wrong answer, and it will sit in your list looking exactly like a
correct one.
Whatever you build needs an ownership check, because a domain that looks like the name is not proof. Ours accepts a website only when the site prints the company's registered number, its full registered name or its registered postcode. In a test of 500 companies across 10 trades in October 2026, accepting a domain that looked like the name, unless the site printed another company's number, gave 38 of them a wrong website; the ownership check gave 3, and 3 of the 83 websites it delivered were wrong.
Searching for the company by name plus town and reading the first page of results. It finds the sites guessing cannot, because it uses the same signal a human would. It is also the first thing in this process that costs money: a search API is roughly a seventh of a penny per company, so 2,000 companies is a couple of pounds.
The barrier is not the money. It is that this is one request per company, and you cannot do 2,000 of them in a spreadsheet.
Deciding whether a domain belongs to a company is the part a rule cannot do, and it is the part an assistant like Claude is good at. Paste in a batch of names with the candidate domains you found, and ask it to judge them. A prompt that works:
For each row below I have a UK registered company name, its town, and a website I found
by searching. Tell me for each whether the website belongs to that company.
Answer YES only if the site's own content confirms it: the trading name, the town, or
the trade all matching. Answer NO if it is a directory listing, a domain-for-sale page,
a different company with a similar name, or a national brand where I expected a local
business. Answer UNSURE if you cannot tell from the name alone.
Give me one line per row: the company number, then YES, NO or UNSURE, then 6 words of
reason. Do not guess, and do not fill in any website I have left blank.
It is not a database. Ask it for "a list of plumbers in Bristol" and you will get something plausible and partly invented, with real-looking addresses for companies that do not exist. Use it to judge data you already have, never to produce data you do not. The register is the source of truth; the assistant reads what you fetched.
This is the step that needs code. There is no spreadsheet formula and no reliable no-code tool for it at volume, and pretending otherwise would waste your weekend.
If you do not write code, there are exactly 3 sensible options: do it by hand for a few hundred companies, pay someone a day's rate to write the script once, or buy the finished file. Everything below is for the third of readers who will write it.
By hand is 30 to 40 seconds a company: open the site, find the contact page, copy the address. 200 companies is a couple of hours. 2,000 is a fortnight, which is where people stop.
robots.txt for the site, and stop if it disallows you.mailto: link and every string matching an email address.
In Python that is the requests library to fetch, BeautifulSoup to read
the page, and the built-in re module for the address pattern. All 3 are free.
It is roughly 80 lines, and the last of the 6 rules above is the one that matters most.
Pages carry addresses that are not the company's: the web designer's in the footer, a trade body's, an image library's. If the address domain does not match the site domain, it is not theirs. Skipping this one check is how homemade lists end up mailing web designers.
info@ and sales@ get read, usually by the person whose job it is to
read them. They are also a materially weaker personal-data case than a named
individual's address. Mark them, keep them, and prefer them.
Measured on a real run: 2,773 companies took 459.6 minutes end to end, with 8 workers running against different hosts and a 1-second-per-host limit. That is about 10 seconds a company, or about 360 companies an hour, and it does not get faster by adding workers, because the limit is politeness, not processing.
| List size | By hand | Running continuously |
|---|---|---|
| 200 companies | ~2 hours | about 33 minutes |
| 2,000 companies | ~2 weeks | about 5.5 hours |
| 10,000 companies | not realistic | about 28 hours, more than a day |
Most of the companies you started with will not have an email address you can actually use. They publish a contact form, a phone number, or nothing at all, or nothing on their site proves the site is theirs.
That is not a failure of method. That is what the register looks like. Anyone quoting you a 90% contactable rate is quoting you something that was not measured.
The file is yours now, and so is the legal duty for it. Not your supplier's, not your sending tool's. And buying the list from somebody else does not move it.
This is a plain-English summary of where the duty sits, not legal advice. If your list is large or your case is unusual, take advice. It is cheaper than the alternative.
jane.smith@firm.co.uk is a person. info@firm.co.uk is a weaker case,
but weaker is not none.Our full position (how the crawler behaves, what it stores, and what we think the duty is on both sides) is on the sources page and in our terms. We would rather you read it and disagree than not read it.
Every number required to decide is now in one place.
| Step | What it costs you |
|---|---|
| Finding your trade codes | An afternoon, once |
| Downloading the register | Free |
| Loading and filtering it | About 10 minutes, with the commands in step 3 |
| Finding the websites | A few pounds per 2,000, plus building the matcher |
| Fetching the contact details | about 5.5 hours per 2,000, about 28 for 10,000 |
| Staying inside the law | Yours either way. It does not transfer. |
Most people who read this far will not do it, and that is a reasonable decision rather than a lazy one. The method is not difficult, it is just long, and the long part is the part a computer has to sit through.
If you want to do it yourself, everything you need is above and we are glad to have helped. If you would rather have the finished file, that is what we sell, and you now know exactly what you would be paying for.
Part 2: Run the campaign covers the sending domain, deliverability, what the law requires of the message itself, sequencing, and the numbers worth watching.
Part 3: Make it worth replying to covers the 5 questions that decide whether anyone answers. A list is not the product. The offer is.