Company Number vs VAT Number: What's the Difference

12 Oct 2026

Company Number vs VAT Number: What's the Difference

A company number and a VAT number are issued by different bodies, for different reasons, and checking one tells you nothing about the other. A company number points to an entity’s entry in a business register; a VAT number points to its VAT registration, which VIES shows as active or not for intra-EU trade at the moment you check. Mixing the two up – pasting a company number into a VAT field, or assuming a valid VAT check confirms incorporation – produces confusing failures that have nothing to do with whether the business is real.

This post draws that line and shows where vatnode’s API surfaces the company number, when it has one to surface. It doesn’t cover the VAT-suffix-as-tax-number case (Spain’s NIF, Poland’s NIP, Greece’s ΑΦΜ) – that’s a separate identifier axis, covered in VAT number vs tax ID.

What a company number actually identifies

A company number is issued by a country’s companies registry at incorporation. It identifies the legal entity itself – the thing that was formed, registered, and given a file at that registry – independent of what the entity does afterward: whether it ever registers for VAT, changes its trading name, or moves address. Sole traders are often VAT-registered without any company-register entry, so for them there may be no company number at all.

The registry that issues it is usually the same body that holds the entity’s incorporation documents, officers, and filing history. In most EU member states that’s a companies house or commercial register, separate from the tax authority. The company number is the key into that register – it’s what you’d use to pull the entity’s filings, not its VAT status.

A company number doesn’t expire when a business stops trading or deregisters for VAT; it stays attached to the legal entity for as long as the entity exists on the register. Whether a company number proves anything about current trading status depends on the registry – some mark dissolved entities, some don’t update promptly – which is a different question from whether the number is correctly formatted.

What a VAT number identifies

A VAT number is issued by a tax authority when a business registers for VAT – a separate step from incorporation, sometimes done at the same time, sometimes months or years later, and in principle reversible if the business deregisters. It carries a two-letter EU country prefix and it’s the identifier VIES checks to confirm intra-EU VAT status.

A VAT number says nothing about incorporation on its own. It means the tax authority’s VIES record shows the number as active for intra-EU transactions at the time of the check – that’s the whole claim a valid: true result makes. Company-level facts like legal form, incorporation date, or registered address sometimes ride along in the same response, but only where the underlying VIES or national-registry source happens to expose them for that country; they’re not guaranteed by the VAT check itself.

Neither number proves solvency, good standing, or safety to deal with. A company number shows an entity is on a business register; a valid VAT number shows the registration was active in VIES when you checked. Beneficial ownership, sanctions screening, and document verification are a different process entirely – see VAT validation vs KYB for what each check does and doesn’t cover.

Same business, two different numbers – worked example

Ireland is a clean illustration because the two numbers come from two entirely separate bodies, issued at two different moments, with no overlap in the digits.

A business incorporating in Ireland gets a company number from the Companies Registration Office (CRO) on incorporation. When – or if – it later registers for VAT, Revenue issues a separate VAT number under the IE prefix. The two numbers don’t derive from each other; nothing about the CRO number tells you the VAT number, and vice versa.

Run that VAT number through a VAT validation API and you get back a validity result and, where the country’s VAT number encodes a register number or a national registry supplies one, registry fields:

{
  "valid": true,
  "vatId": "IE1234567WH",
  "countryCode": "IE",
  "companyName": "EXAMPLE TRADING LIMITED",
  "companyAddress": "1 EXAMPLE STREET, DUBLIN 2",
  "registryCode": null,
  "registryCodeName": null,
  "taxId": null,
  "taxIdName": null
}

registryCode is null here – not because the check failed, but because nothing in the Irish VAT number encodes the CRO number, and this check doesn’t derive or return one any other way. The company name came through; the company number didn’t, and couldn’t, from this check. If you need the CRO number for that entity, that’s a separate lookup against the CRO register, not something a VAT check can supply.

Compare that with France, where the two numbers aren’t separate at all by design: a French VAT number for a business with a SIREN is built directly from it. FR + a 2-character key + the 9-digit SIREN is the whole VAT number – so a VAT check on a French business can hand the SIREN straight back as registryCode:

curl https://api.vatnode.dev/v1/vat/FR32123456789 \
  -H "Authorization: Bearer $VATNODE_API_KEY"
{
  "valid": true,
  "vatId": "FR32123456789",
  "countryCode": "FR",
  "companyName": "EXAMPLE SAS",
  "companyAddress": "1 RUE EXAMPLE, 75001 PARIS",
  "registryCode": "123 456 789",
  "registryCodeName": "numéro SIREN",
  "taxId": "123 456 789",
  "taxIdName": "numéro SIREN"
}

Same shape of check, same fields in the response – but registryCode is populated for France and null for Ireland, because the underlying relationship between the VAT number and the company number is different in each country. Nothing is broken in either case; the response reflects what that country’s numbering encodes.

Where the company number lives in the API response

