One-Off Checks vs an API: When to Move to Code
31 August 2026

One-Off Checks vs an API: When to Move to Code
If you're checking VAT numbers by hand — one at a time, on the VIES site, a free checker, or in a spreadsheet — that's the right approach at low volume with no audit-evidence requirement. Move to an API once any of these becomes true: checks are routine rather than occasional, a check is tied to a transaction like checkout or signup, the check needs to survive VIES going down without blocking the customer, or you need a stored record of the result rather than a memory of having looked. This article walks through both sides so you can place yourself on that line honestly.
What "checking manually" actually means
There are three common versions of manual checking, and they share the same weakness.
The VIES site. The European Commission's own VIES lookup is free, has no login, and answers the one question it's built for: is this number registered right now. It's the reference implementation — every other tool, including vatnode, is ultimately asking the same national databases it asks.
vatnode's free checker. The /check tool does the same lookup with a friendlier interface — company name and address where the country provides them, current VAT rate context, no account needed. It's a better version of the manual workflow, not a different category of tool.
A spreadsheet. Someone pastes VAT numbers into a column, checks each one against VIES by hand, and records "valid" or "invalid" next to it. This is the slowest version and the one most likely to drift out of date, since nothing re-runs the check later.
All three share the same weakness: no stored evidence beyond what a person chose to write down, and no protection against the check simply being skipped when someone's in a hurry. A screenshot or a spreadsheet cell is thin evidence if an auditor later asks why you zero-rated a supply. None of the three fails at low volume — they fail as volume or stakes grow, which is the actual question this article is answering.
When manual is genuinely fine
Don't over-automate. If you're validating a handful of new EU customers or suppliers a month, and you don't yet need to produce a stored audit trail for each check, a manual lookup does the job. There's no minimum-professionalism bar that says you need an API from day one — plenty of finance teams run entirely on the VIES site or a free checker for a long time before anything changes.
If that's you, the practical next step is still worth taking: use vatnode's free /check instead of the bare VIES page. Same underlying data, same zero commitment, but you also get the free plan sitting one step away — 100 checks a month, no card required — so switching to code later is a signup, not a project. Staying manual indefinitely isn't the goal here; staying manual until one of the signals below shows up is.
Signals it's time to move to code
These are concrete, not vibes. If any one of them is true, hand-checking has already started costing you more than it saves.
A check is tied to every signup or checkout. The moment "validate the VAT number" becomes a step in an automated flow — a B2B signup form, a checkout that needs to decide whether to charge VAT — a human clicking through a website doesn't fit the flow anymore. This is the single most common trigger.
You have an existing customer or supplier base that needs periodic re-validation. A VAT number that was valid at onboarding a year ago isn't guaranteed to still be valid — registrations lapse. Re-checking hundreds of stored numbers by hand isn't realistic; batch-validating them is a script's job, not a person's.
The check needs to survive a VIES outage without blocking the transaction. Individual VIES country nodes go down — that's normal, not an emergency, but it means "the site didn't load" can't be allowed to stall a checkout. Handling that gracefully (retry, fallback, or a defined behavior for "unavailable" versus "invalid") is something you build into code, not something a person improvises under pressure.
You need a stored checkId and timestamp, not a memory of having looked. If a reverse-charge or zero-rated invoice ever gets questioned, "I checked it, I'm pretty sure" is not evidence. A structured record — what was checked, when, and what came back — is.
If none of these apply yet, that's a legitimate answer too — keep using the free checker, and if you want the option of code later without a project, the free plan is 100 checks a month, no card.
What moving to an API looks like
The core call is a single GET request against /v1/vat/:vatId with a bearer key:
curl https://api.vatnode.dev/v1/vat/EE100931558 \
-H "Authorization: Bearer $VATNODE_API_KEY"
{
"valid": true,
"vatId": "EE100931558",
"countryCode": "EE",
"countryName": "Estonia",
"companyName": "Example OÜ",
"companyAddress": "Tartu mnt 10, 10145 Tallinn, Estonia",
"checkId": "b3f1c2a8-8f2e-4c1e-9a7d-2f0b1c9d4e55",
"verifiedAt": "2026-08-10T09:12:00.000Z",
"source": "VIES",
"consultationNumber": "EE20260810091200000123"
}
That response shows consultationNumber populated, which requires you to have set your own EU VAT as requester in dashboard Settings — without that, this field is null even on a successful VIES check.
That's the whole shape you need for the decision this article is about: valid for the boolean, checkId and verifiedAt for the audit trail, source for which database actually answered, and consultationNumber for the VIES-issued reference — populated only once you've set your own EU VAT as requester in dashboard Settings, and always null when a national source answered instead of VIES. It's a genuinely useful evidence field, and not something only one provider offers — where vatnode differs is the zero-config path to it (set the requester once, every live check carries it from then on) and the never-null source contract, so you always know which database actually answered.
You don't need to burn real quota to build against this. Every account gets a free test key alongside the live one — requests against reserved XX-prefixed fixture numbers return deterministic responses with no VIES call, no database write, and no effect on your monthly count. See test mode for the fixture numbers and exact behavior. Sign-up for a working key is free — get a free API key, 100 checks a month, no card. If your volume runs past that, pricing shows what the paid tiers cost.
One caution that applies whether you're checking by hand or by API: a check confirms format and registration status, not that a specific transaction qualifies for a given VAT treatment. Format-valid isn't the same as registered and active, and a valid result isn't a ruling on your invoice — it's evidence you feed into that decision. This article is informational, not tax advice; confirm treatment with your advisor where it matters.
Already writing your own VIES client?
If you've already got a script hitting VIES directly, the question isn't whether it works today — it's what it doesn't handle yet: fallback when a node is down, response caching, structured logging you can hand to an auditor, and the maintenance burden of a client that only you own. We've written up the full build-vs-buy comparison, cost side included, separately — see build vs buy for VAT validation rather than re-litigating it here.
Bulk and recurring checks
Two patterns come up once you're past the single-check stage.
Validating an existing list. If you're bringing an existing customer or supplier list into this workflow for the first time, you don't want to call the single-check endpoint in a loop by hand — batch it. Bulk VAT validation covers validating a list in one pass.
Re-checking on a schedule. VAT registrations lapse, so a number valid at onboarding isn't guaranteed valid a year later. Rather than re-running checks manually on a calendar reminder, VAT monitoring with webhooks covers getting notified automatically when a stored VAT number's status changes.
FAQ
Is checking VAT numbers manually ever the right call?
Yes — at low, irregular volume with no reverse-charge evidence requirement yet, a free checker or the VIES site is enough. The free VAT number checker at vatnode is a no-commitment way to keep doing exactly that.
What's the actual signal to stop checking by hand?
A check tied to every signup or checkout, an existing customer base that needs periodic re-validation, a need for the check to survive a VIES outage without blocking the transaction, or needing a stored checkId and timestamp instead of a memory of having looked.
Does moving to an API cost anything to try?
No. vatnode's free plan gives 100 checks a month with no card required, and every account also gets a free test key so you can build and test the integration without touching your live quota.
We already have a script that calls VIES directly — should we still switch?
Depends on what your script currently doesn't handle — fallback when a VIES node is down, caching, structured logging for audit evidence. See our build-vs-buy breakdown for the full comparison.
Still low-volume, or ready to automate?
Still low-volume? Check a VAT number free — no account needed. Ready to automate? Get a free API key and call the VIES API from your own system — free plan, 100 requests a month, no card.