Home / Guides / VIES Validation Tutorial

VIES VAT Number Validation: How to Check an EU VAT Number (2026)

The VAT Information Exchange System (VIES) is the Commission service for checking whether a VAT number is registered in the country that issued it. This tutorial covers: manual checks, interpreting results, handling errors, and keeping records of your checks. Updated September 2026.

πŸ“… Updated: September 2026 ✍️ By: CA Neha Tabassum ⏱️ 11 min read

What Is VIES? Why It Matters

VIES (VAT Information Exchange System) is the EU's real-time database connecting all 27 Member States' VAT registers. It lets you verify if a VAT number is valid and active at the moment of check.

πŸ›‘οΈ What a "Valid" Result Means

A "Valid" result confirms the number is registered for VAT purposes in the issuing country on the date of the check. It does not by itself establish that a transaction qualifies for reverse charge or an exemption - that depends on the applicable rules. Keep the dated result as evidence of the status you relied on.

⚠️ Skipping the Check

If the customer's VAT number is not valid, the reverse charge treatment may fail and the VAT can fall back on the supplier, with interest and possible penalties depending on national rules. The exact consequences vary by transaction and country - confirm with your adviser rather than assuming a fixed penalty band.

When to Check Before Invoicing

  • Every cross-border B2B invoice (services + goods)
  • Every intra-community acquisition (goods received from EU)
  • Before issuing first invoice to new EU customer
  • Quarterly for recurring customers (status changes)
  • Before filing EC Sales List (ZM/DES/ESL)

Manual VIES Check: Step-by-Step

