VAT validation that never returns 503.
36 schemes — all 27 EU member states, the UK, and 8 non-EU GST regimes — validated deterministically from format rules, with real mod-11/Luhn checksum verification for six countries (NL, DE, IT, ES, FR, AT). Pure structural validation: no network call, no VIES outage, no rate limit.
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://almanac.tools/v1/vat/validate?vat=FR40303265045"{
"data": {
"input": "FR40303265045",
"normalized": "FR40303265045",
"country": "FR",
"scheme": "EU-VIES",
"isValidFormat": true,
"checksumChecked": true,
"checksumValid": true
}
}- 36
- VAT/GST schemes
- 27
- EU member states (VIES)
- 6
- Schemes with real checksum verification
- 0
- Network calls — fully offline & deterministic
The VAT & GST Validation API checks whether a VAT or GST registration number is well-formed, normalizing it, detecting its country and scheme, and verifying the format against 36 national rule sets. For six countries it also runs the published checksum algorithm. It is deterministic and offline — it never depends on the EU VIES service being up.
Built for the awkward middle.
Works when VIES is down
The EU VIES service is notoriously flaky — regional outages, maintenance windows, per-IP throttling. We validate format and checksum from rules baked into the engine, so a 503 from Brussels never breaks your checkout. Pair us with a live existence check only when you actually need one.
Real checksums, honestly labelled
Six schemes carry an arithmetic check digit we verify in full — Netherlands elfproef, German USt mod-11/10, Italian Partita IVA Luhn, Spanish NIF/CIF, the French TVA key, and the Austrian ATU mod-10. Every response tells you whether a checksum was actually run, so you never mistake "format OK" for "check digit OK".
Greece, Switzerland and the prefix traps
Greek VAT carries the prefix "EL", not its ISO code "GR" — we detect on EL and report country GR. Swiss numbers use "CHE", matched longest-prefix-first so it never collides. The 8 prefix-less GST schemes (Australia, Canada, India GSTIN, …) are resolved by body pattern in a documented, deterministic order.
Endpoints
Every route takes a Bearer API key. Validation runs before authentication, so a malformed request never costs you a credit.
| GET | /v1/vat/validate | Validate one VAT/GST number (query: vat). Returns country, scheme, format and checksum result. |
| GET | /v1/vat/countries | List all supported schemes with a real example and whether a checksum is implemented. |
| POST | /v1/vat/batch | Validate up to 50 numbers in one call (body: vats[]), preserving input order. |
Frequently asked
Why does a Greek VAT number start with "EL" instead of "GR"?
Greece is the well-known oddity: its VAT prefix is "EL" (from the Greek "Elláda"), not its ISO 3166 country code "GR". We detect numbers on the EL prefix and report the country as GR, so you get the correct ISO code back regardless of the in-number quirk. Submit "EL094014824" and the result's country field is "GR".
What does "checksum" mean here — is it a live VIES lookup?
No. A checksum is the arithmetic check digit built into the number itself (a mod-11, Luhn or similar algorithm). We verify it offline, with no network call. That is different from a live existence check, where VIES or HMRC confirms a number is actually registered to a trading business today. Format + checksum catches typos, transposed digits and fabricated numbers deterministically; only a live registry can confirm a number is currently active.
Which schemes actually carry a checksum?
Six of the 36 schemes have a published, implemented check-digit algorithm: Netherlands (mod-11 elfproef), Germany (USt mod-11/10), Italy (Partita IVA Luhn), Spain (NIF/CIF), France (the numeric TVA key) and Austria (ATU mod-10). For every other scheme we validate format only. Each response carries checksumChecked and checksumValid so you always know which kind of assurance you got — never assume "valid format" means the check digit passed.
What happens for a valid format with no checksum, like the UK or Belgium?
You get isValidFormat: true, checksumChecked: false and checksumValid: null. The number matches the scheme's structural rules but no check-digit algorithm is run because none is implemented (or, for the alphanumeric French TVA key, none is published). Treat null as "not asserted", not "failed".
How large can a batch be?
POST /v1/vat/batch accepts between 1 and 50 numbers per call (each 2–40 characters) and returns the results in the same order you sent them. Each entry is validated independently, so one malformed number never fails the rest of the batch.
Is this a replacement for VIES?
For format and checksum validation, yes — and a far more reliable one, since we never go down or throttle. For confirming a number is currently registered to a live business (the existence check VIES and HMRC provide), no — that genuinely requires a registry call. The right pattern is to validate format/checksum with us on every submission, then make a live lookup only for the numbers that pass and only when you legally need proof of registration.
More from the almanac
Business Days & Settlement
Settlement-date and SLA-calendar math for 21 market & regional calendars.
Postal Code Validation
Structural postal-code validation for 208 countries — including the 62 that have none.
NAICS Industry Codes
NAICS 2022 lookup, keyword search, and SIC→NAICS crosswalk in one call.
Start building with VAT & GST Validation.
One key unlocks every Almanac API. Free tier, no credit card, deterministic results you can pin in a test.