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/rates

Request Examples

Single Country

Terminal
curl https://api.vatnode.dev/v1/rates/DE

All Countries

Terminal
curl https://api.vatnode.dev/v1/rates

Response

Single Country Response

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

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

FieldTypeDescription
countryCodestringTwo-letter ISO country code
countryNamestringFull country name in English
vatNamestringOfficial local name of the tax (e.g. "Mehrwertsteuer")
vatAbbrstringShort abbreviation (e.g. "MwSt", "TVA", "ALV")
standardRatenumberStandard VAT rate (%)
reducedRatesnumber[]Array of reduced VAT rates (%)
superReducedRatenumber | nullSuper-reduced rate if applicable
parkingRatenumber | nullParking rate if applicable
vatNumberFormatstringHuman-readable VAT number format (e.g. "DE + 9 digits")
vatNumberPatternstringRegex for local VAT number format validation (e.g. "^DE\d9$")
updatedAtstringLast 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.

Request
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: €119

Reverse 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.

Request
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.00

B2C Checkout Total by Country

Calculates final checkout total from subtotal, shipping, and discount using the buyer's country VAT rate.

Request
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.80

Invoice Line-Items VAT Breakdown

Calculates VAT per line item and totals (`subtotal`, `vatTotal`, `grandTotal`) for invoice/PDF generation.

Request
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.19

Caching

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.