EU VAT rates by commodity code
Which VAT rate applies to this product in that country, keyed to the same CN and CPA commodity codes your customs paperwork already uses. 2,667 codes, all 27 member states, rebuilt daily from the European Commission's own database.
Why this exists
Published VAT tables give you a country's standard rate and its reduced rates. They do not tell you which goods each reduced rate covers, and that is the part that costs money. Two countries can both have a 10% reduced rate that applies to entirely different things. Undercharge VAT and you cannot recover it from the customer: the shortfall comes out of your margin, with interest on top.
The Commission publishes this mapping. It is not published anywhere as open, machine-readable data. Now it is.
Use it
# every rate for one commodity code, across the EU
curl https://humora2504.github.io/eu-vat-by-commodity-code/data/by-code/4901.json
# everything one country charges
curl https://humora2504.github.io/eu-vat-by-commodity-code/data/by-country/DE.json
# the whole dataset
curl https://humora2504.github.io/eu-vat-by-commodity-code/data/all.json
2,667 commodity codes
CN codes for goods, CPA codes for services, exactly as the member states report them.
1,120 rate rows
Across 27 member states, with the category each rate belongs to.
958 official comments
The member states' own legal notes, in their own words, not a summary.
Rebuilt daily
A scheduled job refetches and commits only when something actually changed, so the git history is the changelog.
Browse a few
What this is not
It is not tax advice, and it is not a substitute for your own verification. It is the Commission's data, reshaped so a machine can read it. Rates change; the situation date is on every page and in every file. If a filing depends on it, check with your tax authority.
Free, and when it is not
The dataset is free under CC BY 4.0 and always will be: it is public data and it is not ours to withhold. What is sold is a commercial licence for embedding it in a product, which buys you a stable schema, a change feed and someone to answer when the Commission moves the endpoint. If you are looking something up by hand, you need none of that.