VIES Consultation Number and VAT Audit Trail for EU Compliance

When auditors examine your EU B2B invoices, they ask one question: how do you know your customer was VAT-registered at the time you issued the invoice? The VIES consultation number is the answer. Here is what it is, why it matters, and what your application needs to store.

The compliance problem: proof of VAT status at invoice time

Selling B2B across EU member states usually means issuing invoices under the reverse charge mechanism — the seller charges zero VAT and the buyer self-assesses at their local rate. The condition for doing this correctly is that the buyer holds a valid, active VAT number at the moment the invoice is issued.

That check is not a one-time event. A VAT registration that was valid last year may have lapsed. A company that merged, restructured, or deregistered will no longer appear in the EU-27 registry. The obligation sits with the seller: if you apply zero-rating and the buyer's VAT status cannot be demonstrated, the tax liability can fall back to you.

Tax authorities — particularly in Germany and France — increasingly ask for documentary evidence that a VAT status check took place. A printed screenshot from a browser session is not sufficient for this. What they expect is a timestamped, system-generated record that ties a specific VAT number, a specific timestamp, and a specific outcome together. The VIES consultation number is that record, issued by the European Commission itself.

If you are building the integration from scratch, see the guide on how to validate EU VAT numbers programmatically for the full technical walkthrough.

What is the VIES consultation number?

VIES (VAT Information Exchange System) is the European Commission's central registry for EU VAT numbers. When you query it using the checkVatApprox operation — which requires you to supply your own VAT number as the requester — the Commission issues a consultation number: a unique reference string that permanently records the fact that a specific VAT number was checked, at a specific time, by a specific requester.

It looks like this: WAPIAAAAWpgnLGnO. It is not the VAT number itself — it is a receipt for the lookup, analogous to a transaction reference number. The EU Commission can cross-reference it if a tax authority enquires.

This is different from storing the VAT number in your database. Any system could store a string. The consultation number proves that a live query was sent to the official EU source and that it returned a result — with your identity as the requester on record.

Quick Fixes 2020 — why the check is now a substantive condition

Before January 2020, having a customer's VAT number was treated in many member states as an administrative formality — useful but not strictly required for zero-rating. Council Directive 2018/1910 (the Quick Fixes package, transposed January 2020) changed this for intra-EU supplies of goods: a valid VAT number registered in the EU-27 is now a substantive legal condition for zero-rating, not merely an evidentiary one.

For cross-border B2B services, the buyer's VAT number determines whether the reverse charge applies under the general B2B place-of-supply rule. The substantive-condition framing from Quick Fixes applies to goods specifically, but the practical implication for services is the same: you need to be able to show that you confirmed VAT status at the time of invoicing.

Note on legal reliance: Storing a VIES consultation number helps demonstrate that a VAT check was performed via the official EU system. It does not guarantee compliance or provide a legal safe harbour in all member states — tax treatment depends on the specifics of each transaction and jurisdiction. Consult your tax adviser for advice on your obligations.

What the consultation number does is put you in the strongest defensible position: you can show an auditor the reference number, the timestamp, and the VAT number that was checked, and they can verify it against the EU Commission's own records.

What vatnode returns in the API response

Every vatnode validation response includes the fields needed to build a complete audit record. See the API reference for the full response schema. The fields relevant to audit are:

FieldTypeDescription
consultationNumberstring | nullEU Commission-issued audit reference. Present when your requester VAT number is configured and VIES answered via checkVatApprox. Null when no requester was supplied, a national fallback was used, or the result was served from cache.
checkIdstringvatnode's own unique identifier for this validation event (UUIDv7). Present on every response regardless of requester configuration.
verifiedAtstringISO 8601 timestamp of when the check was performed. Store this alongside the consultation number.
companyNamestring | nullLegal name as returned by the registry at the time of the check. Record this on your invoice — it shows what was validated.
companyAddressstring | nullRegistered address as returned by the registry. Useful for invoice recipient fields and showing the validated state.

Example response with a consultation number present:

Response JSON
{
  "valid": true,
  "vatId": "DE134214316",
  "countryCode": "DE",
  "countryName": "Germany",
  "companyName": "EXAMPLE GMBH",
  "companyAddress": "MUSTERSTRASSE 1, 10115 BERLIN",
  "checkId": "01956b4a-1234-7abc-8def-0123456789ab",
  "verifiedAt": "2026-04-23T09:14:52.301Z",
  "consultationNumber": "WAPIAAAAWpgnLGnO"
}

How to configure your requester VAT number

The VIES system issues a consultation number only when the query includes a requester VAT number — that is, your own EU VAT number identifying who is making the check. Without it, VIES validates the VAT status but does not issue an audit reference.

