The VAT number format by country
A VAT number starts with the country code, followed by a number whose form depends on the country. The API checks the format and, where the country provides one, the check digit, before any lookup.
| Country | Format | Example |
|---|---|---|
| France | FR + 2 check characters + SIREN (9 digits) | FR14652014051 |
| Belgium | BE + company number (10 digits) | BE0417497106 |
| Switzerland | UID number followed by MWST, TVA or IVA | CHE-105.909.036 TVA |
| Norway | NO + organisation number + MVA | - |
| Finland | FI + 8 characters of the Y-tunnus | - |
| Latvia | LV + 11 digits | - |
| Sweden | SE + organisation number (10 digits) + 01 | SE556042722001 |
| Estonia | EE + 9 digits | EE100210460 |
| Lithuania | LT + 9 digits | LT110053842 |
In France, the check digits are calculated from the SIREN: (12 + 3 × (SIREN modulo 97)) modulo 97. For SIREN 652014051, the remainder is 14 and the number is FR14652014051. Switzerland is not a member of the European Union and the United Kingdom has left it: their numbers are not intra-EU numbers, and the United Kingdom is not supported for VAT. For more on the formats, see Intra-EU VAT number: format and verification.
Valid or invalid: the result returned
The GET /v2/validate route checks the VAT number alone or together with the customer's SIREN or SIRET. It responds 200 even when the number is invalid: the valid field is true only if all checks pass, and checks details each one.
| VAT status | Meaning |
|---|---|
valid | The number is registered. |
invalid | The number is not registered: the vat_registered check fails. |
pending | Verification is in progress: try again a few seconds later. |
not_verified, unavailable | Verification did not complete. It does not make the validation fail, and you can run it again. |
The other checks useful for invoicing are vat_format (well-formed number), identifiers_match (the SIREN, SIRET and VAT number designate the same company) and company_active (the company is not closed).
Example request and response
curl "https://api.jsonpage.com/v2/validate?vat=FR14652014051" \
-H "X-API-Key: $JSONPAGE_API_KEY"
{
"data": {
"valid": true,
"checks": [
{ "code": "vat_format", "ok": true, "value": "FR14652014051" },
{ "code": "company_exists", "ok": true, "value": "FR-652014051" },
{ "code": "company_active", "ok": true, "value": "active" },
{ "code": "vat_registered", "ok": true, "value": "valid" }
],
"company": {
"id": "FR-652014051",
"name": "CARREFOUR",
"status": "active",
"vat": { "number": "FR14652014051", "status": "valid", "checked_at": "..." },
"...": "..."
}
}
}
Abridged response: the basic fields of the record are omitted. To read only the VAT block of a record, add ?include=vat to GET /v2/companies/{id}.
In JavaScript
const url = "https://api.jsonpage.com/v2/validate?vat=" + encodeURIComponent("FR14652014051");
const res = await fetch(url, { headers: { "X-API-Key": process.env.JSONPAGE_API_KEY } });
const { data } = await res.json();
if (!data.valid) console.log(data.checks.filter((c) => !c.ok));
In Python
import os, requests
res = requests.get(
"https://api.jsonpage.com/v2/validate",
params={"vat": "FR14652014051"},
headers={"X-API-Key": os.environ["JSONPAGE_API_KEY"]},
)
data = res.json()["data"]
print(data["valid"], [c for c in data["checks"] if not c["ok"]])
Invoicing use cases
- Intra-EU delivery. VAT exemption requires a valid number for the customer: verify it before issuing the invoice.
- Creating a customer or supplier. Check the VAT number and SIREN entered, then prefill the name and address from the record.
- Paying a supplier invoice. Check that the VAT number really belongs to the payee and that the company is active.
- Ongoing tracking. Monitoring notifies you by webhook when a company closes or enters insolvency proceedings.
For a full customer file, the customer file cleanup offer checks every line without any code.
Pricing and limits
Discovery at €0, Standard at €19 excl. VAT per month, Pro at €129 excl. VAT per month, with 100, 1,000 and 10,000 requests per minute and 1,000 requests per day. Fixed price, no credits, no overage billed. See the pricing.
Frequently asked questions
How do I verify an intra-EU VAT number through an API?+
Call GET /v2/validate with the vat parameter. The response tells you whether the number is well formed, whether the company exists and is active, and the status of the number (valid, invalid or pending).
Which countries are supported for VAT?+
France, Belgium, Switzerland, Norway, Finland, Latvia, Sweden, Estonia and Lithuania. British numbers are not supported.
What does the pending status mean?+
Verification of the number has not completed yet. Try again a few seconds later.
Can I verify a VAT number from the SIREN?+
Yes. In France, the VAT number is calculated from the SIREN, and the API then checks that it is registered. Send the SIREN and the VAT number together to check that they designate the same company.
Is each VAT verification billed individually?+
No. Fixed price, no credits, no overage billed. The rate is limited per minute depending on the plan, and no verification is deducted from a credit balance.
Going further
- SIRENSIREN and SIRET APICompany record, search by name, autocomplete and validation.
- DOCUMENTATIONValidation in the documentationEvery check of the validation route, one by one.
- GUIDEIntra-EU VAT number: format and verificationWhat the number is for, common errors and the details to show on the invoice.