Why Features Docs Pricing FAQ Get API Key
All EU systems operational

Stop duct-taping
5 broken EU APIs.
Use one.

Validate VAT numbers, IBANs, EORI codes, and company data across 27 EU countries in a single API call. Under 100ms. Not 5 seconds. Not a SOAP timeout.

99.9% uptime SLA
GDPR compliant
<100ms p95
27 EU countries
validate.py
import eurovalidate

# One call. VAT + IBAN + EORI + company.
result = eurovalidate.validate({
  "vat_number": "DE121132589",
  "iban": "DE89370400440532013000",
  "eori_number": "DE122240001"
})

# Response in ~47ms
{
  "valid": true,
  "vat": {
    "valid": true,
    "name": "Musterfirma GmbH",
    "address": "Musterstr. 1, Berlin"
  },
  "iban": { "valid": true, "bic": "COBADEFFXXX" },
  "eori": { "valid": true },
  "latency_ms": 47
}

EU validation infrastructure is a dumpster fire.

You shouldn't need a PhD in SOAP to validate a VAT number. But here we are.

VIES is unreliable

2.45% request failure rate. Germany and Belgium endpoints average 32% monthly downtime. Your checkout flow depends on this.

💥

5 APIs for 1 customer

VIES for VAT. National bank APIs for IBAN. EU Customs for EORI. Company registries for legal entities. Each one is different.

💀

SOAP XML in 2026

The EU Commission still speaks SOAP. You get to parse XML envelopes, handle namespace prefixes, and debug character encoding. Fun.

5+ second response times

VIES routinely takes 3-8 seconds per request. Your users abandon checkout. Your background jobs time out. Your queue backs up.

🚫

No monitoring or fallbacks

When VIES goes down at 2 AM, you find out from angry support tickets. No webhooks. No status page. No retry logic.

⛔ This is what you're dealing with
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope
  xmlns:soapenv="http://schemas.xmlsoap.org/
    soap/envelope/"
  xmlns:urn="urn:ec.europa.eu:taxud:
    vies:services:checkVat:types">
  <soapenv:Header/>
  <soapenv:Body>
    <urn:checkVat>
      <urn:countryCode>DE</urn:countryCode>
      <urn:vatNumber>123456789</urn:vatNumber>
    </urn:checkVat>
  </soapenv:Body>
</soapenv:Envelope>

<!-- ...and that's JUST for VAT.
     Now add IBAN, EORI, company lookup.
     Each with its own protocol.
     Each with its own failure modes.
     Each with its own XML schema.

     Or... one JSON API call. -->

One endpoint. Every EU validation. Done.

We handle the SOAP, the retries, the failovers, and the caching. You get clean JSON and sub-100ms responses.

Before — your pain
  • 5 separate API integrations
  • SOAP/XML parsing + namespaces
  • Manual retry logic per service
  • 3-8 second response times
  • No caching or fallback
  • Country-specific edge cases
  • Downtime = your downtime
  • ~400 lines of glue code
After — EuroValidate
  • 1 unified REST API
  • Clean JSON in, clean JSON out
  • Automatic retries + circuit breakers
  • <100ms p95 response time
  • Smart caching with freshness guarantees
  • All 27 countries normalized
  • 99.9% uptime SLA
  • 3 lines of code

Everything you need, nothing you don't

Unified Endpoint

VAT, IBAN, EORI, and company validation in a single POST /validate. Send what you have, get everything back.

📦

Batch Processing

Validate up to 1,000 VAT numbers per request. Async queue for large jobs with webhook on completion.

🔔

Real-time Monitoring

Webhooks for validity changes. Get notified when a customer's VAT status changes, not when your audit reveals it.

🛠

SDKs for Everything

Official SDKs for Python, Node.js, PHP, Go, Ruby, Java, and .NET. Types included. No code generation needed.

🔒

Compliance Built In

Validation certificates with timestamps. Proof-of-validation for auditors. Exportable compliance reports.

🌐

EU-Hosted Infrastructure

All data processed and stored in the EU (Hetzner, Germany). GDPR compliant by architecture, not just policy.

Dashboard Preview
Monitor validations, usage, and API health in real time
Overview
API Keys
Usage
Logs
Monitors
Billing
Today's calls
2,847
Success rate
99.97%
Avg latency
43ms

