✓ FTA-Compliant ✓ Peppol-Aligned

DocFlow E-Invoice API

Submit, validate, and manage Peppol-compliant UAE e-invoices programmatically. Integrate your ERP, accounting software, or custom application with the DocFlow external gateway with JWT management.

Base URL

https://api.docflow.ae

Sandbox URL

https://sandbox-api.docflow.ae

API Reference

Authentication

1

POST

User Login

Authenticates a user using the provided login credentials. Validates the submitted email/username and password, and if successful, generates and returns a JWT access token along with related authentication data. Returns an unauthorized response if the credentials are invalid.

https://api.docflow.ae/api/auth/login

Request Body

Response Body

JSON

{ 

    "email": "khaleel@docflow.ae", 

    "password": "$Docflow1" 

}

2

GET

Current User information

Returns information about the currently authenticated user based on the provided JWT access token. Requires authorization. If the token is valid, returns the user profile and related context data; otherwise, returns an unauthorized response. 

https://api.docflow.ae/api/auth/me 
Authorization: Bearer Token (JWT) 

Response Body

JSON

{ 

    "success": true, 

    "message": "Request completed successfully.", 

    "data": { 

        "isAuthenticated": true, 

        "userId": "bb4jh6c1-93w8-4f08-9b9c-35c20e02540c", 

        "email": "test@docflow.ae", 

        "phoneNumber": "+971525246654", 

        "firstName": "khaleel", 

        "lastName": "Ibrahim", 

        "fullName": "Khaleel Ibrahim", 

        "position": "Developer", 

        "roles": [] 

    }, 

    "errors": [] 

} 

3

POST

Refresh JWT tokens 

Refreshes the authentication tokens using a valid refresh token. Validates the provided refresh token and, if valid, issues a new JWT access token and a new refresh token. Returns an unauthorized response if the refresh token is invalid, expired, or revoked. 

https://api.docflow.ae/api/auth/refresh 

Request Body

Response Body

JSON

{ 

  "refreshToken": "refreshToken" 

} 

4

POST

 Revoke refresh token

Revokes a specific refresh token to prevent further use. Accepts a refresh token in the request body and invalidates it if found and valid. Returns the result of the revocation operation or an appropriate error response if the token is invalid or not found. 

https://api.docflow.ae/api/auth/revoke

Request Body

Response Body

JSON

{ 

  "refreshToken": "refreshToken" 

} 

5

POST

Initiate password recovery 

Initiates the password recovery process for a user account. If the provided email exists, generates a temporary verification code and sends it to the user's email address with an expiration time. Always returns a generic success response to prevent user enumeration, even if the email is not found. 

https://api.docflow.ae/api/auth/forgot

Request Body

Response Body

JSON

{ 

  "email": "test@docflow.ae" 

} 

6

POST

Change password after recovery

Changes the user's password after successful password recovery verification. Requires authorization. Accepts a new password in the request body, validates it according to security policies, and updates the user's credentials. Returns the result of the password change operation or an appropriate error response if validation fails

https://api.docflow.ae/api/auth/forgot/change 
Authorization: Bearer Token (JWT)

Request Body

Response Body

JSON

{

  "newPassword": "P@ssw0rd" 

} 

7

POST

Account Confirmation Email 

Generates and sends a temporary verification code to the specified email address for email confirmation. If the email address exists and has not yet been confirmed, a verification code is generated, with an expiration time, and sent to the user's email. To prevent user enumeration, a generic success response is returned when the email address does not exist. If a code was recently sent, a message is returned indicating that the user should wait before requesting another code. 

https://api.docflow.ae/api/auth/email/confirm/send 

Request Body

Response Body

JSON

{

"email": "test@docflow.ae"

}

8

POST

Verify Email Confirmation Code 

Validates the verification code previously sent to the user's email address. If the provided code is valid, has not expired, and matches the specified email, the user's email address is marked as confirmed.  Returns an appropriate response if the verification code is invalid, expired, the email address does not exist, or the email has already been confirmed. 

