If you are building anything that touches European business data — onboarding, invoicing, KYB, fraud checks — you will eventually ask the same question I did: which countries can I actually get company data from, for free, without an account?
I could not find this written down anywhere, so I worked it out the hard way while building a supplier checker. Here it is.
The baseline: VIES
The European Commission runs VIES, which validates VAT numbers across all 27 member states plus Northern Ireland (XI). It is free, it needs no key, and it is the obvious starting point.
Two things about it are worth knowing before you build on it.
It answers one question: is this VAT number currently registered. It does not tell you the company is solvent, trading, or that it has not been struck off. A company in liquidation keeps a cleanly resolving VAT number for months, because deregistration and insolvency are run by different authorities on different timetables.
Name and address are returned for 25 of the 28 jurisdictions, not all of them. Germany and Spain confirm registration but publish no company name through VIES. I tested three valid numbers for each before accepting that. For those two, a yes/no is genuinely all you can honestly show.
Where you can go further, free
Ten countries publish enough through a national register to add something meaningful on top of VIES:
| Country | Free register | Reports company state | Reports VAT-active |
|---|---|---|---|
| Romania | yes | yes | yes |
| Poland | yes | — | yes |
| Slovenia | yes | — | yes |
| Estonia | yes | yes | — |
| France | yes | yes | — |
| Greece | yes | yes | — |
| Bulgaria | yes | yes | — |
| Latvia | yes | yes | — |
| Czechia | yes | — | — |
| Finland | yes | — | — |
Company state means the register tells you whether a business is inactive, in liquidation, bankrupt, insolvent, terminated or struck off. This is the valuable column, and only six countries have it.
VAT-active matters more than it sounds. VIES cannot distinguish "this is a real company that is not VAT-registered" from "this number belongs to nobody". Three registers can.
Note that Czechia and Finland are in the list but in neither of the other columns — they confirm a name and little else. Worth knowing before you design a feature around "the ten countries".
Where you cannot
No free company-data source I could find at all: Germany, Austria, Italy, Spain, Portugal, Lithuania, Luxembourg, Cyprus, Malta.
Behind an account, an API key or a payment: Hungary, Ireland, Belgium, Denmark, Croatia, Netherlands, Sweden.
Hungary deserves its own paragraph. It does return name and address through VIES, so it looks fine at first. What is missing is company state — and I found six separate official routes to it, every single one behind a CAPTCHA. That is not a technical problem you can engineer around. It is a policy decision, and the answer is no.
The UK, post-Brexit
Great Britain left VIES on 1 January 2021. GB VAT numbers now return invalid there, and HMRC's own VAT checking API requires an approved application. If you do not hold one, what you can do for free is verify the official check digit locally — which proves a number is impossible, never that it exists — and then link people to the free checker on GOV.UK.
Northern Ireland is a separate case: XI numbers go through VIES normally.
Poland is the outlier worth knowing about
Poland is the only EU member state where you can check whether a bank account belongs to a company.
The Ministry of Finance publishes the accounts that VAT-registered businesses have declared, on what is known as the white list. It exists because paying into an unlisted account has tax consequences for the payer, so there is a statutory reason for the data to be public and current.
Nowhere else in the EU can you do this from public data. Everywhere else, an IBAN tells you the country and the bank and absolutely nothing about who owns it.
Practical notes for anyone building this
-
Greece files VAT under
EL, notGR. Every ISO country code list will tell youGR. VIES wantsEL. This will cost you an afternoon if nobody warns you. - Northern Ireland is
XI. - Implement the check digits locally. They are published arithmetic, they work offline, and they work when a registry is down. I did 19 countries and it is one of the highest value-per-line things in the project — it catches a transposed digit instantly with no network call.
- Assume the registers will break. They change their markup without warning, and that is the real maintenance cost. It is also why I have not shipped an API: I would rather a scraper break for me than inside somebody else's production pipeline.
- VIES has downtime, disproportionately at weekends and quarter ends. National registers are a useful fallback for the ten countries above.
Why the gaps matter more than the coverage
The temptation when you build something like this is to present the ten countries as "European coverage" and let people assume the rest works too. It does not, and the honest version is more useful: sixteen of twenty-seven member states have no free route to company status at all.
If you are relying on this data for anything that matters, know which column your country is in.
I keep a running version of this against a free tool I maintain — a worked example is here if you want to see what the combined output looks like. Happy to answer questions about any specific register in the comments.
Top comments (0)