Five minutes to production.

Install an SDK, add your API key, and start validating. Here's how it looks in your language.

# pip install eurovalidate
from eurovalidate import Client

client = Client(api_key="ev_live_sk_...")

# Validate everything in one call
result = client.validate(
    vat_number="DE121132589",
    iban="DE89370400440532013000",
    eori_number="DE122240001",
)

if result.valid:
    print(f"Company: {result.vat.name}")
    print(f"BIC: {result.iban.bic}")
    print(f"Took: {result.latency_ms}ms")
else:
    for err in result.errors:
        print(f"Failed: {err.field} - {err.message}")

# Batch validation
batch = client.validate_batch([
    {"vat_number": "FR40303265045"},
    {"vat_number": "NL820646660B01"},
    {"vat_number": "IT00159560366"},
])
valid = sum(1 for r in batch.results if r["status"] == "valid")
print(f"{valid}/{batch.total_items} valid")
// npm install @eurovalidate/sdk
import { EuroValidate } from '@eurovalidate/sdk';

const ev = new EuroValidate('ev_live_sk_...');

// Single validation
const result = await ev.validate({
  vat_number: 'DE121132589',
  iban: 'DE89370400440532013000',
  eori_number: 'DE122240001',
});

if (result.valid) {
  console.log(`Company: ${result.vat.name}`);
  console.log(`BIC: ${result.iban.bic}`);
  console.log(`Took: ${result.latencyMs}ms`);
}

// Batch validation
const batch = await ev.validateBatch([
  { vat_number: 'FR40303265045' },
  { vat_number: 'NL820646660B01' },
  { vat_number: 'IT00159560366' },
]);
const valid = batch.results.filter(r => r.status === 'valid').length;
console.log(`${valid}/${batch.total_items} valid`);
# Single validation
curl -X POST https://api.eurovalidate.com/v1/validate \
  -H "X-API-Key: ev_live_sk_..." \
  -H "Content-Type: application/json" \
  -d '{
    "vat_number": "DE121132589",
    "iban": "DE89370400440532013000",
    "eori_number": "DE122240001"
  }'

# Response (47ms)
{
  "valid": true,
  "vat": {
    "valid": true,
    "name": "Musterfirma GmbH",
    "address": "Musterstr. 1, 10115 Berlin",
    "country": "DE"
  },
  "iban": {
    "valid": true,
    "bic": "COBADEFFXXX",
    "bank_name": "Commerzbank"
  },
  "eori": { "valid": true },
  "latency_ms": 47,
  "cached": false
}
// composer require eurovalidate/sdk
use EuroValidate\Client;

$ev = new Client('ev_live_sk_...');

// Single validation
$result = $ev->validate([
    'vat_number'  => 'DE121132589',
    'iban'         => 'DE89370400440532013000',
    'eori_number' => 'DE122240001',
]);

if ($result->valid) {
    echo "Company: " . $result->vat->name;
    echo "BIC: " . $result->iban->bic;
}

// Batch validation
$batch = $ev->validateBatch([
    ['vat_number' => 'FR40303265045'],
    ['vat_number' => 'NL820646660B01'],
    ['vat_number' => 'IT00159560366'],
]);
$valid = count(array_filter($batch->results, fn($r) => $r->status === 'valid'));
echo "{$valid}/{$batch->total_items} valid";

Test the API right now.

No signup needed. Enter a VAT number or IBAN and see the response live.

Live API Playground

Enter a value below and hit Validate to see a real API response.

Response
// Click "Validate" to see the response here

Start free. Scale when ready.

No credit card required. No surprise overages. Upgrade or downgrade anytime.

Monthly Annual Save 20%
Free
€0/mo
100 requests/month. Perfect for prototyping.
  • 100 requests/month
  • VAT + IBAN + EORI
  • All 27 EU countries
  • Community support
  • All SDKs included
Start Free
Starter
€19/mo
5,000 requests/month included. Then €0.005 per request. For early-stage products.
  • 5,000 requests/month included
  • €0.005 per request above
  • Everything in Free
  • Company data lookups
  • Batch validation (100/req)
  • Email support (24h)
  • Validation certificates
