---
title: "GET /api/vat/validate"
method: GET
path: "/api/vat/validate"
tags: ["VAT Validation"]
---

# GET /api/vat/validate

`GET /api/vat/validate`

## Request

- Base URL: `https://api.unirateapi.com`
- URL: `https://api.unirateapi.com/api/vat/validate`
- Auth: none declared
- TypeScript: <https://skmtc.dev/unirateapi/apis/unirate-api/docs/api/vat/validate/get.ts> (a function with typed inputs; its response is checked against the schema)

Validate a VAT number against the official registry (Pro subscription required). EU member states and Northern Ireland (XI) are checked against the European Commission's VIES service, Norwegian (NO) numbers against the Brønnøysund Register Centre (data.brreg.no, NLOD licence) and Swiss (CHE) numbers against the Swiss UID register. UK (GB) validation against HMRC is coming soon: until it is enabled, GB numbers are format-checked and then answered `valid: null, status: unavailable` with `upstream_error: SOURCE_NOT_CONFIGURED` (HTTP 503, not counted against your daily quota) — see /api/vat/validate/status. Numbers are format- and checksum-checked first, so an obviously invalid number returns `status: invalid_format` without an upstream lookup. Results are cached (valid answers 24h, invalid 1h). If the registry is unavailable, the response is `valid: null, status: unavailable` (HTTP 503) — never "invalid" — or, when a previous definitive answer exists, that answer flagged `stale: true` (HTTP 200). The response also carries the country's standard VAT rate from the /api/vat/rates dataset. Norwegian answers include an `attribution` string required by the NLOD licence ("Contains data under the Norwegian licence for Open Government data (NLOD) distributed by the Brønnøysund Register Centre"); keep it when you redistribute that data. `attribution` is null for other countries.

## Query parameters

- `api_key` string, required
- `vat_number` string, required
- `country` string
- `requester_vat_number` string
- `format` 'json' | 'xml' | 'csv' | 'tsv'
- `callback` string

## Response `200`

A definitive answer (status valid, invalid or invalid_format), or a stale last-known answer served during a registry outage (stale true).

## Other responses

- `400`: Missing/unparseable vat_number, unsupported country, or rejected requester_vat_number
- `401`: Missing or invalid API key
- `403`: Pro subscription required
- `429`: Daily VAT validation limit exceeded (1000/day on Pro)
- `503`: The registry could not answer and no previous answer is cached. Body has valid null, status "unavailable" and upstream_error (e.g. MS_UNAVAILABLE, TIMEOUT, MS_MAX_CONCURRENT_REQ, SOURCE_NOT_CONFIGURED, or BUSY when our own capacity for concurrent registry lookups is momentarily exhausted). Retry later.

---

[API](https://skmtc.dev/unirateapi/apis/unirate-api.md) - [All operations](https://skmtc.dev/unirateapi/apis/unirate-api/llms.txt) - [OpenAPI document](https://skmtc.dev/unirateapi/apis/unirate-api/revisions/e5fd92902326?raw)
