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.
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
- Open ec.europa.eu/taxation_customs/vies/
- Select Member State (customer's country) from dropdown
- Enter VAT number (without country prefix β the portal adds it)
- Enter your VAT number (requester β optional but recommended for audit trail)
- Click Verify
- 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)
- Open vat-validator
- Enter the VAT number with country prefix (for example,
DE123456789) - Run the format check, then the optional live VIES lookup
- Results show format validity first, then the live VIES registration status where available
- 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
| Result | Meaning | Action | Audit Note |
|---|---|---|---|
| Valid β | VAT number exists and is active in Member State register | Consider 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 deregistered | DO NOT apply reverse charge. Charge domestic VAT. Contact customer. | Save screenshot. "VIES invalid on 2026-09-15 β charged DE 19% VAT" |
| Member State not responding | National VIES server down or timeout | Wait 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 format | Number doesn't match country pattern | Ask 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.
| Country | Code | Format | Example | Pattern |
|---|---|---|---|---|
| Austria | AT | ATU + 8 digits | ATU12345678 | ^ATU\d{8}$ |
| Belgium | BE | BE + 10 digits (leading 0) | BE0123456789 | ^BE0?\d{9}$ |
| Bulgaria | BG | BG + 9-10 digits | BG123456789 | ^BG\d{9,10}$ |
| Croatia | HR | HR + 11 digits | HR12345678901 | ^HR\d{11}$ |
| Cyprus | CY | CY + 8 digits + letter | CY12345678L | ^CY\d{8}[A-Z]$ |
| Czechia | CZ | CZ + 8-10 digits | CZ12345678 | ^CZ\d{8,10}$ |
| Denmark | DK | DK + 8 digits | DK12345678 | ^DK\d{8}$ |
| Estonia | EE | EE + 9 digits | EE123456789 | ^EE\d{9}$ |
| Finland | FI | FI + 8 digits | FI12345678 | ^FI\d{8}$ |
| France | FR | FR + 2 chars + 9 digits | FR12345678901 | ^FR[A-Z0-9]{2}\d{9}$ |
| Germany | DE | DE + 9 digits | DE123456789 | ^DE\d{9}$ |
| Greece | EL | EL + 9 digits | EL123456789 | ^EL\d{9}$ |
| Hungary | HU | HU + 8 digits | HU12345678 | ^HU\d{8}$ |
| Ireland | IE | IE + 7 digits + 1-2 letters | IE1234567TA | ^IE\d{7}[A-Z]{1,2}$ |
| Italy | IT | IT + 11 digits | IT12345678901 | ^IT\d{11}$ |
| Latvia | LV | LV + 11 digits | LV12345678901 | ^LV\d{11}$ |
| Lithuania | LT | LT + 9 or 12 digits | LT123456789 | ^LT(\d{9}|\d{12})$ |
| Luxembourg | LU | LU + 8 digits | LU12345678 | ^LU\d{8}$ |
| Malta | MT | MT + 8 digits | MT12345678 | ^MT\d{8}$ |
| Netherlands | NL | NL + 9 digits + B + 2 digits | NL123456789B01 | ^NL\d{9}B\d{2}$ |
| Poland | PL | PL + 10 digits | PL1234567890 | ^PL\d{10}$ |
| Portugal | PT | PT + 9 digits | PT123456789 | ^PT\d{9}$ |
| Romania | RO | RO + 2-10 digits | RO12345678 | ^RO\d{2,10}$ |
| Slovakia | SK | SK + 10 digits | SK1234567890 | ^SK\d{10}$ |
| Slovenia | SI | SI + 8 digits | SI12345678 | ^SI\d{8}$ |
| Spain | ES | ES + letter/digit + 7 digits + letter/digit | ESX1234567X | ^ES[A-Z0-9]\d{7}[A-Z0-9]$ |
| Sweden | SE | SE + 12 digits | SE123456789012 | ^SE\d{12}$ |
| Northern Ireland | XI | XI + 9 or 12 digits | XI123456789 | ^XI\d{9,12}$ |
| Norway | NO | NO + 9 digits + MVA | NO123456789MVA | ^NO\d{9}MVA$ |
| Switzerland | CH | CHE + 9 digits + TVA/MWST/IVA | CHE123456789TVA | ^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)
| Service | API | Price (10k checks/mo) | Features |
|---|---|---|---|
| VATLayer / apilayer | REST | β¬50/mo | Real-time, company name/address, bulk |
| Vatcheckapi.com | REST | β¬30/mo | Simple, webhook callbacks |
| LOVAT / Taxamo | REST | β¬100+/mo | Full compliance suite |
| Sovos / TrustWeaver | SOAP/REST | Enterprise | Global, 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
| Field | Example | Retention |
|---|---|---|
| Customer VAT number | FR12345678901 | 10 years |
| Customer legal name | SAS Tech Solutions | 10 years |
| VIES check date/time (UTC) | 2026-09-15 14:32:17 UTC | 10 years |
| VIES result | Valid | 10 years |
| VIES screenshot/PDF | vies_FR12345678901_20260915_143217.pdf | 10 years |
| Invoice numbers using this validation | INV-2026-0456, INV-2026-0523 | 10 years |
| Re-check dates (quarterly) | 2026-12-15, 2027-03-15 | 10 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
- "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
- "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
- 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
- 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
- Prefix
- 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)
- Customer master data: store VAT number + last VIES check date
- Before invoice creation: if last check > 90 days β auto-validate
- If VIES invalid β block invoice, alert AR team
- 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:
- Export all cross-border invoices for period
- Extract unique customer VAT numbers
- Run batch VIES validation
- Any invalid? Fix before filing (amend invoice, contact customer)
- 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.
π Reverse Charge vs OSS Checker
Confirms if VIES check needed for your scenario (B2B services, goods, domestic).
π 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.
π§Ύ 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.
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
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.