
✓ 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
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": []
}
© 2026 DocFlow. All rights reserved.



