Complyance Logo

UAE (AE) Implementation Examples

Complete UAE PINT AE-compliant examples using the canonical GETS structure. Includes both the final GETS JSON format and Java SDK payload examples. All examples provide 100% field coverage for UAE requirements with FTA compliance.

UAE-Specific Features

Compliance Standards

  • Government System: FTA (Federal Tax Authority)
  • Portal: e-Tax portal / PINT AE
  • VAT Format: 15-digit TRN (e.g., 100000000000003)
  • TIN Format: 10-digit TIN (e.g., 1000000000)
  • Tax Scheme: VAT, TIN support

Required Fields

  • TRN (Tax Registration Number) - 15 digits starting with 1, ending with 03
  • TIN for non-VAT registered sellers
  • Peppol ID with scheme 0235
  • Invoice type codes (380, 381, 383, 386, 388, 389, 480)
  • VAT category codes (S, Z, E, O, AE, N)
  • Transaction type bitmask for special scenarios
  • Emirate subdivision codes (AUH, AJM, DXB, FUJ, RAK, SHJ, UAQ)

Java SDK Examples

Complete B2B Tax Invoice Example

Complete working example demonstrating UAE-specific TAX_INVOICE functionality with PINT AE compliance.

package io.complyance.test;

import io.complyance.sdk.*;
import io.complyance.sdk.Source;
import io.complyance.sdk.SourceType;
import io.complyance.sdk.SDKConfig;
import io.complyance.sdk.Environment;
import io.complyance.sdk.GETSUnifySDK;
import io.complyance.sdk.Country;
import io.complyance.sdk.Operation;
import io.complyance.sdk.Mode;
import io.complyance.sdk.Purpose;
import io.complyance.sdk.UnifyResponse;
import io.complyance.sdk.SDKException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.List;
import java.util.ArrayList;

/**
 * UAE Tax Invoice Test - Demonstrates UAE-specific TAX_INVOICE functionality
 *
 * This test class demonstrates:
 * - UAE (AE) country-specific compliance
 * - TAX_INVOICE document type mapping
 * - B2B transaction processing with PINT AE
 * - UAE-specific field mappings
 * - Comprehensive payload with UAE invoice data
 */
public class UAETaxInvoiceTest {

