What BR-AE-10 checks
BR-AE-10 requires that a VAT breakdown group (BG-23) with category code AE, reverse charge, contain a VAT exemption reason code (BT-121) or a VAT exemption reason text (BT-120). Reverse charge shifts the tax liability to the buyer, and tax authorities require the invoice to state the mechanism explicitly rather than just showing 0% VAT. The declaration lives in the breakdown group: cac:TaxCategory inside the subtotal in UBL, ram:ApplicableTradeTax in CII.
Layer and formats
The rule fires in the en16931 core layer for every syntax and profile. Its immediate family polices the rest of the reverse charge picture: BR-AE-05 pins category AE lines to a 0% rate, BR-AE-09 pins the group's tax amount to zero, and BR-E-10 is the analogous reason requirement for the exempt category.
Why it fails in practice
- The rate is mapped, the reason is not. The ERP knows the transaction is reverse charge and emits 0%, but its export has no field for exemption reasons.
- The reason sits on the PDF, not in the data. The visible document prints "Steuerschuldnerschaft des Leistungsempfängers", while the XML breakdown stays silent.
- Free-text in the wrong place. The phrase lands in a general invoice note (BT-22) instead of the breakdown group's BT-120, where the rule looks.
How to fix it
Declare the reason inside the AE breakdown group, ideally by code:
<cac:TaxCategory>
<cbc:ID>AE</cbc:ID>
<cbc:Percent>0</cbc:Percent>
<cbc:TaxExemptionReasonCode>VATEX-EU-AE</cbc:TaxExemptionReasonCode>
<cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme>
</cac:TaxCategory>
In an InvoiceXML create request the breakdown group is an entry in invoice.vatBreakdowns with exemptionReasonCode (or exemptionReasonText) next to the category and rate; if you let the API build the breakdown from the lines, supply the reason there and it is carried into the group.
The raw rejection vs the InvoiceXML finding
The Schematron report quotes the full rule prose:
<svrl:failed-assert id="BR-AE-10" flag="fatal"
location="/*:Invoice[namespace-uri()='...']/cac:TaxTotal[1]/cac:TaxSubtotal[1]">
<svrl:text>[BR-AE-10]-A VAT breakdown (BG-23) with VAT Category code
(BT-118) "Reverse charge" shall have a VAT exemption reason code
(BT-121), meaning "Reverse charge" or the VAT exemption reason text
(BT-120) "Reverse charge" (or the equivalent standard text in
another language).</svrl:text>
</svrl:failed-assert>
The InvoiceXML finding for the same failure:
{
"rule": "BR-AE-10",
"layer": "en16931",
"line": null,
"message": "The Reverse charge VAT breakdown is missing a required exemption reason. Add exemption reason code VATEX-EU-AE or the text \"Reverse charge\".",
"btCodes": ["BT-120", "BT-121"],
"fields": null,
"raw": "[BR-AE-10] EN16931: A VAT breakdown (BG-23) with VAT Category code (BT-118) \"Reverse charge\" shall have a VAT exemption reason code (BT-121), meaning \"Reverse charge\" or the VAT exemption reason text (BT-120) \"Reverse charge\" (or the equivalent standard text in another language)."
}
The message already tells your user exactly what to add, naming VATEX-EU-AE, and the BT codes anchor the finding to the breakdown fields. No parsing of rule prose, and clients can localize by the stable rule key.
Check or generate reverse charge invoices
Validate a document in the UBL validator or the XRechnung validator to see every VAT finding at once. Generating via POST /v1/create/ubl or POST /v1/create/facturx keeps the AE package consistent, and each document is validated against the full rule set before delivery. The VAT category model is part of EN 16931 explained.