https://api.docflow.ae/api/auth/email/confirm/verify  

Request Body

Response Body

JSON

 { 

    "email": "test@docflow.ae", 

    "code": "09748" 

} 

Invoice

9

POST

Validate invoice

Runs the full PINT-AE rule set on an invoice body without saving or sending anything. The request body is identical to "create new invoice"; every amount is checked against the lines, allowances and VAT breakdown exactly as on create, and every finding comes back with its rule ID and the JSON path of the field. Use it to test an integration or to check a document before you create it

https://api.docflow.ae/api/v1/invoices/validate

Authorization: Bearer Token (JWT)

Request Body

Response Body

JSON

Same body as "create new invoice". isDraft is ignored; nothing is stored either way.

10

POST

create new invoice

Creates an outgoing invoice for the company given in companyId, which must be active and accessible to the signed-in user . The body is validated against the PINT-AE rules; every amount is supplied by you and checked, never recalculated. With isDraft true or omitted the invoice is saved as a draft. With isDraft: false it is saved and queued for Peppol delivery in one transaction: if queuing fails, nothing is saved.

https://api.docflow.ae/api/v1/invoices

Authorization: Bearer Token (JWT)

Request Body

Response Body

JSON

{

"companyId": "3f2a9c1e-5b7d-4e8a-9c21-7d4e5f6a8b90",

"isDraft": true,

"isSelfBilled": false,

"invoiceNo": "INV-2026-0001",

"documentId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",

"issueDate": "2026-09-30",

"issueTime": "10:15:00",

"invoiceTypeCode": "380",

"invoiceTransactionTypeCode": "00000000",

"currencyCode": "USD",

"dueDate": "2026-10-30",

"principalId": null,

"note": "Thank you for your business.",

"supplyDate": "2026-09-15",

"taxPointDate": "2026-09-15",

"invoicePeriod": {

"start": "2026-09-01",

"end": "2026-09-30",

"billingFrequency": "MTH"

},

"references": {

"buyerReference": "BUYER-REF-01",

"purchaseOrder": "PO-7781",

"salesOrder": null,

"contract": "CTR-2026-004",

"contractValue": 50000.00,

"project": "PRJ-ALPHA",

"receipt": null,

"despatchAdvice": null

},

"precedingInvoice": null,

"creditNoteReasonCode": null,

"creditNoteReasonText": null,

"seller": {

"registeredName": "DocFlow Test Seller LLC",

"tradingName": "DocFlow Seller",

"electronicAddress": {

"id": "100000000000003",

"schemeId": "0235"

},

"taxIdentifier": {

"id": "100000000000003",

"schemeCode": "VAT"

},

"taxRegistration": {

"id": "1000000000",

"schemeId": "TAX"

},

"legalRegistration": {

"id": "TL-123456",

"typeCode": "TL",

"authorityName": "Dubai DET",

"passportIssuingCountryCode": null

},

"address": {

"line1": "Office 1204, Tower A",

"line2": "Business Bay",

"line3": "Marasi Drive",

"city": "Dubai",

"countrySubdivision": "DXB",

"postalCode": "00000",

"countryCode": "AE"

},

"contact": {

"name": "Seller Contact",

"phone": "+971500000001",

"email": "seller@test.ae"

}

},

"buyer": {

"registeredName": "Test Buyer Trading LLC",

"tradingName": "Test Buyer",

"electronicAddress": {

"id": "100000000000010",

"schemeId": "0235"

},

"identifier": {

"id": "BUY-001",

"schemeId": "0235"

},

"taxIdentifier": {

"id": "100000000000010",

"schemeCode": "VAT"

},

"legalRegistration": {

"id": "P1234567",

"typeCode": "PAS",

"authorityName": null,

"passportIssuingCountryCode": "PK"

},

"address": {

"line1": "Warehouse 7",

"line2": null,

"line3": null,

"city": "Dubai",

"countrySubdivision": "DXB",

"postalCode": null,

"countryCode": "AE"

},

"contact": {

"name": "Buyer Contact",

"phone": "+971500000002",

"email": "buyer@test.ae"

}

},

"beneficialRecipient": null,

"delivery": {

"date": "2026-09-15",

"locationName": "Main Warehouse",

"address": {

"line1": "Warehouse 7",

"line2": "Al Quoz Industrial 3",

"line3": null,

"city": "Dubai",

"countrySubdivision": "DXB",

"postalCode": "00000",

"countryCode": "AE"

}

},

"lines": [

{

"lineNo": 1,

"item": {

"name": "Industrial Scanner",

"description": "Standard-rated goods",

"sellerItemId": "SKU-001",

"standardIdentifier": {

"id": "4006381333931",

"schemeId": "0160"

},

"itemType": "GOODS",

"itemClassificationIdentifier": "84719000",

"goodsOrServicesType": null,

"countryOfOriginCode": "DE",

"serviceAccountingCode": null,

"objectIdentifier": "SN-778899"

},

"quantity": 10,

"unitCode": "H87",

"price": {

"grossPrice": 100.00,

"priceDiscount": 0.00,

"netPrice": 100.00,

"baseQuantity": 1,

"baseQuantityUnitCode": "H87"

},

"allowanceCharges": [

{

"isCharge": false,

"percentage": 5,

"reasonCode": "95",

"amount": 50.00,

"baseAmount": 1000.00,

"reason": "Volume discount"

}

],

"tax": {

"scheme": "VAT",

"categoryCode": "S",

"rate": 5.00,

"exemptionReasonCode": null,

"exemptionReasonText": null

},

"amounts": {

"lineExtensionAmount": 950.00,

"taxAmount": 47.50,

"lineTotalAmount": 997.50,

"taxAmountAed": 174.44,

"lineTotalAmountAed": 3663.32

},

"orderLineReference": "1",

"buyerAccountingReference": "ACC-100",

"period": {

"start": "2026-09-01",

"end": "2026-09-30"

}

}

],

"allowanceCharges": [

{

"isCharge": false,

"amount": 30.00,

"baseAmount": 600.00,

"percentage": 5,

"reasonCode": "95",

"reason": "Document discount",

"tax": {

"scheme": "VAT",

"categoryCode": "S",

"rate": 5.00,

"exemptionReasonCode": null,

"exemptionReasonText": null

}

}

],

"taxBreakdown": [

{

"scheme": "VAT",

"categoryCode": "S",

"rate": 5.00,

"taxableAmount": 920.00,

"taxAmount": 46.00,

"exemptionReasonCode": null,

"exemptionReasonText": null

}

],

"totals": {

"lineExtensionTotal": 950.00,

"allowanceTotal": 30.00,

"chargeTotal": 0.00,

"taxExclusiveAmount": 920.00,

"taxTotal": 46.00,

"taxInclusiveAmount": 966.00,

"prepaidAmount": 100.00,

"prepaidTaxAmount": 4.76,

"roundingAmount": 0.00,

"payableAmount": 866.00

},

"taxCurrency": {

"code": "AED",

"exchangeRate": 3.6725,

"taxableAmount": null,

"taxTotal": 168.94,

"taxInclusiveAmount": 3547.64

},

"paymentInstructions": [

{

"id": "PI-1",

"meansCode": "30",

"meansText": "Credit transfer",

"paymentId": "INV-2026-0001",

"bankTransfer": {

"accountId": "AE070331234567890123456",

"accountScheme": "IBAN",

"accountName": "DocFlow Test Seller LLC",

"bankIdentifier": "EBILAEAD",

"bankAddress": "Baniyas Road, Deira",

"bankCountryCode": "AE"

},

"card": null,

"directDebit": null

}

],

"paymentTerms": [

{

"note": "Payable within 30 days",

"amount": 866.00,

"dueDate": "2026-10-30",

"paymentInstructionsId": "PI-1"

}

]

}

