Tax & CompliancePhase 2 Live

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"
Response
{
  "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
What it is

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.

§ 01Differentiators

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.

§ 02The surface

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
GET/v1/vat/countries
POST/v1/vat/batch
§ 03Answers

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.

§ 04The portfolio

More from the almanac

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.