Validate an EU VAT number against the official VIES registry before invoicing, o
Validate an EU VAT number against the official VIES registry before invoicing, onboarding or a reverse charge. Per-country syntax is checked locally first, so invalid formats never touch the network. Valid numbers return the registered company name and address when disclosed, plus an optional consultation number (requesterVat). Never a false 'invalid': if VIES is down you get a 503 and are not charged. ?attest=1 → Ed25519-signed.
Answeringour last check, 2026-09-24
1 of 1checks answered this week
15 msmedian answer time
$0.002listed price per call
$0.002price it asked us
Paid test badge: not yet. The checks above are free: we call the tool without paying and read the payment request it sends back. The Verified badge needs paid calls whose answers match the promised output, and nobody can buy a badge.
Endpoint
GET https://staging.402utils.com/v1/vat-check
| Category | Company and compliance |
|---|---|
| Provider host | staging.402utils.com |
| Networks | eip155:84532 |
| Payment schemes | exact |
| Self-reported calls, 30 days | 1 from 1 payers (the provider's figure, not ours) |
Our checks, last 30 days
| Day | Result | HTTP | Asked | Time |
|---|---|---|---|---|
| 2026-09-24 | valid payment request | 402 | $0.002 | 15 ms |
Example input (from the provider)
{
"method": "GET",
"queryParams": {
"vat": "IE6388047V"
},
"type": "http"
}
Promised output schema (from the provider)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"input": {
"additionalProperties": false,
"properties": {
"method": {
"enum": [
"GET"
],
"type": "string"
},
"queryParams": {
"description": "Query: `vat=FR12345678901` OR `country=FR&number=12345678901`; optional `requesterVat`.",
"properties": {
"attest": {
"description": "Set to 1 for an Ed25519-signed attestation of the result (audit trail).",
"type": "string"
},
"country": {
"description": "Member state code (alternative to `vat`).",
"type": "string"
},
"number": {
"description": "VAT number without prefix (with `country`).",
"type": "string"
},
"requesterVat": {
"description": "Your own VAT number, to receive an official consultation number.",
"type": "string"
},
"vat": {
"description": "Full VAT number incl. country prefix, e.g. FR40303265045.",
"type": "string"
}
},
"type": "object"
},
"type": {
"const": "http",
"type": "string"
}
},
"required": [
"type",
"method"
],
"type": "object"
},
"output": {
"properties": {
"example": {
"properties": {
"address": {
"type": "string"
},
"attestation": {
"description": "Present only with ?attest=1. Ed25519 signature over the canonical result; verify against /.well-known/402utils-attestation.json.",
"properties": {
"alg": {
"const": "Ed25519",
"type": "string"
},
"payload": {
"properties": {
"endpoint": {
"type": "string"
},
"kid": {
"description": "Key id \u2014 matches a key in the .well-known document.",
"type": "string"
},
"resultSha256": {
"description": "SHA-256 of the canonical JSON of the result (attestation excluded).",
"type": "string"
},
"ts": {
"format": "date-time",
"type": "string"
}
},
"type": "object"
},
"sig": {
"description": "base64url Ed25519 signature over the canonical JSON of payload.",
"type": "string"
}
},
"type": "object"
},
"cached": {
"description": "True if served from the 24h positive-result cache.",
"type": "boolean"
},
"checkedAt": {
"format": "date-time",
"type": "string"
},
"consultationNumber": {
"description": "Official proof-of-check id (only with requesterVat).",
"type": "string"
},
"countryCode": {
"type": "string"
},
"name": {
"type": "string"
},
"reason": {
"description": "Present when valid=false due to local syntax: 'invalid_format'.",
"type": "string"
},
"source": {
"const": "VIES",
"type": "string"
},
"valid": {
"type": "boolean"
},
"vatNumber": {
"type": "string"
}
},
"required": [
"valid",
"countryCode",
"vatNumber",
"checkedAt",
"source"
],
"type": "object"
},
"type": {
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
}
},
"required": [
"input"
],
"type": "object"
}