- How UAE E-Invoicing Works
Who receives the document
Wafeq ASP decides where each document goes. This page tells you how Wafeq ASP decides, and which details of the buyer each route needs.
This page uses these terms:
- Taxpayer: a business from which your organization has an active grant. On each document that your app submits, the taxpayer is the seller.
- Buyer: the business that receives the document.
- FTA: the UAE Federal Tax Authority. Wafeq ASP reports each document to the FTA.
- Peppol: the network that UAE businesses use to exchange e-invoices. Each business connects to Peppol through its e-invoicing provider.
- Peppol ID: the address of a business on Peppol. For a UAE business, it is
0235:followed by the TIN of the business. - TIN: the 10-digit number that the FTA gives a business.
- VAT TRN: the VAT registration number of a business: 15 digits, ending in
03. - Delivery: the transfer of the document to the e-invoicing provider of the buyer, on Peppol.
- Report: the copy of the document that Wafeq ASP sends to the FTA.
- FTA placeholder address: an address that the UAE rules give for documents that go to the FTA only. Wafeq ASP puts it in the document instead of the Peppol ID of the buyer.
- Export: a sale of goods or services to a place outside the UAE. Your app marks an export with the last flag of
transaction_type_code, for example00000001. - Deemed supply: goods or services that a business gives away or uses privately. VAT treats them as a sale. Your app marks a deemed supply with the second flag of
transaction_type_code, for example01000000.
An example shows the routes. Al Noor Trading LLC is a taxpayer in Dubai. It sells office furniture. It issues five invoices:
- To Gulf Fresh Foods LLC, a company in Dubai with a TIN. The company is on Peppol. Wafeq ASP delivers the invoice to the e-invoicing provider of the company. Wafeq ASP also reports the invoice to the FTA.
- To Al Barsha Cafeteria, a shop in Dubai with no TIN and no VAT TRN. Wafeq ASP cannot deliver the invoice. Wafeq ASP reports it to the FTA only, with the FTA placeholder address
0235:9900000098. - To Muscat Office Supplies LLC, a company in Oman. The company is not on Peppol. The invoice is an export. Wafeq ASP reports it to the FTA only, with the FTA placeholder address
0235:9900000099. - To Harbour Events Ltd, a company in the United Kingdom. The company buys chairs for its stand at a trade fair in Dubai. The chairs stay in the UAE, so the sale is not an export. The company is not on Peppol. Wafeq ASP reports the invoice to the FTA only, with the FTA placeholder address
0235:9900000098. - To a school in Sharjah, for chairs that Al Noor gives free of charge. The invoice is a deemed supply. Wafeq ASP reports it to the FTA only, with the FTA placeholder address
0235:9900000097.
The routes
Each document goes on one of two routes:
- Delivery and report. Wafeq ASP delivers the document to the e-invoicing provider of the buyer. Wafeq ASP also reports the document to the FTA.
- FTA only. Wafeq ASP does not deliver the document. Wafeq ASP reports it to the FTA only, with an FTA placeholder address.
Wafeq ASP selects the route with these rules, in this order:
1. The document is a deemed supply.
- Route: FTA only, always.
- Address:
0235:9900000097. This is also true when the document is an export, or when the buyer is on Peppol.
2. The document is an export.
- Route: delivery and report, when Wafeq ASP finds the buyer on Peppol.
- Route: FTA only, when the buyer is not on Peppol, or when your app does not send
customer.id. - Address for FTA only:
0235:9900000099.
3. Any other document.
- Route: delivery and report, when Wafeq ASP finds the buyer on Peppol.
- Route: FTA only, when the buyer is not on Peppol, or when your app does not send
customer.id. The buyer can be in the UAE or outside the UAE. - Address for FTA only:
0235:9900000098.
| FTA placeholder address | Wafeq ASP uses it for |
|---|---|
0235:9900000098 | A buyer that Wafeq ASP cannot deliver to, on a document that is not an export. The buyer can be in the UAE or outside the UAE. |
0235:9900000099 | An export that Wafeq ASP cannot deliver. |
0235:9900000097 | A deemed supply. |
Your app does not need to send these addresses. Wafeq ASP selects them.
The FTA placeholder addresses do not apply to self-billed documents (389 and 261). Wafeq ASP delivers a self-billed document to the seller on Peppol.
How Wafeq ASP looks for the buyer
Wafeq ASP looks for the buyer on Peppol each time your app checks or submits a document. Wafeq ASP uses the Peppol ID in customer.id.
- Wafeq ASP finds the buyer. Wafeq ASP delivers the document.
- Wafeq ASP finds that the buyer is not on Peppol. Wafeq ASP selects the FTA-only route, if the rules above permit it.
- The lookup is temporarily unavailable. Wafeq ASP does not know if the buyer is on Peppol. Thus it does not select the FTA-only route, and it accepts nothing. Refer to step 3.
Wafeq ASP does not look for the buyer in two cases:
- The document is a deemed supply.
- Your app does not send
customer.id.
The lookup is the same for each new document. When a buyer joins Peppol, Wafeq ASP delivers the documents that your app submits after that. Wafeq ASP does not deliver the earlier documents again.
Wafeq ASP selects 0235:9900000099 only for a document with the export flag. Your user decides if a sale is an export. Wafeq ASP does not decide it from the country of the buyer.
Route a document: the three steps
| Step | Who | Action |
|---|---|---|
| 1 | Your app | Collects the details of the buyer that each route needs. |
| 2 | Your app | Checks the document and reads the route. |
| 3 | Your app | Submits the document and reads the response. |
Step 1: Collect the details of the buyer
Send customer.id when the buyer has a Peppol ID. For a UAE buyer, this is 0235: followed by its TIN. Do not send customer.id when the buyer has no Peppol ID.
The FTA-only routes with 0235:9900000098 and 0235:9900000097 need one more detail. The document must identify the buyer with one of these:
- The VAT TRN, in
customer.vat_number. - An identifier, in
customer.identifier. Use a registration number of the buyer, for example its trade licence number. To give the type of the number, addcustomer.identifier_scheme, a 4-digit ISO 6523 code. This field is optional.
Without one of these, Wafeq ASP refuses the document with SCH:ibr-135-ae.
A buyer outside the UAE has no UAE VAT TRN. customer.vat_number is for a UAE VAT TRN only. For this buyer, send customer.identifier, for example its company registration number.
If your app sends a TIN in customer.id, your app does not need to send more. When Wafeq ASP reports such a document to the FTA only, Wafeq ASP writes the TIN as the identifier of the buyer, with scheme 0235. The TIN replaces any value in customer.identifier.
Example: a buyer in the UAE with no TIN and no VAT TRN. Wafeq ASP reports this invoice to the FTA only, with 0235:9900000098.
{
"invoice_number": "INV-2026-0401",
"issue_date": "2026-10-15",
"due_date": "2026-11-14",
"source_id": "erp-invoice-9101",
"customer": {
"name": "Al Barsha Cafeteria",
"identifier": "CN-2233445",
"address": { "street": "Shop 4, Al Barsha 1", "city": "Dubai", "country": "AE", "country_subentity": "DXB" }
},
"line_items": [
{ "description": "Coffee machine service", "quantity": 1, "unit_price": 600, "tax_category": "S", "tax_percent": 5 }
]
}An export needs these details of the buyer:
customer.name.customer.address, withstreet,city,country_subentityandcountry. Use the real country of the buyer.delivery_address, withstreet,city,country_subentityandcountry. This is where the goods or services go. The country must not beAE. Wafeq ASP does not copy the address of the buyer into this field.
Example: an export to a buyer that is not on Peppol. Wafeq ASP reports this invoice to the FTA only, with 0235:9900000099.
{
"invoice_number": "INV-2026-0402",
"issue_date": "2026-10-15",
"due_date": "2026-11-14",
"source_id": "erp-invoice-9102",
"transaction_type_code": "00000001",
"customer": {
"name": "Muscat Office Supplies LLC",
"address": { "street": "Way 3015, Al Khuwair", "city": "Muscat", "country": "OM", "country_subentity": "Muscat" }
},
"delivery_address": { "street": "Way 3015, Al Khuwair", "city": "Muscat", "country": "OM", "country_subentity": "Muscat" },
"line_items": [
{ "description": "Office chairs", "quantity": 20, "unit_price": 450, "tax_category": "Z", "tax_percent": 0 }
]
}For the other fields of an export, refer to Special scenarios.
Step 2: Check the document and read the route
Send the request body to POST /invoices/validate, or to POST /credit-notes/validate for a credit note. Wafeq ASP looks for the buyer and selects the route. It keeps nothing, delivers nothing and reports nothing.
Read these fields of the response:
route: where the document will go.effective_recipient_id: the address of the document. This is the Peppol ID of the buyer, or an FTA placeholder address.
route | Meaning |
|---|---|
delivery | Wafeq ASP will deliver the document and report it to the FTA. |
reporting_only | Wafeq ASP will report the document to the FTA only. |
undeliverable | The buyer is not on Peppol, and the FTA-only route does not apply. |
unconfirmed | Wafeq ASP could not look for the buyer at this time, or the check stopped early. |
For the first example in step 1, the response is:
{
"valid": true,
"invoice_id": "INV-2026-0401",
"invoice_type_code": "380",
"profile_execution_id": "00000000",
"effective_recipient_id": "0235:9900000098",
"route": "reporting_only",
"errors": [],
"warnings": [
{
"code": "fta_reporting_only",
"message": "FTA reporting only via 0235:9900000098; no Peppol buyer delivery.",
"severity": "warning",
"location": null
}
],
"info": []
}The fta_reporting_only warning tells your user that the buyer will not receive the document through Peppol. It does not stop the submission.
When the lookup is temporarily unavailable, the response has the warning smp_unavailable, and route is unconfirmed.
The submission looks for the buyer again. Thus the route can change between the check and the submission.
Step 3: Submit the document and read the response
Send the same body to POST /invoices, or to POST /credit-notes for a credit note. Always send an Idempotency-Key header. A document that goes to the FTA only needs it. Without a key, Wafeq ASP refuses that document with 422 idempotency_key_required.
Read the response:
202, status: reporting_only
- Meaning: Wafeq ASP accepted the document and reports it to the FTA only. Wafeq ASP gives this response with or without the
Prefer: respond-asyncheader. - Next: track the report to the FTA. This status is not the answer of the FTA. Wafeq ASP sends a
document.statusevent withdelivery_status: not_applicable. Refer to Track a document.
202, status: queued, or 200, status: delivered
- Meaning: Wafeq ASP accepted the document on the route with delivery. Wafeq ASP also reports it to the FTA.
- Next: track the delivery and the report. Refer to Track a document.
503, code smp_unavailable
- Meaning: Wafeq ASP could not look for the buyer at this time. Wafeq ASP accepted nothing.
- Next: wait. Then send the same request again, with the same
Idempotency-Key.
For the other responses, refer to Submit a document.
Buyers outside the UAE without the export flag
This section is not a step. It applies when the buyer has an address outside the UAE, and the document does not have the export flag.
Example. A company in the United Kingdom buys chairs for its stand at a trade fair in Dubai. The chairs stay in the UAE. Thus the sale is not an export.
Wafeq ASP routes this document as any other document (rule 3):
- Wafeq ASP finds the buyer on Peppol. Wafeq ASP delivers the document and reports it to the FTA.
- The buyer is not on Peppol, or your app does not send
customer.id. Wafeq ASP reports the document to the FTA only, with0235:9900000098. - The lookup is temporarily unavailable. Wafeq ASP refuses the submission with
503 smp_unavailable, and it accepts nothing.
The document must contain these details of the buyer:
customer.identifier, for example the company registration number of the buyer. Without it, Wafeq ASP refuses the document withSCH:ibr-135-ae.customer.address, withstreet,city,country_subentityandcountry. For a buyer outside the UAE,country_subentityis its region, for example its state or county. Without it, Wafeq ASP refuses the document withSCH:ibr-144-ae.
Example:
{
"invoice_number": "INV-2026-0403",
"issue_date": "2026-10-15",
"due_date": "2026-11-14",
"source_id": "erp-invoice-9103",
"customer": {
"name": "Harbour Events Ltd",
"identifier": "09876543",
"address": { "street": "21 Wharf Street", "city": "Bristol", "country": "GB", "country_subentity": "Bristol" }
},
"line_items": [
{ "description": "Exhibition chairs", "quantity": 40, "unit_price": 150, "tax_category": "S", "tax_percent": 5 }
]
}If the sale is an export, set the export flag and send delivery_address. Then Wafeq ASP uses 0235:9900000099 instead. Refer to Special scenarios.
Routes in Sandbox
In Sandbox, Wafeq ASP does not look for buyers on Peppol. It treats each buyer as found and simulates the delivery. Wafeq ASP reports nothing to the FTA.
These rules stay the same as in Live:
- A deemed supply goes to
0235:9900000097. - A document without
customer.idgoes to0235:9900000098or0235:9900000099. - A document that goes to the FTA only gives
202withstatus: reporting_only.
Two test buyers let you test the other results of the lookup:
customer.id | Acts like | Result |
|---|---|---|
0235:1999201000 | A buyer that is not on Peppol | FTA only, with 0235:9900000099 for an export, or 0235:9900000098 for any other document. |
0235:1999202000 | A lookup that is temporarily unavailable | The check gives the warning smp_unavailable. The submission gives 503 smp_unavailable. |
For more about Sandbox, refer to Sandbox.
Updated about 17 hours ago