UAE e-invoicing API
Three endpoints. One of them matters. Everything below mirrors the OpenAPI 3.1 spec the service ships with.
einvoicecheck.ae is a preflight validator. It is not FTA-accredited, it does not transmit legal e-invoices, it does not replace an accredited service provider, and it does not provide statutory archival.
The endpoint contracts here are final; the public base URL is not published yet because the service has not been deployed to production. Join the waitlist to be sent the base URL and a key.
Authentication
Every call except GET /health requires a key. Send it as x-api-key, or as Authorization: Bearer <key>. Rate limits are per key; exceeding them returns 429.
x-api-key: pdk_live_xxxxxxxxxxxxxxxxPOST /v1/validate
Preflight-validate one UAE invoice. Accepts a canonical JSON invoice, an envelope { "document": "<Invoice>..." }, or raw UBL 2.1 / PINT AE XML with Content-Type: application/xml.
Checks: TRN format, required tax fields, line-item and document total arithmetic, VAT category and rate consistency, currency and code-list membership, and invoice-type detection.
POST https://api.einvoicecheck.ae/v1/validate
x-api-key: $EINVOICECHECK_KEY
content-type: application/json
{
"invoiceNumber": "INV-2026-0001",
"issueDate": "2026-07-14",
"documentCurrencyCode": "AED",
"supplier": { "name": "Acme FZ-LLC", "trn": "100123456700003" },
"customer": { "name": "Buyer LLC", "trn": "100987654300003" },
"lines": [
{ "id": "1", "quantity": 2, "unitPrice": 500.00,
"lineExtensionAmount": 1000.00, "vatCategory": "S", "vatRate": 5 }
],
"taxTotal": 50.00,
"payableAmount": 1050.00
}200 response
{
"valid": false,
"invoiceType": "380",
"schemaVersion": "PINT-AE-1.0",
"errors": [
{
"path": "/taxTotal",
"rule": "AE-TOTAL-VAT-SUM",
"severity": "error",
"message": "taxTotal 50.00 does not equal the sum of line VAT (52.50).",
"fix": "Recompute VAT per line at the stated rate, then sum with half-up rounding to 2dp."
}
]
}| Status | Meaning |
|---|---|
| 200 | Document was processed. Read `valid` and `errors` - a 200 is not a pass. |
| 401 | Missing or invalid API key. |
| 429 | Rate limit exceeded for this key. |
GET /usage
Usage metering for the calling key: all-time, today and last-30-day totals, outcome counts (valid / invalid / error), and the most recent calls.
GET https://api.einvoicecheck.ae/usage
x-api-key: $EINVOICECHECK_KEY
{
"keyPrefix": "pdk_live_a1b2",
"keyName": "CI pipeline",
"totals": { "allTime": 1840, "today": 26, "last30Days": 612 },
"outcomes": { "valid": 1502, "invalid": 331, "error": 7 },
"recent": [
{ "endpoint": "/v1/validate", "method": "POST", "outcome": "invalid",
"statusCode": 200, "timestamp": "2026-07-14T09:12:03.114Z" }
]
}GET /health
Unauthenticated liveness and readiness probe. Returns 503 when a dependency is down.
GET https://api.einvoicecheck.ae/health
{ "status": "ok", "live": true,
"checks": { "mongo": "up", "redis": "up" },
"timestamp": "2026-07-14T09:12:03.114Z" }API questions
What does the UAE e-invoicing API return?
A JSON body with valid (boolean), invoiceType, schemaVersion, and an errors array. Each error has a JSON pointer path, a rule id, a severity of error or warning, a human-readable message, and where possible a suggested fix.
How do I authenticate?
Send your key in the x-api-key header, or as a bearer token in the Authorization header. Keys are issued to waitlist members at launch.
Does the API submit my invoice to the FTA?
No. The API validates a document and returns errors. It is not FTA-accredited, does not transmit legal e-invoices, does not replace an accredited service provider, and does not provide statutory archival.