One API for VAT validation across 32 countries

Real-time lookups against VIES, HMRC, BFS, Bronnysund, and ABR. Built-in audit trails, smart caching, and typed SDKs. EU, UK, Switzerland, Liechtenstein, Norway, and Australia in one call.

500 free validations/month. No credit card.

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.

Audit record
{
  "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.

EU (27 member states)
SourceVIES
Returns name
Returns address
Consultation #*
United Kingdom
SourceHMRC
Returns name
Returns address
Consultation #*
Switzerland
SourceBFS UID Register
Returns name
Returns address
Consultation #
Liechtenstein
SourceBFS UID Register
Returns name
Returns address
Consultation #
Norway
SourceBronnysund Register
Returns name
Returns address
Consultation #
Australia
SourceABR
Returns name
Returns address
Consultation #

* 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
curl -H "Authorization: Bearer vtly_live_..." \
  "https://api.vatly.dev/v1/validate?vat_number=NL123456789B01"
@vatly/node
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.

Billing

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
CRM & Onboarding

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

Start validating in under two minutes

500 free validations per month. No credit card, no sales call. Get your API key and send your first request.