VAT validation

Validate an EU VAT ID

Validates the supplied VAT ID against VIES, falling back to the relevant national registry when VIES is unavailable. Without a requester, for some member states vatnode also queries the national VAT register at the same time as VIES, and the register answer is returned if it arrives first – source is then the register code and consultationNumber is null. Results for the base validation are cached for up to 15 minutes.

Configure a requester VAT once in the dashboard (Account details, or PATCH /v1/me/requester) to obtain a VIES consultationNumber on every call automatically. When the account has a requester configured, the cache is bypassed so a fresh consultation number is always issued.

get/v1/vat/{vatId}

Request

  • Base URL: https://api.vatnode.dev
  • URL: https://api.vatnode.dev/v1/vat/{vatId}
  • Auth: HTTP bearer

Path parameters

vatIdstring required
Example:IE6388047V

VAT ID including the two-letter country prefix as accepted by VIES, e.g. IE6388047V. Greek VAT IDs must use the EL prefix – the ISO code GR is not a valid VAT prefix and returns INVALID_FORMAT. Northern Ireland uses XI. Whitespace and separators are normalised server-side; no country-prefix aliasing is performed.

Response

Validation result.

validboolean required

Whether the VAT ID is valid. With source: VIES this is the VIES verdict. With a national registry source it is that register’s answer about domestic VAT registration, not a VIES confirmation that the number is valid for intra-EU transactions – re-check in VIES before relying on it to zero-rate an intra-EU supply.

vatIdstring required

Normalised VAT ID (uppercase, no separators).

countryCodestring required

Two-letter country code extracted from the VAT ID.

countryNamestring required
companyNamestring nullable required
companyAddressstring nullable required
companyRegistrationDatestring date nullable required
companyFormstring nullable required
industryDescriptionstring nullable required
registryCodestring nullable required

The company’s number in the national business register, in its national format (e.g. 0112038-9 for a Finnish Y-tunnus, 123 456 789 for a French SIREN). Read off the VAT number where the VAT number is built from it (BE, BG, CZ, DK, FI, FR, SE) and taken from the national register for LT. null everywhere else, and for VAT numbers built from a personal number (a Czech rodné číslo, a Swedish personnummer), and for a Bulgarian 10-digit suffix.

registryCodeNamestring nullable required

Local name of registryCode in the country’s first official language (e.g. Y-tunnus, numéro SIREN). null when registryCode is null.

taxIdstring nullable required

The national tax number the VAT number carries, in its national format – e.g. the Spanish NIF, the Polish NIP, the Greek ΑΦΜ, or CZ + IČO for a Czech DIČ. The same value as registryCode where one number serves both (BE, DK, FI, FR, SE). null where the VAT number is not the national tax number.

taxIdNamestring nullable required

Local name of taxId in the country’s first official language (e.g. NIP, ΑΦΜ). null when taxId is null.

commercialNamestring nullable required

Trade / commercial name where the source provides one distinct from the legal companyName. null when the source has only one name or no commercial name (never a duplicate of companyName).

companyStatusstring nullable required

Best-effort normalized operational status from the source registry (one of active, inactive, ceased, bankrupt, liquidation, dissolved, or a lowercased source value that does not map cleanly). Enrichment metadata only – it never overrides valid. null when the source provides no status.

secondaryActivitiesstring[] required

Secondary activity / classification descriptions where the source provides them (the main activity is industryDescription). Empty array when none or unavailable.

companyAgeYearsinteger nullable required

Full years between companyRegistrationDate and verifiedAt (floored). null when companyRegistrationDate is null.

registryPrivacyboolean required

true when the source national register marks the record as restricted from publication at the registrant’s own request – French ‘non-diffusible’, Dutch afscherming. The record above is still returned in full; the flag tells you the registrant asked their register not to hand these details out, which matters if you plan to republish them. vatnode’s own public /check pages mask a flagged record. false for every other result, including countries whose register exposes no such flag.