    public static void main(String[] args) {
        System.out.println("=== šŸ‡¦šŸ‡Ŗ UAE Tax Invoice Test ===");
        System.out.println("Testing UAE-specific TAX_INVOICE functionality");
        System.out.println("Demonstrates B2B mapping, AE compliance, and comprehensive payload");

        try {
            // Configure SDK
            configureSDK();

            // Create comprehensive UAE test payload
            Map<String, Object> payload = createUAETestPayload();

            System.out.println("āœ… UAE test payload created");

            // Test UAE TAX_INVOICE flow
            testUAETaxInvoiceFlow(payload);

            System.out.println("\nšŸŽ‰ UAE Tax Invoice test completed successfully!");

        } catch (Exception e) {
            System.err.println("āŒ Unexpected error: " + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * Configure the SDK for UAE testing
     */
    private static void configureSDK() {
        Source source = new Source("uae-source-system", "1.0", SourceType.FIRST_PARTY);
        SDKConfig config = new SDKConfig("ak_368d073d3de1f19041612fe6cdcf",
                Environment.SANDBOX, Arrays.asList(source));
        GETSUnifySDK.configure(config);
        System.out.println("āœ… SDK Configured for UAE Testing");
    }

    /**
     * Creates UAE test payload with PINT AE compliance
     */
    private static Map<String, Object> createUAETestPayload() {
        Map<String, Object> payload = new HashMap<>();

        // Invoice Data - Maps to GETS header fields
        Map<String, Object> invoiceData = new HashMap<>();
        invoiceData.put("document_number", "AE-INV-2026-001");
        invoiceData.put("document_type", "tax_invoice");
        invoiceData.put("invoice_type_code", "380");
        invoiceData.put("invoice_date", "2026-02-18");
        invoiceData.put("invoice_time", "14:30:00+04:00");
        invoiceData.put("currency_code", "AED");
        invoiceData.put("tax_currency_code", "AED");
        invoiceData.put("due_date", "2026-03-20");
        payload.put("invoice_data", invoiceData);

        // Seller Info - UAE company with TRN
        Map<String, Object> sellerInfo = new HashMap<>();
        sellerInfo.put("company_name", "ABC Trading LLC");
        sellerInfo.put("trade_name", "ABC Trading");
        sellerInfo.put("vat_registration", "100000000000003");
        sellerInfo.put("tax_id_type", "TRN");
        sellerInfo.put("tin_number", "1000000000");
        sellerInfo.put("registration_type", "TL");
        sellerInfo.put("registration_number", "CN-1234567");
        sellerInfo.put("peppol_id", "0235:1000000003");
        sellerInfo.put("email", "contact@abctrading.ae");
        sellerInfo.put("phone", "+971-4-1234567");
        sellerInfo.put("street_address", "Sheikh Zayed Road");
        sellerInfo.put("building_number", "123");
        sellerInfo.put("city_name", "Dubai");
        sellerInfo.put("state_province", "DUBAI");
        sellerInfo.put("postal_code", "00000");
        sellerInfo.put("country_code", "AE");
        sellerInfo.put("emirate", "DXB");
        payload.put("seller_info", sellerInfo);

        // Buyer Info
        Map<String, Object> buyerInfo = new HashMap<>();
        buyerInfo.put("company_name", "XYZ Corporation LLC");
        buyerInfo.put("vat_registration", "100000000000003");
        buyerInfo.put("tax_id_type", "TRN");
        buyerInfo.put("buyer_vat", "100000000000003");
        buyerInfo.put("peppol_id", "0235:1000000003");
        buyerInfo.put("email", "purchasing@xyzcorp.ae");
        buyerInfo.put("phone", "+971-2-9876543");
        buyerInfo.put("street_address", "Al Wasl Road");
        buyerInfo.put("building_number", "456");
        buyerInfo.put("city_name", "Dubai");
        buyerInfo.put("state_province", "DUBAI");
        buyerInfo.put("postal_code", "00000");
        buyerInfo.put("country_code", "AE");
        buyerInfo.put("emirate", "DXB");
        payload.put("buyer_info", buyerInfo);

        // Line Items
        List<Map<String, Object>> lineItems = new ArrayList<>();
        Map<String, Object> item1 = new HashMap<>();
        item1.put("item_id", "1");
        item1.put("item_name", "Office Equipment");
        item1.put("description", "Professional office equipment package");
        item1.put("quantity", 10);
        item1.put("unit_code", "EA");
        item1.put("unit_price", 500.00);
        item1.put("tax_rate", 5);
        item1.put("tax_category", "S");
        item1.put("tax_amount", 250.00);
        item1.put("line_extension_amount", 5000.00);
        item1.put("total_amount", 5250.00);
        lineItems.add(item1);
        payload.put("line_items", lineItems);

        // Totals
        Map<String, Object> totals = new HashMap<>();
        totals.put("line_extension_amount", 5000.00);
        totals.put("tax_exclusive_amount", 5000.00);
        totals.put("total_tax_amount", 250.00);
        totals.put("total_amount", 5250.00);
        totals.put("amount_due", 5250.00);
        payload.put("totals", totals);

        // Payment
        Map<String, Object> payment = new HashMap<>();
        payment.put("payment_means_code", "30");
        payment.put("payment_means_text", "Credit Transfer");
        payment.put("payee_account_id", "AE123456789012345678901");
        payment.put("payment_terms", "Net 30 days");
        payload.put("payment", payment);

        return payload;
    }

    /**
     * Test UAE tax invoice flow
     */
    private static void testUAETaxInvoiceFlow(Map<String, Object> payload) {
        GetsDocumentType documentType = GetsDocumentType.builder()
                .base(BASE.TAX_INVOICE)
                .build();

        UnifyResponse response = GETSUnifySDK.pushToUnify(
                "uae-source-system",
                "1.0",
                documentType,
                Country.AE,
                Operation.SINGLE,
                Mode.DOCUMENTS,
                Purpose.INVOICING,
                payload
        );

        if (response != null && "success".equalsIgnoreCase(response.getStatus())) {
            System.out.println("āœ… UAE Invoice submitted successfully!");
            if (response.getData() != null && response.getData().getSubmission() != null) {
                System.out.println("šŸ†” Submission ID: " +
                        response.getData().getSubmission().getSubmissionId());
            }
        } else {
            System.out.println("āš ļø Response: " + response);
        }
    }
}

Key UAE-Specific Features

VAT Category Codes (UNCL5305 AE-restricted)

CodeNameTax RateWhen to Use
SStandard rate5%Default taxable supplies
ZZero rated0%Exports and specific zero-rated supplies
EExempt from taxN/AFinancial services, residential property, bare land
ONot subject to taxN/AOutside scope supplies
AEVAT Reverse ChargeVariesVAT levied from invoicee
NStandard rate additional VATNon-zeroProfit margin scheme

TRN and TIN Format

  • TRN: 15 alphanumeric, starts with 1, ends with 03 (e.g., 100000000000003)
  • TIN: 10 numeric, starts with 1 (e.g., 1000000000)
  • Peppol ID: Scheme 0235 + TIN value (e.g., 0235:1000000003)

Invoice Type Codes

API ValueUNCL1001Name
tax_invoice380Commercial invoice
credit_note381Credit note
debit_note383Debit note
386386Self-billed invoice
388388Self-billed credit note

Emirate Subdivision Codes

CodeEmirate
AUHAbu Dhabi
AJMAjman
DXBDubai
FUJFujairah
RAKRas al-Khaimah
SHJSharjah
UAQUmm al-Quwain

Transaction Type Bitmask (BTAE-02)

Position1 MeansConditional Requirements
1Free Trade Zone supplyBeneficiary ID required
2Deemed supply
3Profit Margin SchemeMust use VAT category N
4Summary invoiceInvoicing period required
5Continuous supply
6Agent billingPrincipal ID required
7E-commerceDelivery address required
8ExportsDelivery address required; country must not be AE

Implementation Guide

How to use these examples in your application.

1. Choose the Right Document Type

For UAE, use these base document types:

Document TypeBaseDescription
Tax InvoiceTAX_INVOICEStandard B2B/B2G invoice
Credit NoteCREDIT_NOTEInvoice corrections/returns
Debit NoteDEBIT_NOTEAdditional charges

2. Submit via Java SDK

// Configure SDK
Source source = new Source("your-source", "1.0", SourceType.FIRST_PARTY);
SDKConfig config = new SDKConfig("ak_your_api_key", Environment.PRODUCTION, Arrays.asList(source));
GETSUnifySDK.configure(config);

// Build document type
GetsDocumentType documentType = GetsDocumentType.builder()
        .base(BASE.TAX_INVOICE)
        .build();

// Submit invoice
UnifyResponse response = GETSUnifySDK.pushToUnify(
        "your-source",
        "1.0",
        documentType,
        Country.AE,
        Operation.SINGLE,
        Mode.DOCUMENTS,
        Purpose.INVOICING,
        payload
);

3. Map Your Data to GETS Fields

See the UAE Field Mapping for detailed field paths and requirements.

UAE Compliance Checklist

  • TRN is 15 digits starting with 1 and ending with 03
  • Invoice type code is valid (380, 381, 383, 386, 388, 389, 480)
  • VAT category codes are correct (S, Z, E, O, AE, N)
  • Transaction type bitmask is 8 characters (e.g., 00000000)
  • Seller and buyer addresses include valid emirate codes
  • For exports: delivery address country is not AE
  • For RCM: buyer VAT ID provided and RCM goods type specified
  • Currency is AED or exchange rate is provided for foreign currency

Next Steps


UAE PINT AE — Enum, Constant and Dropdown Reference

Source of truth for codelist values required by UAE e-invoicing.

  • Specification basis: UAE PINT AE Specification (2025-Q2), UAE Electronic Invoicing Guidelines v1.0 (MoF)
  • Last updated: 2026-04-24

Open Engineering Question

#QuestionImpact
1Credit note reason codes mismatch: validator constants use numeric 1-7, but Schematron validates DL8.61.1.A/B/C/D/E and VD. Confirm mapping before Peppol submission.Credit notes may fail government/Peppol validation

1) VAT Category Codes

Standard: UNCL5305 (AE-restricted subset)

CodeNameTax RateWhen to UseRules
SStandard rate5%Default taxable suppliesRate must be exactly 5.00% (IBR-190-AE)
ZZero rated0%Exports and specific zero-rated suppliesRate must be 0; line VAT amount must be 0
EExempt from taxN/AFinancial services, residential property, bare land, local transportRate 0; exemption reason required; line VAT amount must not be provided; VAT breakdown rate must be omitted (IBR-121-AE)
ONot subject to taxN/AOutside scope suppliesRate must not be provided; line VAT amount must not be provided
AEVAT Reverse ChargeVariesVAT levied from invoiceeBreakdown tax amount 0; buyer VAT ID required (IBR-103-AE); RCM goods type required (IBR-006-AE)
NStandard rate additional VATNon-zeroProfit margin schemeRate must not be zero; doc-level charges/allowances cannot use this code

2) Tax Exemption Reason Codes

Standard: AE-Exempt (UAE specific, not VATEX-EU)

CodeDescriptionLegal Reference
DL8.46.1Certain financial servicesUAE VAT Decree-Law Article 46(1)
DL8.46.2Supply of residential units (lease or sale)UAE VAT Decree-Law Article 46(2)
DL8.46.3Bare landUAE VAT Decree-Law Article 46(3)
DL8.46.4Local passenger transportUAE VAT Decree-Law Article 46(4)

Usage: Mandatory when VAT category = E (IBR-167/168/169-AE).

3) Reverse Charge Mechanism (RCM) Goods Type

