einvoicecheck.ae

UAE e-invoicing API

Three endpoints. One of them matters. Everything below mirrors the OpenAPI 3.1 spec the service ships with.

What this is not

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.

Docs skeleton

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_xxxxxxxxxxxxxxxx

POST /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."
    }
  ]
}
StatusMeaning
200Document was processed. Read `valid` and `errors` - a 200 is not a pass.
401Missing or invalid API key.
429Rate 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.