Documentation

RapidAPI base URL: https://vatpulse1.p.rapidapi.com · Direct base URL (direct customers): https://api.vatpulse.workers.dev · OpenAPI: 3.1 / 3.0 · Interactive: /docs/reference

Quick start

  1. Subscribe to the free plan (100 validations/month) on RapidAPI and copy your X-RapidAPI-Key.
  2. Validate:
curl -X POST https://vatpulse1.p.rapidapi.com/validate \
  -H "X-RapidAPI-Key: $RAPIDAPI_KEY" \
  -H "X-RapidAPI-Host: vatpulse1.p.rapidapi.com" \
  -H "Content-Type: application/json" \
  -d '{"vat": "IE6388047V", "iban": "DE89 3704 0044 0532 0130 00"}'

JavaScript

const res = await fetch("https://vatpulse1.p.rapidapi.com/validate", {
  method: "POST",
  headers: {
    "X-RapidAPI-Key": process.env.RAPIDAPI_KEY,
    "X-RapidAPI-Host": "vatpulse1.p.rapidapi.com",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ vat: "NL004495445B01" }),
});
const { vat } = await res.json();
if (vat.valid === true) { /* registered */ }
else if (vat.valid === false) { /* not registered or malformed: vat.error.code */ }
else { /* unknown right now (upstream down): retry later */ }

Python

import requests
r = requests.post(
    "https://vatpulse1.p.rapidapi.com/validate",
    headers={"X-RapidAPI-Key": RAPIDAPI_KEY, "X-RapidAPI-Host": "vatpulse1.p.rapidapi.com"},
    json={"iban": "FR1420041010050500013M02606"},
    timeout=15,
)
print(r.json()["iban"])

Authentication

RapidAPI (default): call https://vatpulse1.p.rapidapi.com with your X-RapidAPI-Key and X-RapidAPI-Host: vatpulse1.p.rapidapi.com headers. RapidAPI handles keys, plans and billing.

Direct keys: direct customers receive a key (vk_live_…) from us and call https://api.vatpulse.workers.dev with it in the X-API-Key header (Authorization: Bearer <key> also works). Self-serve signup on this site is closed; use RapidAPI or ask via the RapidAPI listing.

POST /validate

JSON body with vat, iban, or both (strings). Spaces, dots and dashes are ignored. VAT numbers need their 2-letter prefix; Greece is EL (we also accept GR), Northern Ireland is XI (checked via VIES). UK GB numbers via HMRC are coming soon (built, not yet enabled); until then they return service_unavailable and are not billed.

HTTP 200 is returned whenever at least one component produced a definitive answer. If nothing could be answered, the status reflects the error (400 bad input, 503 upstream down with nothing cached).

Response fields

vat

FieldDescription
validtrue registered, false not registered or malformed, null unknown (see error).
vat_numberNormalized number with prefix.
country_code / country_nameISO 3166 code (GR for EL, GB for XI).
name / addressRegistered name/address when the member state discloses them (e.g. DE and ES do not via VIES); otherwise null.
sourcevies, hmrc, or syntax (rejected locally by format check).
cached / stalecached: served from cache. stale: last-known-good copy served because the upstream is down.
checked_atWhen VIES/HMRC confirmed this answer.
consultation_numberVIES consultation reference when the deployment is configured with a requester VAT number.
error / warning{code, message} or null. warning is set when a stale result is served.

iban

FieldDescription
validChecksum, length and structure all pass.
iban / iban_formattedElectronic and print formats.
country_code, check_digits, bban, bank_code, branch_code, account_numberParsed components (per SWIFT IBAN registry positions).
sepaCountry is in the SEPA scheme.
bank{name, bic} from the bundled registry, or null if the bank code is not covered.

An IBAN check confirms the number is well-formed. It cannot confirm that the account exists or is open.

Error codes

CodeHTTPMeaning
invalid_request400Body not JSON, or neither vat nor iban given.
invalid_format400*Doesn't match the country's VAT/IBAN structure.
invalid_country400Unknown or unsupported country prefix.
invalid_length400*IBAN length wrong for its country.
invalid_checksum200IBAN mod-97 check failed (valid:false).
member_state_unavailable503That country's VAT system is down (VIES MS_UNAVAILABLE/TIMEOUT) and nothing is cached.
service_unavailable503VIES/HMRC unreachable or erroring, nothing cached.
upstream_rate_limited503VIES/HMRC is throttling.
unauthorized / forbidden401 / 403Missing/invalid key, or revoked key.
rate_limited429Per-minute limit exceeded; see Retry-After.
quota_exceeded429Monthly quota used up. Cached answers are still served.

