VAT rates
VerifNow publishes the VAT rates of the 27 EU member states, retrieved every day from the European Commission’s Taxes in Europe Database (TEDB), the official source the member states feed themselves.
It is public reference data: no API key, and no quota spent.
GET https://api.verifnow.io/api/v1/vat/rates/FR{
"countryCode": "FR",
"standardRate": 20,
"reducedRates": [2.1, 5.5, 10],
"regionalRates": [
{ "rate": 0.9, "note": "For Corsica: 0.9% on sales of live animals to non-sujected to VAT entities, and on the first performances or circus." },
{ "rate": 1.05, "note": "The super reduced rate in Martinique, Guadeloupe and Réunion is 1.05% (for the press)." },
{ "rate": 8.5, "note": "The standard VAT rate in Martinique, Guadeloupe and Réunion is 8.5%. …" },
{ "rate": 13, "note": "For Corsica: rate of 13% on oil products; 10% on construction works, …" }
],
"situationOn": "2026-07-01",
"fetchedAt": "2026-09-23T02:52:37Z"
}GET /api/v1/vat/rates returns every member state at once, under rates, with source: "TEDB".
These are the rates a member state has, not the rate an invoice carries. Which one applies depends on who sells to whom, where, and what. In B2B trade between member states the invoice is usually zero-rated under the reverse charge, whatever the buyer’s country rate is — multiplying the amount by the buyer’s standard rate is wrong in exactly the case a VAT number is collected for. Validating an EU B2B checkout walks through the decision.
The fields
| Field | Meaning |
|---|---|
countryCode | The member state, as TEDB and VIES name it. Greece is EL; GR is accepted in the path. |
standardRate | The national standard rate. |
reducedRates | Every reduced, super-reduced and parking rate on the mainland territory, ascending. Which one applies depends on the product. |
regionalRates | Rates that apply to part of the territory only, each with TEDB’s own note saying where. |
situationOn | The date TEDB says these rates apply from. |
fetchedAt | When VerifNow last retrieved them from TEDB. |
Why the reduced rates are one list
TEDB files each reduced rate under a sub-label — reduced, super-reduced, parking — but the labels
disagree between member states: 8 % is filed as super-reduced in Luxembourg and Poland, 13 % as a
parking rate in Greece. reducedRates is therefore one sorted list, which is correct as a set,
rather than a set of labels that are not.
Why regional rates are apart
TEDB mixes them into the national rows. Left there, France would appear to have rates of 0.9 %, 1.05 %, 8.5 % and 13 % — which apply in Corsica and the overseas departments, never to a customer on the mainland. The same goes for Madeira (22 %) and the Azores (16 %) in Portugal, Jungholz and Mittelberg in Austria, some Aegean islands in Greece, and the Canary Islands (7 %) in Spain.
Two of these are outside the EU VAT area. The VAT Directive does not apply to the Canary Islands or to the French overseas territories of Article 349 TFEU — Guadeloupe, French Guiana, Martinique, Mayotte, Réunion, Saint-Martin (Article 6(1) ). They are “third territories” for VAT, so goods shipped there from another member state leave the Community: an export, not an intra-EU distance sale. The 8.5 % and 1.05 % TEDB lists for the French overseas departments, and the 7 % for the Canary Islands, are local rates, not rates you charge through the OSS. Corsica, Madeira, the Azores, Jungholz and Mittelberg, and the Aegean islands are inside the EU VAT area.
What is not there
- A 0 % rate. TEDB lists exemptions with a value of 0; they are exemptions, not rates, and are left out.
- The rate for a product. Mapping a product to its rate needs the product’s classification in each member state, and is a tax engine’s job.
- Countries outside the union. TEDB covers the 27 member states. The United Kingdom, Norway and
Switzerland answer
404.
Freshness
TEDB is read once a day, after midnight in Brussels, when a new rate takes effect. If TEDB is
unavailable, the previous rates keep being served: fetchedAt shows how old they are, rather than
the response pretending to be current.
situationOn is TEDB’s own date and varies by member state — some have not had a change for a
while, and show a date in an earlier year. Responses are cacheable for an hour.
From the SDKs
import { VerifNow } from '@verifnow/sdk';
const client = new VerifNow({ apiKey: process.env.VERIFNOW_API_KEY! });
const france = await client.vatRate('FR');
france.standardRate; // 20
france.reducedRates; // [2.1, 5.5, 10]
const all = await client.vatRates(); // all.rates: one entry per member stateCountryVatRates france = client.vatRate("FR");
VatRates all = client.vatRates();Needs @verifnow/sdk 1.8.0 or later, or io.verifnow:verifnow-spring 2.8.0 or later. In Java,
unlike validation, the rate calls never fail open: there is no safe default for a tax rate, so an
unreachable API is thrown whatever failOnError says.
Errors
| Status | When |
|---|---|
404 | The code is not an EU member state — e.g. Not an EU member state: US. VAT rates are published for the 27 member states; Greece is EL. |
503 | No rates have been retrieved yet. Rates are stored once read, so this only happens on a service that has never reached TEDB. Retry. |
Next steps
- Validate VAT — whether a VAT number is registered, with a VIES receipt
- Validating an EU B2B checkout — reverse charge or charge VAT