VAT Validation for Adyen Merchants

By Remco from Avatcado

Adyen is one of Europe's largest payment platforms, serving enterprise merchants across the globe. If you use Adyen for B2B payments, you need to validate customer VAT numbers for reverse charge compliance. Adyen does not provide this.

What Adyen does and doesn't do for VAT

Adyen processes payments. It does not validate customer tax IDs, calculate VAT, or automate the reverse charge mechanism.

  • Adyen's Legal Entity Management API handles VAT numbers for sub-merchant onboarding (KYC), but this is not available for validating your end customers' VAT numbers
  • Adyen's tax-free shopping feature (partnership with Global Blue) is for in-store retail VAT refunds, not B2B VAT validation
  • Adyen's documentation has no mention of VIES integration, customer VAT validation APIs, or reverse charge automation for merchants

Adding VAT validation to your Adyen integration

Validate the customer's VAT number before you create the Adyen payment or checkout session. Use the result to determine VAT treatment (reverse charge or charge VAT), then store the result for audit purposes before the payment session is created:

curl "https://api.avatcado.com/v1/validate?vat_number=DE123456789" \
  -H "Authorization: Bearer avat_live_your_api_key"
{
  "data": {
    "valid": true,
    "vat_number": "DE123456789",
    "country_code": "DE",
    "company": {
      "name": "EXAMPLE GMBH",
      "address": "MUSTERSTRASSE 1, 10115 BERLIN"
    },
    "requested_at": "2026-08-07T10:30:00.000Z"
  },
  "meta": {
    "request_id": "9f6a1c2e-4b3d-4a8f-9c7e-2d5b8e1f0a63",
    "request_duration_ms": 842,
    "source_status": "live"
  }
}

Or with the TypeScript SDK, wired into the step before you build the Adyen payment request:

import Avatcado from "@avatcado/node";

const avatcado = new Avatcado("avat_live_your_api_key");

async function determineVatTreatment(customer: { vatNumber?: string; country: string }, sellerCountry: string) {
  if (!customer.vatNumber) {
    return { chargeVat: true, vatRate: getVatRate(customer.country) };
  }

  const { data, error } = await avatcado.vat.validate({ vatNumber: customer.vatNumber });

  if (error || !data.data.valid || customer.country === sellerCountry) {
    // Invalid, unverifiable, or domestic: charge VAT
    return { chargeVat: true, vatRate: getVatRate(customer.country) };
  }

  // Valid, cross-border, B2B: apply the reverse charge before creating the Adyen session
  return { chargeVat: false, reverseCharge: true, companyName: data.data.company?.name };
}

Create the Adyen payment or checkout session with the resulting vatRate (or zero-rated amount) already applied. Adyen has no concept of a VAT treatment decision, so this logic has to live in your own backend, ahead of the Adyen call.

Handling errors and non-200 responses

  • 422 invalid_vat_format: The VAT number failed format or checksum validation before Avatcado even called the upstream registry. Surface this to the customer at checkout so they can correct a typo before you attempt the Adyen payment.
  • 503 upstream_unavailable: VIES, HMRC, or a national registry is temporarily down. Avatcado serves a cached, stale result when one exists (meta.stale: true). With no cached result, fall back to charging VAT conservatively rather than blocking the checkout, and flag the order for a manual revalidation.
  • 429 rate_limit_exceeded: Rare at typical Adyen merchant volumes given the tier limits below, but if you validate on every cart update rather than once at checkout, debounce the calls or validate only on the final submit.

Adyen for Platforms and marketplaces

If you run Adyen for Platforms, you have two distinct VAT validation needs: your sub-merchants' own VAT numbers (for onboarding and KYC, which Adyen's Legal Entity Management API already covers) and your sub-merchants' end customers' VAT numbers (for reverse charge on individual transactions, which Adyen does not cover at all). Avatcado handles the second case regardless of how many sub-merchants sit on your platform, since it validates one VAT number per call independent of any Adyen account structure.

Batch validation for high-volume Adyen merchants

If you are backfilling VAT validation for existing customers, or reconciling a batch of orders at the end of a billing cycle, use the batch endpoint instead of looping single requests (Pro and Business plans, up to 50 numbers per request):

curl -X POST "https://api.avatcado.com/v1/validate/batch" \
  -H "Authorization: Bearer avat_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "vat_numbers": [
      "DE123456789",
      "FR82542065479",
      "NL123456789B01"
    ]
  }'

Each item in the response has its own data (or error) and meta block, so a single malformed or unresponsive VAT number in the batch does not block validation of the others.

Enterprise reliability

Adyen merchants typically process high volumes. VAT validation needs to be reliable at scale.

  • Caching: Avatcado caches results for 25 days. Repeat lookups for the same number resolve from cache in milliseconds, with no upstream round trip.
  • Retries: Automatic retries with backoff when VIES is down, plus stale cache fallback for HMRC and the national registries.
  • Stale fallback: If a country's tax service is offline and no fresh result is available, Avatcado returns the last known result with a stale indicator so your checkout flow doesn't break.
  • Rate limits: Scale with your plan. 120 requests per minute on the Business tier.
  • Batch validation: Process up to 50 numbers in a single request on Pro and Business plans.

See the pricing page for plan details and rate limits.

Limitations

  • No Adyen-native integration. Avatcado is a standalone REST API with no Adyen app, marketplace listing, or webhook that fires on Adyen events. You call it from your own backend, on your own schedule, before you talk to Adyen.
  • You own the VAT decision logic. Adyen has no field or setting for "reverse charge applied." The zero-rating decision and any resulting invoice wording are entirely your responsibility to implement and store.
  • No revalidation trigger. Adyen will not notify you if a previously valid customer VAT number is later deregistered. For recurring or subscription merchants, schedule periodic revalidation yourself, separate from the Adyen payment flow.

Get started

Avatcado's free tier includes 500 validations per month with no credit card required. Add VAT validation to your Adyen integration in under 5 minutes.

Start validating for free →

Read the API documentation for integration details.

Frequently asked questions

Does Adyen validate customer VAT numbers?

No. Adyen collects VAT numbers for sub-merchant KYC purposes in their Platforms product, but does not offer customer VAT validation for merchants.

Can I use Avatcado with Adyen?

Yes. Avatcado is a standalone API. Validate the customer's VAT number before creating the Adyen payment session. The two services are independent.

What about high-volume validation?

Avatcado's Business plan supports 50,000 validations per month with 120 requests per minute burst rate. For higher volumes, contact us for a custom plan.

Sources