Everything in one API
Validate, audit, and cache. No stitching together multiple services.
Global coverage
EU-27 via VIES, UK via HMRC, Switzerland and Liechtenstein via BFS, Norway via Bronnysund, Australia via ABR. Each lookup hits the official government source.
Built-in audit trail
Every validation is stored with a timestamp, the raw upstream response, and a consultation number where the source provides one (VIES, HMRC). Exportable for tax audits.
Smart caching
Repeat lookups return in milliseconds from cache. When an upstream source goes down, Vatly serves the most recent cached result so your integration keeps working.
Typed SDKs
@vatly/node for TypeScript and vatly on PyPI. Full type definitions, structured errors, and autocomplete out of the box. OpenAPI spec included.
Test mode
Magic VAT numbers for every supported country. Deterministic responses, no upstream calls, no quota usage. Safe to run in CI.
Batch and async
Validate up to 1,000 numbers in a single request. Or fire-and-forget with webhook delivery when results are ready. Deduplicated counting.
Audit trail, built in
Every validation is stored with the full upstream response. No extra logging, no separate service.
{
"data": {
"valid": true,
"vat_number": "NL123456789B01",
"country_code": "NL",
"company": {
"name": "Example B.V.",
"address": "Keizersgracht 123, 1015 Amsterdam"
},
"consultation_number": "WAAV4B5xQ3UzR7kP",
"requested_at": "2026-04-07T10:30:00Z"
},
"meta": {
"request_id": "req_abc123",
"source_status": "live"
}
}Tax-audit ready from day one
- Stored automatically with every validation
- Consultation numbers from VIES and HMRC (when requester VAT is provided)
- Exportable as JSON via the data export endpoint
Reverse-charge claims require proof that you verified the buyer's VAT registration. The audit trail is that proof. Timestamped, with consultation numbers, ready for any tax authority review.
Country coverage
One endpoint, one response shape. Vatly routes to the correct government source automatically.
| Country / Region | Source | Name | Address | Consultation # |
|---|---|---|---|---|
| EU (27 member states) | VIES | * | ||
| United Kingdom | HMRC | * | ||
| Switzerland | BFS UID Register | |||
| Liechtenstein | BFS UID Register | |||
| Norway | Bronnysund Register | |||
| Australia | ABR |
* Available when a requester VAT number is included in the request.
Built for developers who read the docs
Clean API design, honest error messages, and SDKs that work with your editor, not against it.
curl -H "Authorization: Bearer vtly_live_..." \
"https://api.vatly.dev/v1/validate?vat_number=NL123456789B01"import Vatly from '@vatly/node';
const vatly = new Vatly('vtly_live_...');
const { data, error } = await vatly.vat.validate({
vatNumber: 'NL123456789B01',
});
if (error) {
console.error(`${error.code}: ${error.message}`);
} else {
console.log(data.data.valid, data.data.company?.name);
}Clean REST + JSON
One endpoint, predictable response shapes, snake_case fields. No SOAP, no XML, no surprises.
Typed SDKs
@vatly/node for TypeScript and vatly on PyPI. Full type definitions and autocomplete. OpenAPI spec for everything else.
Structured errors
Every error returns a machine-readable code, a human-readable message, and a docs_url linking to the fix.
Infrastructure you can point auditors to
EU-hosted
Single-region deployment, co-located with VIES for minimal latency. Your validation data stays in the EU.
GDPR-clean
No third-party tracking on API requests. Data retention aligned to your plan. Full data export available anytime.
99.9% uptime target
Monitored continuously. When upstream sources go down, Vatly serves the most recent cached result regardless of age, so your integration stays available.
Two problems, one API
VAT validation matters at checkout and at account creation. Vatly handles both.
Validate at checkout, get reverse-charge right
Determine whether to charge VAT or apply the reverse charge before you generate an invoice. A valid cross-border VAT number means zero-rate. An invalid or missing one means you charge VAT.
- SaaS checkout flows
- Subscription billing
- Stripe and Mollie integrations
Clean account data from the first record
No CRM validates VAT numbers natively. Validate when an account is created and write the registered company name back to the record. Catch bad data before it reaches invoices or ERP syncs.
- Salesforce account creation
- HubSpot contact enrichment
- Partner and vendor onboarding