Developer guides

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

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:

CountryRegisterLookupId returned
NorwayBrønnøysund Enhetsregisterethttps://data.brreg.no/enhetsregisteret/api/enheter?navn=...9-digit organisasjonsnummer; VAT is NO + number + MVA
Francerecherche-entreprises (annuaire des entreprises)https://recherche-entreprises.api.gouv.fr/search?q=...9-digit SIREN; FR VAT is derived from it
FinlandPRH / YTJ open datahttps://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 RepublicAREShttps://ares.gov.cz/ekonomicke-subjekty-v-be/rest/ekonomicke-subjekty/{ico}8-digit IČO
Great BritainCompanies HouseREST API needs a free key; monthly bulk snapshot needs none8-character company number
GermanyHandelsregisterFree web search, no API, no bulk; automated use is restricted by its termsHRB/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

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

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 yourselfArcadium Data /v1/companies/resolve
Name to idOne integration per country registerOne call, country required
Website to idScrape the legal notice, validate checksumsOne call with domain
VAT number to companyVIES gives validity, not identity (no name in DE and ES)Send the VAT number as id
Confidence and sources per idYou build themIncluded on every id
Sole tradersYour responsibilityNever returned (withheld counts them)
Live statusQuery each registerSeparate call: /v1/companies/verify
CoverageWhatever you integrateStrongest in NO, FI, FR; elsewhere ids from legal notices, Wikidata, GLEIF
CostEngineering timeAnonymous 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.

Sources

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.