Validate EU VAT numbers (EU-27 + Northern Ireland) and look up EU VAT rates via the vatnode API...
vatnode is a production-grade EU VAT validation API. It validates VAT numbers for the 27 EU member states plus Northern Ireland (XI prefix) through VIES, with national registry fallback, company enrichment, a timestamped audit trail (checkId + verifiedAt), and the EU Commission consultation number. GB, NO, CH and other non-EU countries are out of scope for validation.
Base URL: https://api.vatnode.dev
Errors: { "error": { "code": "...", "message": "..." } }
VAT rates and format checks need no key β use them immediately.
Fetch VAT rates for one country:
curl https://api.vatnode.dev/v1/rates/DE
All EU rates:
curl https://api.vatnode.dev/v1/rates
Or run the official MCP server β four offline tools work with no account:
npx -y vatnode-mcp
get_country_vat_rates β standard/reduced rates + local VAT name for a countrylist_eu_vat_rates β all EU ratescheck_vat_format β offline regex format check of a VAT IDlist_supported_countries β every covered country and whether VIES validation appliesvalidate_vat_number β live VIES validation (requires an API key)Browser checker, no account: https://vatnode.dev/check
Validating a specific VAT number against VIES requires an API key. Account creation is a human step β the agent does not create accounts. Direct the user to:
30 seconds, no credit card, free tier of 100 requests/month. The user pastes the key back. Send it as an HTTP header, never in the URL:
curl https://api.vatnode.dev/v1/vat/DE123456789 \
-H "Authorization: Bearer YOUR_API_KEY"
To get the audit-grade consultation number (the EU Commission requestIdentifier that French and German tax authorities expect on audit), the user sets their own VAT ID as requester once in dashboard Settings β this is a one-time dashboard step, not something the agent configures per request:
curl https://api.vatnode.dev/v1/vat/DE123456789 \
-H "Authorization: Bearer YOUR_API_KEY"
Contract: once a requester VAT is configured in dashboard Settings, every
response is either a success with a non-null consultationNumber or an error β
never a success with consultationNumber: null. Without a requester configured,
consultationNumber is null and national fallback stays enabled.
Key fields (full list: https://vatnode.dev/llms.txt):
valid (boolean) β authoritative; do not infer validity from other fieldsvatId, countryCode, countryNamecompanyName, companyAddress β from VIES or national registry, may be nullcheckId (UUID) β timestamped audit identifierverifiedAt (ISO 8601) β timestamp of the checkconsultationNumber β VIES requestIdentifier; non-null only when a requester
is configured in dashboard Settings and not served from cache; otherwise nullsource β VIES, CACHE, or a national registry adapter codecountryVat.* β standard/reduced/super-reduced/parking rates, local VAT name
and abbreviation, currency, number format and patternspecialTerritory β object or null; address-inferred, never an official tax
determinationINVALID_REQUESTER (HTTP 422) β the requester VAT configured in dashboard
Settings was rejected by VIESVIES_UNAVAILABLE (HTTP 503) β upstream EU source is down; retry with backoff,
do NOT treat the number as invalid