Method 1: Official EU VIES Portal

  1. Open ec.europa.eu/taxation_customs/vies/
  2. Select Member State (customer's country) from dropdown
  3. Enter VAT number (without country prefix β€” the portal adds it)
  4. Enter your VAT number (requester β€” optional but recommended for audit trail)
  5. Click Verify
  6. Save result: Screenshot (PrtScn) or "Print to PDF" β€” include timestamp

Example: Checking French VAT FR12345678901

Member State: France
VAT number: 12345678901 (no "FR")
Requester: DE123456789 (your German VAT ID)
Result: "Valid β€” VAT number exists in French register"

Method 2: Our VAT Validator (Format Check + VIES Lookup)

  1. Open vat-validator
  2. Enter the VAT number with country prefix (for example, DE123456789)
  3. Run the format check, then the optional live VIES lookup
  4. Results show format validity first, then the live VIES registration status where available
  5. Save the result (screenshot or PDF) with its timestamp for your records

Advantage: format errors are caught before the lookup, and you keep the dated result as evidence of the status you relied on.

Interpreting VIES Results

ResultMeaningActionAudit Note
Valid βœ“VAT number exists and is active in Member State registerConsider reverse charge / intra-community supply if the other conditions are met - a "Valid" result alone does not decide treatment.Save screenshot + timestamp. "VIES valid on 2026-09-15 14:32 UTC"
Invalid βœ—Number not found, expired, or deregisteredDO NOT apply reverse charge. Charge domestic VAT. Contact customer.Save screenshot. "VIES invalid on 2026-09-15 β€” charged DE 19% VAT"
Member State not respondingNational VIES server down or timeoutWait 1-2 hours, retry. If persistent: charge domestic VAT. Document attempts.Save all attempts with timestamps. "MS timeout 14:30, 15:00, 16:00 β€” charged domestic VAT"
Invalid formatNumber doesn't match country patternAsk customer for correct number. Don't guess."Customer provided DE123 β€” format requires 9 digits. Requested correction."

What "Valid" Doesn't Guarantee

  • Customer is actually the holder (could be stolen number)
  • Customer is VAT-compliant (filing returns, paying VAT)
  • Transaction is legitimate (could be carousel fraud)

Bottom line: a "Valid" result confirms registration status on the check date. Whether reverse charge or an exemption applies follows Articles 196 and 138 and national rules - not the check result.

EU VAT Number Formats (For Pre-Check)

Before VIES, verify format locally. Our VAT Validator does this automatically.

CountryCodeFormatExamplePattern
AustriaATATU + 8 digitsATU12345678^ATU\d{8}$
BelgiumBEBE + 10 digits (leading 0)BE0123456789^BE0?\d{9}$
BulgariaBGBG + 9-10 digitsBG123456789^BG\d{9,10}$
CroatiaHRHR + 11 digitsHR12345678901^HR\d{11}$
CyprusCYCY + 8 digits + letterCY12345678L^CY\d{8}[A-Z]$
CzechiaCZCZ + 8-10 digitsCZ12345678^CZ\d{8,10}$
DenmarkDKDK + 8 digitsDK12345678^DK\d{8}$
EstoniaEEEE + 9 digitsEE123456789^EE\d{9}$
FinlandFIFI + 8 digitsFI12345678^FI\d{8}$
FranceFRFR + 2 chars + 9 digitsFR12345678901^FR[A-Z0-9]{2}\d{9}$
GermanyDEDE + 9 digitsDE123456789^DE\d{9}$
GreeceELEL + 9 digitsEL123456789^EL\d{9}$
HungaryHUHU + 8 digitsHU12345678^HU\d{8}$
IrelandIEIE + 7 digits + 1-2 lettersIE1234567TA^IE\d{7}[A-Z]{1,2}$
ItalyITIT + 11 digitsIT12345678901^IT\d{11}$
LatviaLVLV + 11 digitsLV12345678901^LV\d{11}$
LithuaniaLTLT + 9 or 12 digitsLT123456789^LT(\d{9}|\d{12})$
LuxembourgLULU + 8 digitsLU12345678^LU\d{8}$
MaltaMTMT + 8 digitsMT12345678^MT\d{8}$
NetherlandsNLNL + 9 digits + B + 2 digitsNL123456789B01^NL\d{9}B\d{2}$
PolandPLPL + 10 digitsPL1234567890^PL\d{10}$
PortugalPTPT + 9 digitsPT123456789^PT\d{9}$
RomaniaRORO + 2-10 digitsRO12345678^RO\d{2,10}$
SlovakiaSKSK + 10 digitsSK1234567890^SK\d{10}$
SloveniaSISI + 8 digitsSI12345678^SI\d{8}$
SpainESES + letter/digit + 7 digits + letter/digitESX1234567X^ES[A-Z0-9]\d{7}[A-Z0-9]$
SwedenSESE + 12 digitsSE123456789012^SE\d{12}$
Northern IrelandXIXI + 9 or 12 digitsXI123456789^XI\d{9,12}$
NorwayNONO + 9 digits + MVANO123456789MVA^NO\d{9}MVA$
SwitzerlandCHCHE + 9 digits + TVA/MWST/IVACHE123456789TVA^CHE\d{9}(TVA|MWST|IVA)?$

Batch Validation: For 50+ Customers

Option 1: Our VAT Validator (One Number at a Time)

Our validator checks a single number's format and then queries VIES live. It does not batch-process lists or export CSV files - for each customer, save the result yourself (screenshot or PDF with timestamp) and log it in your own records.

Option 2: VIES API (For Developers)

EU provides SOAP API at: `https://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl`

Python Example:

import zeep
from datetime import datetime

client = zeep.Client('https://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl')

def check_vat(country_code, vat_number):
    try:
        result = client.service.checkVat(countryCode=country_code, vatNumber=vat_number)
        return {
            'valid': result.valid,
            'name': result.name,
            'address': result.address,
            'timestamp': datetime.utcnow().isoformat()
        }
    except Exception as e:
        return {'error': str(e), 'timestamp': datetime.utcnow().isoformat()}

# Batch check
customers = [('DE', '123456789'), ('FR', '12345678901'), ('IT', '12345678901')]
for cc, vn in customers:
    print(check_vat(cc, vn))

Option 3: Commercial Services (High Volume)

ServiceAPIPrice (10k checks/mo)Features
VATLayer / apilayerREST€50/moReal-time, company name/address, bulk
Vatcheckapi.comREST€30/moSimple, webhook callbacks
LOVAT / TaxamoREST€100+/moFull compliance suite
Sovos / TrustWeaverSOAP/RESTEnterpriseGlobal, audit trail, SLA

Audit Trail: What to Keep

How long records must be kept depends on the country - commonly six to ten years for VAT documents. Confirm your national retention period rather than assuming a single figure.

Per Customer Validation Record

FieldExampleRetention
Customer VAT numberFR1234567890110 years
Customer legal nameSAS Tech Solutions10 years
VIES check date/time (UTC)2026-09-15 14:32:17 UTC10 years
VIES resultValid10 years
VIES screenshot/PDFvies_FR12345678901_20260915_143217.pdf10 years
Invoice numbers using this validationINV-2026-0456, INV-2026-052310 years
Re-check dates (quarterly)2026-12-15, 2027-03-1510 years

Folder Structure (Recommended)

/VIES_Audit/
  /2026/
    /Q1/
      vies_FR12345678901_20260115.pdf
      vies_DE123456789_20260115.pdf
      batch_check_20260115.csv
    /Q2/
      vies_FR12345678901_20260415.pdf
      batch_check_20260415.csv
  /2025/
    ...
  master_validation_log.xlsx

Master Log Spreadsheet Columns

Date | VAT Number | Country | Customer Name | VIES Result | Screenshot File | Invoices | Re-check Due | Notes

Handling Common VIES Errors

  1. "Member State not responding" (Timeout)
    • Retry at 30-min intervals (max 3 attempts)
    • Check VIES availability page for known outages
    • If down > 4 hours: charge domestic VAT, document all attempts
    • Re-check next business day
  2. "Invalid" but customer insists it's correct
    • Ask customer for: VAT certificate (issued by their tax office)
    • Check format matches country pattern (table above)
    • Common issues: missing leading zero (BE), wrong prefix (EL vs GR), new registration not yet synced
    • New registrations: can take 2-4 weeks to appear in VIES
  3. Name/address mismatch
    • VIES returns registered name/address β€” may differ from trading name
    • If legal entity matches: OK (e.g., "MΓΌller GmbH" vs trading "MΓΌller Consulting")
    • If completely different entity: potential fraud β€” investigate
  4. Northern Ireland (XI) numbers
    • Prefix XI (not GB) for NI businesses under Protocol
    • Check on VIES with Member State = "Northern Ireland"
    • GB numbers (Great Britain) no longer on EU VIES post-Brexit
  5. Group VAT registrations
    • Some countries allow group registration (single VAT ID for multiple entities)
    • VIES shows group head β€” subsidiaries may not appear individually
    • Ask for group confirmation letter

Automation: Build It Into Your Workflow

Pre-Invoice Validation (ERP/Accounting Integration)

  1. Customer master data: store VAT number + last VIES check date
  2. Before invoice creation: if last check > 90 days β†’ auto-validate
  3. If VIES invalid β†’ block invoice, alert AR team
  4. Log everything to audit table

Quarterly Batch Re-Check (Cron Job)

# Pseudocode for quarterly job (runs 1st of Jan/Apr/Jul/Oct)
customers = db.query("SELECT vat_number, country FROM customers WHERE cross_border = true")
results = []
for c in customers:
    result = vies_check(c.vat_number, c.country)
    results.append({
        'vat_number': c.vat_number,
        'country': c.country,
        'valid': result.valid,
        'checked_at': now(),
        'previous_valid': c.last_vies_valid
    })
    # Alert if status changed from valid to invalid
    if c.last_vies_valid and not result.valid:
        alert_slack(f"⚠️ VIES INVALID: {c.vat_number} was valid, now invalid!")
    db.update(c.id, last_vies_check=now(), last_vies_valid=result.valid)

export_csv(results, f'vies_batch_{now().date()}.csv')

EC Sales List Pre-Flight Check

Before filing ZM/DES/ESL:

  1. Export all cross-border invoices for period
  2. Extract unique customer VAT numbers
  3. Run batch VIES validation
  4. Any invalid? Fix before filing (amend invoice, contact customer)
  5. File ESL only with VIES-validated numbers

Real-World Workflow: Monthly VIES Routine

Scenario: German Agency, 50 EU Clients

1st of Month (30 min)

AR Manager: Works through all 50 active cross-border clients - each number checked on VIES (our VAT Validator handles the format check plus one live lookup at a time), results saved with timestamps. Exports CSV: `vies_2026-09-01.csv`.

Result: 48 Valid, 1 Invalid (IT client deregistered), 1 Timeout (ES server down).

Same Day (15 min)

Action on Invalid: Emails Italian client: "Your VAT number IT12345678901 shows invalid on VIES. Please provide updated VAT certificate. We'll charge 19% DE VAT on next invoice until resolved."

Action on Timeout: Retries at 14:00, 14:30, 15:00. Still timeout. Notes: "ES VIES timeout 3x β€” will retry tomorrow."

Next Day (5 min)

Retry Spanish: Now valid. Updates master log. Proceeds with reverse charge.

Invoice Creation (Ongoing)

System check: Before each cross-border invoice, ERP checks `last_vies_check` date. If > 90 days β†’ auto-validates. If invalid β†’ blocks invoice with alert.

Quarter End (Before ESL Filing)

Pre-flight: Confirms each Q3 cross-border customer number is still valid, resolves anything that changed, files ZM via ELSTER, and archives the dated results with the ESL confirmation.

Tools for VIES Validation

πŸ” VAT Validator (Our Tool)

Format check plus one live VIES lookup at a time, with timestamps. Format checks run client-side; a live lookup necessarily sends the number to the EU database.

Open Validator β†’

πŸ” Reverse Charge vs OSS Checker

Confirms if VIES check needed for your scenario (B2B services, goods, domestic).

Open Checker β†’

πŸ“„ Invoice Generator

Auto-fills both VAT IDs, reverse charge text, €0 VAT. Check the numbers in VIES yourself before issuing - the generator does not validate them.

Generate Invoice β†’

🧾 UBL E-Invoice Kit

Creates UBL 2.1 XML with the VAT IDs you enter. It performs a structural check only - validate numbers separately and use an official Peppol validator for formal conformance.

UBL Kit β†’

VIES Compliance Checklist

Per New Cross-Border Customer

  • [ ] Obtain VAT number with country prefix
  • [ ] Verify format matches country pattern
  • [ ] Check VIES (manual or batch)
  • [ ] Save screenshot/PDF with timestamp
  • [ ] Log in master validation spreadsheet
  • [ ] Set re-check reminder: 90 days
  • [ ] Apply the treatment the rules require for your transaction - a "Valid" result alone does not decide it

Monthly

  • [ ] Run batch VIES on all active cross-border customers
  • [ ] Flag any status changes (Valid β†’ Invalid)
  • [ ] Contact affected customers immediately
  • [ ] Update master log
  • [ ] Archive batch CSV

Quarterly (Before ESL Filing)

  • [ ] Batch validate all period cross-border customers
  • [ ] Resolve any invalid before filing
  • [ ] File ZM/DES/ESL
  • [ ] Archive: ESL confirmation + VIES batch CSV

Annually

  • [ ] Review master log: any customers not re-checked in 12 months?
  • [ ] Verify VIES screenshots readable (PDF not corrupted)
  • [ ] Update country format patterns if EU publishes changes
  • [ ] Test API/automation still working
πŸ”’ Privacy note: Format checks run locally in your browser. A live VIES lookup necessarily sends the VAT number to the EU database - that is the only data that leaves your device, and only when you ask for the check.

Disclaimer: This guide is informational β€” not tax or legal advice. VIES is operated by the European Commission. National VAT registers are the authoritative source. Always confirm with your tax advisor. Last verified September 2026.