Country Guide10 min readAlberto García

French VAT Number Validation: TVA Intracommunautaire Format, VIES, and Code Examples

French VAT numbers use FR + 2 alphanumeric characters + 9 digits. The first two characters can be letters or numbers — one of the few EU formats with an alpha component after the prefix.

francefrtva

France is the EU's second-largest economy and one of the top sources of B2B customers for European SaaS, e-commerce, and professional services platforms. Validating French VAT numbers — the numéro de TVA intracommunautaire — is straightforward once you know the format, but the two-character alphanumeric component after the FR prefix makes it subtly different from most EU countries and a frequent source of integration bugs. This guide covers the exact format, the VIES flow specific to France, common errors, and complete code examples.

Note

French VAT numbers (TVA intracommunautaire) are issued and managed by the Direction Générale des Finances Publiques (DGFiP). VIES queries the DGFiP system in real time. France participates fully in the EU VIES system.

The French VAT Number Format (TVA Intracommunautaire)

A French VAT number consists of the prefix FR followed by exactly two alphanumeric characters, followed by exactly nine digits — 13 characters in total. The two-character 'key' can be any combination of uppercase digits and letters, with one restriction: the letters O and I are excluded to avoid confusion with the digits 0 and 1. Valid characters in positions 3 and 4 are therefore 0-9 and A-H, J-N, P-Z. Valid examples include FR12345678901, FRXX345678901, and FR0A345678901.

The 9-digit block at the end is derived from the SIREN — the French national business identifier maintained by INSEE. Every French legal entity has a SIREN, and the TVA key is computed from the SIREN using a modular arithmetic algorithm. In practice, local format validation (FR + 2 alphanumeric + 9 digits) is sufficient before sending to VIES. Full check digit validation against the SIREN is performed internally by the TaxID API.

French businesses commonly write their TVA number with spaces — 'FR 12 345678901' or 'FR12 345678901'. Some accounting software outputs 'FR-12-345678901'. Strip all spaces, hyphens, and non-alphanumeric characters before validation. The canonical form for API calls is always FR followed immediately by 11 characters with no separators.

PropertyValue
PrefixFR
Total length13 characters (FR + 2 alphanumeric + 9 digits)
FormatFR + 2 chars (0-9, A-H, J-N, P-Z — no O or I) + 9 digits
ExampleFR12345678901
Regex^FR[0-9A-HJ-NP-Z]{2}[0-9]{9}$
VIES country codeFR
National authorityDirection Générale des Finances Publiques (DGFiP)
Local nameNuméro de TVA intracommunautaire

Common French VAT Format Errors

  • Submitting the SIREN instead of TVA: French businesses often confuse their 9-digit SIREN with the TVA number. A SIREN like '345678901' is not a valid TVA — it lacks the FR prefix and the 2-character key.
  • Submitting the SIRET: the SIRET is SIREN + a 5-digit establishment code (14 digits total). Not a VAT number.
  • Missing FR prefix: '12345678901' instead of 'FR12345678901' — the most common customer input error.
  • Letters O or I in the key: 'FRO1345678901' contains O in position 3 — structurally invalid.
  • Spaces and separators: 'FR 12 345 678 901' or 'FR.12.345678901' — strip all non-alphanumeric characters before validation.
  • Lowercase: 'fr12345678901' — normalise to uppercase. The TaxID API accepts and normalises lowercase automatically.

French Company Types and VAT Registration

The most common French legal forms for B2B customers are SARL (Société à responsabilité limitée — equivalent to a GmbH or LLC), SAS (Société par actions simplifiée — popular for French startups and tech companies), SA (Société anonyme — public company), and the auto-entrepreneur or micro-entreprise regime for sole traders. All these forms can be VAT-registered and have a TVA intracommunautaire number.

Auto-entrepreneurs and micro-enterprises operating below the franchise en base de TVA threshold — €36,800 for services and €91,900 for goods in 2026 — are VAT-exempt and do not have a TVA number. This is a common, legitimate scenario for French freelancers and small service providers. A French customer without a TVA number is not necessarily avoiding VAT — they may simply be below threshold. You must charge French VAT at the applicable rate on supplies to unregistered French customers.

VIES and France's DGFiP: What to Expect

France's VIES integration via DGFiP is generally reliable but experiences slowdowns during high-traffic periods — particularly around French public holidays, month-end, and VAT filing deadlines (the 20th of each month). Unlike Germany's BZST, DGFiP does not publish a regular maintenance window; downtime is typically unannounced and load-related. Response times for live VIES lookups range from 300 to 800ms in normal conditions.

France usually returns both company name and registered address via VIES. The name is the official DGFiP-registered denomination, which may differ from the trading name. For SAS companies with a simple brand name, VIES returns the full legal name including the legal form designation (e.g., 'Acme SAS'). Use the VIES-returned name on invoices rather than the customer's self-reported name — French tax authorities verify invoice recipient details against DGFiP records during audits.