Get Started
Scale
€149/mo
100,000 requests/month included. Then €0.002 per request. For high-volume platforms.
  • 100,000 requests/month included
  • €0.002 per request above
  • Everything in Growth
  • Dedicated account manager
  • Custom SLA (up to 99.99%)
  • Private Slack channel
  • Volume discounts available
  • SOC 2 Type II report
Contact Sales

Built for developers who hate SOAP.

We obsess over uptime so you don't have to. Here's how we compare to going direct.

VIES vs EuroValidate — real numbers

MetricVIES (Direct)EuroValidate
Avg response time 3,200ms 47ms
p99 latency 8,400ms 98ms
Request failure rate 2.45% 0.003%
DE endpoint uptime 68% (monthly avg) 99.97%
BE endpoint uptime 72% (monthly avg) 99.95%
Protocol SOAP/XML REST/JSON
Rate limits Undocumented Transparent + headers

Regulatory timeline — why this matters now

2025 Q4

ViDA Directive adopted

VAT in the Digital Age requires real-time VAT validation for all intra-EU B2B transactions.

2026 H1

E-invoicing mandates expand

France, Germany, and Spain mandate B2B e-invoicing. Valid VAT numbers required on every invoice.

2027 Q1

Digital Reporting Requirements

Real-time digital reporting to tax authorities. Automated validation becomes non-optional.

2028

Full ViDA enforcement

Cross-border VAT fraud prevention. Validation at point of transaction mandatory EU-wide.

Guides for every workflow.

Real code, real responses, real implementation patterns.

Implementation

Validate EU VAT in Node.js

5 lines of code. Install the SDK, validate any EU VAT number, handle the response. Copy-paste ready.

Implementation

Validate EU VAT in Python

Sync and async examples with the eurovalidate package. Timeout handling, caching tips, common pitfalls.

Integration

Add VAT Validation to Stripe Checkout

Validate before charge, apply reverse charge for EU B2B, store proof for tax audit. 10-minute setup.

Comparison

VIES API Alternative

Why developers switch from raw VIES: 70% uptime, SOAP/XML, no caching. Honest comparison of alternatives.

Deep Dive

Why VIES Is Unreliable

Germany generates 95% of errors. Circuit breakers, dual-layer cache, and confidence scoring explained.

Build in Public

Building EuroValidate

Solo founder, 7/mo server, 2 weeks to production. The technical story of replacing 5 government APIs.

View all guides on the blog →

Common questions.

No fluff. Straight answers.

No. VIES is one of the data sources, but EuroValidate unifies VAT (VIES), IBAN (national bank APIs), EORI (EU Customs), and company registry data into a single endpoint. We add caching, retry logic, circuit breakers, normalization, and monitoring on top. Think of it as a reliability and integration layer, not a proxy.
Smart caching with configurable freshness (default: 24h for VAT, 7d for company data). Circuit breakers per country endpoint. Automatic failover to secondary sources. Queue-and-retry for non-blocking validation. When VIES is down, we serve cached results with a cached: true flag.
Yes. All infrastructure runs on Hetzner in Germany (EU). We do not store PII beyond the cache TTL. No data leaves the EU. No third-party analytics. Logs are anonymized after 30 days. We can provide a DPA on request.
Absolutely. The API is globally accessible. We have edge nodes for low latency worldwide, but all data processing happens in the EU. Perfect for US/UK companies selling into the EU market.
We don't cut you off. Requests beyond your plan are billed at the per-call overage rate for your tier (shown in your dashboard). You'll get email alerts at 80% and 100% usage. You can set hard caps if you prefer.
Yes. We're tracking the ViDA directive timeline and will support all new validation requirements as they come into effect. Our API response already includes the fields needed for e-invoicing compliance. Growth and Scale plans include compliance export reports.
Default cache TTL is 24 hours for VAT and EORI, 7 days for company data (GLEIF), and 1 hour for IBAN validation results. Cached responses include the cached flag and last_verified timestamp in the meta block.
Not yet, but it's on the roadmap. For now, the Scale plan with a custom SLA covers most compliance requirements. If you need on-premise deployment for regulatory reasons, contact us — we'll figure it out.

Stay in the loop

EU tax rules change fast. Get updates on VIES outages, ViDA deadlines, and new API features. No spam, unsubscribe anytime.

Stop fighting SOAP.
Start shipping.

Free tier. No credit card. First API call in under 2 minutes.

Install SDK
$ pip install eurovalidate