VAT Rates
Get current VAT rates for 45 European countries (EU-27 + Norway, Switzerland, UK, and others). This endpoint is free and does not require an API key.
FREE: This endpoint is free to use and does not require an API key.
Endpoints
Get Rates for a Country
GET /v1/rates/{countryCode}Get All Rates
GET /v1/ratesRequest Examples
Single Country
curl https://api.vatnode.dev/v1/rates/DEAll Countries
curl https://api.vatnode.dev/v1/ratesResponse
Single Country Response
{
"countryCode": "DE",
"countryName": "Germany",
"vatName": "Mehrwertsteuer",
"vatAbbr": "MwSt",
"standardRate": 19,
"reducedRates": [7],
"superReducedRate": null,
"parkingRate": null,
"vatNumberFormat": "DE + 9 digits",
"vatNumberPattern": "^DE\d{9}$",
"updatedAt": "2026-03-27"
}All Countries Response
{
"rates": [
{
"countryCode": "AT",
"countryName": "Austria",
"vatName": "Umsatzsteuer",
"vatAbbr": "USt",
"standardRate": 20,
"reducedRates": [19, 13, 10],
"superReducedRate": null,
"parkingRate": null,
"vatNumberFormat": "ATU + 8 digits",
"vatNumberPattern": "^ATU\d{8}$",
"updatedAt": "2026-03-27"
},
// ... 43 more countries
],
"count": 44
}Response Fields
| Field | Type | Description |
|---|---|---|
| countryCode | string | Two-letter ISO country code |
| countryName | string | Full country name in English |
| vatName | string | Official local name of the tax (e.g. "Mehrwertsteuer") |
| vatAbbr | string | Short abbreviation (e.g. "MwSt", "TVA", "ALV") |
| standardRate | number | Standard VAT rate (%) |
| reducedRates | number[] | Array of reduced VAT rates (%) |
| superReducedRate | number | null | Super-reduced rate if applicable |
| parkingRate | number | null | Parking rate if applicable |
| vatNumberFormat | string | Human-readable VAT number format (e.g. "DE + 9 digits") |
| vatNumberPattern | string | Regex for local VAT number format validation (e.g. "^DE\d9$") |
| updatedAt | string | Last update timestamp |
Code Examples
Calculate VAT
VAT calculation examples for the same request in multiple languages. cURL is intentionally omitted because it is great for fetching data, but not for arithmetic in application code.
async function getVatRate(countryCode) {
const response = await fetch(`https://api.vatnode.dev/v1/rates/${countryCode}`);
if (!response.ok) throw new Error('Failed to fetch VAT rate');
return response.json();
}
// Calculate VAT
const rate = await getVatRate('DE');
const netPrice = 100;
const vatAmount = netPrice * (rate.standardRate / 100);
const grossPrice = netPrice + vatAmount;
console.log(`Net: €${netPrice}, VAT: €${vatAmount}, Gross: €${grossPrice}`);
// Output: Net: €100, VAT: €19, Gross: €119Reverse VAT (Gross to Net)
Useful when your input price already includes VAT and you need to extract net amount plus VAT for invoices and accounting.
async function getVatRate(countryCode) {
const response = await fetch(`https://api.vatnode.dev/v1/rates/${countryCode}`);
if (!response.ok) throw new Error('Failed to fetch VAT rate');
return response.json();
}
// Reverse VAT (gross -> net + VAT)
const rate = await getVatRate('DE');
const grossPrice = 119;
const netPrice = grossPrice / (1 + rate.standardRate / 100);
const vatAmount = grossPrice - netPrice;
console.log(`Gross: €${grossPrice}, Net: €${netPrice.toFixed(2)}, VAT: €${vatAmount.toFixed(2)}`);
// Output: Gross: €119, Net: €100.00, VAT: €19.00B2C Checkout Total by Country
Calculates final checkout total from subtotal, shipping, and discount using the buyer's country VAT rate.
async function getVatRate(countryCode) {
const response = await fetch(`https://api.vatnode.dev/v1/rates/${countryCode}`);
if (!response.ok) throw new Error('Failed to fetch VAT rate');
return response.json();
}
// B2C checkout total
const rate = await getVatRate('FR');
const subtotal = 89;
const shipping = 10;
const discount = 5;
const taxableAmount = subtotal + shipping - discount;
const vatAmount = taxableAmount * (rate.standardRate / 100);
const total = taxableAmount + vatAmount;
console.log(`Taxable: €${taxableAmount}, VAT: €${vatAmount.toFixed(2)}, Total: €${total.toFixed(2)}`);
// Output: Taxable: €94, VAT: €18.80, Total: €112.80Invoice Line-Items VAT Breakdown
Calculates VAT per line item and totals (`subtotal`, `vatTotal`, `grandTotal`) for invoice/PDF generation.
async function getVatRate(countryCode) {
const response = await fetch(`https://api.vatnode.dev/v1/rates/${countryCode}`);
if (!response.ok) throw new Error('Failed to fetch VAT rate');
return response.json();
}
// Invoice line-items VAT breakdown
const rate = await getVatRate('ES');
const items = [
{ description: 'Pro Plan', qty: 1, unitPrice: 79 },
{ description: 'Onboarding', qty: 2, unitPrice: 30 },
];
const lines = items.map((item) => {
const net = item.qty * item.unitPrice;
const vat = net * (rate.standardRate / 100);
const gross = net + vat;
return { ...item, net, vat, gross };
});
const subtotal = lines.reduce((sum, line) => sum + line.net, 0);
const vatTotal = lines.reduce((sum, line) => sum + line.vat, 0);
const grandTotal = subtotal + vatTotal;
console.log({ lines, subtotal, vatTotal, grandTotal });
// Output: subtotal: €139, vatTotal: €29.19, grandTotal: €168.19Caching
VAT rates change infrequently. We recommend caching rates on your end for at least 24 hours to minimize API calls.
Data Source
VAT rates are sourced from the European Commission Taxes in Europe Database (TEDB) via its official SOAP web service, checked daily and updated automatically when rates change.
Prefer a zero-dependency solution? If you only need VAT rates (not validation), check out our eu-vat-rates-data — a free, open-source package available for JavaScript/TypeScript, Python, PHP, Go, and Ruby. Rates are bundled directly in the package and updated daily via GitHub Actions.