DraftDraft for review, not yet a published standard. Registry vehicle/1.0-draft of 2026-10-24, marker vehicle/1.0. How changes are made.

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:

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.

Values follow the grammar of their key in the registry. In general:

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.

  1. On each line, read the item attributes whose name is Label [key] or a bare key. Other item attributes are not VINvoice rows.
  2. 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.
  3. 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.
  4. 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 as com.example.stockNumber.
  5. If a key that is not repeatable appears twice, keep the first value.
  6. Take the VIN from BT-128 (scheme AKG or VT); if it is absent, from the row vehicle.vin; if that is absent too, from BT-18. If BT-128 and the row differ, BT-128 wins.
  7. 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.
  8. 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.

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

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