ATverify
API referenceValidation

Validate a VAT number

Validate a VAT number against the appropriate upstream service (VIES, HMRC, BFS, or BRREG) and return the validity status, company details, and VAT metadata for the country.

Input is normalized automatically — spaces, dots, and casing are handled for you ("de 811.569.869" → "DE811569869").

Results are cached for 30 days. Cached responses include `meta.cached: true`; `data.verified_at` always reflects the original registry fetch time. Pass `cache=false` to bypass the cache and force a fresh lookup from the upstream service.

Try it live
playground
Query

30 requests per hour per IP · demo key used automatically

Auth
Requires the Authorization: Bearer <api_key> header. Use a vtv_live_* key in production or a vtv_test_* key for deterministic magic-number responses.

Query parameters

vat_numberrequiredstring · min 4

Full VAT number with country prefix. Spaces, dots, and casing are handled automatically ("de 811.569.869" → "DE811569869"). Norwegian registrations use the "NO" prefix even though the underlying 9-digit number has no prefix in Brønnøysund.

example DE811569869
cacheenum

Set to `false` to bypass the 30-day cache and force a fresh upstream lookup. Defaults to `true`.

example true
requester_vat_numberstring · min 4

Your own VAT number. When provided, the response includes a `data.verify_id` — the official consultation identifier emitted by VIES (or HMRC, when supported). These calls bypass the cache since the verify_id is specific to each consultation.

example DE100000001
200

Response

Validation result

datarequiredobject
data.validrequiredboolean

Whether the VAT number is registered and active according to the upstream registry.

example true
data.vat_numberrequiredstring

The normalized VAT number — uppercased, stripped of spaces/dots/dashes, with country prefix.

example IE6388047V
data.countryrequiredobject

Country derived from the VAT prefix, with VAT metadata useful for invoicing and client-side validation.

data.country.coderequiredstring

Two-letter ISO-3166 country code extracted from the VAT prefix.

example IE
data.country.namerequiredstring

Full English country name.

example Ireland
data.country.vatrequiredobject | null

VAT metadata for this country (rates, currency, number format). Null when we have no data for the country (currently XI, LI).

data.country.vat.namerequiredstring

Official local name of the tax (e.g. "Arvonlisävero", "Mehrwertsteuer", "TVA").

example Value Added Tax
data.country.vat.abbreviationrequiredstring

Short abbreviation used in invoices and official docs (e.g. "VAT", "MwSt", "TVA", "IVA").

example VAT
data.country.vat.currencyrequiredstring

ISO 4217 currency code used when invoicing in this country.

example EUR
data.country.vat.standard_raterequirednumber

Standard VAT rate applied to most goods and services, in percent.

example 23
data.country.vat.reduced_ratesrequiredarray<number>

Reduced VAT rates applied to specific categories (food, medicine, books, etc). Empty array when the country has no reduced rate.

example [9,13.5]
data.country.vat.super_reduced_raterequirednumber | null

Super-reduced rate for essential items, where applicable (currently CY, ES, FR, IT, LU, PT). Null for countries that do not use one.

example 4.8
data.country.vat.parking_raterequirednumber | null

Transitional "parking" rate for items that previously qualified for a reduced rate. Null for most countries.

example 13.5
data.country.vat.number_formatrequiredstring

Human-readable description of the VAT number format for this country.

example IE + 7 digits + 1-2 letters
data.country.vat.number_patternrequiredstring

Regex pattern for client-side format validation before hitting the API. Matches the normalized (uppercased, stripped) VAT string.

example ^IE\d{7}[A-Z]{1,2}$
data.country.vat.updated_atrequiredstring

ISO date when the VAT metadata for this country was last reviewed.

example 2026-04-01
data.companyrequiredobject | null

Company details returned by the upstream registry. Null when `valid: false` or when the registry does not publish company info (e.g. Germany).

data.company.namestring | null

Registered legal name of the company as reported by the upstream registry. Null when the registry does not publish a name (Germany, Spain, Austria suppress disclosure under national privacy policy via VIES).

example GOOGLE IRELAND LIMITED
data.company.addressstring | null

Registered address of the company. Null when the registry does not publish an address.

example 3RD FLOOR GORDON HOUSE, BARROW STREET, DUBLIN 4
data.verify_idrequiredstring | null

Official verification identifier emitted by the upstream registry (VIES consultation number / HMRC check reference). Populated when `requester_vat_number` is provided and the source supports it; null otherwise. Tax auditors accept this as proof of a valid query.

example WAPIAAAAA1BBB2
data.verified_atrequiredstring

ISO 8601 timestamp of when the VAT number was fetched from the registry. For cached responses this is the original fetch time, not the current request time.

example 2026-04-14T15:42:03.451Z
metarequiredobject
meta.request_idrequiredstring

UUID v7 identifying this specific HTTP request. Include it in any support ticket so we can trace the call in our logs.

example 0190f8ea-a5b2-7000-a123-000000000000
meta.latency_msrequiredinteger

Total server-side processing time in milliseconds, from request received to response sent.

example 694
meta.cachedrequiredboolean

Whether this response was served from the 30-day cache instead of a fresh registry fetch. Cached hits do not count toward your monthly quota.

example false
meta.sourcerequiredstring

Which official registry produced this result. `vies` for EU-27 + XI, `hmrc` for GB, `bfs` for CH/LI, `brreg` for NO.

one of"vies""hmrc""bfs""brreg""bzst"
meta.source_statusrequiredstring

Upstream data source reliability. `live` = confirmed fresh registry response. `cached` = served from the 30-day cache. `degraded` = result may be unreliable (reserved for future expansion).

one of"live""cached""degraded"

Error responses

400Invalid request
401Missing or invalid API key
404Test-mode VAT not in magic fixtures
429Rate limit exceeded
502Upstream registry unavailable
import { Vatverify } from '@vatverify/node';
const client = new Vatverify();

const result = await client.validate();
{
  "data": {
    "valid": true,
    "vat_number": "IE6388047V",
    "country": {
      "code": "IE",
      "name": "Ireland",
      "vat": {
        "name": "Value Added Tax",
        "abbreviation": "VAT",
        "currency": "EUR",
        "standard_rate": 23,
        "reduced_rates": [
          9,
          13.5
        ],
        "super_reduced_rate": 4.8,
        "parking_rate": 13.5,
        "number_format": "IE + 7 digits + 1-2 letters",
        "number_pattern": "^IE\\d{7}[A-Z]{1,2}$",
        "updated_at": "2026-04-01"
      }
    },
    "company": {
      "name": "GOOGLE IRELAND LIMITED",
      "address": "3RD FLOOR GORDON HOUSE, BARROW STREET, DUBLIN 4"
    },
    "verify_id": "WAPIAAAAA1BBB2",
    "verified_at": "2026-04-14T15:42:03.451Z"
  },
  "meta": {
    "request_id": "0190f8ea-a5b2-7000-a123-000000000000",
    "latency_ms": 694,
    "cached": false,
    "source": "vies",
    "source_status": "live"
  }
}