NOTE : use 381 (or 81), set creditNoteReasonCode and creditNoteReasonText, give precedingInvoice unless the reason is VD, omit taxPointDate , and omit paymentInstructions and dueDate if nothing is payable.

11

POST

Submit PINT-AE UBL XML

Validate a finished UBL 2.1 Invoice or CreditNote against the UBL XSD and the PINT -AE schematron, and optionally queue the exact bytes for Peppol delivery . DocFlow does not change the document

https://api.docflow.ae/api/v1/invoices/ubl

Authorization: Bearer Token (JWT)

Content-Type: application/xml or text/xml · Maximum body size 16 MB

Query Parameters:

Name

companyId

submit

Type

String (GUID)

strinBooleang

description

Required GUID: the company the document is sent for . Must be active and accessible to the signed-in user

false (default): validate only , nothing stored or sent. true: validate and queue

Request Body

Response Body

XML

<?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:CommonAggregateComp

onents-2”

xmlns:cbc=”urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponen

ts-2”>

<cbc:CustomizationID>urn:peppol:pint:billing-1@ae-1</cbc:CustomizationID>

<cbc:ProfileID>urn:peppol:bis:billing</cbc:ProfileID>

<cbc:ID>INV-2026-0001</cbc:ID>

<cbc:IssueDate>2026-09-30</cbc:IssueDate>