Standard: AE-GoodsType

CodeDescriptionLegal Reference
DL8.48.8.2Electronic DevicesDecree-Law Article 48(8)(2)
DL8.48.8.1Gold and DiamondsDecree-Law Article 48(8)(1)
DL8.48.3.1Crude or refined oilDecree-Law Article 48(3)(1)
DL8.48.3.2Unprocessed or processed natural gasDecree-Law Article 48(3)(2)
DL8.48.3.3Pure hydrocarbonsDecree-Law Article 48(3)(3)

Usage: Mandatory for invoice lines with VAT category AE (IBR-006-AE, IBR-166-AE).

4) Invoice Type Codes

Standard: UNCL1001 (AE-restricted subset)

API accepts text aliases as primary input; system normalizes to UNCL1001 internally.

Invoice types

API ValueUNCL1001NameRules
tax_invoice380Commercial invoiceCannot have only E/O VAT categories (IBR-151-AE)
(no alias)480Invoice out of scope of taxMust use only E/O/Z; no tax details or party tax registrations (IBR-122-AE)

Credit note types

API ValueUNCL1001Name
credit_note381Credit note
(no alias)81Credit note — out-of-scope transactions

Debit note

API ValueUNCL1001Name
debit_note383Debit note

Self-billing types

UNCL1001Name
386Self-billed invoice
388Self-billed credit note
389Self-billed debit note