websitestring nullable required

Company homepage as the national business register publishes it, lower-cased and without a trailing slash, as the register has it – it may be written without a scheme (www.example.fi). null when the register publishes none or the number is not enriched from a register that carries one. Always present.

checkIdstring uuid required

UUIDv7 identifier for this validation, and the primary key of the stored check record. It is issued only after that record is committed, so a checkId you hold always names a check vatnode can still produce – it is a receipt, not a request id. If the record cannot be stored, the response is AUDIT_WRITE_FAILED (HTTP 502) with no checkId and no quota consumed.

verifiedAtstring date-time required
source'VIES' | 'CACHE' | 'BZST' | 'MF_PL' | 'ANAF_RO' | 'ARES_CZ' | 'SIREN_FR' | 'PRH_FI' | 'CVR_DK' | 'BOLAGSVERKET_SE' | 'KVK_NL' | 'CBE_BE' | 'JARS_LV' | 'JARS_LT' | 'AJPES_SI' required

Which system produced this result.

  • VIES — the EU Commission’s VIES service answered directly. The only source that can carry a consultationNumber.
  • CACHE — the base validation was served from vatnode’s cache (a prior VIES or national-register result, up to 15 minutes old). A cached result does not say which of the two produced it. Never carries a consultation number.
  • A national registry code (MF_PL for PL, ANAF_RO for RO, ARES_CZ for CZ) – vatnode answered from that national register instead of VIES, either because VIES was unavailable for the country or, for some member states (currently CZ), because the register answered before VIES. valid then reflects the national register (domestic VAT registration), not a VIES confirmation that the number is valid for intra-EU transactions. Only possible when no requester was supplied; never carries a consultation number. The other national codes in the enum are not returned as a validity source.

A successful requester-authenticated call (one returning a consultationNumber) always has source: VIES, because national fallback is disabled whenever a requester is supplied.

consultationNumberstring nullable required

VIES requestIdentifier, returned only when the account has a requester VAT configured (dashboard Account details) and VIES answered successfully via checkVatApprox. null when no requester is configured, when the answer came from a national register, or when served from cache.

Example response

{
  "countryVat": {
    "vatName": "Value Added Tax",
    "vatAbbr": "VAT",
    "currency": "EUR",
    "standardRate": 23,
    "reducedRates": [
      13.5,
      9
    ],
    "superReducedRate": 4.8,
    "parkingRate": 13.5,
    "identifiers": {
      "registryAuthorityName": {
        "de": "Unternehmens-Identifikationsnummer",
        "fr": "numéro d'identification des entreprises",
        "it": "numero d'identificazione delle imprese",
        "en": "Unique Enterprise Identification Number"
      },
      "registryName": {
        "de": "Unternehmens-Identifikationsnummer",
        "fr": "numéro d'identification des entreprises",
        "it": "numero d'identificazione delle imprese",
        "en": "Unique Enterprise Identification Number"
      },
      "registryCodeName": {
        "de": "Unternehmens-Identifikationsnummer",
        "fr": "numéro d'identification des entreprises",
        "it": "numero d'identificazione delle imprese",
        "en": "Unique Enterprise Identification Number"
      },
      "taxIdName": {
        "de": "Unternehmens-Identifikationsnummer",
        "fr": "numéro d'identification des entreprises",
        "it": "numero d'identificazione delle imprese",
        "en": "Unique Enterprise Identification Number"
      },
      "vatIdName": {
        "de": "Unternehmens-Identifikationsnummer",
        "fr": "numéro d'identification des entreprises",
        "it": "numero d'identificazione delle imprese",
        "en": "Unique Enterprise Identification Number"
      }
    }
  },
  "specialTerritory": {
    "code": "aland-islands",
    "name": "Åland Islands",
    "memberState": "FI"
  }
}

Changes

No recorded changes to this operation across all 1 revision of this API.