100% Free - No API Key Required

VAT Number Validation API

Comprehensive VAT validation with checksum verification, VAT rates, currency data, and more. No signup or API key required - just call the endpoint.

Checksum Validation
MOD 11, MOD 97, Luhn
💰
VAT Rates
Standard & Reduced
💱
Currency Info
Code, Name, Symbol
🇪🇺
EU Membership
Join/Exit Dates
🏢
Business Type
Entity Detection
📊
Confidence Score
0-100% Rating
Fast Response
<50ms Latency
🌐
28 Countries
All EU + UK

Quick Start

Start validating VAT numbers in seconds. No API key or signup required - just call the endpoint directly.

cURL No API Key Needed
curl "https://softwaresphere.ca/tools/VATNumberValidationTool/api.php?vat_number=DE123456789"

API Endpoint

GET POST https://softwaresphere.ca/tools/VATNumberValidationTool/api.php

Request Parameters

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

Response Structure

The API returns comprehensive validation data in JSON format. Here are all available fields:

Core Response

FieldTypeDescription
successbooleanWhether the API call completed successfully
messagestringHuman-readable validation result message

Request Info

FieldTypeDescription
request.inputstringOriginal input VAT number
request.cleanedInputstringCleaned/normalized VAT number

Validation

FieldTypeDescription
validation.validbooleanOverall validation result
validation.formatValidbooleanWhether format matches country pattern
validation.checksumValid.validboolean|nullChecksum verification result
validation.checksumValid.algorithmstringAlgorithm used (MOD 11, MOD 97, Luhn)
validation.checksumValid.reasonstringDetailed checksum status
validation.confidence.scoreintegerConfidence score (0-100)
validation.confidence.levelstringLevel: high, medium, low, none
validation.confidence.factorsarrayFactors contributing to score
validation.detailsobjectDetailed validation checks

VAT Number Parsing

FieldTypeDescription
vatNumber.fullstringComplete cleaned VAT number
vatNumber.formattedstringHuman-readable formatted version
vatNumber.parsed.countryPrefixstringCountry prefix (e.g., DE, ATU)
vatNumber.parsed.bodystringVAT number body without prefix
vatNumber.parsed.numericPartstringNumeric digits only
vatNumber.parsed.alphabeticPartstringAlphabetic characters only
vatNumber.parsed.lengthintegerTotal length
vatNumber.parsed.bodyLengthintegerBody length (excluding prefix)

Country Information

FieldTypeDescription
country.namestringFull country name
country.isoCode.shortstringISO 3166-1 alpha-2 (e.g., DE)
country.isoCode.longstringISO 3166-1 alpha-3 (e.g., DEU)
country.isoCode.numericstringISO 3166-1 numeric (e.g., 276)
country.capitalstringCapital city
country.regionstringGeographic region
country.populationintegerPopulation count
country.timezonestringTimezone (e.g., Europe/Berlin)
country.dialCodestringPhone dial code (e.g., +49)
country.tldstringDomain TLD (e.g., .de)
country.languagesarrayOfficial languages

Currency

FieldTypeDescription
currency.codestringISO 4217 currency code (e.g., EUR)
currency.namestringCurrency name (e.g., Euro)
currency.symbolstringCurrency symbol (e.g., €)

VAT Rates

FieldTypeDescription
vatRates.standardnumberStandard VAT rate (%)
vatRates.reducedarrayReduced VAT rates (%)
vatRates.superReducednumber|nullSuper reduced rate (%) if applicable
vatRates.parkingnumber|nullParking rate (%) if applicable

VAT Threshold

FieldTypeDescription
vatThreshold.amountnumberThreshold amount for VAT registration
vatThreshold.currencystringCurrency code
vatThreshold.formattedstringFormatted with symbol (e.g., €22,000)

EU Membership

FieldTypeDescription
euMembership.isMemberbooleanCurrent EU membership status
euMembership.joinDatestring|nullEU join date (YYYY-MM-DD)
euMembership.exitDatestring|nullEU exit date if applicable
euMembership.specialStatusstring|nullSpecial status (e.g., Windsor Framework)

Business Type

FieldTypeDescription
businessType.typestringBusiness type name
businessType.codestringType code (e.g., SA, SL, GOV)
businessType.descriptionstringDetailed description

Metadata

FieldTypeDescription
meta.timestampstringISO 8601 timestamp
meta.processingTimeMsnumberProcessing time in milliseconds
meta.apiVersionstringAPI version
meta.documentationstringLink to documentation

Legacy Compatibility

These fields are maintained for backward compatibility:

FieldTypeDescription
inputstringSame as request.input
vatNumberstringCleaned VAT number string
validbooleanSame as validation.valid
validFormatbooleanSame as validation.formatValid

Code Examples

cURL
curl "https://softwaresphere.ca/tools/VATNumberValidationTool/api.php?vat_number=NL853746333B01"
JavaScript (Fetch)
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)`);
    }
});
Python
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
<?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";
?>
Ruby
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']}"
Go
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)
}
C#
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()}");
    }
}

Example Response

JSON Response for DE123456789
{
    "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
}

Supported Countries (28)

Full support for all EU member states plus UK and Northern Ireland:

🇦🇹 AT - Austria
🇧🇪 BE - Belgium
🇧🇬 BG - Bulgaria
🇨🇾 CY - Cyprus
🇨🇿 CZ - Czech Republic
🇩🇪 DE - Germany
🇩🇰 DK - Denmark
🇪🇪 EE - Estonia
🇬🇷 EL - Greece
🇪🇸 ES - Spain
🇫🇮 FI - Finland
🇫🇷 FR - France
🇬🇧 GB - United Kingdom
🇭🇷 HR - Croatia
🇭🇺 HU - Hungary
🇮🇪 IE - Ireland
🇮🇹 IT - Italy
🇱🇹 LT - Lithuania
🇱🇺 LU - Luxembourg
🇱🇻 LV - Latvia
🇲🇹 MT - Malta
🇳🇱 NL - Netherlands
🇵🇱 PL - Poland
🇵🇹 PT - Portugal
🇷🇴 RO - Romania
🇸🇪 SE - Sweden
🇸🇮 SI - Slovenia
🇸🇰 SK - Slovakia
🇬🇧 XI - N. Ireland

Error Handling

The API returns helpful error messages for invalid inputs:

Missing Parameter (HTTP 400)
{
    "success": false,
    "error": "Missing required parameter: vat_number",
    "meta": {
        "timestamp": "2024-01-15T10:30:45+00:00",
        "apiVersion": "1.0.0"
    }
}
Invalid Format (HTTP 200)
{
    "success": true,
    "validation": {
        "valid": false,
        "formatValid": false,
        "confidence": {
            "score": 0,
            "level": "none"
        }
    },
    "message": "VAT number format is invalid or country not recognized..."
}

Ready to Get Started?

Start validating VAT numbers for free right now. No signup required.

Try It Free Now