5) Credit Note Reason Codes

Standard: AE-CreditReason

CodeDescription
DL8.61.1.ASupply was cancelled
DL8.61.1.BTax treatment changed due to nature change
DL8.61.1.CPreviously agreed consideration altered
DL8.61.1.DRecipient returned goods/services in full or part
DL8.61.1.ETax charged/treatment applied in error
VDVolume Discount

Usage:

  • Cardinality is 0..1 (BTAE-03), mandatory via IBR-158-AE.
  • If code = VD, preceding invoice reference is not required.
  • For other codes, preceding invoice reference is required (IBR-055-AE).

6) Payment Means Codes

Standard: UNCL4461 (AE-restricted subset)

API accepts enum strings; conversion to UNCL4461 is internal. Default: CREDIT_TRANSFER (30).

API Enum ValueUNCL4461NameNotes
IN_CASH10In cash
CHEQUE20Cheque
BANKERS_DRAFT21Banker's draft
CREDIT_TRANSFER30Credit transferAccount identifier required (IBR-192-AE)
DIRECT_DEBIT49Direct debit
CREDIT or CREDIT_CARD54Credit cardBoth aliases supported
DEBIT or DEBIT_CARD55Debit cardBoth aliases supported
ONLINE_PAYMENT_SERVICE68Online payment service

7) Transaction Type (8-bit bitmask)

Standard: AE-TransType, field BTAE-02

Position1 MeansConditional Requirements
1Free Trade Zone supplyBeneficiary ID required (IBR-007-AE)
2Deemed supply (no consideration)
3Profit Margin SchemeMust use VAT category N (IBR-116-AE)
4Summary invoiceInvoicing period required (IBR-138-AE)
5Continuous supply
6Agent billingPrincipal ID required (IBR-137-AE)
7E-commerceDelivery address required (IBR-142-AE)
8ExportsDelivery address required; country must not be AE (IBR-152-AE)

Format: 1–8 binary characters (IBR-154-AE). Recommended: always send all 8 (example 00000000, 10000001).

8) Item Type Codes

Standard: AE-ItemType

