What Mutabiq reports
One entry for each way this rule can be reported.
- Reported as
- What kind of value was found — empty, not_15_digits and the like — never the value itself.
Seller identification carries no scheme id
Reported asscheme_id_missingno scheme id
What is wrong
A seller identification (BT-29) — a cbc:ID under cac:PartyIdentification in the seller's party block — has no schemeID attribute, or carries one that is empty. The schemeID says which kind of identifier the value is, and ZATCA flags an identification without one under BR-KSA-08, which SDK 3.4.8 runs as a warning, not a rejection: the finding is reported without failing the document by itself.
What to check in your ERP
Every seller identification needs both parts: the value in the element and the kind in its schemeID attribute. The kinds SDK 3.4.8's checker accepts for the seller are CRN for the commercial registration number, MOM for a MOMRAH licence, MLS for a MHRSD licence, SAG for a MISA licence, 700 for the number the ZATCA XML Implementation Standard (section 13.3.1) names, and OTH for anything else. In most systems the identifier and its kind are two columns of one table and the export writes only the first.
Seller identification scheme id is not one ZATCA accepts
Reported asscheme_id_not_listeda scheme id ZATCA does not accept
What is wrong
A seller identification (BT-29) carries a schemeID that is not in the list SDK 3.4.8's checker accepts for the seller: CRN, MOM, MLS, SAG, OTH and 700. Anything else is flagged under BR-KSA-08, which SDK 3.4.8 runs as a warning, not a rejection: the finding is reported without failing the document by itself. Earlier SDK releases ran this same assertion at error and did not carry the 700 scheme id the ZATCA XML Implementation Standard (section 13.3.1) names - SDK 3.4.8 both downgrades the flag and adds 700 to the list the checker itself carries.
What to check in your ERP
Map each identifier your system holds for the issuing entity onto one of six: CRN for the commercial registration number, MOM, MLS or SAG for the respective licences, 700 for the number the ZATCA XML Implementation Standard names, and OTH for anything that fits none of them. OTH is a legitimate answer and is better than inventing a code. The buyer's list is longer and different - it also has NAT, TIN, IQA, PAS and GCC - so a code copied across from the buyer mapping will draw this warning here.
Seller identification value contains characters other than letters and digits
Reported asvalue_not_alphanumericcontains characters other than letters and digits
What is wrong
A seller identification (BT-29) holds a value with something other than Latin letters and digits in it. Only rule packs before 2.0.0 report this: SDK 3.0.8's BR-KSA-08 also required the value to be alphanumeric and refused any other character - a space, a dash, a slash, a full stop, or Arabic text. In SDK 3.4.8, which rule pack 2.0.0 reads, BR-KSA-08 no longer tests the value, although its message still says the value must contain only alphanumeric characters, so a report produced under 2.0.0 never carries this note. SDK 3.4.8 adds separate format warnings on identifier values (BR-KSA-F-07 to BR-KSA-F-13), which Mutabiq does not mirror.
What to check in your ERP
Send the identifier as stored on the certificate, with no formatting: no spaces, no dashes between groups, no prefix such as CR or licence number. The usual causes are a value held with separators for display and exported as held, and a mapping that writes a descriptive label next to the number. If the identifier genuinely contains a character that is not a letter or a digit, it does not belong in this field.
Seller identification is missing
Reported asidentification_missingthe identification is missing
What is wrong
The seller block (cac:AccountingSupplierParty/cac:Party) carries no cac:PartyIdentification/cbc:ID. BR-KSA-08 asks for one seller identifier with a scheme ID from ZATCA's list: CRN, MOM, MLS, SAG, OTH or 700. ZATCA flags this as a warning, which does not by itself reject the document.
What to check in your ERP
Map the seller's commercial registration number, with schemeID CRN, or the licence the business trades under, with its own scheme ID, into cac:PartyIdentification/cbc:ID in the seller block. Where the business holds several commercial registrations, use the one for the branch issuing the invoice.
Seller has more than one identification
Reported asidentification_repeatedmore than one identification
What is wrong
The seller block carries more than one cac:PartyIdentification. ZATCA's message for BR-KSA-08 anticipates sellers with several identifiers and asks for one of them, but its current checker cannot evaluate the rule on such a document: the run stops with a processing error rather than a rule code. The rule's own flag is a warning, and Mutabiq reports it at that severity, but whether ZATCA would accept the document is uncertain.
What to check in your ERP
Write one seller identifier only: the one for the branch issuing the invoice, with its scheme ID, chosen in the order ZATCA's message gives (CRN, MOM, MLS, 700, SAG, OTH). Remove the others from the XML export.
The clause that runs
Quoted from the validation-rule stylesheet ZATCA publishes, at the file and line named below. The executed guard is what the check runs; the reported test is what it prints when it fails, and the two are not always the same.
Executed guard
not( exists(cac:AccountingSupplierParty/cac:Party/cac:PartyIdentification/cbc:ID) and string-length(cac:AccountingSupplierParty/cac:Party/cac:PartyIdentification/cbc:ID/normalize-space(@schemeID)) > 2 and contains('CRN MOM MLS SAG OTH 700', normalize-space(cac:AccountingSupplierParty/cac:Party/cac:PartyIdentification/cbc:ID/@schemeID)))
Reported test
not( string-length(normalize-space( ./@schemeID)) > 2 and contains('CRN MOM MLS SAG OTH 700', ./@schemeID) and (matches((.), '^[a-zA-Z0-9]*$')) )
- Evaluated against
/ubl:Invoice | /cn:CreditNote- Source
vendor/zatca/schematron/20210819_ZATCA_E-invoice_Validation_Rules.xsl:452As shipped in ZATCA SDK 3.4.8: the copy quoted here is, byte for byte, the file that release ships. The date in the file name is the name ZATCA gives the file; the rules in it are those of SDK 3.4.8.
© 2026 Hayatiq AI Solutions F.Z.E. All rights reserved.