EU VIES + UK HMRC
Proof you checked, years after you checked.
Validate a VAT number, and VATWarden keeps the registry's own consultation ID on file for seven years — then re-checks that customer every night and calls your webhook the moment they deregister.
14 days free · no charge during trial · from $19/month
- VAT
- DE 811569869
- Result
- valid
- Name
- Bayerische Motoren Werke AG
- Consultation
- WAPIAAAAY5J8kHRD
- Checked
- 2026-08-06 09:14:07 UTC
- Registry
- VIES
How it works
Three verbs, one durable record
Validate
One POST. We pre-check the format, call VIES or HMRC, retry with backoff, and fall back
to a recent cached answer — flagged stale — when the registry is down.
Remember
Every answer is appended to an archive that is never edited or deleted: the verbatim registry response, the consultation ID, the timestamp. Exportable as CSV, always.
Watch
Save the numbers you invoice. We re-check them nightly, within the registries' rate limits, and fire a signed webhook when one flips from valid to invalid.
Deregistration
The failure nobody watches for
Validating at signup is easy, and everyone does it. The expensive case is the customer who was valid when you onboarded them and quietly deregistered eighteen months later — while you kept zero-rating every invoice.
Stripe validates a tax ID once and, by its own documentation, never checks it again. Neither do most VAT APIs. VATWarden checks every saved number every night.
Kessler Logistiek valid
Rossi Forniture Srl deregistered
Google Ireland Ltd valid
Your endpoint, 02:41
You find out before your accountant does
A status change fires a webhook signed with HMAC-SHA256, retried at one minute, five minutes, thirty minutes, two hours and twelve hours until your server acknowledges it.
No email notifications. Webhooks and the dashboard only — so alerts land in your systems, not someone's inbox.
{
"id": "evt_0mkq9r2h71x4c8t2w6p3n5d1",
"type": "monitored.status_changed",
"data": {
"country_code": "IT",
"vat_number": "12345678903",
"label": "Rossi Forniture Srl",
"old_status": "valid",
"new_status": "invalid"
}
}
The API
One request, one durable answer
curl -s https://vatwarden.com/v1/validate \
-H "Authorization: Bearer vw_live_..." \
-H "Content-Type: application/json" \
-d '{"country_code": "DE", "vat_number": "811569869"}'
{
"id": "val_0mkq9r2h71x4c8t2w6p3n5d1",
"country_code": "DE",
"vat_number": "811569869",
"valid": true,
"name": "Bayerische Motoren Werke Aktiengesellschaft",
"address": "Petuelring 130\n80809 München",
"consultation_id": "WAPIAAAAY5J8kHRD",
"checked_at": "2026-08-06T09:14:07Z",
"source": "vies",
"stale": false,
"error_code": null
}
Outage-proof
VIES goes down on a schedule — Germany overnight, the Netherlands most weekends. We
retry, then serve the freshest confirmed answer, clearly marked stale: true.
Errors are not verdicts
A registry timeout never becomes “invalid”. Downtime can't trigger a false deregistration alert, and it never consumes your quota.
Honest metering
Monitoring re-checks are free. Trials stop at the quota instead of surprise-billing you. No per-seat pricing, no annual lock-in.
Why it matters
The question arrives years later
When you sell B2B across an EU border you invoice without VAT, and the buyer self-accounts under the reverse-charge mechanism. That zero-rating rests on the buyer's VAT number being valid at the time of supply — and an auditor can ask you to show that you checked.
VIES keeps no history for you. A number that was valid when you invoiced may be gone by the time anyone asks, and the public registry holds no record of what you saw. VATWarden keeps the registry's exact answer, so the proof exists when the question arrives.
This describes how the product works; it is not tax or legal advice, and a valid check is one element of evidence rather than a guarantee. Your accountant has the final word on your invoicing.
| VAT | Result | Consultation | Checked |
|---|---|---|---|
| DE811569869 | valid | WAPIAAAAY5J8kHRD | 2026-08-06 |
| FR40303265045 | valid | WAPIAAAAY5J1pQ2M | 2026-08-05 |
| IT12345678903 | invalid | WAPIAAAAY4X7dR9L | 2026-08-05 |
Start validating in minutes
One API key, one POST request, evidence from the first call.