CodeDescriptionClassification Required
GGoodsHS code required (IBR-184-AE)
SServicesSAC code required (IBR-185-AE)
BBoth goods and servicesBoth HS and SAC required (IBR-186-AE)

9) Billing Frequency Codes

Standard: AE-FreqBill

API accepts enum values; conversion to PINT codes is internal.

API Enum ValuePINT CodeDescription
DAILYDLYDaily
WEEKLYWKYWeekly
ONCE_IN_15_DAYSQ15Once in 15 days
MONTHLYMTHMonthly
ONCE_IN_45_DAYSQ45Once in 45 days
ONCE_IN_60_DAYSQ60Once in 60 days
QUARTERLYQTRQuarterly
HALF_YEARLYHYRHalf-Yearly
YEARLYYRLYearly
OTHERSOTHOthers (invoice note required, IBR-160-AE)

10) Emirate Subdivision Codes

Standard: PINT AE specific (not ISO 3166-2:AE)

CodeEmirate
AUHAbu Dhabi
AJMAjman
DXBDubai
FUJFujairah
RAKRas al-Khaimah
SHJSharjah
UAQUmm al-Quwain

Usage: Mandatory for seller and buyer addresses (IBR-143/144-AE). API accepts names and legacy ISO-style values, normalizes internally.

11) Allowance Reason Codes

Standard: UNCL5189 (Peppol subset, 19 codes)

41, 42, 60, 62, 63, 64, 65, 66, 67, 68, 70, 71, 88, 95, 100, 102, 103, 104, 105

12) Charge Reason Codes

Standard: UNCL7161 (Peppol full list)

Common examples: AA, AAA, ABK, ABL, ACF, ACS, ADE, AEO, AEV, AEW, CG, DL, FC, FI, HD, NAA, PC, SH, ZZZ

13) MIME Codes for Attachments

Standard: IANAMT (AE subset includes application/xml)

application/pdf, application/xml, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.oasis.opendocument.spreadsheet, image/png, image/jpeg, text/csv

14) VAT Date Codes

Standard: UNCL2005 subset

CodeDescription
3Invoice document issue date
35Delivery date/time actual
432Paid to date

15) Tax Scheme IDs

CodeUsageField Context
VATDefault tax scheme; seller provides VAT identifier (TRN) in IBT-031Seller tax scheme, buyer tax scheme, VAT breakdown
!VATSeller provides TIN in IBT-032 instead of VAT identifierSeller tax scheme only (never buyer or VAT breakdown)

16) Currency Rules

  • Invoice currency: any valid ISO 4217 code
  • Tax accounting currency (IBT-006): must be AED when provided (IBR-140-AE)
  • If invoice currency is not AED, exchange rate (BTAE-04) is required (IBR-159-AE)
  • Exchange rate: max 6 decimal places

Common UAE trade currencies: AED, USD, EUR, GBP, SAR, INR, CNY

17) TRN and TIN Format Rules

TRN

  • Length: 15 alphanumeric
  • Must start with 1 and end with 03
  • Example: 100000000000003
  • Rule: IBR-132-AE

TIN

  • Length: 10 numeric
  • Must start with 1
  • Example: 1000000000
  • Rule: IBR-148-AE

Peppol Participant ID

  • Scheme: 0235
  • Peppol notation: 0235:XXXXXXXXXX (TIN value)
  • UBL serialization separates schemeID and value

18) Identifier Scheme Codes

ICD/EAS

CodeNameUsage
0235UAE Tax Identification NumberUsed as ICD and EAS
CodeDescriptionNotes
TLCommercial/Trade LicenseStandard business registration
EIDEmirates IDPersonal identification
PASPassportIssuing country required (IBR-012/013-AE)
CDCabinet DecisionGovernment entities

19) Specification Identifiers

FieldValue
CustomizationID (Invoice)starts with urn:peppol:pint:billing-1@ae-1
CustomizationID (Self-billing)starts with urn:peppol:pint:selfbilling-1@ae-1
ProfileID (Invoice)urn:peppol:bis:billing
ProfileID (Self-billing)urn:peppol:bis:selfbilling

20) Incoterms

Standard: ICC Incoterms 2020

EXW, FCA, CPT, CIP, DAP, DPU, DDP, FAS, FOB, CFR, CIF

21) Predefined Endpoint IDs

Endpoint ID
9900000097
9900000098
9900000099

Use UAE predefined endpoints where applicable for recipient routing in integration flows.