<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>

<cbc:DocumentCurrencyCode>AED</cbc:DocumentCurrencyCode>

<cac:AccountingSupplierParty>…</cac:AccountingSupplierParty>

<cac:AccountingCustomerParty>…</cac:AccountingCustomerParty>

<cac:TaxTotal>…</cac:TaxTotal>

<cac:LegalMonetaryTotal>…</cac:LegalMonetaryTotal>

<cac:InvoiceLine>…</cac:InvoiceLine>

</Invoice>

NOTE : The document is sent exactly as received, so a self-billed UBL must itself carry type code 389 (invoice) or 261 (credit note) together with ProfileID urn:peppol:bis:selfbilling. A ProfileID that disagrees with the type code is rejected on submit

12

GET

paginated invoice list

Returns a paginated list of invoices for the current company. Supports filtering, sorting, and paging parameters via query string.

https://api.docflow.ae/api/v1/invoices

Authorization: Bearer Token (JWT) 

Query Parameters:

Name

Type

status

dateFrom

dateTo

search

page

pageSize

Type

integer

integer

timestamp

timestamp

string

integer

integer

description

Direction filter . Optional

If true, returns only draft clients. If false, returns active clients.

Filters the list based on Date. YYYY-MM-DD

Filters the list based on Date. YYYY-MM-DD

A search term to filter clients by name or identifier.

The specific page number of results to retrieve (e.g., 1).

The number of records to return per page (e.g., 20).

Response Body

JSON

{

"success": true,

"message": "Request completed successfully.",

"data": {

"items": [

{

"id": "71c2ced3-d1e7-4abd-b44d-0cb599ededcb",

"status": "Draft",

"direction": "Outgoing",

"invoiceNo": "CN-ALLFIELDS-0559",

"documentId": "b3e1c2d4-5f6a-4b7c-8d9e-0f1a2b3c4d5e",

"invoiceTypeCode": "381",

"issueDate": "2026-09-30",

"dueDate": "2026-10-30",

"currencyCode": "USD",

"sellerName": "DocFlow Test Seller LLC",

"buyerName": "Test Buyer Trading LLC",

"taxExclusiveAmount": 1550.00,

"taxTotal": 46.00,

"taxInclusiveAmount": 1596.00,

"payableAmount": 1496.01,

"createdAt": "2026-10-01T17:26:32.4059357+04:00"

}

],

"page": 1,

"pageSize": 1,

"total": 35

},

"errors": []

}

13

GET

invoice details by ID

Returns detailed information for a specific invoice by its identifier, including invoice items. Returns not found if the invoice does not exist or is not accessible.

https://api.docflow.ae/api/v1/invoices/{id}

Authorization: Bearer Token (JWT) 

Path Variables:

Name

id

Type

string

required

yes (in path)

description

The unique identifier of the invoice

Response Body

JSON

