Oman ๐ด๐ฒ
E-invoicing requirements and Peppol compliance for the Sultanate of Oman.
Overviewโ
| Aspect | Details |
|---|---|
| Tax Authority | Oman Tax Authority (OTA) |
| B2G Mandate | Active โ Peppol network |
| B2B Mandate | Phased rollout (2025โ2027) |
| Required CIUS | PINT OM (Official OpenPeppol PINT Oman) |
| Primary Scheme | 9959 (Oman national scheme) |
| Currency | OMR (Omani Rial, 3 decimal places) |
| VAT Rate | 5% standard rate |
| QR Code | Mandatory โ Fatoora TLV format |
| Digital Signature | XAdES-BES enveloped signature |
Oman joined the Peppol network under the OpenPeppol umbrella. The Oman Tax Authority (OTA) mandates Peppol-based e-invoicing with additional national requirements (Fatoora CIUS) on top of standard Peppol BIS 3.0.
Oman PINT OM (Official Schematrons)โ
The official OpenPeppol PINT OM specification replaces the earlier Fatoora CIUS. It includes billing, self-billing, and Tax Data Document (TDD) Schematrons.
Customization IDsโ
<!-- PINT OM Billing -->
<cbc:CustomizationID>urn:peppol:pint:billing-1@om-1</cbc:CustomizationID>
<!-- PINT OM Self-Billing -->
<cbc:CustomizationID>urn:peppol:pint:selfbilling-1@om-1</cbc:CustomizationID>
<!-- TDD (Tax Data Document) -->
<cbc:CustomizationID>urn:peppol:taxdata:om-1</cbc:CustomizationID>
Profile IDsโ
<!-- Billing / Self-Billing -->
<cbc:ProfileID>urn:peppol:bis:billing</cbc:ProfileID>
<!-- Tax Reporting -->
<cbc:ProfileID>urn:peppol:taxreporting</cbc:ProfileID>
Schematron Packsโ
GoRoute runs the official OpenPeppol PINT OM Schematrons compiled with Saxon-HE 12.4:
| Pack | Schematrons | Description |
|---|---|---|
| Billing Invoice | 2 (preprocessed + jurisdiction-aligned) | Standard tax invoice validation |
| Billing Credit Note | 2 | Credit note validation |
| Self-Billing Invoice | 2 | Self-billing invoice validation |
| Self-Billing Credit Note | 2 | Self-billing credit note validation |
| TDD | 1 | Tax Data Document for CTC reporting |
PINT OM documents are auto-detected by the urn:peppol:pint:billing-N@om-N or urn:peppol:pint:selfbilling-N@om-N CustomizationID pattern and skip baseline CEN+BIS Schematrons.
Identifier Scheme โ 9959โ
Oman uses scheme 9959 for participant identification on the Peppol network.
# Oman participant
participant = {
"scheme": "9959",
"identifier": "872236341",
"name": "Oman Trading Company LLC",
"country": "OM"
}
Peppol ID Formatโ
9959:<oman-registration-number>
Example: 9959:872236341
SMP Lookupโ
# Verify an Oman participant exists on Peppol
curl "https://smp-test.goroute.ai/iso6523-actorid-upis::9959:872236341"
Currency โ OMR (3 Decimal Places)โ
Oman uses the Omani Rial (OMR) which has 3 decimal places โ unlike EUR/USD which have 2.
<!-- All amounts use 3 decimal places -->
<cbc:TaxAmount currencyID="OMR">50.000</cbc:TaxAmount>
<cbc:TaxInclusiveAmount currencyID="OMR">1050.000</cbc:TaxInclusiveAmount>
<cbc:PayableAmount currencyID="OMR">1050.000</cbc:PayableAmount>
Always use 3 decimal places for OMR amounts (e.g., 1050.000, not 1050.00). This applies to all monetary fields in the invoice including line items, tax amounts, and totals.
VAT in Omanโ
Oman introduced VAT at 5% in April 2021.
| Category | Rate | Code | Description |
|---|---|---|---|
| Standard | 5% | S | Most goods and services |
| Zero-rated | 0% | Z | Exports, certain food items, healthcare |
| Exempt | 0% | E | Financial services, residential rent |
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>5</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
QR Code Requirements (Fatoora)โ
Oman mandates a Fatoora QR code on all invoices. The QR contains TLV (Tag-Length-Value) encoded invoice data that allows offline verification.
TLV Fieldsโ
| Tag | Field | Description | Example |
|---|---|---|---|
| 1 | Seller Name | Seller's registered name (UTF-8) | Al Haya Trading LLC |
| 2 | VAT Number | Seller's tax registration number | OM1234567890 |
| 3 | Timestamp | ISO 8601 issue date/time | 2026-02-08T12:00:00Z |
| 4 | Total with VAT | Tax-inclusive amount (3 decimals) | 1050.000 |
| 5 | VAT Amount | Total VAT (3 decimals) | 50.000 |
| 6 | Invoice Hash | SHA-256 digest (base64) | A1B2C3... |
TLV Encodingโ
Each field is encoded as: Tag (1 byte) + Length (1 byte) + Value (UTF-8 bytes)
Tag 1: [20] = Al Haya Trading LLC
Tag 2: [12] = OM1234567890
Tag 3: [20] = 2026-02-08T12:00:00Z
Tag 4: [8] = 1050.000
Tag 5: [6] = 50.000
Tag 6: [44] = <base64 SHA-256 hash>
The concatenated TLV bytes are base64-encoded and embedded in the UBL XML.
QR Embedding in UBLโ
The QR data is stored in an AdditionalDocumentReference with ID QR:
<cac:AdditionalDocumentReference>
<cbc:ID>QR</cbc:ID>
<cac:Attachment>
<cbc:EmbeddedDocumentBinaryObject mimeCode="text/csv" filename="QR">
AQxBbCBIYXlhIExMQwIKT00xMjM0NTY3ODkw...
</cbc:EmbeddedDocumentBinaryObject>
</cac:Attachment>
</cac:AdditionalDocumentReference>
Invoice Hashโ
A SHA-256 hash of the invoice's business content is also embedded:
<cac:AdditionalDocumentReference>
<cbc:ID>HASH</cbc:ID>
<cac:Attachment>
<cbc:EmbeddedDocumentBinaryObject mimeCode="application/octet-stream" filename="HASH">
kX5xVq2F8a3pZ...base64-encoded-sha256...
</cbc:EmbeddedDocumentBinaryObject>
</cac:Attachment>
</cac:AdditionalDocumentReference>
When you send an invoice to or from an Oman participant via GoRoute, the QR code, hash, and digital signature are automatically generated by our Fatoora signing pipeline. You send a standard UBL invoice โ we add the Oman compliance elements.
Digital Signatureโ
Oman requires an XAdES-BES enveloped digital signature on invoices:
- Algorithm: RSA-SHA256
- Canonicalization: Exclusive C14N 1.0
- Certificate: PKCS12 keystore (
.p12) - Location: Inside
ext:UBLExtensions(UBL DSig Profile)
<!-- Signature reference in the invoice body -->
<cac:Signature>
<cbc:ID>urn:oasis:names:specification:ubl:signature:Invoice</cbc:ID>
<cbc:SignatureMethod>urn:oasis:names:specification:ubl:dsig:enveloped:xades</cbc:SignatureMethod>
</cac:Signature>
<!-- Actual cryptographic signature in UBLExtensions (first child of Invoice) -->
<ext:UBLExtensions>
<ext:UBLExtension>
<ext:ExtensionContent>
<sig:UBLDocumentSignatures>
<sac:SignatureInformation>
<ds:Signature Id="invoice-signature">
<!-- SignedInfo, SignatureValue, KeyInfo -->
</ds:Signature>
</sac:SignatureInformation>
</sig:UBLDocumentSignatures>
</ext:ExtensionContent>
</ext:UBLExtension>
</ext:UBLExtensions>
Sending via GoRoute APIโ
JSON Format (Recommended)โ
curl -X POST https://app.goroute.ai/peppol-api/api/v1/invoices \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"invoice_number": "OM-INV-2026-001",
"issue_date": "2026-02-08",
"due_date": "2026-03-10",
"currency": "OMR",
"sender": {
"name": "Al Haya Trading LLC",
"street": "Sultan Qaboos Street",
"city": "Muscat",
"postal_code": "100",
"country": "OM",
"vat_number": "OM1234567890",
"peppol_id": "9959:872236341"
},
"receiver": {
"name": "Oman National Corp",
"street": "Al Khuwair Road",
"city": "Muscat",
"postal_code": "200",
"country": "OM",
"vat_number": "OM9876543210",
"peppol_id": "9959:987654321"
},
"lines": [
{
"description": "IT Consulting Services - January 2026",
"quantity": 160,
"unit": "HUR",
"unit_price": 25.000,
"vat_rate": 5,
"vat_category": "S"
}
]
}'
Python SDKโ
import requests
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://app.goroute.ai/peppol-api"
invoice = {
"invoice_number": "OM-INV-2026-001",
"issue_date": "2026-02-08",
"currency": "OMR",
"sender": {
"name": "Al Haya Trading LLC",
"country": "OM",
"vat_number": "OM1234567890",
"peppol_id": "9959:872236341"
},
"receiver": {
"name": "Oman National Corp",
"country": "OM",
"vat_number": "OM9876543210",
"peppol_id": "9959:987654321"
},
"lines": [
{
"description": "IT Consulting Services",
"quantity": 160,
"unit": "HUR",
"unit_price": 25.000,
"vat_rate": 5,
"vat_category": "S"
}
]
}
response = requests.post(
f"{BASE_URL}/api/v1/invoices",
headers={"X-API-Key": API_KEY},
json=invoice
)
result = response.json()
print(f"Transaction: {result['transaction_id']}")
print(f"Status: {result['status']}")
# QR code, hash, and signature are added automatically
UBL XML (Direct)โ
You can also send raw UBL XML. GoRoute will add the Fatoora QR, hash, and signature automatically:
curl -X POST https://app.goroute.ai/peppol-api/api/v1/documents/send \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/xml" \
--data-binary @oman-invoice.xml
Example Oman Invoice (Full UBL)โ
<?xml version="1.0" encoding="UTF-8"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
<!-- Oman PINT OM -->
<cbc:CustomizationID>urn:peppol:pint:billing-1@om-1</cbc:CustomizationID>
<cbc:ProfileID>urn:peppol:bis:billing</cbc:ProfileID>
<cbc:ID>OM-INV-2026-001</cbc:ID>
<cbc:IssueDate>2026-02-08</cbc:IssueDate>
<cbc:IssueTime>12:00:00Z</cbc:IssueTime>
<cbc:DueDate>2026-03-10</cbc:DueDate>
<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
<cbc:DocumentCurrencyCode>OMR</cbc:DocumentCurrencyCode>
<cbc:BuyerReference>PO-2026-456</cbc:BuyerReference>
<!-- Seller (Oman company) -->
<cac:AccountingSupplierParty>
<cac:Party>
<cbc:EndpointID schemeID="9959">872236341</cbc:EndpointID>
<cac:PartyName>
<cbc:Name>Al Haya Trading LLC</cbc:Name>
</cac:PartyName>
<cac:PostalAddress>
<cbc:StreetName>Sultan Qaboos Street</cbc:StreetName>
<cbc:CityName>Muscat</cbc:CityName>
<cbc:PostalZone>100</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>OM</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID>OM1234567890</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>Al Haya Trading LLC</cbc:RegistrationName>
<cbc:CompanyID>1234567890</cbc:CompanyID>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingSupplierParty>
<!-- Buyer (Oman company) -->
<cac:AccountingCustomerParty>
<cac:Party>
<cbc:EndpointID schemeID="9959">987654321</cbc:EndpointID>
<cac:PartyName>
<cbc:Name>Oman National Corp</cbc:Name>
</cac:PartyName>
<cac:PostalAddress>
<cbc:StreetName>Al Khuwair Road</cbc:StreetName>
<cbc:CityName>Muscat</cbc:CityName>
<cbc:PostalZone>200</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>OM</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID>OM9876543210</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>Oman National Corp</cbc:RegistrationName>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingCustomerParty>
<cac:PaymentMeans>
<cbc:PaymentMeansCode>30</cbc:PaymentMeansCode>
</cac:PaymentMeans>
<cac:TaxTotal>
<cbc:TaxAmount currencyID="OMR">200.000</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="OMR">4000.000</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="OMR">200.000</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>5</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="OMR">4000.000</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="OMR">4000.000</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="OMR">4200.000</cbc:TaxInclusiveAmount>
<cbc:PayableAmount currencyID="OMR">4200.000</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="HUR">160</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="OMR">4000.000</cbc:LineExtensionAmount>
<cac:Item>
<cbc:Name>IT Consulting Services - January 2026</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>5</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="OMR">25.000</cbc:PriceAmount>
</cac:Price>
</cac:InvoiceLine>
</Invoice>
When this invoice is sent via GoRoute, the following Fatoora elements are added before Peppol transmission:
- QR Code โ
AdditionalDocumentReference[ID='QR']with TLV-encoded data - Invoice Hash โ
AdditionalDocumentReference[ID='HASH']with SHA-256 digest - Digital Signature โ
ext:UBLExtensionswith XAdES-BES enveloped signature - cac:Signature โ Signature reference element
You do not need to generate these yourself.
Validationโ
GoRoute applies multi-layer validation to Oman invoices:
| Layer | Check | Rule |
|---|---|---|
| 1 | UBL 2.1 XSD | Structural XML validity |
| 2 | Business rules | Totals, calculations, required fields |
| 3 | eDEC Code Lists | Participant schemes, currencies, process IDs |
| 3B | PINT OM Schematron | Official OpenPeppol jurisdiction rules (IBR-OM) |
| 3C | TDD Schematron | Tax Data Document validation (CTC reporting) |
PINT OM invoices (detected by urn:peppol:pint:billing-N@om-N in CustomizationID) skip the baseline CEN-EN16931 + Peppol BIS Schematrons. They run only the official PINT OM Schematrons, which already incorporate all required European and Peppol rules along with Oman-specific jurisdiction rules.
TDD (Tax Data Document)โ
Oman's CTC (Continuous Transaction Controls) protocol requires a Tax Data Document to be submitted to the Oman Tax Authority within 15 minutes of invoice issuance. GoRoute generates the TDD automatically:
- Root element:
pxs:TaxData(namespaceurn:peppol:schema:om-taxdata:1.0) - Receiving party: Oman Tax Authority (
0242:000773) - Validated against
TDD-OM-peppol-om-tdd.xsltbefore submission - Supports document types: Send, Receive, Withdraw, Forward
Comparison with Saudi Arabia (ZATCA)โ
Oman's Fatoora system is inspired by Saudi Arabia's ZATCA but with key differences:
| Feature | Oman (OTA) | Saudi Arabia (ZATCA) |
|---|---|---|
| Network | Peppol | ZATCA platform |
| Base Standard | Peppol BIS 3.0 | UBL 2.1 (no Peppol) |
| QR Format | TLV (Tags 1-6) | TLV (Tags 1-9) |
| Signature | XAdES-BES | XMLDSIG |
| Currency Decimals | 3 (OMR) | 2 (SAR) |
| Tax Rate | 5% | 15% |
| Clearance | Via Peppol AP | Via ZATCA portal |
| Certificate | Peppol AP cert | ZATCA-issued cert |
Troubleshootingโ
Common Issuesโ
"Amount must have 3 decimal places"
- OMR uses 3 decimal places. Use
1050.000not1050.00.
"Scheme 9959 not recognized"
- Ensure you're using the latest eDEC code lists. GoRoute updates these automatically.
"QR code shows gibberish when scanned"
- Fatoora QR codes contain TLV binary data, not plain text. Use a Fatoora-compatible reader or the GoRoute dashboard to verify.
"CustomizationID validation failed"
- Use the exact Oman CIUS CustomizationID shown above. The
#conformant#suffix is required.
Resourcesโ
- GoRoute API Reference โ Full endpoint documentation
- Oman Tax Authority โ Official OTA portal
- OpenPeppol โ Peppol specifications
- GoRoute Dashboard โ Send and manage invoices