Comprehensive VAT validation with checksum verification, VAT rates, currency data, and more. No signup or API key required - just call the endpoint.
Start validating VAT numbers in seconds. No API key or signup required - just call the endpoint directly.
curl "https://softwaresphere.ca/tools/VATNumberValidationTool/api.php?vat_number=DE123456789"
https://softwaresphere.ca/tools/VATNumberValidationTool/api.php
| Parameter | Type | Required | Description |
|---|---|---|---|
vat_number |
string | Required | VAT number to validate (include country prefix, e.g., DE123456789) |
vat |
string | Optional | Alias for vat_number parameter |
The API returns comprehensive validation data in JSON format. Here are all available fields:
| Field | Type | Description |
|---|---|---|
success | boolean | Whether the API call completed successfully |
message | string | Human-readable validation result message |
| Field | Type | Description |
|---|---|---|
request.input | string | Original input VAT number |
request.cleanedInput | string | Cleaned/normalized VAT number |
| Field | Type | Description |
|---|---|---|
validation.valid | boolean | Overall validation result |
validation.formatValid | boolean | Whether format matches country pattern |
validation.checksumValid.valid | boolean|null | Checksum verification result |
validation.checksumValid.algorithm | string | Algorithm used (MOD 11, MOD 97, Luhn) |
validation.checksumValid.reason | string | Detailed checksum status |
validation.confidence.score | integer | Confidence score (0-100) |
validation.confidence.level | string | Level: high, medium, low, none |
validation.confidence.factors | array | Factors contributing to score |
validation.details | object | Detailed validation checks |
| Field | Type | Description |
|---|---|---|
vatNumber.full | string | Complete cleaned VAT number |
vatNumber.formatted | string | Human-readable formatted version |
vatNumber.parsed.countryPrefix | string | Country prefix (e.g., DE, ATU) |
vatNumber.parsed.body | string | VAT number body without prefix |
vatNumber.parsed.numericPart | string | Numeric digits only |
vatNumber.parsed.alphabeticPart | string | Alphabetic characters only |
vatNumber.parsed.length | integer | Total length |
vatNumber.parsed.bodyLength | integer | Body length (excluding prefix) |
| Field | Type | Description |
|---|---|---|
country.name | string | Full country name |
country.isoCode.short | string | ISO 3166-1 alpha-2 (e.g., DE) |
country.isoCode.long | string | ISO 3166-1 alpha-3 (e.g., DEU) |
country.isoCode.numeric | string | ISO 3166-1 numeric (e.g., 276) |
country.capital | string | Capital city |
country.region | string | Geographic region |
country.population | integer | Population count |
country.timezone | string | Timezone (e.g., Europe/Berlin) |
country.dialCode | string | Phone dial code (e.g., +49) |
country.tld | string | Domain TLD (e.g., .de) |
country.languages | array | Official languages |
| Field | Type | Description |
|---|---|---|
currency.code | string | ISO 4217 currency code (e.g., EUR) |
currency.name | string | Currency name (e.g., Euro) |
currency.symbol | string | Currency symbol (e.g., €) |
| Field | Type | Description |
|---|---|---|
vatRates.standard | number | Standard VAT rate (%) |
vatRates.reduced | array | Reduced VAT rates (%) |
vatRates.superReduced | number|null | Super reduced rate (%) if applicable |
vatRates.parking | number|null | Parking rate (%) if applicable |
| Field | Type | Description |
|---|---|---|
vatThreshold.amount | number | Threshold amount for VAT registration |
vatThreshold.currency | string | Currency code |
vatThreshold.formatted | string | Formatted with symbol (e.g., €22,000) |
| Field | Type | Description |
|---|---|---|
euMembership.isMember | boolean | Current EU membership status |
euMembership.joinDate | string|null | EU join date (YYYY-MM-DD) |
euMembership.exitDate | string|null | EU exit date if applicable |
euMembership.specialStatus | string|null | Special status (e.g., Windsor Framework) |
| Field | Type | Description |
|---|---|---|
businessType.type | string | Business type name |
businessType.code | string | Type code (e.g., SA, SL, GOV) |
businessType.description | string | Detailed description |
| Field | Type | Description |
|---|---|---|
meta.timestamp | string | ISO 8601 timestamp |
meta.processingTimeMs | number | Processing time in milliseconds |
meta.apiVersion | string | API version |
meta.documentation | string | Link to documentation |
These fields are maintained for backward compatibility:
| Field | Type | Description |
|---|---|---|
input | string | Same as request.input |
vatNumber | string | Cleaned VAT number string |
valid | boolean | Same as validation.valid |
validFormat | boolean | Same as validation.formatValid |
curl "https://softwaresphere.ca/tools/VATNumberValidationTool/api.php?vat_number=NL853746333B01"
async function validateVAT(vatNumber) {
const response = await fetch(
`https://softwaresphere.ca/tools/VATNumberValidationTool/api.php?vat_number=${vatNumber}`
);
const data = await response.json();
console.log('Valid:', data.validation.valid);
console.log('Confidence:', data.validation.confidence.score + '%');
console.log('Checksum:', data.validation.checksumValid?.algorithm);
console.log('Country:', data.country.name);
console.log('Capital:', data.country.capital);
console.log('Currency:', data.currency.symbol, data.currency.name);
console.log('VAT Rate:', data.vatRates.standard + '%');
console.log('EU Member:', data.euMembership.isMember);
console.log('Business Type:', data.businessType?.type);
return data;
}
validateVAT('DE123456789').then(result => {
if (result.validation.valid) {
console.log(`Valid ${result.country.name} VAT (${result.vatRates.standard}% VAT rate)`);
}
});
import requests
def validate_vat(vat_number):
"""Validate VAT number - no API key required!"""
response = requests.get(
'https://softwaresphere.ca/tools/VATNumberValidationTool/api.php',
params={'vat_number': vat_number}
)
return response.json()
result = validate_vat('DE123456789')
print(f"Valid: {result['validation']['valid']}")
print(f"Confidence: {result['validation']['confidence']['score']}%")
checksum = result['validation'].get('checksumValid', {})
print(f"Checksum Algorithm: {checksum.get('algorithm')}")
print(f"Checksum Valid: {checksum.get('valid')}")
country = result['country']
print(f"Country: {country['name']} ({country['capital']})")
print(f"Region: {country['region']}")
print(f"Timezone: {country['timezone']}")
print(f"Languages: {', '.join(country['languages'])}")
print(f"Currency: {result['currency']['symbol']} {result['currency']['name']}")
print(f"Standard VAT: {result['vatRates']['standard']}%")
print(f"Reduced VAT: {result['vatRates']['reduced']}")
print(f"VAT Threshold: {result['vatThreshold']['formatted']}")
eu = result['euMembership']
print(f"EU Member: {eu['isMember']} (joined {eu.get('joinDate', 'N/A')})")
biz = result.get('businessType', {})
print(f"Business Type: {biz.get('type')} - {biz.get('description')}")
<?php
function validateVAT($vatNumber) {
$url = "https://softwaresphere.ca/tools/VATNumberValidationTool/api.php";
$url .= "?vat_number=" . urlencode($vatNumber);
$response = file_get_contents($url);
return json_decode($response, true);
}
$result = validateVAT('NL853746333B01');
echo "Valid: " . ($result['validation']['valid'] ? 'Yes' : 'No') . "\n";
echo "Confidence: " . $result['validation']['confidence']['score'] . "%\n";
$checksum = $result['validation']['checksumValid'] ?? [];
echo "Checksum Algorithm: " . ($checksum['algorithm'] ?? 'N/A') . "\n";
echo "Country: " . $result['country']['name'] . "\n";
echo "Capital: " . $result['country']['capital'] . "\n";
echo "Languages: " . implode(', ', $result['country']['languages']) . "\n";
echo "Standard VAT: " . $result['vatRates']['standard'] . "%\n";
echo "Reduced Rates: " . implode('%, ', $result['vatRates']['reduced']) . "%\n";
echo "Currency: " . $result['currency']['symbol'] . " " . $result['currency']['name'] . "\n";
echo "EU Member: " . ($result['euMembership']['isMember'] ? 'Yes' : 'No') . "\n";
?>
require 'net/http'
require 'json'
require 'uri'
def validate_vat(vat_number)
uri = URI("https://softwaresphere.ca/tools/VATNumberValidationTool/api.php")
uri.query = URI.encode_www_form(vat_number: vat_number)
JSON.parse(Net::HTTP.get(uri))
end
result = validate_vat('DE123456789')
puts "Valid: #{result['validation']['valid']}"
puts "Confidence: #{result['validation']['confidence']['score']}%"
puts "Country: #{result['country']['name']} (#{result['country']['capital']})"
puts "Region: #{result['country']['region']}"
puts "Standard VAT: #{result['vatRates']['standard']}%"
puts "Reduced Rates: #{result['vatRates']['reduced'].join('%, ')}%"
puts "Currency: #{result['currency']['symbol']} #{result['currency']['name']}"
puts "EU Member: #{result['euMembership']['isMember']}"
package main
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
)
type VATResponse struct {
Success bool `json:"success"`
Validation struct {
Valid bool `json:"valid"`
Confidence struct {
Score int `json:"score"`
Level string `json:"level"`
} `json:"confidence"`
ChecksumValid struct {
Valid *bool `json:"valid"`
Algorithm string `json:"algorithm"`
} `json:"checksumValid"`
} `json:"validation"`
Country struct {
Name string `json:"name"`
Capital string `json:"capital"`
Region string `json:"region"`
Languages []string `json:"languages"`
} `json:"country"`
Currency struct {
Code string `json:"code"`
Name string `json:"name"`
Symbol string `json:"symbol"`
} `json:"currency"`
VatRates struct {
Standard float64 `json:"standard"`
Reduced []float64 `json:"reduced"`
} `json:"vatRates"`
EuMembership struct {
IsMember bool `json:"isMember"`
JoinDate string `json:"joinDate"`
} `json:"euMembership"`
}
func validateVAT(vatNumber string) (*VATResponse, error) {
baseURL := "https://softwaresphere.ca/tools/VATNumberValidationTool/api.php"
params := url.Values{}
params.Add("vat_number", vatNumber)
resp, err := http.Get(baseURL + "?" + params.Encode())
if err != nil {
return nil, err
}
defer resp.Body.Close()
var result VATResponse
json.NewDecoder(resp.Body).Decode(&result)
return &result, nil
}
func main() {
result, _ := validateVAT("DE123456789")
fmt.Printf("Valid: %v (Confidence: %d%%)\n", result.Validation.Valid, result.Validation.Confidence.Score)
fmt.Printf("Country: %s (%s)\n", result.Country.Name, result.Country.Capital)
fmt.Printf("VAT Rate: %.0f%%\n", result.VatRates.Standard)
fmt.Printf("Currency: %s %s\n", result.Currency.Symbol, result.Currency.Name)
}
using System;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
public class VATValidator
{
private static readonly HttpClient client = new HttpClient();
public static async Task<JsonDocument> ValidateVAT(string vatNumber)
{
var url = $"https://softwaresphere.ca/tools/VATNumberValidationTool/api.php?vat_number={Uri.EscapeDataString(vatNumber)}";
var response = await client.GetStringAsync(url);
return JsonDocument.Parse(response);
}
public static async Task Main()
{
var result = await ValidateVAT("DE123456789");
var root = result.RootElement;
var validation = root.GetProperty("validation");
Console.WriteLine($"Valid: {validation.GetProperty("valid").GetBoolean()}");
Console.WriteLine($"Confidence: {validation.GetProperty("confidence").GetProperty("score").GetInt32()}%");
var country = root.GetProperty("country");
Console.WriteLine($"Country: {country.GetProperty("name").GetString()}");
Console.WriteLine($"Capital: {country.GetProperty("capital").GetString()}");
var rates = root.GetProperty("vatRates");
Console.WriteLine($"Standard VAT: {rates.GetProperty("standard").GetInt32()}%");
var currency = root.GetProperty("currency");
Console.WriteLine($"Currency: {currency.GetProperty("symbol").GetString()} {currency.GetProperty("name").GetString()}");
}
}
{
"success": true,
"request": {
"input": "DE123456789",
"cleanedInput": "DE123456789"
},
"validation": {
"valid": true,
"formatValid": true,
"checksumValid": {
"valid": false,
"algorithm": "MOD 11",
"reason": "Checksum mismatch"
},
"confidence": {
"score": 70,
"level": "medium",
"maxScore": 100,
"factors": ["Country recognized (+30)", "Format valid (+40)"]
},
"details": {
"countryRecognized": true,
"formatMatchesPattern": true,
"checksumAlgorithm": "mod11",
"lengthValid": true
}
},
"vatNumber": {
"full": "DE123456789",
"formatted": "DE 1234 5678 9",
"parsed": {
"full": "DE123456789",
"countryPrefix": "DE",
"body": "123456789",
"numericPart": "123456789",
"alphabeticPart": "",
"length": 11,
"bodyLength": 9
}
},
"country": {
"name": "Germany",
"isoCode": {
"short": "DE",
"long": "DEU",
"numeric": "276"
},
"capital": "Berlin",
"region": "Western Europe",
"population": 83783942,
"timezone": "Europe/Berlin",
"dialCode": "+49",
"tld": ".de",
"languages": ["German"]
},
"currency": {
"code": "EUR",
"name": "Euro",
"symbol": "€"
},
"vatRates": {
"standard": 19,
"reduced": [7],
"superReduced": null,
"parking": null
},
"vatThreshold": {
"amount": 22000,
"currency": "EUR",
"formatted": "€22,000"
},
"euMembership": {
"isMember": true,
"joinDate": "1958-01-01",
"exitDate": null,
"specialStatus": null
},
"businessType": {
"type": "Standard Business",
"code": "BUS",
"description": "Standard registered business"
},
"format": {
"expected": "DE + 9 digits",
"example": "DE123456789"
},
"company": {
"name": "Format validated - use EU VIES for live company lookup",
"address": "Available via VIES API"
},
"message": "VAT number format is valid for Germany",
"meta": {
"timestamp": "2024-01-15T10:30:45+00:00",
"processingTimeMs": 2.45,
"apiVersion": "1.0.0",
"documentation": "https://softwaresphere.ca/?p=vatnumbervalidationtoolapi"
},
"input": "DE123456789",
"vatNumber": "DE123456789",
"valid": true,
"validFormat": true
}
Full support for all EU member states plus UK and Northern Ireland:
The API returns helpful error messages for invalid inputs:
{
"success": false,
"error": "Missing required parameter: vat_number",
"meta": {
"timestamp": "2024-01-15T10:30:45+00:00",
"apiVersion": "1.0.0"
}
}
{
"success": true,
"validation": {
"valid": false,
"formatValid": false,
"confidence": {
"score": 0,
"level": "none"
}
},
"message": "VAT number format is invalid or country not recognized..."
}
Start validating VAT numbers for free right now. No signup required.
Try It Free Now