Attestwire › Rule reference › BR-05
BR-05 An invoice must have a currency code
noun · EN 16931 · fatal · BT-5
an amount with no currency is just a number.
Your invoice was refused because it does not say which currency its amounts are in. Every invoice needs a three-letter currency code such as EUR, and this is a one-field fix. In the standard the currency code is field 5, written BT-5, and BR-05 is the rule that checks it.
- Business term
BT-5— Invoice currency code- Severity
fatal- Applies to
All profiles
The fix
Put the currency code on the invoice, currency: "EUR". Store the currency alongside the amounts, on the same record, and never derive it at render time from the customer’s country. If your product only ever bills in euros today, hard-code "EUR" at the point where you build the invoice rather than leaving the field to a default somewhere further in; a default you cannot see is the one that changes when someone adds a second currency next year.
If VAT has to be reported in a different currency from the invoice, that is BT-6, a separate field, not a second value in this one.
What the rule requires
The invoice needs a currency, given as the three-letter code from the ISO 4217 list: EUR, SEK, CHF. Uppercase. The code, never the symbol: € is not a value this field accepts, and neither is the numeric ISO 4217 code. This is business term BT-5.
One code covers the whole document. EN 16931 has no per-line currency, so an invoice that mixes currencies cannot be expressed here; it is two invoices.
Our input check fires when currency is missing, empty or only whitespace.
An Invoice shall have an Invoice currency code (BT-5).
Failing and passing
validateInput({
profile: "en16931",
invoiceNumber: "2026-000142",
issueDate: "2026-08-09",
// currency omitted <- BR-05
seller: { /* ... */ },
buyer: { /* ... */ },
lines: [ /* ... */ ],
});
// -> { valid: false, errors: [ { rule: "BR-05", ... } ] }validateInput({
profile: "en16931",
invoiceNumber: "2026-000142",
issueDate: "2026-08-09",
currency: "EUR", // uppercase ISO 4217 alphabetic code
seller: { /* ... */ },
buyer: { /* ... */ },
lines: [ /* ... */ ],
});
// -> { valid: true, errors: [] }Why it exists
Every monetary amount on the invoice is a bare number. The currency code is the only thing that says what those numbers mean, and a receiving system has no way to guess it from the seller’s country, the buyer’s, or the amounts themselves. A German seller invoicing a Swedish buyer in Swedish kronor is ordinary. Without the code, the amounts cannot be booked.
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-05",
"field": "BT-5",
"severity": "fatal",
"message": "An invoice must have a currency code (BT-5) from ISO 4217, but none was provided. Every monetary amount in the document is interpreted against this code.",
"fix": "Set currency to the three-letter ISO 4217 alphabetic code, e.g. \"EUR\". Use the code, not the symbol.",
"example": "\"currency\": \"EUR\"",
"xpath": "/ubl:Invoice/cbc:DocumentCurrencyCode",
"docsUrl": "https://attestwire.com/rules/BR-05"
}
xpath is always a UBL path. On a CII invoice, look for the
matching CII field instead.
How our check differs
BR-05 is presence only, here and in the standard. Whether the code you supplied is on the ISO 4217 list is a different rule with a different id: XYZ comes back as BR-CL-03 and BR-CL-04, the code-list rules, with BR-05 silent because the field was filled in.
Case matters. "eur" is rejected, by the code-list rules again, not by this one.
ISO 4217 alphabetic codes are uppercase and the code lists are matched literally, so lowercase is not accepted anywhere in the chain.
See also: BR-CL-03 — the currency code must be on the ISO 4217 list; BR-CL-04 — the same question, asked of the VAT accounting currency.