Valider un numéro de TVA avec VIES : guide de programmation
Apprenez à valider des numéros de TVA néerlandais et européens avec l'API VIES. Exemples de code, gestion des erreurs et stratégies de cache.
Si vous construisez une plateforme B2B ou traitez des factures au sein de l’UE, la validation des numéros de TVA est incontournable. Ce n’est pas seulement une exigence technique, c’est aussi une obligation légale. Pour les livraisons intracommunautaires, vous devez vérifier le numéro de TVA de votre client.
Dans cet article, nous expliquons comment fonctionne le système VIES, comment l’appeler par programmation et quels pièges éviter.
Qu’est-ce que VIES ?
VIES signifie VAT Information Exchange System (système d’échange d’informations sur la TVA). C’est un service fourni par la Commission européenne qui permet de vérifier si un numéro de TVA est valide et actif. Chaque État membre de l’UE alimente le système avec ses propres données.
Lorsque vous vérifiez un numéro de TVA via VIES, vous obtenez :
- Si le numéro est valide (oui/non)
- Le nom de l’entreprise (dans la plupart des pays)
- L’adresse de l’entreprise (dans la plupart des pays)
Le format d’un numéro de TVA néerlandais
Un numéro de TVA néerlandais suit un format précis :
NL + 9 digits + B + 2 digits
Example: NL123456789B01
Avant d’envoyer une requête à VIES, vous pouvez valider le format localement :
function isValidDutchVatFormat(vatNumber) {
return /^NL\d{9}B\d{2}$/.test(vatNumber.replace(/[\s.]/g, ''));
}
// Exemples
isValidDutchVatFormat("NL123456789B01"); // true
isValidDutchVatFormat("NL12345678B01"); // false (trop peu de chiffres)
isValidDutchVatFormat("DE123456789"); // false (pas néerlandais)
Les autres pays de l’UE utilisent leurs propres formats. L’Allemagne utilise DE + 9 chiffres, la Belgique BE + 10 chiffres, et ainsi de suite.
Appeler l’API VIES
La Commission européenne fournit une API REST pour la validation VIES :
curl -X POST "https://ec.europa.eu/taxation_customs/vies/rest-api/check-vat-number" \
-H "Content-Type: application/json" \
-d '{
"countryCode": "NL",
"vatNumber": "123456789B01"
}'
La réponse ressemble à peu près à ceci :
{
"isValid": true,
"requestDate": "2025-10-21",
"userError": "VALID",
"name": "VOORBEELD B.V.",
"address": "VOORBEELDSTRAAT 1\n1234AB AMSTERDAM",
"requestIdentifier": ""
}
Implémentation en JavaScript
async function validateVatNumber(countryCode, vatNumber) {
const response = await fetch(
'https://ec.europa.eu/taxation_customs/vies/rest-api/check-vat-number',
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ countryCode, vatNumber })
}
);
if (!response.ok) {
throw new Error(`VIES API error: ${response.status}`);
}
return response.json();
}
// Utilisation
const result = await validateVatNumber('NL', '123456789B01');
if (result.isValid) {
console.log(`Valid! Company: ${result.name}`);
} else {
console.log('Invalid VAT number');
}
Problèmes courants avec VIES
1. Indisponibilités
VIES dépend des systèmes de chaque État membre. Il est fréquent qu’un pays donné soit temporairement indisponible. Vous recevez alors une erreur comme MS_UNAVAILABLE ou SERVICE_UNAVAILABLE.
Cela ne signifie pas que le numéro est invalide : cela signifie que la vérification n’a pas pu être effectuée à ce moment-là.
2. Timeouts
L’API VIES peut répondre lentement, parfois en 10 secondes ou plus. Définissez un timeout généreux et prévenez vos utilisateurs que la validation peut prendre un moment :
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 15000);
try {
const response = await fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ countryCode, vatNumber }),
signal: controller.signal
});
// traiter la réponse
} catch (error) {
if (error.name === 'AbortError') {
console.log('VIES timeout - please try again later');
}
} finally {
clearTimeout(timeout);
}
3. Limitation de débit
VIES n’a pas de limites de débit officiellement documentées, mais envoyer trop de requêtes en peu de temps peut vous faire bloquer. Mettez toujours en place une file d’attente pour les validations en masse.
Stratégie de cache
Comme la validation VIES peut être lente et peu fiable, le cache est essentiel :
async function cachedVatValidation(countryCode, vatNumber) {
const cacheKey = `vat:${countryCode}:${vatNumber}`;
const cached = await cache.get(cacheKey);
if (cached) {
const age = Date.now() - cached.timestamp;
// Numéros valides : cache de 7 jours
// Numéros invalides : cache de 1 heure (peut être temporaire)
const maxAge = cached.isValid ? 7 * 86400000 : 3600000;
if (age < maxAge) return cached;
}
const result = await validateVatNumber(countryCode, vatNumber);
await cache.set(cacheKey, { ...result, timestamp: Date.now() });
return result;
}
La logique est la suivante : un numéro de TVA valide change rarement de statut, donc un cache de 7 jours est sûr. Un résultat invalide peut être dû à une indisponibilité, vous le mettez donc en cache moins longtemps.
Pourquoi la validation de la TVA est importante
La validation de la TVA n’est pas facultative pour les transactions B2B au sein de l’UE. Pour les livraisons intracommunautaires (LIC), vous devez :
- Vérifier le numéro de TVA de votre client
- Faire figurer le numéro vérifié sur votre facture
- Déposer correctement la déclaration de LIC auprès de l’administration fiscale
Sans vérification valable, vous risquez d’être redevable de la TVA sur la livraison.
Combiner validation KVK et validation de la TVA
En pratique, vous voulez souvent valider à la fois le numéro KVK et le numéro de TVA d’une entreprise néerlandaise. Avec KVKBase, vous pouvez réunir cela en un seul flux : recherchez l’entreprise par son numéro KVK et vous obtenez directement le numéro de TVA associé. Vous pouvez ensuite valider ce numéro via VIES pour l’enregistrement au niveau de l’UE.
Conclusion
La validation des numéros de TVA via VIES est indispensable pour toute application B2B opérant au sein de l’UE. L’API est gratuite et publique, mais pas toujours fiable. Investissez dans une gestion des erreurs solide, un cache et une stratégie de repli pour offrir à vos utilisateurs une expérience fiable.
En combinant les recherches KVK et la validation de la TVA, vous couvrez à la fois l’immatriculation des entreprises néerlandaises et l’identification fiscale à l’échelle de l’UE, dans un seul flux.