Clean vehicles (CVD) — what a vehicle invoice has to carry on top
The Clean Vehicles Directive obliges public authorities to report on the vehicles they buy. Rather than collect that separately, the invoice carries the two facts itself — vehicle category and drive type — and these eight rules check that both are present and agree.
8 rules · Rule set v2026-08-31
Two codes, on the same invoice line
The vehicle category goes in BT-158 under the CVD scheme and must be one of six: M1, M2, M3, N1, N2 or N3 — M for passengers, N for goods. The drive type goes in BT-161 as the item attribute BG-32 named cva, and has exactly three values: clean, zero-emission or other.
BR-DE-CVD-06-a and BR-DE-CVD-06-b tie the two together: set one and the same line must carry exactly one of the other. A category without a drive type is as unusable as a drive type without a category.
And the invoice has to match the tender
BR-DE-CVD-01 and BR-DE-CVD-02 make the contract reference (BT-12) and the tender or lot reference (BT-17) mandatory — both are optional in an ordinary XRechnung. Without them the reported purchase cannot be tied to a procurement.
These rules only apply when you produce the CVD variant. Its identifier in BT-24 ends in #compliant#urn:xeinkauf.de:kosit:xrechnung:cvd_0.9; an ordinary XRechnung is checked against none of them. Which identifier you send is BR-DE-21.
All CVD rules
With the official rule text and the expression the validator evaluates.
BR-DE-CVD-01
Das Element […] "Contract reference" (BT-12) muss übermittelt werden.
- What the validator checks
UBLcac:ContractDocumentReference/cbc:ID[boolean(normalize-space(.))]CIIram:ContractReferencedDocument/ram:IssuerAssignedID[boolean(normalize-space(.))]
BR-DE-CVD-02
Das Element […] "Tender or lot reference" (BT-17) muss übermittelt werden.
- What the validator checks
UBLcac:OriginatorDocumentReference/cbc:ID[boolean(normalize-space(.))]CIIram:AdditionalReferencedDocument[normalize-space(ram:TypeCode) = '50' and normalize-space(ram:IssuerAssignedID)]
BR-DE-CVD-03
In einer Rechnung muss mindestens eine […] INVOICE LINE (BG-25) enthalten sein, in der der Scheme identifier von […] "Item classification identifier" (BT-158) den Wert 'CVD' und der […] "Item attribute name" (BT-160) den Wert 'cva' enthält.
- What the validator checks
UBL(cac:InvoiceLine/cac:Item | cac:CreditNoteLine/cac:Item)[cac:CommodityClassification/cbc:ItemClassificationCode/@listID = 'CVD' and cac:AdditionalItemProperty/cbc:Name = 'cva']CIIram:IncludedSupplyChainTradeLineItem/ram:SpecifiedTradeProduct[ram:DesignatedProductClassification/ram:ClassCode/@listID = 'CVD' and ram:ApplicableProductCharacteristic/ram:Description = 'cva']
BR-DE-CVD-04
Ein […] "Item classification identifier" (BT-158) mit dem Scheme identifier 'CVD' muss einen Wert aus der Liste der zulässigen Fahrzeugkategorien enthalten.
- What the validator checks
UBLnot(normalize-space(@listID) = 'CVD') or normalize-space(.) = $CVD-VEHICLE-CATEGORYCIInot(normalize-space(@listID) = 'CVD') or normalize-space(.) = $CVD-VEHICLE-CATEGORY
BR-DE-CVD-05
Wenn innerhalb von […] ITEM ATTRIBUTES (BG-32) der […] "Item attribute name" (BT-160) den Wert 'cva' hat, muss der […] "Item attribute value" (BT-161) einen der zulässigen Werte enthalten.
- What the validator checks
UBLnormalize-space(cbc:Value) = $CVA-CODESCIInormalize-space(ram:Value) = $CVA-CODES
BR-DE-CVD-06-a
Wenn der Scheme identifier von […] "Item classification identifier" (BT-158) mit dem Wert 'CVD' angegeben ist, muss in derselben Rechnungszeile genau ein […] "Item attribute name" (BT-160) mit dem Wert 'cva' vorhanden sein.
- What the validator checks
UBLnot(cac:CommodityClassification/cbc:ItemClassificationCode[@listID = 'CVD']) or count(cac:AdditionalItemProperty[cbc:Name = 'cva']) = 1CIInot(ram:DesignatedProductClassification/ram:ClassCode/@listID = 'CVD') or count(ram:ApplicableProductCharacteristic[ram:Description = 'cva']) = 1
BR-DE-CVD-06-b
Wenn […] "Item attribute name" (BT-160) mit dem Wert 'cva' angegeben ist, muss in derselben Rechnungszeile genau ein […] "Item classification identifier" (BT-158) mit dem Scheme identifier 'CVD' vorhanden sein.
- What the validator checks
UBLnot(cac:AdditionalItemProperty[cbc:Name = 'cva']) or count(cac:CommodityClassification/cbc:ItemClassificationCode[@listID = 'CVD']) = 1CIInot(ram:ApplicableProductCharacteristic/ram:Description = 'cva') or count(ram:DesignatedProductClassification/ram:ClassCode[@listID = 'CVD']) = 1
BR-TMP-CVD-01
Das Bildungsschema für […] "Item classification identifier" (BT-158) ist aus der Codeliste UNTDID 7143 zu wählen.
- What the validator checks
UBL((not(contains(normalize-space(@listID), ' ')) and contains($UNTDID-7143-CVD-CODES, concat(' ', normalize-space(@listID), ' '))))CII((not(contains(normalize-space(@listID), ' ')) and contains($UNTDID-7143-CVD-CODES, concat(' ', normalize-space(@listID), ' '))))
NormAPI provides technical validation, not tax or legal advice.