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.
| Method | Endpoint | What 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.