{

"success": true,

"message": "Request completed successfully.",

"data": {

"id": "71c2ced3-d1e7-4abd-b44d-0cb599ededcb",

"status": "Draft",

"createdAt": "2026-10-01T17:26:32.4059357+04:00",

"updatedAt": null,

"invoiceNo": "CN-ALLFIELDS-0559",

"documentId": "b3e1c2d4-5f6a-4b7c-8d9e-0f1a2b3c4d5e",

"issueDate": "2026-09-30",

"issueTime": "10:15:00",

"invoiceTypeCode": "381",

"invoiceTransactionTypeCode": "00000000",

"currencyCode": "USD",

"dueDate": "2026-10-30",

"principalId": "PRN-0001",

"note": "All-fields storage test",

"supplyDate": "2026-09-15",

"taxPointDate": "2026-09-15",

"invoicePeriod": { ... },

"references": { ... },

"precedingInvoice": { ... },

"creditNoteReasonCode": "VD",

"creditNoteReasonText": "Volume discount adjustment",

"seller": { ... },

"buyer": { ... },

"beneficialRecipient": { ... },

"delivery": { ... },

"lines": [ { ... } ],

"allowanceCharges": [ { ... } ],

"taxBreakdown": [ { ... } ],

"totals": { ... },

"taxCurrency": { ... },

"paymentInstructions": [ { ... } ],

"paymentTerms": [ { ... } ]

},

"errors": []

}

14

PUT

update draft invoice

Replaces a draft invoice with the request body . The same validation as create applies, and totals are checked, not recalculated. Only drafts can be edited; the document type cannot change. On lines[], send back a line's id to update it, omit id to add a line, and leave a line out to delete it. The result is always saved as a draft ( isDraft is ignored) and the full invoice is returned.

https://api.docflow.ae/api/v1/invoices/{id}

Authorization: Bearer Token (JWT) 

Path Variables:

Name

id

Type

string

required

yes (in path)

description

The unique identifier of the invoice

Request Body

Response Body

JSON

// same as create API

15

DELETE

delete draft invoice

Soft-deletes a draft invoice identified by the specified id. Only draft invoices can be deleted; attempts to delete a non-draft invoice return a conflict response. Marks the invoice as deleted and returns no content.

https://api.docflow.ae/api/v1/invoices/{id}

Authorization: Bearer Token (JWT) 

Path Variables:

Name

id

Type

string

required

yes (in path)

description

The unique identifier of the invoice

Response Body

JSON

// 204 No Content

16

GET

get invoice status

Returns the current status of an invoice with its approval and payment dates. 404 if the invoice does not exist or belongs to another company .

https://api.docflow.ae/api/v1/invoices/{id}/status

Authorization: Bearer Token (JWT) 

Path Variables:

Name

id

Type

string

required

yes (in path)

description

The unique identifier of the invoice

Response Body

JSON

{

"success": true,

"message": "Request completed successfully.",

"data": {

"id": "71c2ced3-d1e7-4abd-b44d-0cb599ededcb",

"status": 0,

"approveDate": null,

"paidDate": null

},

"errors": []

}

Peppol Lookup

16

GET

Peppol participant lookup

Checks whether a buyer or seller is registered on the Peppol network before you send to them. Accepts a UAE TRN, a TIN, or a full Peppol participant identifier, normalises it and queries the Peppol SML/SMP.

https://api.docflow.ae/api/v1/peppol/participants/lookup

Authorization: Bearer Token (JWT)

Query Parameters:

Name

id

details

Type

string

boolean

required

yes

no

description

The participant to look up: a 15-digit TRN, a 10-digit TIN, 0235:<TIN>, or any <ICD>:<value> pair

true adds smpUrl and documentTypes to the result. Default false.

Response Body

JSON

{

"success": true,

"message": "Request completed successfully.",

"data": {

"input": "0235:1001234567",

"participantId": "0235:1001234567",

"status": "Registered",

"isRegistered": true,

"smpUrl": "https://smp.example.com/",

"capabilities": null,

"documentTypes": [

"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2::Invoice",

"urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2::CreditNote"

],

"checkedAt": "2026-10-23T10:15:00+04:00",

"message": null

},

"errors": []

}

