# 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