There are two ways to supply this to vatnode:

  • Dashboard (recommended):Go to Settings → Requester VAT and enter your EU VAT number. vatnode will include it on every live VIES query automatically. No changes to your integration code are required.
  • Per-request query parameters: Pass requesterCountryCode and requesterVatNumber on the request URL. Useful for multi-entity setups where the requester varies by transaction.
cURL — with requester VAT for consultation number
# Without requester VAT: consultationNumber will be null
curl https://api.vatnode.dev/v1/vat/DE134214316 \
  -H "Authorization: Bearer vat_live_your_key_here"

# With requester VAT: consultationNumber is returned
curl "https://api.vatnode.dev/v1/vat/DE134214316?requesterCountryCode=IE&requesterVatNumber=6388047V" \
  -H "Authorization: Bearer vat_live_your_key_here"

Failure behaviour when requester VAT is configured

When a requester VAT is set, vatnode routes the check via VIES checkVatApprox directly — national registry fallback is bypassed. The outcome is always binary:

  • VIES responds — consultation number returned with the result
  • ×VIES is unavailable for that country — returns 503 VIES_UNAVAILABLE
  • ×Your requester VAT is no longer valid — returns 422 INVALID_REQUESTER

There is no partial state. If you need a consultation number, you either get it with the result or receive a clear error code to handle. Without a requester VAT, validation continues normally (with national registry fallback where available) and consultationNumber will be null.

What to store alongside your invoices

For every B2B invoice issued with reverse charge applied, persist the following fields from the vatnode response in your invoice or order record. Audit trail storage is available on all plans, and check records are accessible through the dashboard and API.

FieldWhy store itWhere
consultationNumberEU Commission-issued audit reference — strongest available evidenceInvoice record (when present)
checkIdvatnode's unique check identifier — links back to the validation eventInvoice record / order metadata
verifiedAtTimestamp proves the check happened before invoicingInvoice record / order metadata
vatIdCustomer's VAT number as validated (normalized form)Customer record + invoice
companyNameLegal name as returned by the registry at check timeInvoice recipient field
companyAddressRegistered address as returned at check timeInvoice recipient field
Recommended audit record — minimum fields
{
  "invoiceId":          "inv_2024_001",
  "vatNumber":          "IE6388047V",
  "consultationNumber": "WAPIAAAAZ27qPadm",  // EU Commission audit token
  "validatedAt":        "2026-03-26T14:25:57.209Z",
  "countryCode":        "IE"
}

Here is a TypeScript example showing how to persist these fields at checkout:

TypeScript — storing the audit record
interface VatAuditRecord {
  vatId: string
  consultationNumber: string | null
  checkId: string
  verifiedAt: string
  companyName: string | null
  companyAddress: string | null
}

async function validateAndStoreAuditRecord(
  invoiceId: string,
  buyerVatId: string
): Promise<{ applyReverseCharge: boolean; auditRecord: VatAuditRecord }> {
  const response = await fetch(
    `https://api.vatnode.dev/v1/vat/${encodeURIComponent(buyerVatId)}`,
    { headers: { Authorization: `Bearer ${process.env.VATNODE_API_KEY}` } }
  )

  if (!response.ok) {
    const err = await response.json()
    throw Object.assign(new Error(err.error.message), { code: err.error.code })
  }

  const result = await response.json()

  const auditRecord: VatAuditRecord = {
    vatId: result.vatId,
    consultationNumber: result.consultationNumber,  // EU Commission reference
    checkId: result.checkId,                        // vatnode check ID
    verifiedAt: result.verifiedAt,                  // ISO 8601 timestamp
    companyName: result.companyName,
    companyAddress: result.companyAddress,
  }

  // Persist alongside the invoice — do not discard these fields
  await db.invoices.update(invoiceId, {
    vatAuditRecord: auditRecord,
    applyReverseCharge: result.valid,
  })

  return { applyReverseCharge: result.valid, auditRecord }
}

Frequently asked questions

What if VIES does not return a consultation number?

VIES issues a consultation number only when a requester VAT is supplied and the live VIES path succeeds. Without a requester, the check still confirms VAT status accurately but no EU Commission audit reference is issued. When a requester VAT is configured, the outcome is binary: either VIES responds and the consultation number is returned with the result, or you receive a clear error (503 if VIES is unavailable for that country, 422 INVALID_REQUESTER if your own VAT has lapsed). There is no partial state. Configure your EU VAT in the vatnode dashboard under Settings → Requester VAT to receive a consultation number on every qualified check.

How long should VAT validation records be retained?

EU VAT records must generally be retained for at least 10 years, though the exact retention period varies by member state (some require longer). vatnode stores check records and they are accessible via the dashboard and API. You should also maintain your own archive as part of your invoice retention system — do not rely solely on a third-party API for long-term compliance records. Consult your tax adviser or local regulations for the precise requirement in each country where you operate.

Start building your EU VAT audit trail

vatnode returns the VIES consultation number on every qualified validation response. Configure your requester VAT in the dashboard once — no code changes required.