Validate any EU VAT number.

The official VIES verdict — registered trader name, address, and a requester consultation number as proof of the check — returned as clean JSON. Fail-closed: when VIES or a member state can't answer, you get a machine-readable refusal, never a fabricated verdict.

Try it — a live VIES consultation

This calls the free, rate-limited demo lane of the API — the same engine behind the paid endpoint. A real answer from VIES, no fabrication.

Try:

What you can call

Every check is a live consultation of VIES — nothing cached, nothing guessed. Items VIES could not answer are refused machine-readably (member_state_unavailable, upstream_timeout, …), never returned as verdicts. The full, always-current list lives in the OpenAPI document.

MethodEndpointWhat it returns
POST /v1/check Official VIES verdict + registered name/address + consultation number
POST /v1/batch Up to 100 VAT numbers per request, order kept, refusals indexed
POST /v1/demo/check The same full verdict, free — hard rate-limited (10 / 5 min / IP)
GET /v1/health Liveness + pinned engine version (does not call VIES)
GET /v1/status Live VIES availability per member state — check before you pay

The API is built on the eu-vat engine — the same library that powers a local CLI with SQLite history and change tracking, so a VAT number's verdicts can be recorded and diffed over time. On the API surface every response carries data_versions and attribution.

For agents

Point any HTTP client at the base URL. Supply requester_country_code + requester_vat_number to receive a VIES consultation number (request_identifier) — the identifier businesses keep as proof of the check.

# one call, clean JSON — verdict + consultation number
curl -s -X POST https://vat.api.chrisked.de/v1/check \
  -H 'content-type: application/json' \
  -d '{"vat_id": "DE811191002",
       "requester_country_code": "DE", "requester_vat_number": "129273398"}'

# check member-state availability (free) before paying for a check
curl -s https://vat.api.chrisked.de/v1/status

Prefer a machine-readable contract? The reference (Scalar) renders from the same OpenAPI JSON agents consume — every endpoint, refusal code, and error shape. Sibling APIs live in the catalog.