Canonical data source — VAT rates for 45 European countries, including all EU-27 member states plus Norway, Switzerland, the United Kingdom, and more. Sourced from the European Commission TEDB (EU rates) and supplemented with non-EU European countries. Checked daily, committed automatically when rates change.
This repository contains only the data and the update script. Language-specific packages are published separately:
| Language | Package | Install |
|---|---|---|
| JavaScript / TypeScript | npm | npm install eu-vat-rates-data |
| Python | PyPI | pip install eu-vat-rates-data |
| PHP | Packagist | composer require vatnode/eu-vat-rates-data |
| Go | pkg.go.dev | go get github.com/vatnode/eu-vat-rates-data-go |
| Ruby | RubyGems | gem install eu_vat_rates_data |
No package needed — use the JSON directly via CDN:
# jsDelivr CDN (cached):
https://cdn.jsdelivr.net/gh/vatnode/eu-vat-rates-data@main/data/eu-vat-rates-data.json
# Raw GitHub (always latest commit):
https://raw.githubusercontent.com/vatnode/eu-vat-rates-data/main/data/eu-vat-rates-data.json
const res = await fetch(
'https://cdn.jsdelivr.net/gh/vatnode/eu-vat-rates-data@main/data/eu-vat-rates-data.json'
)
const { rates } = await res.json()
console.log(rates.DE.standard) // 19interface VatRate {
country: string // "Finland"
currency: string // "EUR" (or "DKK", "GBP", …)
eu_member: boolean // true for EU-27, false for non-EU
vat_name: string // "Arvonlisävero" — official name in primary local language
vat_abbr: string // "ALV" — short abbreviation used locally
standard: number // 25.5
reduced: number[] // [10, 13.5] — sorted ascending
super_reduced: number | null // null when not applicable
parking: number | null // null when not applicable
format: string // "FI + 8 digits" — human-readable VAT number format
pattern: string // "^FI\\d{8}$" — regex for format validation, always present
}{
"version": "2026-03-31",
"source": "European Commission TEDB",
"rates": {
"FI": {
"country": "Finland",
"currency": "EUR",
"eu_member": true,
"vat_name": "Arvonlisävero",
"vat_abbr": "ALV",
"standard": 25.5,
"reduced": [10, 13.5],
"super_reduced": null,
"parking": null,
"format": "FI + 8 digits",
"pattern": "^FI\\d{8}$"
}
}
}- Fetched from EC TEDB SOAP API: daily at 07:00 UTC
- Committed on every run (version date always updated)
- Full audit trail:
git log -- data/eu-vat-rates-data.json
To run locally:
git clone https://github.com/vatnode/eu-vat-rates-data.git
pip install requests
python3 scripts/update.pyThe JSON in this repository is updated automatically — use it directly via CDN if you need always-current data without any setup:
https://cdn.jsdelivr.net/gh/vatnode/eu-vat-rates-data@main/data/eu-vat-rates-data.json
https://raw.githubusercontent.com/vatnode/eu-vat-rates-data/main/data/eu-vat-rates-data.json
Language-specific packages bundle a snapshot of this data at publish time. A new package version is released automatically whenever rates change, but installed packages do not update themselves. If you use a package and need rates to stay current, set up Renovate or Dependabot — they will open a PR automatically when a new version is published.
EU-27 (daily auto-updates via EC TEDB):
AT BE BG CY CZ DE DK EE ES FI FR GR HR HU IE IT LT LU LV MT NL PL PT RO SE SI SK
Non-EU Europe (manually maintained):
AD AL BA CH GB GE IS LI MC MD ME MK NO RS TR UA XK
45 countries total.
This repository provides VAT rates only. If you also need to validate EU VAT numbers against the official VIES database, check out vatnode.dev — a simple REST API with a free tier.
- fix: Corrected Sweden (SE) VAT number regex — was
^SE\d{12}$, now correctly requires the mandatory01suffix:^SE\d{10}01$.
MIT
If you find this useful, a ⭐ on GitHub is appreciated.