* When the component is answered as valid:false the HTTP status is 200; 4xx is used when no component could be answered.

Caching & outages

Billing & quotas

PlanPriceValidations / monthRequests / minute
Free$010010
Basic$192,00060
Pro$4910,000180

You pay only for successful validations: a request counts once if at least one component produced a fresh definitive result (VIES/HMRC answered, or the IBAN checksum ran). Free: cache hits, stale fallbacks, input rejected by format/length checks, upstream errors, auth and rate-limit errors. The response field billable tells you. On RapidAPI, usage is reported to RapidAPI as a custom Validations quota (header X-RapidAPI-Billing: Validations=1|0) and your balance is in the RapidAPI dashboard; direct keys get X-Quota-Limit, X-Quota-Remaining and X-Quota-Reset headers. Quotas reset on the 1st of each month (UTC). The per-minute limit applies to all requests.

GET /usage

curl https://vatpulse1.p.rapidapi.com/usage -H "X-RapidAPI-Key: $RAPIDAPI_KEY" -H "X-RapidAPI-Host: vatpulse1.p.rapidapi.com"
{
  "plan": "free", "monthly_quota": 100, "used": 12, "remaining": 88,
  "period_start": "2026-10-01T00:00:00.000Z", "reset_at": "2026-11-01T00:00:00.000Z",
  "rate_limit_per_minute": 10, "requests_this_month": 31
}

GET /status

Public. Live VIES availability per member state (cached 60s). Handy before batch jobs.

Coverage

VAT

PrefixCountryExampleSource
ATAustriaATU12345678VIES
BEBelgiumBE0123456789VIES
BGBulgariaBG123456789VIES
CYCyprusCY12345678XVIES
CZCzechiaCZ12345678VIES
DEGermanyDE123456789VIES
DKDenmarkDK12345678VIES
EEEstoniaEE123456789VIES
ELGreeceEL123456789VIES
ESSpainESX1234567XVIES
FIFinlandFI12345678VIES
FRFranceFRXX123456789VIES
HRCroatiaHR12345678901VIES
HUHungaryHU12345678VIES
IEIrelandIE1234567XVIES
ITItalyIT12345678901VIES
LTLithuaniaLT123456789VIES
LULuxembourgLU12345678VIES
LVLatviaLV12345678901VIES
MTMaltaMT12345678VIES
NLNetherlandsNL123456789B01VIES
PLPolandPL1234567890VIES
PTPortugalPT123456789VIES
RORomaniaRO1234567890VIES
SESwedenSE123456789001VIES
SISloveniaSI12345678VIES
SKSlovakiaSK1234567890VIES
XINorthern IrelandXI123456789VIES
GBUnited KingdomGB123456789HMRC (coming soon; currently returns service_unavailable)

IBAN

Checksum, length and structure validation for all 127 countries in the SWIFT IBAN registry (plus a few partial adopters).

Bank name / BIC lookup

Derived from openly published national bank directories (Deutsche Bundesbank, OeNB, NBB, Betaalvereniging, Banco de España, Banca d'Italia, SIX, NBP and others) via the MIT-licensed schwifty registry. Countries marked "major banks only" have curated lists rather than full official directories. Lookups are by bank code (and for some countries bank+branch); bank is null when not covered.

CountryBank codesSource type
AD6curated list (major banks only)
AE56curated list (major banks only)
AT864official national directory
BA25official national directory
BE771official national directory
BG24curated list (major banks only)
CH1,065official national directory
CR24curated list (major banks only)
CY7curated list (major banks only)
CZ34official national directory
DE3,503official national directory
DK6,479curated list (major banks only)
EE16official national directory
ES384official national directory
FI643official national directory
FR215curated list (major banks only)
GB39curated list (major banks only)
GE20official national directory
GR22curated list (major banks only)
HR21official national directory
HU179official national directory
IE28curated list (major banks only)
IL1curated list (major banks only)
IS4curated list (major banks only)
IT453official national directory
KZ49official national directory
LI19official national directory
LT287official national directory
LU118curated list (major banks only)
LV25official national directory
MC1curated list (major banks only)
MD18official national directory
ME12curated list (major banks only)
NL86official national directory
NO2,297official national directory
PL2,999official national directory
PT77curated list (major banks only)
RO47official national directory
RS26official national directory
SE36official national directory
SI829official national directory
SK37official national directory
TR48curated list (major banks only)