In GET /v1/vat/:vatId, the company number – where one is derivable from the VAT number for that check, or supplied by a national registry – comes back as registryCode, together with registryCodeName: a single string naming that number in the country’s first official language, e.g. numéro SIREN for France or organisationsnummer for Sweden. That same response also nests a countryVat.identifiers block – the country-level reference described next, not a fact about the specific business being checked.

The per-country identifiers block – countryVat.identifiers on GET /v1/vat/:vatId, the top-level identifiers field on GET /v1/rates, and the equivalent in the eu-vat-rates-data package – carries only names, never numbers: registryCodeName, taxIdName, registryAuthorityName, registryName, and vatIdName, each given in the country’s own language (or languages) plus English. It tells you what the register number is called in France; it can’t tell you any specific French business’s actual SIREN – that only ever comes back in the flat registryCode field on a real check.

taxId and taxIdName sit next to registryCode/registryCodeName in that same flat per-check response. For some countries taxId matches registryCode exactly – Finland’s Y-tunnus and Sweden’s organisationsnummer each do double duty as both the register number and the tax number. For others, the VAT suffix encodes a tax number but not a register number for that check, so registryCode comes back null while taxId carries the value – the entity may still have a register number elsewhere, it simply isn’t derivable from this particular VAT number. VAT number vs tax ID covers that second case in depth; this post stays on the registry-number axis.

These fields are part of the same validation response you’d call for any other reason – there’s no separate endpoint for ‘look up the company number.’ If registryCode matters to your workflow, read it off the same GET /v1/vat/:vatId call you’re already making.

Why this isn’t a fixed per-country list

It’s tempting to want a table: ‘these countries return registryCode, these don’t.’ That table doesn’t hold up as a static reference, because whether registryCode comes back populated depends on two things – whether a country’s VAT number is structurally built from its company number (a design choice each tax authority made for its own numbering scheme), and whether a national registry source is wired into vatnode’s fallback or enrichment path to supply it when it isn’t.

The current state – which countries have a registry fallback, and what each one returns – is published at coverage rather than reproduced here, because a list embedded in this post would stop reflecting that state the moment it changes.

What doesn’t change is the underlying rule: registryCode is null whenever the company number isn’t actually available from the check, for whichever reason, and populated only when it is. A null is never a bug report against this field – it’s the honest answer when there’s nothing to return.

Common gotchas

Pasting a company number into a VAT number field. Company number formats and VAT number formats rarely coincide, so this usually fails format validation before it ever reaches VIES – the request gets rejected locally, with no network call made. In some countries the VAT suffix is the company number, so there this failure mode doesn’t apply in the same way – the number may format-validate and resolve successfully regardless of which one you meant to enter. Elsewhere, if a value happens to pass format validation but fails the VIES lookup, that pattern is consistent with a company number landing in the wrong field; it isn’t evidence the business doesn’t exist. The error reference covers what a format rejection looks like versus a genuine VIES miss.

Treating a null registryCode as a failed check. A valid: true response with registryCode: null is a complete, correct answer – the VAT check succeeded; the company number simply isn’t something that check can surface for that country. Don’t retry the call expecting a different result, and don’t treat the null as a lower-confidence validation – validity and registry enrichment are two separate questions the same response happens to answer together.

Assuming a VAT check proves incorporation status. A valid: true result confirms VAT registration at the moment of the check. It doesn’t confirm the entity is still incorporated, hasn’t been struck off its companies register, or is in good standing there – that’s a question for the companies registry itself, not for VIES. Where companyAddress or companyName come back, treat them as what VIES or the national registry reported at check time, not as a live company-register lookup.

FAQ

Is a company number the same as a VAT number?

No. A company number is issued by a companies registry when a business incorporates; a VAT number is issued by a tax authority when a business registers for VAT. A business can have one without the other, and in some countries they share digits by design, not because they’re the same identifier.

Can I validate a company number through a VIES check?

No. VIES only checks VAT numbers. If a company number happens to be embedded in the VAT number – as it is for France’s SIREN or, for Swedish companies, the organisationsnummer – a VAT check can return it alongside the validity result, but the check itself is still validating the VAT number, not the company number directly. A Swedish sole trader’s VAT number is built on a personal ID number instead, so for them registryCode comes back null.

Why does vatnode’s API return registryCode as null for some valid VAT numbers?

Because registryCode is only populated where the company number is derivable from the VAT number for that check, or supplied by a national registry. Where the VAT suffix encodes a tax number rather than a register number, registryCode comes back null even though valid is true – not because the entity has no register number, but because this check didn’t derive or receive one. That’s a correct response, not a missing field.

What should I check if a customer pastes a company number into a VAT number field?

It will usually fail format validation outright, because company number formats rarely match the VAT number pattern for that country. In some countries the VAT suffix is the company number, so there this failure mode doesn’t apply in the same way. Elsewhere, if it does pass format validation but fails the VIES lookup, that’s consistent with a company number being entered where a VAT number was expected – it’s not evidence the business doesn’t exist.

Check which number you’re actually holding

Run a VAT number through the free checker to see exactly which fields come back for that country – including whether registryCode is populated. Validating from your own code? Get a free API key and call it from your code via the VIES API – free plan, 100 requests/month, no card required.