Check Germany VAT numbers
Validate German VAT numbers (USt-IdNr.) against the EU VIES registry. For sellers who need §18e UStG legal evidence, the BZSt qualified confirmation is available on /v1/confirm and stores the per-field match grid for 10 years to meet §147 AO retention. Every response includes the company name, registered address, and validity at query time.
Try it
curl -X POST "https://api.vatverify.dev/v1/validate" \ -H "Authorization: Bearer $VATVERIFY_KEY" \ -H "Content-Type: application/json" \ -d '{"vat_number":"DE129273398"}'Facts
Format
- Prefix
- DE
- Digits
- 9
- Regex
- ^DE\d{9}$
DE129273398DE129273390DE12927339Registry
VIES powers /v1/validate for Germany.
Additionally, BZSt runs the §18e qualified confirmation on top of VIES, via /v1/confirm.
VAT rates (EUR)
food staples, books, newspapers, cut flowers, hotel accommodation, short-distance passenger transport, cultural events
What we return for Germany
{
"data": {
"valid": true, // boolean validity at query time
"vat_number": "DE129273398",
"country": {
"code": "DE",
"name": "Germany",
"vat": { "standard_rate": 19 }
},
"company": {
"name": "SIEMENS AG", // legal entity name
"address": "..." // when VIES provides it
},
"verified_at": "2026-04-25T10:00:00Z"
},
"meta": {
"request_id": "019dc...", // for audit trail correlation
"source": "vies",
"source_status": "live", // live | cached | degraded
"cached": false,
"latency_ms": 234
}
}
For §18e qualified confirmation, /v1/confirm additionally returns per-field A/B/C/D match codes on name, street, postcode, town.
Test against production VATs
Real numbers from publicly-documented corporate filings. Click to see the live result.
Watch out for
- DE USt-IdNr. is 9 digits; do not confuse with the 10-13-digit Steuernummer (domestic tax ID). Only USt-IdNr. is valid for intra-EU VAT.
- §18e UStG requires a qualified confirmation for VAT-free EU supplies: /v1/confirm returns per-field A/B/C/D match codes against BZSt.
- BZSt qualified confirmation is separate from VIES: VIES says "exists", BZSt says "exists AND matches your records".
Fraud patterns
- Missing Trader Intra-Community (MTIC) fraud: fake DE buyers present a valid VIES-listed USt-IdNr. that matches a recently-registered shell. §18e qualified confirmation with address-match flags is the defense; VIES-only check will pass, BZSt match will not.
Why §18e matters for German sellers
German sellers making VAT-free intra-EU supplies are required by §18e UStG to obtain a qualifizierte Bestätigungsmitteilung, a confirmation from the Bundeszentralamt für Steuern (BZSt) that the foreign customer's VAT number is valid and that the specific company details (name, street, postcode, town) on file match what the seller has in their books.
A plain VIES check is not enough. VIES tells you whether a number exists; BZSt tells you whether that number belongs to the entity you think it does. If a tax audit challenges a VAT-free invoice, the BZSt confirmation is the legal evidence that protects the seller's good-faith position.
vatverify exposes both:
/v1/validatehits VIES and returnsvalid: true/false, the same level of detail most validators offer./v1/confirmhits BZSt and returns per-field match codes (A/B/C/D) for name, street, postcode, and town. The full field grid is stored for 10 years to meet §147 AO retention.
For the full integration walkthrough, see the BZSt §18e qualified confirmation guide.
DE format specifics
USt-IdNr. is always 9 digits after the DE prefix. It is not the same as
the domestic Steuernummer. The former is EU-facing; the latter is how
your Finanzamt identifies you. Many import flows confuse the two, and our
validator rejects Steuernummer inputs immediately on format rather than
round-tripping to VIES.
The 9-digit USt-IdNr. carries a check digit. A structurally well-formed number that fails the check digit is rejected offline before any registry call, useful when you're validating thousands of numbers in a batch and don't want to burn quota on obvious typos.
Known fraud shape: MTIC
Missing Trader Intra-Community fraud uses short-lived shell companies that are technically VIES-listed at the moment of the sale. A VIES-only integration will mark these valid. A BZSt qualified confirmation in the same window often returns degraded match codes on street and postcode because the shell uses a hollow address. The qualified check is not a guarantee but it is materially stronger than the VIES baseline.
If a counterparty's VAT number was issued recently and you are about to
zero-rate a high-value invoice, run the BZSt qualified check rather than
a plain VIES lookup. A qualified A/A/A/A response is what an
auditor wants to see in the file.
Name disclosure: VIES often returns nothing for DE
Germany is one of the member states that suppress trader name and address
disclosure through VIES under national privacy policy. The number is still
validated authoritatively, so valid: true is meaningful, but the
data.company.name and data.company.address fields on a /v1/validate
response will come back null for most DE numbers.
This is the case where BZSt's qualified confirmation matters. Pass the company name and address you have on file and BZSt will return match codes per field. That is the only authoritative way to confirm identity (not just existence) for a German VAT number.
Caching against the BZSt cycle
The BZSt registry refreshes from the regional Finanzämter on a regular
batch cadence. A company that registered or deregistered yesterday may
not flip in the public response immediately. vatverify caches valid
responses for 30 days by default and invalid ones for 24 hours, which
keeps re-check pressure low while still picking up state changes
within a day. For high-stakes B2B onboarding, override with
cache-control: no-cache to force a live BZSt round-trip.
Automate Germany VAT checks in your stack
Replace manual lookups with one API call against VIES. Drops into invoicing, checkout, and signup flows in any language. 500 free validations per month, no credit card.