Every working day, a few thousand new companies are registered in the UK. For accountants, banks, insurers, web agencies and SaaS sales teams that list is gold: a company that was incorporated last week usually has no accountant, no website and no business bank account yet.
The good news: you don't need to buy that list. Companies House, the UK company register, offers it for free through an official API. Here's how to pull it yourself in about 20 lines of Python, plus a no-code option if you just want a CSV.
1. Get a free API key
- Create an account at the Companies House developer hub (
developer.company-information.service.gov.uk). - Create an application (choose Live).
- Create a REST API key. No domains or IPs needed.
The key is used as the username for HTTP Basic auth, with an empty password. The limit is 600 requests per 5 minutes, which is plenty.
2. Query the advanced search
The endpoint you want is /advanced-search/companies. It filters by incorporation date, SIC code (industry), status, company type and location, and returns up to 5,000 companies per request.
import csv from datetime import date, timedelta import requests API_KEY = "your-key-here" since = (date.today() - timedelta(days=7)).isoformat() params = [ ("incorporated_from", since), ("company_status", "active"), ("sic_codes", "62012"), # business and domestic software development ("sic_codes", "62020"), # IT consultancy ("location", "London"), ("size", 5000), ] r = requests.get( "https://api.company-information.service.gov.uk/advanced-search/companies", params=params, auth=(API_KEY, ""), timeout=30, ) r.raise_for_status() items = r.json().get("items", []) with open("new_companies.csv", "w", newline="", encoding="utf-8") as f: w = csv.writer(f) w.writerow(["number", "name", "incorporated", "sic", "town", "postcode"]) for c in items: a = c.get("registered_office_address", {}) w.writerow([c["company_number"], c["company_name"], c.get("date_of_creation"), " ".join(c.get("sic_codes", [])), a.get("locality"), a.get("postal_code")]) print(len(items), "companies saved") That's it: a fresh list of new London tech companies from the last 7 days.
3. Things that will trip you up
- Dormant shells. Filter out SIC
99999(dormant) and74990(non-trading). Otherwise a good chunk of your "leads" are holding companies that will never buy anything. - Formation-agent addresses. Many companies use the address of their formation agent or accountant as the registered office. The postcode is often not where the business actually operates.
- Filing deadlines are a sales signal. The company profile endpoint (
/company/{number}) returnsaccounts.next_dueandconfirmation_statement.next_due, including anoverdueflag. Overdue accounts are a strong signal for accountants. - Personal data. Directors' names come from the officers endpoint. Under UK GDPR, cold outreach to named individuals needs a legitimate-interest assessment. Company-level data is the safer starting point.
- Pagination.
sizegoes up to 5,000, andstart_indexlets you page. The search stops at 10,000 results per filter set, so narrow by date or SIC if you need more.
4. No-code option
If you don't want to maintain a script, I packaged the same logic as a ready-made tool on Apify: UK Companies House Search. It adds SIC descriptions, filing deadlines and overdue flags, and an "only new" mode for a daily lead feed. It deliberately leaves out directors and other personal data, and you pay per company returned. Ready-made examples like "New Tech Companies in London This Week" can be run as-is.
(Disclosure: I built it. The Python above works without it.)
Wrap-up
Companies House is one of the best free business datasets in Europe. With one API key and one endpoint, you get a daily, industry-filtered list of brand-new companies, without scraping and without buying lead lists.
What are you using new-company data for? I'm curious which industries people filter for.
Contains public sector information licensed under the Open Government Licence v3.0.