Response Guide:

Field

input

participantId

status

isRegistered

smpUrl

message

capabilities

documentTypes

checkedAt

description

The identifier exactly as you sent it.

The normalised scheme:value identifier, or null when the input was invalid.

Registered, NotRegistered, InvalidIdentifier or LookupFailed.

true only when status is Registered.

SMP base URL. Only with details=true and only when registered.

Explanation for any result other than a clean Registered.

What the participant can receive, when known; null when not registered or the SMP could not be read.

Document type identifiers the participant accepts. Only with details=true.

When the lookup ran. Earlier than now when the answer came from cache.

17

POST

Peppol batch lookup

Looks up up to 10 participants in one call. Results come back in the same order as the identifiers you sent. A malformed identifier does not fail the request; it comes back as a result with status InvalidIdentifier.

https://api.docflow.ae/api/v1/peppol/participants/lookup

Authorization: Bearer Token (JWT)

Request Body

Response Body

JSON

{

"ids": [

"0235:1001234567",

"100123456700003"

],

"details": false

}

Company

18

GET

Companies List

Returns the companies the signed-in user can act for: the user's own company and the other companies in the same company group. Use the id of a company from this list as companyId on the invoice and UBL endpoints.

https://api.docflow.ae/api/companies

Authorization: Bearer Token (Partner JWT)

Query Parameters:

Name

search

page

pageSize

Type

string

integer

integer

required

No

no

no

description

Search term of 2 to 100 characters; filters the list by company name or identifier.

Page number, starting at 1

Records per page

Response Body

JSON

{

"success": true,

"message": "Request completed successfully.",

"data": {

"items": [

{

"id": "3f2a9c1e-5b7d-4e8a-9c21-7d4e5f6a8b90",

"name": "DocFlow Test Seller LLC",

"tradeName": "DocFlow Seller",

"trn": "100000000000003",

"tin": "1000000000",

"peppolParticipantId": "0235:1000000000",

"status": 1

},

{

"id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",

"name": "ABC Trading LLC",

"tradeName": "ABC Trading",

"trn": "100123456700003",

"tin": "1001234567",

"peppolParticipantId": null,

"status": 1

}

],

"page": 1,

"pageSize": 20,

"total": 2

},

"errors": []

}

19

GET

Company details

Returns the full profile of one company the signed-in user can act for, including its tax registrations, trade licence and Peppol registration.

https://api.docflow.ae/api/v1/companies/{companyId}

Authorization: Bearer Token (Partner JWT)

Path Variables:

Name

companyId

Type

string (GUID)

required

Yes

description

he company identifier from the companies list.

Response Body

JSON

{

"success": true,

"message": "Request completed successfully.",

"data": {

"id": "3f2a9c1e-5b7d-4e8a-9c21-7d4e5f6a8b90",

"name": "DocFlow Test Seller LLC",

"tradeName": "DocFlow Seller",

"address": "Office 1204, Tower A, Business Bay, Dubai, UAE",

"trn": "100000000000003",

"isVATRegistered": true,

"tin": "1000000000",

"vatCertificate": null,

"corporateTaxTRN": null,

"taxIdentificationNumber": "1000000000",

"tradeLicense": "TL-123456",

"tradeLicenseIssuingAuthority": "Dubai Department of Economy and Tourism",

"tradeLicenseExpiryDate": "2027-03-31T00:00:00Z",

"peppolParticipantId": "0235:1000000000",

"smpDetails": null,

"status": 1,

"companyGroupId": "c9d8e7f6-a5b4-4c3d-9e2f-1a0b9c8d7e6f"

},

"errors": []

}

DocFlow Home

Where Anyone Can Be an Accountant. We Make E-Invoicing Easy.

ISO 27001 Certification
ISO 22301 Certification
Peppol Certification

© 2026 DocFlow. All rights reserved.