Following system theme

#EN 16931 Tax Category Codes

Scribo never infers the tax category code. The caller picks one per line item. This page explains when each code applies and what schematron rules the validator will enforce.

Two enforcement layers: the tax_rate == 0 and BR-E-10 exemption-code checks fail fast at the API boundary (400); the VAT-ID requirements are enforced downstream by Invopop's schematron — the invoice is returned (201) with validator_summary.valid == false.

Code Name Typical use Schematron constraints
S Standard rated Normal domestic sale; full VAT rate applies (e.g. DE 19%, FR 20%, ES 21%). tax_rate > 0. Requires sender VAT ID.
Z Zero rated Sale taxable in principle but at 0% (rare; some food categories, some UK exports pre-Brexit). tax_rate == 0 (Scribo cross-field check). Requires sender VAT ID.
E Exempt Sale exempt from VAT under a specific statute (medical, education, financial services). Use only when domestic law explicitly exempts the supply. tax_rate == 0. tax_exemption_code is mandatory (per EN 16931 BR-E-10 + GOBL TAX-COMBO-06) — pick the VATEX-EU-* code matching the legal basis: VATEX-EU-132 for Art. 132 health/education, VATEX-EU-79-C for the small-business exemption under § 19 UStG. Optional tax_exemption_reason surfaces a free-form BT-120 note.
AE Reverse charge Intra-EU B2B services where the recipient self-accounts for VAT — the most common cross-border B2B EU services case. (Also valid domestically under § 13b UStG for construction, scrap metal, etc.) Requires recipient VAT ID. tax_rate == 0. Scribo applies VATEX-EU-AE automatically; override via tax_exemption_code.
K Intra-community supply Goods (not services) shipped between EU member states under the intra-community simplification. Requires recipient VAT ID. tax_rate == 0. Scribo applies VATEX-EU-IC automatically. Recipient must be in a different EU member state.
G Free export Goods exported outside the EU (proof of export required). tax_rate == 0. Scribo applies VATEX-EU-G automatically.
O Outside scope Services that fall outside the scope of VAT entirely (some B2B services to non-EU customers, certain insurance/financial transactions). tax_rate == 0. Scribo applies VATEX-EU-O automatically. All-O invoices — Scribo strips VAT identifiers from both parties per EN 16931 BR-O-02 and emits the sender's tax_id under identities[] (BT-29) so BR-CO-26 stays satisfied. Mixed S+O invoices are rejected.

#Decision flow

Ask the user, in order:

  1. Is the supply domestic (sender and recipient in the same country)?
    • Yes, normal rate → S with the country's standard rate.
    • Yes, special 0% category → Z.
    • Yes, statutorily exempt → E.
  2. Is the supply intra-EU B2B?
    • Goods crossing an EU border, recipient has a valid VAT ID → K.
    • Services crossing an EU border, recipient has a valid VAT ID → AE.
  3. Is the supply exported outside the EU?
    • Goods → G.
    • Services → O (in most cases — confirm with a tax advisor).

If the user picks AE or K without a recipient VAT ID, the validator returns a schematron error and the response has validator_summary.valid == false. Surface the rule and ask the user for the VAT ID before retrying. See troubleshooting#validator-failed for the common rule families (BR-AE-*, BR-IC-*, BR-S-*, BR-CO-*).

#What Scribo does not do

  • No tax-rate inference. The user supplies the percentage.
  • No exemption-clause lookup. If the user picks E, they're responsible for citing the statute in notes.
  • No advice on VOEC / IOSS / OSS / MOSS or any other special-scheme regime. Out of scope for v1.

Always remind the user: verify with a tax advisor when the picked code is cross-border or non-S.

#See also