One endpoint.
Thirty-two countries.
Validate any VAT number against the relevant official registry. Returns company name, address, VAT rates, and a consultation ID auditors accept as proof.
One call, one parameter.
GET /v1/validate with a bearer token. The API handles normalisation, retries, and routing to the correct registry.
curl "https://api.vatverify.dev/v1/validate?vat_number=IE6388047V" \ -H "Authorization: Bearer $VATVERIFY_API_KEY"import { Vatverify } from "@vatverify/node"const vatverify = new Vatverify()const { data, meta } = await vatverify.validate({ vat_number: "IE6388047V",})data.valid // truedata.company?.name // "GOOGLE IRELAND LIMITED"data.country.vat?.standard_rate // 23meta.source // "vies"meta.cached // falseSee the full endpoint schema: GET /v1/validate 路 POST /v1/validate/batch.
vat_numberstringrequiredFull VAT number with country prefix. Spaces, dots, and casing normalised automatically.
cachebooleanoptionalDefaults to true. Pass false to bypass the 30-day cache and force a fresh registry lookup.
requester_vat_numberstringoptionalYour own VAT number. When present, VIES returns a consultation ID under verify_id that tax auditors accept as proof of verification.
Same shape, every registry.
Business payload under data, operational metadata under meta. VIES, HMRC, BFS, and Brreg all normalised to this envelope.
{ "data": { "valid": true, "vat_number": "IE6388047V", "country": { "code": "IE", "name": "Ireland", "vat": { "standard_rate": 23, "reduced_rates": [9, 13.5], "currency": "EUR", "number_format": "IE + 7 digits + 1-2 letters" } }, "company": { "name": "GOOGLE IRELAND LIMITED", "address": "3RD FLOOR GORDON HOUSE, BARROW STREET, DUBLIN 4" }, "verify_id": null, "verified_at": "2026-04-21T09:14:29.451Z" }, "meta": { "request_id": "0190f8ea-a5b2-7000-a123-000000000000", "latency_ms": 694, "cached": false, "source": "vies", "source_status": "live" } }
Standard rate, reduced rates, currency, and number-format regex. Ready for invoicing.
VIES consultation ID when you pass requester_vat_number. Tax auditors accept it as proof.
Which registry answered: vies, hmrc, bfs, or brreg.
Up to 50 at once. One roundtrip.
POST /v1/validate/batch fans out per country to the correct registry in parallel. Results come back in request order.
const { data, meta } = await vatverify.validateBatch({ vat_numbers: [ "IE6388047V", "DE811569869", "FR44732829320", "GB727255821", ],})data.summary // { total: 4, successful: 4, failed: 0 }data.results // ordered same as input; each { ok, data? | error? }Every country, one shape.
Coverage maps exactly to government registries. No scrapers, no proxies, no intermediaries.
See the full reference.
Endpoint schema, error codes, SDK examples, and every edge case documented.