# VAT Rates
VAT rates of the 27 EU member states and the United Kingdom: the standard rate, reduced, super-reduced and parking rates, regional rates, and the goods and services each reduced rate covers, with their CN (goods) and CPA (services) codes as the member states report them. Rates are kept per period, so you can ask for any date.
The EU rates come from the European Commission's Taxes in Europe Database (TEDB) (opens new window), imported every day, including changes the member states announced for the next 90 days. TEDB does not cover the UK: its rates are kept by hand from HMRC's guidance (opens new window) and marked as such (source.id is manual).
The rates are reference data, not tax advice: TEDB's data is supplied by the member states "for information", and a rate can depend on details a category does not capture.
# Get the rates of a country
Request Method: GET
Request URL: https://api.vatcheckapi.com/v2/rates?country_code=[[ country_code ]]
| Parameter | Type | Mandatory | Description |
|---|---|---|---|
apikey | string | ️ | Your API Key |
country_code | string | ️ | An EU member state's VAT prefix (Greece: EL, GR is accepted) or GB. Case does not matter. Not needed with ip |
ip | string | Instead of country_code: an IPv4 or IPv6 address; the rates are those of the country it is located in, for example your customer's (the same location data as ipbase.com (opens new window)). An address outside the EU and the UK, or without a known location, fails with a 422 | |
as_of | string | The date the rates are for, YYYY-MM-DD. Default: today (UTC). A date before the earliest rates we hold for the country fails with a 422 |
# Sample Request
curl -G https://api.vatcheckapi.com/v2/rates \
-d country_code=AT \
-H "apikey: YOUR-APIKEY"
# Sample Response
{
"country_code": "AT",
"as_of": "2026-10-17",
"valid_from": "2026-07-01",
"valid_to": null,
"standard_rate": 20.0,
"reduced_rates": [10.0, 13.0],
"super_reduced_rates": [4.9],
"parking_rates": [],
"regional_rates": [
{ "rate": 19.0, "comment": "Jungholz, Mittelberg" }
],
"rates": [
{
"type": "super_reduced",
"rate": 4.9,
"category": "FOODSTUFFS",
"category_description": "Foodstuffs (including beverages but excluding alcoholic beverages) for human and animal consumption; ...",
"cn_codes": [
{ "code": "0401 10", "description": "Of a fat content, by weight, not exceeding 1 %" }
],
"cpa_codes": null,
"comment": "From July 1, 2026, the tax rate of 4.9% applies to the foodstuffs listed in Annex 3 to Sec. 10 of the Austrian VAT Act 1994. ..."
},
{
"type": "standard",
"rate": 20.0,
"category": null,
"category_description": null,
"cn_codes": null,
"cpa_codes": null,
"comment": null
}
],
"source": {
"id": "tedb",
"name": "European Commission, Taxes in Europe Database (TEDB)",
"url": "https://ec.europa.eu/taxation_customs/tedb/",
"licence": "CC BY 4.0",
"attribution": "European Commission TEDB, CC BY 4.0"
},
"last_updated": "2026-10-17T04:40:00Z"
}
# Response Fields
| Field | Description |
|---|---|
country_code | The country (EL for Greece) |
as_of | The date the rates are for |
valid_from | Since when this set of rates applies, as the member state reports it to TEDB (the date of its latest change) |
valid_to | The last day this set applies, when a change is announced; null otherwise |
standard_rate | The standard rate in percent |
reduced_rates | The distinct reduced rates, lowest first (regional rates not included) |
super_reduced_rates | The distinct super-reduced rates (below 5 %) |
parking_rates | The distinct parking rates |
regional_rates | Rates for particular regions (rate, comment naming the regions) |
rates | Every rate with what it applies to, see below |
source | Where the rates come from: id (tedb or manual), name, url, licence and the attribution to show when you republish them |
last_updated | When we last got these rates from the source (UTC) |
Each item of rates:
| Field | Description |
|---|---|
type | standard, reduced, super_reduced, parking, exempted (0 %, exempt with the right to deduct, often called zero-rated), not_applicable or out_of_scope |
rate | The rate in percent |
category | TEDB's category, e.g. FOODSTUFFS, ACCOMMODATION, REGION; null for the standard rate |
category_description | The category as the VAT Directive's Annex III describes it |
cn_codes | The goods the rate applies to, as Combined Nomenclature codes (code, description), or null |
cpa_codes | The services the rate applies to, as CPA codes, or null |
comment | The member state's note, as plain text, or null |
A category can appear more than once with different rates: the CN codes and the comment say which goods each rate covers.
# Work out a price
Request Method: GET
Request URL: https://api.vatcheckapi.com/v2/rates/price?country_code=[[ country_code ]]&amount=[[ amount ]]
Takes the parameters of /v2/rates (country_code or ip, and as_of) and:
| Parameter | Type | Mandatory | Description |
|---|---|---|---|
amount | string | ️ | The amount, at least 0, with at most two decimals (100, 99.95). The currency does not matter |
amount_type | string | net (default): the amount is without VAT. gross: the amount includes VAT | |
rate_type | string | standard (default), reduced, super_reduced or parking | |
category | string | The TEDB category to take the rate of, e.g. ACCOMMODATION. Needed when the country has several rates of the rate_type |
curl -G https://api.vatcheckapi.com/v2/rates/price \
-d country_code=AT -d amount=99.99 -d amount_type=gross \
-H "apikey: YOUR-APIKEY"
{
"country_code": "AT",
"as_of": "2026-10-17",
"rate_type": "standard",
"category": null,
"rate": 20.0,
"amount_type": "gross",
"net_amount": 83.33,
"vat_amount": 16.66,
"gross_amount": 99.99,
"valid_from": "2026-07-01",
"source": { "id": "tedb", "name": "European Commission, Taxes in Europe Database (TEDB)", "url": "https://ec.europa.eu/taxation_customs/tedb/", "licence": "CC BY 4.0", "attribution": "European Commission TEDB, CC BY 4.0" },
"last_updated": "2026-10-17T04:40:00Z"
}
The VAT of a net amount, and the net of a gross amount, are rounded half up to two decimals; the third amount is the difference, so net plus VAT is always the gross amount.
If the country has several rates of the rate_type (Austria has reduced rates of 10 % and 13 %) and category does not pick one, or has none, the answer is a 422 naming the rates. Some categories have several rates for different goods (Austria's FOODSTUFFS): use /v2/rates and the CN codes to find the right one.
# Download the whole table
Request Method: GET
Request URL: https://api.vatcheckapi.com/v2/rates/table?format=[[ json|csv ]]
Every country's rates on as_of (default: today) in one download, free (X-Cost: 0). format=json (default) returns as_of, an attribution and countries, a list of /v2/rates answers. format=csv returns one row per rate:
country_code,valid_from,valid_to,type,rate,category,category_description,cn_codes,cpa_codes,comment,source,last_updated
AT,2026-07-01,,reduced,10,FOODSTUFFS,"Foodstuffs (including ...",0401 0402 ...,,"Annex 1 to Sec. 10 ...","European Commission TEDB, CC BY 4.0",2026-10-17T04:40:00Z
In the CSV, codes are separated by spaces and written without inner spaces (040110).
When you republish the EU rates, name the source: "European Commission TEDB, CC BY 4.0" (the source.attribution of each country).
# Cost
| Request | Cost |
|---|---|
/v2/rates, /v2/rates/price | 1 |
/v2/rates/table | 0 |
422 (invalid parameters, a date before our data, an IP address outside the EU and the UK, an ambiguous rate) and 503 | 0 |
Sandbox keys (opens new window) get the real rates at no cost (X-Cost: 0): the same data as the free table download.
# Errors
| Status | When |
|---|---|
422 | country_code and ip are both missing, country_code is not an EU member state or GB, ip is not an IP address or is located elsewhere, as_of is not YYYY-MM-DD or before the earliest rates we hold, amount is not a number with at most two decimals, amount_type or rate_type is unknown, or the rate is ambiguous or missing (/v2/rates/price) |
503 | We hold no rates for the country (the import has not run yet), or the IP address lookup failed. Not billed |