Selling B2B in the EU means the reverse charge, and the reverse charge means checking your customer's VAT number in VIES, the European Commission's VAT Information Exchange System. VIES works, but it has quirks. National databases go offline at random, Greece uses EL rather than GR, some countries never return a company name, and "invalid" sometimes really means "busy". VATKit wraps all of that in plain JSON with honest status codes.
curl -G "https://vatkit-eu-vat-number-check-vies-vat-rates.p.rapidapi.com/check" \
-d vat=IE6388047V \
-H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
-H "X-RapidAPI-Host: vatkit-eu-vat-number-check-vies-vat-rates.p.rapidapi.com"
You get valid: true, the registered name (GOOGLE IRELAND LIMITED), the address, the VIES timestamp and an offline format_valid check. Add requester_vat=<your own VAT number> and VIES also returns a consultation number, which you can keep as audit evidence that you checked.
When a member state's database is down, you don't get a false "invalid". You get a 503 with error_code: "MS_UNAVAILABLE" and retryable: true, so your code can queue a retry instead of rejecting a real customer.
Endpoints
-
/check?vat=FR40303265045: live VIES lookup. Spaces, dots andGRprefixes are all fine. -
/format?vat=GB980780684: instant offline check of length and check digits for all 27 EU countries plus UK (GB) and Northern Ireland (XI). Use it to catch typos as people type. -
/rates?country=DE: standard, reduced, super-reduced and parking VAT rates for any EU member state, or all 27 at once. -
/status: which national VIES databases are up right now.
UK VAT numbers aren't in VIES since Brexit, so /check points you to /format for those.
MCP
For agents, the MCP server is at https://vatkit-eu-vat-number-check-vies-vat-rates.p.rapidapi.com/mcp.
There's a free plan. VATKit on RapidAPI
Top comments (1)
"Invalid sometimes really means busy" is the VIES quirk that bites hardest, because it fails in a way that looks like a customer problem rather than a service problem. Separating format_valid from the live check is a smart call. How do you suggest handling checkout when the national database is offline: let the order through and re-check later, or block until VIES answers?