Swiss UID validation: understanding the CHE-xxxxxxxxx format
How Switzerland's UID register works, CHE format, MWST/IVA/TVA suffixes, BFS UID register SOAP eCH-0097 schema, and Liechtenstein's dual coverage.
TL;DR
- Swiss UID is Switzerland's unified business identifier (think of it as a company registration number that optionally carries VAT status).
- The format is
CHE+ 9 digits, commonly displayed with hyphens and dots:CHE-123.456.789. - The Federal Statistical Office (BFS) runs the registry via a SOAP endpoint using the eCH-0097 standard.
- Liechtenstein uses the same CHE format and validates through the same endpoint.
- vatverify normalizes all input variations and handles the SOAP layer for you.
@vatverify/node (used in the Node example below) ships on npm at the API launch. Reading this before launch? The REST endpoint is live today. Swap any vat.validate({ vat_number }) call for fetch('https://api.vatverify.dev/v1/validate?vat_number=...') with an Authorization: Bearer header. The Python and cURL snippets on this page work today without any package install.
Swiss UID vs VAT: the distinction
UID (Unternehmens-Identifikationsnummer) is the company's universal identifier, assigned at incorporation and used across all Swiss federal agencies. VAT registration (MWST/TVA/IVA) is a separate status that may or may not be active on that UID. A company can have a UID without being VAT-registered (below the CHF 100,000 turnover threshold, or operating in an exempt sector). When you validate a Swiss "VAT number," you are really asking: does this UID exist, and is the VAT flag active on it?
The CHE-xxxxxxxxx format
The canonical display format is CHE-123.456.789: the three-letter prefix followed by three groups of three digits separated by dots, with a hyphen between the prefix and the first group. In practice you will encounter all of these in the wild:
CHE-123.456.789CHE123456789CHE 123 456 789CHE-123.456.789 MWST
vatverify normalizes all of them silently before sending the upstream request. The 9-digit body uses a MOD-11 check digit as the final digit.
The MWST / TVA / IVA suffixes
Switzerland has three official languages, and the VAT suffix varies by language:
| Language | Suffix | Meaning |
|---|---|---|
| German | MWST | Mehrwertsteuer |
| French | TVA | Taxe sur la valeur ajoutée |
| Italian | IVA | Imposta sul valore aggiunto |
All three refer to exactly the same VAT registration status. Which suffix appears in practice depends on the canton the company is registered in (and sometimes just on which language the person entering the number was using). vatverify strips all three variants before lookup.
BFS UID register
The UID register is operated by the Federal Statistical Office (Bundesamt für Statistik, abbreviated BFS). The BFS provides a public SOAP web service for querying UID records and checking VAT registration status. There is no official public REST API. It is SOAP only, similar in spirit to VIES.
The BFS maintains a separate query interface for public lookups at uid.admin.ch, but programmatic access goes through the SOAP endpoint.
SOAP eCH-0097 schema
eCH-0097 is the Swiss e-government standard that defines the data schema for UID-related records. It specifies the XML element names, types, and validation rules for UID lookups. The standard is maintained by the eCH association (E-Government Standards Switzerland) and is publicly available at ech.ch. A minimal UID lookup request against the BFS endpoint references the uid:getUID operation and wraps the CHE prefix and numeric body in the schema's typed elements. vatverify handles schema construction and response parsing internally.
Liechtenstein (LI) dual coverage
Liechtenstein is not Switzerland, but its VAT system is tightly integrated with the Swiss one under a customs and currency union. Liechtenstein VAT numbers use LI as the country prefix in an international context, but the underlying business identifier is a CHE-format UID validated through the same BFS endpoint. When you pass LI as the country prefix to vatverify, it routes to the BFS endpoint automatically. You do not need separate handling.
Input normalization in vatverify
vatverify strips the following before upstream lookup:
- Hyphens (
-) - Dots (
.) - Spaces
- MWST / TVA / IVA suffix (case-insensitive)
- Leading/trailing whitespace
So CHE-115.932.342 MWST, CHE115932342, and che 115 932 342 tva all resolve to the same lookup.
Sample request/response
import { Vatverify } from '@vatverify/node';
const vat = new Vatverify(process.env.VATVERIFY_API_KEY!);
const result = await vat.validate({ vat_number: 'CHE-115.932.342 MWST' });
// result.data.valid → true
// result.data.company?.name → "Example AG"
// result.data.country.code → "CH"import os
import httpx
response = httpx.get(
"https://api.vatverify.dev/v1/validate",
params={"vat_number": "CHE-115.932.342 MWST"},
headers={"Authorization": f"Bearer {os.environ['VATVERIFY_API_KEY']}"},
)
result = response.json()
# result["data"]["valid"] → True
# result["data"]["company"]["name"] → "Example AG"
# result["data"]["country"]["code"] → "CH"curl "https://api.vatverify.dev/v1/validate?vat_number=CHE-115.932.342%20MWST" \
-H "Authorization: Bearer $VATVERIFY_API_KEY"Example response:
{
"data": {
"valid": true,
"vat_number": "CHE115932342",
"country": { "code": "CH", "name": "Switzerland" },
"company": {
"name": "Example AG",
"address": "Musterstrasse 1, 8001 Zürich"
},
"verified_at": "2026-04-14T15:42:03.451Z"
},
"meta": {
"request_id": "0190f8ea-a5b2-7000-a123-000000000000",
"cached": false,
"source": "bfs",
"source_status": "live",
"latency_ms": 312
}
}If the business exists but is not VAT-registered, the upstream registry returns data.valid: false and data.company: null:
{
"data": {
"valid": false,
"vat_number": "CHE115932342",
"country": { "code": "CH", "name": "Switzerland" },
"company": null,
"verified_at": "2026-04-14T15:42:03.451Z"
},
"meta": { "source": "bfs", "source_status": "live" }
}Rate limits & uptime
The BFS UID register has no published rate limit. Anecdotal testing suggests ~50 requests/second sustained is safe without triggering throttling. BFS uptime is consistently ≥99.9%. Swiss government infrastructure tends to be reliable. vatverify caches responses for 30 days, so repeated lookups of the same number hit the cache and never touch the BFS endpoint.
FAQ
Is UID the same as VAT?
No. UID is the Swiss company identifier. Every registered business has one. VAT registration (MWST/TVA/IVA) is a separate flag that is only active if the company meets the registration threshold (currently CHF 100,000 annual turnover) or has voluntarily registered. A company can have a valid UID but data.valid: false in vatverify if it is not VAT-registered.
What if the input is CHE-115.932.342 MWST?
vatverify strips the hyphen, dots, spaces, and MWST suffix before sending the lookup. All of those display variants normalize to CHE115932342 internally. You do not need to sanitize the input before passing it to the API.
Does Liechtenstein need separate handling?
No. Pass the number with the LI prefix (LI00012345) and vatverify routes it to the same BFS endpoint used for Swiss UIDs. Liechtenstein does not have a separate registry endpoint. The response includes "country": "LI" to confirm the routing.
What if the business exists but isn't VAT-registered?
The response has data.valid: false. The company name and address are not populated on a valid: false response; if you need the business-registered-but-not-VAT-registered signal, pair this with a separate UID lookup against BFS.
Does UID work for sole proprietors?
Yes. Individual sole proprietors (Einzelunternehmen) in Switzerland receive a CHE UID, the same as legal entities. Whether they are VAT-registered depends on whether they have crossed the registration threshold. The same validation endpoint and response format applies. If they are below threshold, data.valid is false.