How to find a company’s VAT and registration number from its name or website
There is no single EU database that maps a company name or website to its VAT and registry numbers; the free routes are national registers, the legal notice on the company’s own site and open identifier data such as GLEIF. Source: Arcadium Data, data as of .
People search for "VAT number lookup by company name" and "company registration number from website" because the two most obvious tools do not do it. VIES checks a VAT number you already have and cannot search by name. A national register searches by name but only in its own country, and each has its own API, id format and licence. The result is a stack of small integrations before the first answer.
This guide lists the routes that work, in the order we would try them, with the traps (identifier formats, groups of companies, sole traders) that make a lookup return the wrong entity.
The official routes
1. Read the company's own legal notice
EU law makes the company publish its identity. Article 5 of the e-Commerce Directive (2000/31/EC) requires online service providers to make their registration details and VAT number easily and permanently accessible. In practice that is the footer, the "Impressum" (Germany, Austria, Switzerland), "mentions légales" (France), "legal notice" or "terms" page. The number is on the site; extracting it is a scraping job: fetch the page linked from the footer, match the identifier shapes of the country, and validate the checksum before you trust it.
2. Ask the national register (name to id)
Several registers answer anonymously over HTTP. These are the ones we use:
| Country | Register | Lookup | Id returned |
|---|---|---|---|
| Norway | Brønnøysund Enhetsregisteret | https://data.brreg.no/enhetsregisteret/api/enheter?navn=... | 9-digit organisasjonsnummer; VAT is NO + number + MVA |
| France | recherche-entreprises (annuaire des entreprises) | https://recherche-entreprises.api.gouv.fr/search?q=... | 9-digit SIREN; FR VAT is derived from it |
| Finland | PRH / YTJ open data | https://avoindata.prh.fi/opendata-ytj-api/v3/companies?businessId=... (the same endpoint takes search parameters; see its docs) | Y-tunnus (7 digits, dash, check digit) |
| Czech Republic | ARES | https://ares.gov.cz/ekonomicke-subjekty-v-be/rest/ekonomicke-subjekty/{ico} | 8-digit IČO |
| Great Britain | Companies House | REST API needs a free key; monthly bulk snapshot needs none | 8-character company number |
| Germany | Handelsregister | Free web search, no API, no bulk; automated use is restricted by its terms | HRB/HRA plus court |
Check each register's terms and licence before you build on it; the Norwegian register publishes under NLOD 2.0, the UK Companies House data products under the Open Government Licence v3.0. The European e-Justice portal also offers a cross-border "find a company" search over the connected national registers, as a web page rather than a bulk API.
curl
# Norway: search by name, returns organisasjonsnummer, legal form, status
curl -s "https://data.brreg.no/enhetsregisteret/api/enheter?navn=Equinor&size=3"
# France: SIREN search by name
curl -s "https://recherche-entreprises.api.gouv.fr/search?q=Michelin&per_page=3"
Python
import requests
def norway_by_name(name: str):
r = requests.get(
"https://data.brreg.no/enhetsregisteret/api/enheter",
params={"navn": name, "size": 5},
timeout=30,
)
r.raise_for_status()
for e in r.json().get("_embedded", {}).get("enheter", []):
yield e["organisasjonsnummer"], e["navn"], e.get("organisasjonsform", {}).get("kode")
def siren_ok(siren: str) -> bool:
"""Luhn check of a French SIREN (9 digits)."""
if len(siren) != 9 or not siren.isdigit():
return False
total = 0
for i, ch in enumerate(reversed(siren)):
d = int(ch)
if i % 2 == 1:
d *= 2
if d > 9:
d -= 9
total += d
return total % 10 == 0
print(list(norway_by_name("Equinor")))
print(siren_ok("542051180"))
TypeScript
export const sirenOk = (siren: string): boolean => {
if (!/^\d{9}$/.test(siren)) return false;
let total = 0;
[...siren].reverse().forEach((ch, i) => {
let d = Number(ch);
if (i % 2 === 1) {
d *= 2;
if (d > 9) d -= 9;
}
total += d;
});
return total % 10 === 0;
};
const res = await fetch('https://data.brreg.no/enhetsregisteret/api/enheter?navn=Equinor&size=3');
const { _embedded } = (await res.json()) as { _embedded?: { enheter: { organisasjonsnummer: string; navn: string }[] } };
console.log(_embedded?.enheter.map((e) => e.organisasjonsnummer + ' ' + e.navn));
3. Cross-check with open identifier data
GLEIF publishes the Legal Entity Identifier of every registered entity with its national registration number (registeredAs) under CC0; Wikidata carries registry ids, VAT numbers and websites for notable companies. Both are good for large companies and thin for small ones. The LEI guide shows the GLEIF calls.
Traps that return the wrong company
- VAT number and registry id are different things. In Norway the VAT number is the organisation number plus
MVA; in France it adds two check characters to the SIREN; in Italy the partita IVA usually equals the codice fiscale of a company; in Germany there is no relation between the VAT number and the HRB number. - Groups. A group has one website and many legal entities. A domain-to-id lookup must say which entity (the parent, or the one named in the legal notice) and how sure it is.
- Same name, different company. Names repeat across countries and inside one. Always search with the country, and prefer an exact legal-name match.
- Sole traders. Their registration number is personal data. Registers differ in what they publish; leave natural persons out of any dataset you build.
- Stale numbers. A company that dissolved keeps its number in old pages. Check the status in the register before using the id.
The fast route: GET /v1/companies/resolve
The resolve route connects the identifiers we hold: ids read from the company's own legal notice, Wikidata, GLEIF and the national registers (Norway, Finland, France). Send exactly one of domain, name with country, or id (a registry id, a VAT number with its prefix, or an LEI). Every id comes with the sources that showed it, a confidence from 0 to 1 and the time it was last seen, so you can choose your own threshold.
Calls on this page work without a key from one IP (10 requests a minute, 100 a day, short answers, point lookups). A free key lifts the limits: sign up. Routes, parameters and fields: OpenAPI.
curl
curl -s "https://api.arcadiumdata.io/v1/companies/resolve?domain=equinor.com"
Response (abridged)
{
"query": { "mode": "domain", "domain": "equinor.com" },
"found": true,
"data": [{
"domain": "equinor.com",
"domainConfidence": 1,
"legalName": "EQUINOR ASA",
"country": "NO",
"legalForm": "ASA",
"status": "active",
"statusSource": "no_brreg",
"vat": "NO923609016",
"lei": "549300IFR7AQPZMXRU46",
"leiStatus": { "entity": "ACTIVE", "registration": "ISSUED" },
"registryIds": [
{ "type": "no_orgnr", "value": "923609016", "confidence": 1, "sources": ["gleif", "register_no_brreg"] },
{ "type": "lei", "value": "OW6OFBNCKXC4US5C7523", "confidence": 0.95, "sources": ["gleif"] }
],
"match": { "method": "domain", "confidence": 1 }
}]
}
Name to id works the same way. The name must be the registered name (exact, or its first whole words) and the country is required:
curl
curl -s "https://api.arcadiumdata.io/v1/companies/resolve?name=Equinor%20ASA&country=NO"
curl
curl -s "https://api.arcadiumdata.io/v1/companies/resolve?id=923609016&country=NO"
Python
import requests
BASE = "https://api.arcadiumdata.io/v1/companies/resolve"
def ids_for_domain(domain: str, min_confidence: float = 0.9):
r = requests.get(BASE + "?domain=" + domain, timeout=30)
r.raise_for_status()
body = r.json()
if not body["found"]:
return []
return [
(i["type"], i["value"], i["confidence"], i["sources"])
for row in body["data"]
for i in row["registryIds"]
if i["confidence"] >= min_confidence
]
print(ids_for_domain("equinor.com"))
TypeScript
type Row = { legalName: string | null; country: string | null; vat: string | null; registryIds: { type: string; value: string; confidence: number }[]; match: { method: string; confidence: number } };
const res = await fetch('https://api.arcadiumdata.io/v1/companies/resolve?name=Equinor%20ASA&country=NO');
const body = (await res.json()) as { found: boolean; data: Row[] };
for (const row of body.data) console.log(row.legalName, row.vat, row.match.method, row.match.confidence);
How to read the answer
found: falsecomes back with HTTP 200 and an empty list. It means "not in our data", not an error.- Several rows can come back: group companies that share a domain or an LEI. Use
match.methodandmatch.confidence, and prefer the row whoselegalNameyou expected. - A company can show more than one LEI with different confidence (an LEI from Wikidata at 0.9, the GLEIF record at 0.95). Take the highest and check its
leiStatus. withheldcounts ids left out because the holder could be a sole trader or natural person. We never return them.- The answer comes from stored data. For a live status check, send the id to
GET /v1/companies/verify(see the VIES guide).
Anonymous calls return at most three rows. Coverage is widest in Norway, Finland and France, where an open register confirms the ids; elsewhere an id appears when the company's own legal notice, Wikidata or GLEIF states it. The sources page lists the datasets and their licences.
Comparison
| Do it yourself | Arcadium Data /v1/companies/resolve | |
|---|---|---|
| Name to id | One integration per country register | One call, country required |
| Website to id | Scrape the legal notice, validate checksums | One call with domain |
| VAT number to company | VIES gives validity, not identity (no name in DE and ES) | Send the VAT number as id |
| Confidence and sources per id | You build them | Included on every id |
| Sole traders | Your responsibility | Never returned (withheld counts them) |
| Live status | Query each register | Separate call: /v1/companies/verify |
| Coverage | Whatever you integrate | Strongest in NO, FI, FR; elsewhere ids from legal notices, Wikidata, GLEIF |
| Cost | Engineering time | Anonymous tier free; free key for more |
Get the data without the plumbing
Arcadium Data serves these datasets from one REST API and one MCP server, with sources, licences and dates on every answer. No key is needed to try the routes in this guide.
Related
- EU VAT number check with VIES
- LEI lookup with the GLEIF API
- Company register APIs in Europe
- Company lookup
- Data sources and licences
Sources
- Directive 2000/31/EC, article 5 (general information to be provided)
- Brønnøysund Register Centre: open data API
- recherche-entreprises (api.gouv.fr)
- Finnish Patent and Registration Office: open data
- European e-Justice: find a company
Last updated 2026-10-25. This guide is ours and independent of the organisations it describes. Found a mistake? Tell us and we correct it.
Questions
Is there a free way to look up a VAT number by company name?
Not in VIES, which only validates a number you already have. Use the national register of the company’s country, or the resolve route of our API with the registered name and the country.
How do I find a company registration number from its website?
Read the legal notice (Impressum, mentions légales, terms page), where EU law requires the registration details to be shown, and validate the checksum of what you find. Our resolve route does this at scale: send the domain and read registryIds.
Why does a VAT number differ from the registry number?
They are separate identifiers. In Norway the VAT number is the organisation number plus MVA, in France it is built from the SIREN plus two check characters, and in Germany the two are unrelated.
Does the resolve route return sole traders?
No. Sole traders and natural persons are never returned; the withheld counter shows how many ids were left out because the holder could be a private person.
Which countries have the best coverage?
Norway, Finland and France, where an open national register confirms the ids and the status. Other countries rely on ids stated in the company’s own legal notice, Wikidata and GLEIF, each with a confidence value.
Cite as: Arcadium Data, "How to find a company’s VAT and registration number from its name or website", https://arcadiumdata.io/guides/find-company-vat-and-registration-number/, data as of 2026-10-25.