Attestwire › Rule reference › BR-16
BR-16 An invoice must have at least one line
noun · EN 16931 · fatal · BG-25
an invoice for nothing at all.
Your invoice was refused because it has no invoice lines: nothing on it says what was supplied. Every invoice needs at least one line, even if the amount is zero, and one line is enough. In the standard an invoice line is group 25, written BG-25, and BR-16 is the rule that checks it.
- Business term
BG-25— Invoice line- Severity
fatal- Applies to
All profiles
The fix
Add a line for what was supplied, in lines. If you are hitting this on a document that has nothing on it, such as a cancellation or a zero-value correction, do not send an empty invoice. Send a credit note (invoiceTypeCode: "381") that names the invoice it reverses, with real lines carrying positive amounts.
If you are hitting it because a filter upstream dropped every line, look at that filter before you look at this rule: a document that lost its lines has probably lost the meaning of its totals too.
What the rule requires
The invoice needs at least one line describing what was supplied. One is enough, and there is no upper bound. In business-term language that is group BG-25, the lines array in this model.
A line is not much: an id (BT-126), a description (BT-153), a quantity (BT-129) with its unit code (BT-130), a unit price (BT-146) and a VAT category with its rate (BT-151, BT-152). To bill a flat fee, use quantity 1 with unit code C62, “one, piece” in UN/ECE Recommendation 20, and put the fee in unitPrice.
Our input check fires when lines is missing or empty. It does not matter what the totals say: a document whose amounts are all zero still needs a line saying what was supplied for nothing.
An Invoice shall have at least one Invoice line (BG-25).
Failing and passing
validateInput({
profile: "en16931",
invoiceNumber: "2026-000142",
issueDate: "2026-08-09",
currency: "EUR",
seller: { /* ... */ },
buyer: { /* ... */ },
lines: [], // <- BR-16
});
// -> { valid: false, errors: [ { rule: "BR-16", ... } ] }validateInput({
// ...
lines: [{
id: "1",
description: "Retainer, August 2026",
quantity: 1,
unitCode: "C62", // one / piece
unitPrice: 500,
vatCategory: "S",
vatRate: 19,
}],
});
// -> { valid: true, errors: [] }Why it exists
An invoice is a claim about a supply, and the lines are where the supply is described. Strip them out and what is left is a payment demand with a VAT figure attached and nothing underneath it. The buyer cannot match it to a purchase order, cannot post it to a cost centre, and cannot show a tax authority what the VAT was charged on.
That is also why “just put the total in a line” works: the regulation does not require the lines to be granular, only to exist.
What the library returns
The full error returned by @attestwire/en16931. It includes the rule ID,
affected field and suggested correction. Developers can use this object in their application:
{
"rule": "BR-16",
"field": "BG-25",
"severity": "fatal",
"message": "An invoice must have at least one invoice line (BG-25). A document with no lines has no taxable supply to describe, so it cannot be an invoice — even if its totals are zero.",
"fix": "Add at least one entry to lines. To invoice a flat fee, use quantity 1 with unitCode \"C62\" (one/piece) and the fee as unitPrice.",
"example": "\"lines\": [{ \"id\": \"1\", \"description\": \"Retainer\", \"quantity\": 1, \"unitCode\": \"C62\", \"unitPrice\": 500, \"vatCategory\": \"S\", \"vatRate\": 19 }]",
"xpath": "/ubl:Invoice/cac:InvoiceLine",
"docsUrl": "https://attestwire.com/rules/BR-16"
}
xpath is always a UBL path. On a CII invoice, look for the
matching CII field instead.
How our check differs
We check the count, which is all BR-16 asks. What a line has to contain is spread across other rules and you will meet them straight after this one: BR-21 for the line identifier, BR-22 for the quantity, BR-24 for the line net amount, BR-25 for the item name. A document that clears BR-16 with one skeletal line is not close to done, and the findings you get next are the useful ones.
See also: BR-24 — each line needs a net amount; BR-CO-10 — the line net amounts must add up to BT-106.