VINvoice specification
Vehicle data in EN 16931 e-invoices. Editor's draft.
Registry vehicle/1.0-draft · 24 October 2026 · marker vehicle/1.0
1. Status of this document
This is a draft for review. It is not yet a published standard; do not rely on it for production systems before version 1.0. Comments and proposals are welcome; see Governance.
The normative content consists of this page and the key registry (registry.json). Where they differ, the registry wins for anything about a single key; this page wins for everything else. Examples, the crosswalk and the reference checker are informative.
2. Introduction
EN 16931, the European model for electronic invoices, has no business term for a vehicle.
Factur-X and ZUGFeRD, XRechnung and Peppol BIS Billing all implement that model, so an invoice
for a car, a repair or a lease can carry vehicle data only in generic places. Exactly one of
them is structured enough for an identifier: the invoice line object identifier BT-128, which
accepts the UNTDID 1153 scheme AKG (vehicle identification number). Everything else
ends up in free text or in item attributes (BG-32) that nobody has named.
VINvoice names those item attributes. It adds no XML element, no extension and no specification identifier (BT-24), so every invoice that follows it remains a valid EN 16931 invoice in each syntax and each national profile. A receiver that does not know VINvoice shows the rows as ordinary item attributes.
3. Conformance language
The key words MUST, MUST NOT, SHOULD, SHOULD NOT and MAY are to be interpreted as described in RFC 2119 and RFC 8174 when, and only when, they appear in capitals. The conditions under which each key is required are part of the registry and are shown on each term page.
4. Vehicle lines
A vehicle line is an invoice line that carries exactly one marker row vehicle.specificationId = vehicle/1.0. The marker states the major and minor version of the convention. It SHOULD be the first
row of the line and MUST NOT appear on any other line. The marker stands in for a
specification identifier: Factur-X hybrid invoices accept only a closed list in BT-24, and
Peppol fixes its prefix, so a separate VINvoice identifier could not be announced there.
Every vehicle line MUST carry the role row vehicle.roleCode, which SHOULD be the second
row. It says why the vehicle appears on the line, seen from the seller:
-
supply -
trade-in -
service -
rental -
lease -
agency -
transport -
other
Why the vehicle appears on this line, seen from the issuer. supply: the vehicle is the goods supplied, including self-billed purchases, hire-purchase and leases with agreed transfer of ownership. trade-in: the vehicle is taken in from the buyer in part-exchange; how its value is invoiced follows the issuer's VAT treatment, not this token. service: work, parts, test or repair on the vehicle. rental: a charge for the use of the vehicle for a continuous period of at most 30 days. lease: a periodic charge for use over a longer period without agreed transfer of ownership, including subscriptions. agency: a commission for intermediating the sale or purchase of the vehicle. transport: transfer, delivery or logistics of the vehicle. other. The token states no VAT treatment and no place of supply.
Scope of version 1.0. One vehicle per invoice line; a line with the
role supply or trade-in has the quantity 1. Motorised land vehicles
only; vessels and aircraft are left for a later version.
Workshop and service invoices. The rows go on one vehicle reference line with the value 0.00. Every other line about the same vehicle (labour, parts) carries the VIN in BT-128. A document about a single vehicle MAY also carry it once in the invoice object identifier BT-18.
5. Rows: names and values
Each fact is one BG-32 item attribute: the name goes into BT-160, the value into BT-161. The name is the registry label followed by one space and the key in square brackets:
Marke [vehicle.make]
Make [vehicle.make]
vehicle.make
The three names above are equivalent: German label, English label and bare key.
- The label MUST be the German or the English label from the registry. Viewers show it to people; software reads only the key in brackets.
-
Keys are case-sensitive, start with
vehicle.and follow the naming rules: at most 40 characters per key and 64 per name. A two-letter segment after the root is a country scope for national facts, as invehicle.de.. -
A key MAY be written bare, without label and brackets, unless it is a statutory key. Keys
that carry a feature required by VAT law MUST always be written with their label, because
the mandatory particulars of an invoice have to be readable in the structured data:
vehicle.odometerReadingKm,vehicle.odometerReadingMi,vehicle.newMeansOfTransportIndicator,vehicle.firstEntryIntoServiceDate,vehicle.marginSchemeIndicator. -
A key appears at most once per line. Exception: repeatable keys (
vehicle.energySourceCode,vehicle.basicColourCode,vehicle.catalogueId) take one row per value.
Values follow the grammar of their key in the registry. In general:
-
Dates are ISO 8601:
YYYY-MM-DD, orYYYY-MMwhere the key allows it. -
Numbers have no group separator and use a full stop as decimal mark:
48200, not48.200or48,200 km. -
The unit is part of the key (for example
vehicle.odometerReadingKmandvehicle.maximumNetPowerKw) and never part of the value. See units. -
Registry-owned lists use lower-case tokens such as
used; codes that an EU or international list publishes (vehicle categories, bodywork codes, countries) keep their official form, such asM1. Neither is ever translated. See code lists. -
Free text is Unicode NFC, trimmed, without control or bidirectional formatting characters,
and does not start with
=,+,-or@. -
The value stays in the text element of BT-161. Measure or quantity variants of the element (
ram:ValueMeasure,cbc:ValueQuantity) MUST NOT be used for rows.
6. Identifying the vehicle
The VIN is written twice: as the row vehicle.vin, which every invoice viewer shows,
and in the line object identifier BT-128 with the scheme identifier BT-128-1 = AKG and the document type code 130. Both MUST hold the same value. Receivers SHOULD
also accept VT as scheme on input.
BT-157 (item standard identifier) and BT-158 (item classification) MUST NOT be used for the VIN: neither has a scheme for it, and custom schemes fail validation outside individual national validators.
When no VIN is known, BT-128 MAY carry the registration number with the scheme ABZ; the row vehicle.registrationNumber then repeats it. A registration number is never a
VIN.
7. Conformance levels
| Level | Name | What the invoice carries |
|---|---|---|
| 0 | Identify |
The VIN in BT-128 with scheme AKG (or in BT-18 for a single-vehicle document).
No rows.
|
| 1 | Describe | On each vehicle line: the marker, the role and the core rows that apply, including the VIN as a row. BT-128 is not required. |
| 2 | Describe and identify | Level 1, plus the VIN in BT-128 with scheme AKG on every line about the vehicle. |
Level 1 exists because some invoice libraries map BG-32 correctly but cannot yet write BT-128 with its scheme in every syntax. Level 2 is the target. Conformance is self-declared against the public test corpus; there is no certification.
8. Syntax bindings
VINvoice uses only business terms that EN 16931 already binds to both syntaxes. Paths are relative to the invoice line unless they start at the document root.
| Business term | CII (Factur-X, ZUGFeRD, XRechnung CII) | UBL 2.1 (Peppol, XRechnung UBL) |
|---|---|---|
| Invoice line | /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem |
/Invoice/cac:InvoiceLine, /CreditNote/cac:CreditNoteLine |
| BG-32 item attribute (one row) | ram:SpecifiedTradeProduct/ram:ApplicableProductCharacteristic |
cac:Item/cac:AdditionalItemProperty |
| BT-160 name | ram:Description |
cbc:Name |
| BT-161 value | ram:Value |
cbc:Value |
| BT-128 line object identifier | ram:SpecifiedLineTradeSettlement/ram:AdditionalReferencedDocument with ram:IssuerAssignedID = VIN, ram:TypeCode = 130 |
cac:DocumentReference with cbc:ID = VIN, cbc:DocumentTypeCode = 130 |
| BT-128-1 scheme | ram:ReferenceTypeCode = AKG |
cbc:ID/@schemeID = AKG |
| BT-18 invoice object identifier | /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:AdditionalReferencedDocument (ram:TypeCode = 130, ram:ReferenceTypeCode = AKG) |
/Invoice/cac:AdditionalDocumentReference (cbc:ID/@schemeID = AKG, cbc:DocumentTypeCode = 130) |
| BG-1 invoice note | /rsm:CrossIndustryInvoice/rsm:ExchangedDocument/ram:IncludedNote/ram:Content |
/Invoice/cbc:Note |
Factur-X EXTENDED MAY additionally mirror vehicle.make and vehicle.model in its
own product elements; the rows stay. Other richer syntax elements (CII IndividualTradeProductInstance, UBL ItemInstance) are outside EN 16931 and are not used.
Example: the first line of sale-25a.fx.cii.xml (CII)
<ram:IncludedSupplyChainTradeLineItem>
<ram:AssociatedDocumentLineDocument>
<ram:LineID>1</ram:LineID>
</ram:AssociatedDocumentLineDocument>
<ram:SpecifiedTradeProduct>
<ram:SellerAssignedID>STK-26-0042</ram:SellerAssignedID>
<ram:Name>Volkswagen Golf 2.0 TDI Life</ram:Name>
<ram:Description>FIN TSTVEH016N0000001 · Erstzulassung: 18.03.2022 · Kilometerstand: 48.200 km · Leistung: 110 kW (150 PS) · Farbe: Grau</ram:Description>
<ram:ApplicableProductCharacteristic>
<ram:Description>VINvoice-Spezifikation [vehicle.specificationId]</ram:Description>
<ram:Value>vehicle/1.0</ram:Value>
</ram:ApplicableProductCharacteristic>
<ram:ApplicableProductCharacteristic>
<ram:Description>Fahrzeugrolle [vehicle.roleCode]</ram:Description>
<ram:Value>supply</ram:Value>
</ram:ApplicableProductCharacteristic>
<ram:ApplicableProductCharacteristic>
<ram:Description>Fahrzeug-Identifizierungsnummer (FIN) [vehicle.vin]</ram:Description>
<ram:Value>TSTVEH016N0000001</ram:Value>
</ram:ApplicableProductCharacteristic>
<ram:ApplicableProductCharacteristic>
<ram:Description>Marke [vehicle.make]</ram:Description>
<ram:Value>Volkswagen</ram:Value>
</ram:ApplicableProductCharacteristic>
<ram:ApplicableProductCharacteristic>
<ram:Description>Modell [vehicle.model]</ram:Description>
<ram:Value>Golf</ram:Value>
</ram:ApplicableProductCharacteristic>
<ram:ApplicableProductCharacteristic>
<ram:Description>Modellausführung [vehicle.configuration]</ram:Description>
<ram:Value>2.0 TDI Life</ram:Value>
</ram:ApplicableProductCharacteristic>
<ram:ApplicableProductCharacteristic>
<ram:Description>Fahrzeugzustand [vehicle.conditionCode]</ram:Description>
<ram:Value>used</ram:Value>
</ram:ApplicableProductCharacteristic>
<ram:ApplicableProductCharacteristic>
<ram:Description>Datum der Erstzulassung [vehicle.firstRegistrationDate]</ram:Description>
<ram:Value>2022-03-18</ram:Value>
</ram:ApplicableProductCharacteristic>
<ram:ApplicableProductCharacteristic>
<ram:Description>Kilometerstand (km) [vehicle.odometerReadingKm]</ram:Description>
<ram:Value>48200</ram:Value>
</ram:ApplicableProductCharacteristic>
<ram:ApplicableProductCharacteristic>
<ram:Description>Höchste Nutzleistung (kW) [vehicle.maximumNetPowerKw]</ram:Description>
<ram:Value>110</ram:Value>
</ram:ApplicableProductCharacteristic>
<ram:ApplicableProductCharacteristic>
<ram:Description>Hubraum (cm3) [vehicle.engineCapacityCm3]</ram:Description>
<ram:Value>1968</ram:Value>
</ram:ApplicableProductCharacteristic>
<ram:ApplicableProductCharacteristic>
<ram:Description>Kraftstoffart oder Energiequelle [vehicle.energySourceCode]</ram:Description>
<ram:Value>diesel</ram:Value>
</ram:ApplicableProductCharacteristic>
<ram:ApplicableProductCharacteristic>
<ram:Description>Grundfarbe [vehicle.basicColourCode]</ram:Description>
<ram:Value>grey</ram:Value>
</ram:ApplicableProductCharacteristic>
<ram:ApplicableProductCharacteristic>
<ram:Description>Nächste technische Prüfung [vehicle.nextRoadworthinessTestDate]</ram:Description>
<ram:Value>2027-03</ram:Value>
</ram:ApplicableProductCharacteristic>
<ram:ApplicableProductCharacteristic>
<ram:Description>Differenzbesteuerung [vehicle.marginSchemeIndicator]</ram:Description>
<ram:Value>true</ram:Value>
</ram:ApplicableProductCharacteristic>
<ram:ApplicableProductCharacteristic>
<ram:Description>Lagernummer [com.example.stockNumber]</ram:Description>
<ram:Value>STK-26-0042</ram:Value>
</ram:ApplicableProductCharacteristic>
</ram:SpecifiedTradeProduct>
<ram:SpecifiedLineTradeAgreement>
<ram:NetPriceProductTradePrice>
<ram:ChargeAmount>15900.00</ram:ChargeAmount>
</ram:NetPriceProductTradePrice>
</ram:SpecifiedLineTradeAgreement>
<ram:SpecifiedLineTradeDelivery>
<ram:BilledQuantity unitCode="C62">1</ram:BilledQuantity>
</ram:SpecifiedLineTradeDelivery>
<ram:SpecifiedLineTradeSettlement>
<ram:ApplicableTradeTax>
<ram:TypeCode>VAT</ram:TypeCode>
<ram:CategoryCode>E</ram:CategoryCode>
<ram:RateApplicablePercent>0</ram:RateApplicablePercent>
</ram:ApplicableTradeTax>
<ram:SpecifiedTradeSettlementLineMonetarySummation>
<ram:LineTotalAmount>15900.00</ram:LineTotalAmount>
</ram:SpecifiedTradeSettlementLineMonetarySummation>
<ram:AdditionalReferencedDocument>
<ram:IssuerAssignedID>TSTVEH016N0000001</ram:IssuerAssignedID>
<ram:TypeCode>130</ram:TypeCode>
<ram:ReferenceTypeCode>AKG</ram:ReferenceTypeCode>
</ram:AdditionalReferencedDocument>
</ram:SpecifiedLineTradeSettlement>
</ram:IncludedSupplyChainTradeLineItem>
Example: the first line of sale-25a.peppol.ubl.xml (UBL)
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="C62">1</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="EUR">15900.00</cbc:LineExtensionAmount>
<cac:DocumentReference>
<cbc:ID schemeID="AKG">TSTVEH016N0000001</cbc:ID>
<cbc:DocumentTypeCode>130</cbc:DocumentTypeCode>
</cac:DocumentReference>
<cac:Item>
<cbc:Description>FIN TSTVEH016N0000001 · Erstzulassung: 18.03.2022 · Kilometerstand: 48.200 km · Leistung: 110 kW (150 PS) · Farbe: Grau</cbc:Description>
<cbc:Name>Volkswagen Golf 2.0 TDI Life</cbc:Name>
<cac:SellersItemIdentification>
<cbc:ID>STK-26-0042</cbc:ID>
</cac:SellersItemIdentification>
<cac:ClassifiedTaxCategory>
<cbc:ID>E</cbc:ID>
<cbc:Percent>0</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
<cac:AdditionalItemProperty>
<cbc:Name>VINvoice-Spezifikation [vehicle.specificationId]</cbc:Name>
<cbc:Value>vehicle/1.0</cbc:Value>
</cac:AdditionalItemProperty>
<cac:AdditionalItemProperty>
<cbc:Name>Fahrzeugrolle [vehicle.roleCode]</cbc:Name>
<cbc:Value>supply</cbc:Value>
</cac:AdditionalItemProperty>
<cac:AdditionalItemProperty>
<cbc:Name>Fahrzeug-Identifizierungsnummer (FIN) [vehicle.vin]</cbc:Name>
<cbc:Value>TSTVEH016N0000001</cbc:Value>
</cac:AdditionalItemProperty>
<cac:AdditionalItemProperty>
<cbc:Name>Marke [vehicle.make]</cbc:Name>
<cbc:Value>Volkswagen</cbc:Value>
</cac:AdditionalItemProperty>
<cac:AdditionalItemProperty>
<cbc:Name>Modell [vehicle.model]</cbc:Name>
<cbc:Value>Golf</cbc:Value>
</cac:AdditionalItemProperty>
<cac:AdditionalItemProperty>
<cbc:Name>Modellausführung [vehicle.configuration]</cbc:Name>
<cbc:Value>2.0 TDI Life</cbc:Value>
</cac:AdditionalItemProperty>
<cac:AdditionalItemProperty>
<cbc:Name>Fahrzeugzustand [vehicle.conditionCode]</cbc:Name>
<cbc:Value>used</cbc:Value>
</cac:AdditionalItemProperty>
<cac:AdditionalItemProperty>
<cbc:Name>Datum der Erstzulassung [vehicle.firstRegistrationDate]</cbc:Name>
<cbc:Value>2022-03-18</cbc:Value>
</cac:AdditionalItemProperty>
<cac:AdditionalItemProperty>
<cbc:Name>Kilometerstand (km) [vehicle.odometerReadingKm]</cbc:Name>
<cbc:Value>48200</cbc:Value>
</cac:AdditionalItemProperty>
<cac:AdditionalItemProperty>
<cbc:Name>Höchste Nutzleistung (kW) [vehicle.maximumNetPowerKw]</cbc:Name>
<cbc:Value>110</cbc:Value>
</cac:AdditionalItemProperty>
<cac:AdditionalItemProperty>
<cbc:Name>Hubraum (cm3) [vehicle.engineCapacityCm3]</cbc:Name>
<cbc:Value>1968</cbc:Value>
</cac:AdditionalItemProperty>
<cac:AdditionalItemProperty>
<cbc:Name>Kraftstoffart oder Energiequelle [vehicle.energySourceCode]</cbc:Name>
<cbc:Value>diesel</cbc:Value>
</cac:AdditionalItemProperty>
<cac:AdditionalItemProperty>
<cbc:Name>Grundfarbe [vehicle.basicColourCode]</cbc:Name>
<cbc:Value>grey</cbc:Value>
</cac:AdditionalItemProperty>
<cac:AdditionalItemProperty>
<cbc:Name>Nächste technische Prüfung [vehicle.nextRoadworthinessTestDate]</cbc:Name>
<cbc:Value>2027-03</cbc:Value>
</cac:AdditionalItemProperty>
<cac:AdditionalItemProperty>
<cbc:Name>Differenzbesteuerung [vehicle.marginSchemeIndicator]</cbc:Name>
<cbc:Value>true</cbc:Value>
</cac:AdditionalItemProperty>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="EUR">15900.00</cbc:PriceAmount>
</cac:Price>
</cac:InvoiceLine>
9. Reading rules
A receiver that reads VINvoice rows SHOULD proceed as follows.
-
On each line, read the item attributes whose name is
Label [key]or a bare key. Other item attributes are not VINvoice rows. - Treat a line as a vehicle line only if it has a marker with a valid value. Rows on lines without a marker are ignored.
- If the major version in the marker is not one the receiver knows (version 1 for this draft), skip the rows of that line. Never reject the invoice for it.
-
Check each value against the grammar of its key and drop values that do not match. Ignore
unknown keys and reserved names. Ignore vendor rows:
rows whose name in brackets is not under
vehicle.but a reverse-DNS name of a domain the vendor controls, such ascom.example.stockNumber. - If a key that is not repeatable appears twice, keep the first value.
-
Take the VIN from BT-128 (scheme
AKGorVT); if it is absent, from the rowvehicle.vin; if that is absent too, from BT-18. If BT-128 and the row differ, BT-128 wins. - A line without a marker whose BT-128 equals the VIN of a vehicle line belongs to that vehicle (labour and parts on a workshop invoice). Otherwise such a line identifies a vehicle at level 0.
- VINvoice findings never make an invoice invalid. They only say whether a line claims conformance to this convention.
The reference checker implements these steps and the rules that follow from the registry.
10. VAT and the margin scheme
The encodings in this section are provisional until a tax adviser has signed them off in writing.
Margin scheme for second-hand goods
Most used vehicles are sold under the margin scheme (Art. 311 to 325 of the VAT Directive; §
25a UStG in Germany). EN 16931:2017 has no VAT category for a margin-scheme supply. Every
margin-scheme vehicle line therefore carries vehicle.marginSchemeIndicator = true, so
that a receiver can tell the margin scheme from a real exemption.
-
Domestic and intra-EU margin-scheme supplies use VAT category
Ewith an exemption reason text, and the invoice carries the noteGebrauchtgegenstände/Sonderregelung
in BG-1 (Art. 226(14) VAT Directive, § 14a(6) UStG). -
A margin-scheme export to a country outside the EU uses category
GwithVATEX-EU-Gand keeps the flag. -
A margin-scheme line MUST NOT use category
K(intra-community supply): the exemption is excluded for margin-scheme goods (Art. 313(2) VAT Directive, § 25a(7) UStG). -
Under EN 16931-1:2026, category
F(margin scheme, second-hand goods) replaces theEworkaround. The flag MAY still be given.
New means of transport
An intra-EU supply of a new means of transport (Art. 2(2)(b) and 138 VAT Directive; §§ 1b, 6a
and 14a(4) UStG) MUST carry vehicle.newMeansOfTransportIndicator = true. The line then
states the features that make the vehicle new: vehicle.maximumNetPowerKw or vehicle.engineCapacityCm3, and an odometer reading or vehicle.firstEntryIntoServiceDate. A land vehicle counts as
new if it was first put into service at most six months before the supply or has travelled at
most 6,000 km.
Supplies of new vehicles to buyers in another member state who have no VAT identification
number (Art. 138(2)(a)) cannot currently be written as a valid EN 16931 invoice, because
category K requires both VAT identifiers. They are outside the scope of version
1.0.
11. What never goes into rows
- Prices, VAT amounts, purchase prices and margins. They stay in the EN 16931 amount and VAT terms.
- Legal wording, such as the margin-scheme statement or an exemption reason. It stays in BG-1 (invoice note) and BT-120 (VAT exemption reason text).
- Data about people. A row describes the vehicle, not the buyer, the previous owner or the driver.
12. Versions and EN 16931-1:2026
The marker carries major.minor. A minor version only adds keys, tokens or labels,
and receivers ignore what they do not know. A major version gets a new marker value, and
receivers keep reading the previous major version for 24 months. Keys are never removed or
redefined, only deprecated. The full rules are under Governance.
EN 16931-1:2026 runs in parallel with the 2017 model during a migration period. It adds an attribute code (BT-211) and a unit (BT-212) to BG-32, and margin-scheme VAT categories. It adds no vehicle terms. VINvoice rows stay unchanged under both models; once BT-212 is available it MAY repeat the unit code that the key already fixes.
13. Personal data
A VIN or a registration number can identify a person when the buyer or keeper is a natural person. Write the registration number only where the receiver needs it (service, lease and rental) and leave it out on invoices to private persons unless it is required. All examples on this site use fictional data.
14. References
- EN 16931-1:2017 Electronic invoicing, semantic data model of the core elements of an electronic invoice; CEN/TS 16931-3-2 and 3-3 (UBL and CII syntax bindings).
-
UNTDID 1153 Reference code qualifier (scheme
AKG,ABZ,VT). - UN/ECE Recommendation 20, codes for units of measure used in international trade.
- Council Directive 2006/112/EC on the common system of value added tax.
- Umsatzsteuergesetz (UStG), in particular §§ 1b, 14, 14a and 25a.
- Council Directive 1999/37/EC on the registration documents for vehicles (harmonised codes of the registration certificate).
- Regulation (EU) 2018/858 on the approval of motor vehicles (vehicle categories, certificate of conformity).
- Regulation (EU) 2021/535 (structure and check digit of the vehicle identification number).