apyhub
Back
▣ VERIFICATION KIT

EU VAT Number Details API

What it does

EU VAT Number Validator checks whether an EU VAT number is formatted correctly and can be verified against the live VIES service. Send a vatNumber, and optionally country when the number has no prefix. If you only want a syntax check, set offlineOnly to true.

Use it when you need to confirm a customer or supplier VAT ID before creating an account, issuing an invoice, or applying reverse-charge tax logic. The validator accepts common formatting variations such as spaces or dots, so DE123456789 and DE 123.456.789 are treated as the same number.

The service returns a JSON object, so you can plug it into onboarding flows, billing systems, or back-office checks without adding your own VAT parsing logic. It is useful both for quick validation at form submit time and for deeper compliance checks that depend on a live VIES lookup.

If a VAT number is missing its country prefix, provide the two-letter country code separately. Greece uses EL in place of GR for VAT prefix handling.

POST
Validate an EU VAT number: layout check per member state plus a live VIES lookup
https://api.eu.apyhub.com/freedailypro/eu-vat-number-details/converters/vat-validate

QUICKSTART

GUIDE

Check a Dutch VAT number and get the registered company details.

cURL

curl -X POST "https://api.apyhub.com/<service-path>" \
  -H "apy-token: YOUR_APY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"vatNumber": "NL862735944B01"}'

Response

{
  "result": {
    "vatNumber": "NL862735944B01",
    "country": "NL",
    "countryName": "Netherlands",
    "formatValid": true,
    "valid": true,
    "checked": "vies",
    "name": "APYHUB B.V.",
    "address": "KEIZERSGRACHT 00520 H\n1017EK AMSTERDAM",
    "requestDate": "2026-11-11T08:19:08.682Z"
  }
}
TRY ITLIVE · 10 ATOMS
Loading your default key…
The full key is used to call the gateway and stays in this tab — never sent to orbit or saved.
body*
The EU VAT number, with or without the two-letter prefix and with spaces or dots, for example DE123456789 or 'DE 123.456.789'.
Two-letter country code when vatNumber has no prefix (Greece is EL).
true checks only the number layout and skips the live VIES lookup.

About this endpoint

What it does

Checks an EU VAT number in two steps. First it checks that the number has the right layout for its member state. Then, by default, it looks the number up live in VIES, the European Commission's VAT registration service, and returns whether it is registered for trade within the EU, with the registered company name and address where the member state provides them.

Send offlineOnly: true to skip the live lookup and only check the layout. The offline check is instant and does not confirm that the number is registered.

It covers the 27 EU member states and Northern Ireland (XI). Numbers from other countries, such as GB, US or CH, return formatValid: false.

Request Body

ParameterTypeMandatoryDescription
vatNumberStringYesThe VAT number, 2 to 40 characters. Send it with its two-letter country prefix, for example DE115235681. Spaces, dots and dashes are ignored, letters are not case sensitive, and leading or trailing spaces are removed.
countryStringNoTwo-letter country code, used when vatNumber has no prefix. Greece is EL. If you send country, send vatNumber without a prefix: the whole value is then treated as the number for that country.
offlineOnlyBooleanNotrue checks only the number layout and skips the live lookup. Default false.

A prefix of GR is accepted for Greece and returned as EL.

Response

The endpoint returns a JSON object with the result under result.

FieldTypeDescription
vatNumberStringThe number in clean form, with the country prefix and no spaces or dots.
countryStringTwo-letter country code.
countryNameStringCountry name.
formatValidBooleantrue when the number has a valid layout for its country. This checks the layout only, not the check digits.
validBoolean or nulltrue when VIES shows the number as registered for intra-EU trade on the request date. false when it does not. null when no live lookup was made, for example with offlineOnly: true.
checkedStringvies when the live lookup ran, format when only the layout was checked.
nameStringRegistered name. Only returned by the live lookup, and only when the member state provides it.
addressStringRegistered address. Same conditions as name. Lines are separated by \n.
requestDateStringDate and time of the live lookup, in UTC.
reasonStringOptional. Extra detail when valid could not be confirmed.
noteStringPlain-language note about the result.
▣ COMMON ERRORS

Errors any endpoint can return

400bad_request

Required parameter missing or malformed body.

401unauthorized

API key missing, revoked, or not authorized for this service.

429rate_limited

Your plan's per-second rate exceeded. Retry with exponential backoff.

503upstream_busy

Backend temporarily unavailable. Try again in a few seconds.