French VAT validation via TaxID caches results in Redis for 24 hours. A previously validated French number returns in under 10ms; an uncached live lookup typically completes in 400-700ms. If DGFiP is temporarily unavailable, TaxID returns service_unavailable rather than a false negative. For checkout flows, implement the allow-and-re-validate pattern. See VIES Downtime: Building a Resilient Validation Flow.

French VAT Rates

France applies a standard VAT rate of 20% to most goods and services. A 10% reduced rate applies to restaurant meals, hotel accommodation, passenger transport, and home renovation work. A 5.5% reduced rate applies to most food products, books (print and digital), and certain energy subscriptions. A super-reduced rate of 2.1% applies to pharmaceutical products reimbursed by social security and certain press publications. For SaaS sold to French B2C customers the rate is 20%. For French B2B customers with a valid TVA intracommunautaire, zero-rate reverse charge applies.

Code Examples

cURL

bash
# Validate a French VAT number
curl https://taxid.dev/api/v1/validate/FR/FR12345678901 \
  -H "Authorization: Bearer YOUR_API_KEY"

# Expected response:
# {
#   "valid": true,
#   "status": "active",
#   "vat": "FR12345678901",
#   "country_code": "FR",
#   "company_name": "Example SAS",
#   "address": "1 Rue de la Paix, 75001 Paris",
#   "cached": false,
#   "request_id": "req_01j..."
# }

Node.js / TypeScript

typescriptvalidate-french-vat.ts
export async function validateFrenchVat(vatNumber: string): Promise<{
  valid: boolean;
  companyName: string | null;
  address: string | null;
  status: string;
}> {
  const normalised = vatNumber.replace(/\s/g, '').toUpperCase();

  // FR + 2 alphanumeric (no O or I) + 9 digits
  if (!/^FR[0-9A-HJ-NP-Z]{2}[0-9]{9}$/.test(normalised)) {
    return { valid: false, companyName: null, address: null, status: 'format_invalid' };
  }

  const res = await fetch(
    `https://taxid.dev/api/v1/validate/FR/${normalised}`,
    {
      headers: { Authorization: `Bearer ${process.env.TAXID_API_KEY}` },
      signal: AbortSignal.timeout(5000),
    }
  );

  const data = await res.json();
  return {
    valid: data.valid,
    companyName: data.company_name,
    address: data.address,
    status: data.status,
  };
}

Python

pythonvalidate_french_vat.py
import re, os, requests
from dataclasses import dataclass
from typing import Optional

FR_PATTERN = re.compile(r'^FR[0-9A-HJ-NP-Z]{2}[0-9]{9}$')

@dataclass
class FrenchVatResult:
    valid: bool
    company_name: Optional[str]
    address: Optional[str]
    status: str

def validate_french_vat(vat: str) -> FrenchVatResult:
    normalised = vat.replace(' ', '').upper()
    if not FR_PATTERN.match(normalised):
        return FrenchVatResult(False, None, None, 'format_invalid')

    r = requests.get(
        f'https://taxid.dev/api/v1/validate/FR/{normalised}',
        headers={'Authorization': f'Bearer {os.environ["TAXID_API_KEY"]}'},
        timeout=5,
    )
    r.raise_for_status()
    d = r.json()
    return FrenchVatResult(
        valid=d['valid'],
        company_name=d.get('company_name'),
        address=d.get('address'),
        status=d['status'],
    )

Frequently Asked Questions

  • Is FR always the VIES code for France? Yes. France uses FR as both its ISO 3166-1 alpha-2 code and its VIES prefix — no mismatch like Greece (EL vs GR).
  • What is the difference between SIREN, SIRET, and TVA number? SIREN is a 9-digit national business identifier. SIRET is SIREN + 5-digit establishment code (14 digits). The TVA number is FR + 2-char key + 9-digit SIREN. They share data but are not interchangeable.
  • Can a French auto-entrepreneur have a TVA number? Only if they have exceeded the franchise en base de TVA threshold and opted for ordinary VAT registration. Auto-entrepreneurs below threshold have no TVA number and cannot receive zero-rate reverse charge.
  • Does VIES return the company name for French businesses? In most cases yes. The name is the official DGFiP denomination, which may differ from the trading name. Use the VIES name on invoices for compliance.
  • How long does VIES take for French validations? Cached French numbers respond in under 10ms. Uncached live DGFiP lookups typically complete in 400-700ms. VAT filing periods (around the 20th of each month) can add latency.

Validating French VAT Numbers at Scale

France is typically a top-three source of EU B2B customers alongside Germany and the Netherlands for European-facing platforms. At high validation volumes, TaxID's caching layer ensures repeated lookups for the same French number within 24 hours do not create additional DGFiP load. For bulk validation of a supplier or CRM database, process in batches of 50-100 with a short delay between batches, and store the request_id from each response as an audit trail. For the complete format reference and a live validator, see validate-vat/fr.

Start validating EU VAT numbers

Free plan — 100 validations/month. No credit card required.

AG
Alberto García

Founder, TaxID

Building EU VAT validation tools for developers. Obsessed with compliance automation and developer experience.