Guides.
Build VAT validation into anything. Language tutorials, registry deep dives, payment-platform integrations, and more.
Fundamentals
Concepts and explainers. Start here if you are new to EU VAT or want a clear reference for a specific mechanism.
EU VAT rate changes 2024-2026: what changed and what your code needs to know
A consolidated reference of the standard and reduced VAT rate changes across European jurisdictions in 2024-2026. Switzerland 8.1%, Estonia 22% then 24%, Finland 25.5%, Czechia consolidated 12% reduced, Slovakia 23%, with practical guidance on date-aware rate logic.
Offline VAT validation: zero dependencies, real checksums
Validate EU VAT numbers without a network call using @vatverify/vat-rates. 44-country rates data, real MOD-11 / MOD-97 / Luhn / HMRC 97-55 algorithms.
OSS and IOSS implementation guide for cross-border B2C sellers
How OSS and IOSS work for cross-border B2C sales to EU consumers, when each scheme applies, the €10,000 and €150 thresholds, and the integration patterns that hold up under audit. Builds on the validation flow.
Reverse charge VAT explained: when it applies, what it does to your invoice, and how to evidence it
Reverse charge shifts the VAT-accounting obligation from the seller to the buyer in cross-border B2B sales between EU member states. This guide covers when it applies, what changes on the invoice, the evidence requirements, and the domestic-reverse-charge variants that share the name.
What is a VAT number? A practical guide for developers and businesses
A VAT number is the identifier a national tax authority issues to a business once it is registered for VAT. Inside the EU it is country-prefixed and validatable through VIES. Includes format details, country examples, and how to validate one programmatically.
API features
How specific endpoints behave: batch validation, webhooks, the /v1/decide tax-rules engine, BZSt qualified confirmation, and VIES downtime handling.
Batch VAT validation: validate up to 50 numbers per request
Validate hundreds or thousands of VAT numbers at once with the batch endpoint. Concurrency, retries, partial-failure handling, and the patterns that scale to weekly customer-list audits.
BZSt §18e qualified VAT confirmation (German legal evidence)
Obtain a qualifizierte Bestätigungsmitteilung from Germany's BZSt with a single API call. Field-by-field match codes, 10-year evidence retention, idempotent retries.
Handle VIES downtime with degraded cache, fallbacks, and retry patterns
VIES goes down. Here's how vatverify handles it automatically, and how your code should handle the edge cases that still matter.
The EU VAT reverse-charge API: stop hand-coding B2B tax logic
The /v1/decide endpoint decides whether to charge VAT, at what rate, under which mechanism. Full walkthrough with Stripe + invoice integration.
VAT compliance evidence: what tax auditors actually accept (and how to produce it)
A field guide to the four tiers of VAT validation evidence, what auditors check for, and what changes under ViDA from 2026 onward. Written for finance and compliance teams at EU sellers.
VAT validation webhooks: react to deregistrations and registry-status changes
Wire up vatverify webhooks to catch B2B customer deregistrations, registry outages, and audit log events without polling. Includes signature verification and idempotency patterns.
Languages and frameworks
Per-language tutorials with idiomatic HTTP, caching, and retry patterns.
How to validate VAT numbers in Node.js
Validate EU, UK, Swiss, and Norwegian VAT numbers in Node.js with real checksum algorithms and a free live API.
How to validate VAT numbers in Python
Validate EU, UK, Swiss, and Norwegian VAT numbers from Python by calling the vatverify REST API directly with httpx or requests. Sync, async, and offline modes.
Validate VAT numbers in C# / .NET: HttpClient, IMemoryCache, and Polly retry
Validate EU and UK VAT numbers from a .NET service. IHttpClientFactory wiring, IMemoryCache or Redis cache, Polly retry policies, and the patterns that scale to ASP.NET checkout flows.
Validate VAT numbers in Django
Add VAT validation to Django forms, admin, and DRF serializers by calling the vatverify REST API with httpx. Covers sync and async views.
Validate VAT numbers in Elixir and Phoenix: Req, Cachex, and Oban for re-validation
Validate EU and UK VAT numbers from an Elixir or Phoenix application. Uses Req for HTTP, Cachex for in-process caching, and Oban for monthly customer-list re-validation jobs.
Validate VAT numbers in Go: net/http, context cancellation, and structured concurrency
Validate EU and UK VAT numbers from a Go service. Standard library net/http, context-aware cancellation, errgroup-based batch validation, and the patterns that hold up under concurrent traffic.
Validate VAT numbers in Java and Spring Boot: HttpClient, RestClient, and resilient retry
Validate EU and UK VAT numbers from a Spring Boot or plain Java service. Includes Java 21 HttpClient, Spring's RestClient, Resilience4j retry, and Caffeine caching patterns.
Validate VAT numbers in Laravel
Add EU VAT validation to a Laravel app with a custom validation rule, service container binding, and Livewire integration.
Validate VAT numbers in Next.js (App Router)
Add VAT validation to a Next.js 15 app using server actions, route handlers, and @vatverify/node. Includes form binding and error states.
Validate VAT numbers in PHP: Guzzle, Symfony HTTP Client, and curl patterns
Validate EU and UK VAT numbers in raw PHP without WordPress or a framework dependency. Includes Guzzle, Symfony HTTP Client, and curl examples plus a small caching layer suitable for any PHP application.
Validate VAT numbers in Ruby on Rails: HTTP, ActiveJob, and idempotent caching
Validate EU and UK VAT numbers from a Rails application. Includes a service object, an ActiveJob worker for re-validation cadence, and a Rails.cache layer suitable for production.
E-commerce platforms
Wire VAT validation into Shopify, BigCommerce, and WooCommerce stores.
BigCommerce VAT validation: customer groups, webhooks, and tax exemption
Validate EU VAT numbers on a BigCommerce store, route cross-border B2B customers into a tax-exempt customer group, and persist the audit trail. Built around BigCommerce V3 API and webhooks.
Shopify VAT validation: from B2B sign-up to tax-exempt checkout
Add real VAT number validation to a Shopify store, mark cross-border B2B customers tax-exempt, and store the audit trail. Built around Shopify B2B, Customer Accounts, and the Admin GraphQL API.
WooCommerce VAT validation: a custom plugin pattern
Add proper VAT validation to a WooCommerce EU store. Hook into woocommerce_after_checkout_validation, validate via vatverify, reject invalid B2B VAT.
Payment platforms
Validate VAT before creating customers in Stripe or Mollie.
Mollie VAT validation: EU B2B checkout with reverse-charge
Validate customer VAT before a Mollie payment. Add reverse-charge logic to EU B2B invoices using /v1/decide.
Stripe VAT validation: validate customer VAT before charging
Add EU VAT validation to a Stripe checkout flow. Validate before creating the Customer, set tax_id_data, and handle reverse-charge for B2B correctly.
Registry deep dives
How each VAT registry behaves, what it returns, and how vatverify handles its quirks.
EU national VAT databases explained: fallback paths when VIES is down
How the 27 member-state VAT registries sit behind VIES, which national databases expose direct public endpoints, and where the tradeoffs around using them directly actually land.
HMRC VAT API explained: UK validation after Brexit
How the HMRC Check a UK VAT Number endpoint works, the OAuth 2.0 flow behind it, sandbox vs production access, and the quirks of the 97-55 checksum.
HMRC VAT check API: UK VAT validation explained
How HMRC's VAT check API works. OAuth 2.0 client credentials, sandbox vs production, rate limits, and why vatverify handles all of it for you.
Norwegian brreg explained: org-number, MVA, and the open registry
How the Brønnøysund Register Centre runs Norway's Entity and VAT registers, what the public REST API returns, and where MVA diverges from the rest of Europe.
Norwegian VAT validation: how brreg and MVA work
Norway's VAT (MVA) system, org-number format, MOD-11 checksum, and the public brreg REST API. No auth required, but watch the deprecation notices.
Swiss BFS and Zefix explained: UID, VAT, and the eCH-0097 schema
How the Swiss Federal Statistical Office runs the UID register, how Zefix relates to it, what the SOAP endpoint returns, and why Liechtenstein rides the same rails.
Swiss UID validation: understanding the CHE-xxxxxxxxx format
How Switzerland's UID register works, CHE format, MWST/IVA/TVA suffixes, BFS UID register SOAP eCH-0097 schema, and Liechtenstein's dual coverage.
The VIES API guide: how EU VAT validation actually works
How VIES (VAT Information Exchange System) works under the hood. SOAP/XML, rate limits, downtime patterns, and why wrapping it with vatverify is 10× simpler than hitting it directly.
VIES explained: how the EU VAT aggregator actually works
A deep dive into the VAT Information Exchange System, the SOAP protocol it speaks, the national registries it fronts, and how vatverify smooths over its quirks.