UAE E-Invoice Peppol PINT AE
How to get “API Key” from Portal ?
To obtain the API key to be used in the request body of the login endpoint, navigate to Settings > ERP Management > API Management in the Portal and use the "Generate" button.
Login and Authorization Configuration
Technical Details
| Property | Value |
|---|---|
| Endpoint | /auth/login |
| Method | POST |
| Content-Type | application/json |
| Base URL | Stage Environment URLhttps://api-stage.evatrauae.com/apikey/create Production Environment URLhttps://api.evatrauae.com/ |
| Authorization | None (Initial access) |
Request Body (JSON)
The following fields are used to define login criteria:
| Field | Type | Description |
|---|---|---|
| apiKey | String | A unique key assigned specifically to the user for portal access, verifying the system identity. (it is explained in previous section “How to get API Key from portal”) |
| String | The registered email address in the system belonging to the authorized user performing the operation. |
Response Details
Upon a successful request, a 200 OK code is returned with the following details:
| Field | Type | Description |
|---|---|---|
| jwt | — | The secure session token that must be used as a 'R-Auth' API Key in all subsequent API calls. |
| expirationDate | DateTime | Indicates the exact time the session key will expire; the ERP system can use this data to manage automatic re-login processes. |
The JWT token successfully obtained during the authentication step (auth/login) acts as a key to access the secure endpoints of the APIs. After the first successful login, the JWT token obtained from the response of a successful login is used as the R-Auth value in the authorization section of other queries. This configuration ensures that every data exchange between the ERP and the portal occurs over an authenticated and secure channel.
Technical Details
| Property | Value |
|---|---|
| Key | Enter R-Auth in the Key field. |
| Value | {{apiKey}} or {{jwt}} (Copy the jwt string returned from the login endpoint.) |
| Header Setting | Navigate to the "Headers" tab of the request to be sent. |
1. Introduction
Evatra is a cloud-based e-invoice management portal fully compliant with the UAE's digital transformation requirements and Peppol network standards. This API documentation is designed to ensure seamless integration of your ERP systems with UAE e-invoice regulations. Our portal abstracts complex XML structures and Peppol communication protocols (AS4), providing developers with an easy-to-use, secure, and scalable interface. Using the Evatra API, you can send invoices asynchronously, track real-time status, manage incoming invoices, and automatically process technical responses (MLR) from recipients back into your ERP system. Our compliance-focused architecture guarantees the legal validity of every document, ensures data integrity, and creates an end-to-end traceable audit trail.
2. Authentication POST
Purpose of Use: This endpoint allows users to log in to the system using an API key and email address, without requiring a password. Authentication is performed through a valid API key and email combination.
Upon successful login, a JWT access token and its expiration date are returned. The API key may be of type COMPANY or USER; for company-type keys, the user must be authorized for the associated company.
Endpoint Information
| Property | Value |
|---|---|
| URL | /auth/login |
| Method | POST |
| Content-Type | application/json |
| Base URL | Stage Environment URLhttps://api-stage.evatrauae.com/ Production Environment URLhttps://api.evatrauae.com/ |
| Authorization | R-Auth Header (JWT Token) — Required |
Example Request
curl -X POST 'https://api-stage.evatrauae.com/auth/login' \
-H 'accept: */*' \
-H 'R-Auth: {{jwt_token}}' \
-H 'Content-Type: application/json' \
-d '{
"apiKey": "{{your_api_key}}",
"email": "user@example.com"
}'
Request Parameters
Body Parameters
| Field Name | Type | Required | Description |
|---|---|---|---|
| apiKey | string | Conditional* | User or company API key. Required to trigger the API key-based login flow. |
| string | Conditional* | Registered email address of the user. Required to trigger the API key-based login flow. |
Note
When apiKey and email are provided together (without a password), the API key-based login flow is triggered and a JwtBasicResponse is returned.
Responses
200 - Successful Response
Login successful. Returns a JWT access token and its expiration date.
Response body (JwtBasicResponse):
{
"jwt": "{{jwt_token}}",
"expirationDate": "2026-01-15T12:00:00.000Z"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| jwt | string | JWT access token (used as Bearer token in subsequent requests) |
| expirationDate | string (ISO 8601) | Expiration date and time of the JWT token |
401 - Unauthorized
Trigger
When the API key is invalid or the user is not authorized for the associated company.
Response body:
{
"errorMessage": "Invalid login attempt!",
"errorType": "NOT_AUTHORITY",
"errorTitle": "UNAUTHORIZED",
"status": 401,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/auth/login"
}
An AuthorizationServiceException is thrown when API key authentication fails, returning a 401 Unauthorized response.
404 - Not Found
Trigger
When the API key or email address does not exist in the system.
Response body:
{
"errorMessage": "User not found!",
"errorType": "NOT_FOUND_USER",
"errorTitle": "NOT_FOUND",
"status": 404,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/auth/login"
}
A NotFoundException is thrown when the provided email or API key does not exist in the system.
500 - Internal Server Error
Trigger
When an unexpected server error occurs.
Response body:
{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"status": 500,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/auth/login"
}
Returns a 500 Internal Server Error when an unexpected server-side error occurs.
3. Send Document Async POST
Purpose of Use: This endpoint submits XML or PDF documents (invoices, waybills, etc.) from ERP systems to the platform for asynchronous processing.
The document is not processed immediately upon request; instead, a tracking ID is returned. The processing status can be polled using the /invoice/document-status/{trackingId} endpoint. Authorization requires either a valid R-Auth JWT token or an apiKey combined with a compId.
Endpoint Information
| Property | Value |
|---|---|
| URL | /invoice/send-document-async |
| Method | POST |
| Content-Type | application/json |
| Base URL | Stage Environment URLhttps://api-stage.evatrauae.com/ Production Environment URLhttps://api.evatrauae.com/ |
| Authorization | R-Auth Header (Bearer JWT Token) — Required |
Example Request
curl -X POST 'https://api-stage.evatrauae.com/invoice/send-document-async' \
-H 'R-Auth: {{jwt_token}}' \
-H 'Content-Type: application/json' \
-d '{
"apiKey": "{{your_api_key}}",
"base64Document": "{{base64_xml_document}}",
"businessType": "B2B",
"compId": "{{company_uuid}}",
"invoiceSource": "ERP",
"invoiceType": "UAE_PINT",
"receiverEmails": ["user@example.com"]
}'
Request Parameters
Body Parameters
| Field Name | Type | Required | Description |
|---|---|---|---|
| compId | string (UUID) | Conditional* | The unique identifier of the company. Required if apiKey is not provided. |
| apiKey | string | Conditional* | The company API key. Required if compId is not provided. The system resolves the company identity from this key. |
| base64Document | string | Conditional* | Base64-encoded XML document (invoice or waybill). Required if base64Pdf is not provided. |
| base64Pdf | string | Conditional* | Base64-encoded PDF document (ZUGFeRD/Factur-X PDF). Required if base64Document is not provided. |
| invoiceType | string (enum) | Conditional* | The format of the invoice document. Required if waybillType is not provided. See Parameter Value Reference below for valid values. |
| waybillType | string (enum) | Conditional* | The format of the waybill document. Required if invoiceType is not provided. See Parameter Value Reference below for valid values. |
| invoiceSource | string (enum) | Optional | The source of the document (e.g. ERP, PORTAL, EMAIL). See Parameter Value Reference below for valid values. |
| businessType | string (enum) | Optional | The business model type: B2B (Business to Business), B2C (Business to Consumer), or B2G (Business to Government). |
| receiverEmails | array (string) | Optional | List of recipient email addresses to which the document will be forwarded. |
| mailTemplateId | string | Optional | The identifier of the email template to use during document delivery. |
Notes
- At least one of compId or apiKey must be provided.
- At least one of invoiceType or waybillType must be provided.
- At least one of base64Document or base64Pdf must be provided.
Parameter Value Reference
InvoiceType Values
| Value | Description |
|---|---|
| PEPPOL_BIS | PEPPOL BIS Billing — International PEPPOL invoice format |
| RO_EFACTURA | Romania e-Invoice format |
| XRECHNUNG | Germany XRechnung UBL format |
| MY_INVOIS | Malaysia MyInvois invoice format |
| MY_PINT | Malaysia PINT invoice format |
| DK_OIOUBL | Denmark OIOUBL invoice format |
| EG_INVOICE | Egypt e-Invoice format |
| HR_INVOICE | Croatia e-Invoice format |
| UAE_PINT | United Arab Emirates PINT invoice format |
| ZUGFERD | Germany ZUGFeRD hybrid PDF/XML format |
| FACTUR_X | France Factur-X hybrid PDF/XML format |
| XRECHNUNG_CII | Germany XRechnung CII format |
| CII | UN/CEFACT CII XML format |
| CID | CID XML format |
| KZ_ESF_V2 | Kazakhstan ESF v2 invoice format |
| KSEF | Poland KSeF invoice format |
WaybillType Values
| Value | Description |
|---|---|
| RS_WAYBILL_DESPATCH | Serbia Despatch Advice waybill |
| RS_WAYBILL_RECEIPT | Serbia Receipt Advice waybill |
| RS_APPLICATION_RESPONSE | Serbia Application Response |
| RO_ETRANSPORT | Romania e-Transport format |
InvoiceSource Values
| Value | Description |
|---|---|
| PORTAL_OCR | Upload via portal using OCR |
| EMAIL_OCR | Upload via email using OCR |
| Sent via email | |
| PORTAL | Sent via portal |
| ERP | ERP system integration |
| PEPPOL | Via PEPPOL network |
| LHDNM | Malaysia LHDN corridor |
| NEMHANDEL | Denmark NemHandel network |
| SERVICE | Service integration |
| HARVEST | Harvest integration |
| SHOPIFY | Shopify integration |
| AMAZON_SP | Amazon SP integration |
| EBAY | eBay integration |
| HUBSPOT | HubSpot integration |
| ANAF | Romania ANAF integration |
| LAZADA | Lazada integration |
| SFTP | Upload via SFTP |
| KSEF | Poland KSeF integration |
| RS_API | Serbia API integration |
| ETA | Egypt ETA integration |
| ERACUN | Croatia eRacun integration |
| STRIPE | Stripe integration |
BusinessType Values
| Value | Description |
|---|---|
| B2B | Business to Business |
| B2C | Business to Consumer |
| B2G | Business to Government |
Responses
200 - Successful Response
The document submission request was accepted. A trackingId and an initial status of PENDING are returned. Actual processing continues asynchronously; use the /invoice/document-status/{trackingId} endpoint to poll the result.
Response body (AsyncERPResponse):
{
"trackingId": "{{entity_uuid}}",
"status": "PENDING",
"message": null
}
Response Fields
| Field | Type | Description |
|---|---|---|
| trackingId | string (UUID) | Unique tracking identifier for the asynchronous processing request. Used to query status. |
| status | string (enum) | Current processing status of the document. Returns PENDING initially. See Document Processing Status below for valid values. |
| message | string | Optional informational message about the processing. Typically returns null. |
Document Processing Status
| Value | Description |
|---|---|
| PENDING | Request received, processing has not started yet |
| PROCESSING | Document is actively being processed |
| FAILED | Processing failed |
| SENDING_FAILED | Document was processed but transmission failed |
| PERMANENT_FAILED | Permanent failure that cannot be retried |
| COMPLETED | Processing completed successfully |
400 - Bad Request
Trigger
When a required conditional field pair is missing: compId/apiKey, invoiceType/waybillType, or base64Document/base64Pdf.
Response body:
{
"errorMessage": "Required field missing: apiKey or companyId",
"errorType": "DOCUMENT_PROCESS_REQUIRED_FIELDS",
"errorTitle": "BAD_REQUEST",
"status": 400,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/invoice/send-document-async"
}
An IllegalArgumentException is thrown and a 400 Bad Request is returned when any of the conditional required field pairs (compId/apiKey, invoiceType/waybillType, base64Document/base64Pdf) is left empty.
401 - Unauthorized
Trigger
When the R-Auth token is invalid or the user is not authorized for the specified company.
Response body:
{
"errorMessage": "User is not authorized for this company",
"errorType": "NOT_AUTHORITY",
"errorTitle": "UNAUTHORIZED",
"status": 401,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/invoice/send-document-async"
}
Returns 401 Unauthorized when the JWT token is invalid or expired, or when the authenticated user does not have access to the company identified by compId.
500 - Internal Server Error
Trigger
When an unexpected server error occurs.
Response body:
{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"status": 500,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/invoice/send-document-async"
}
Returns a 500 Internal Server Error when an unexpected server-side error occurs.
4. Send Document Async JSON POST
Purpose of Use: This endpoint allows sending e-invoice documents in JSON format asynchronously, following the UBL 2.1 standard. The document processing runs in the background and the response returns a unique trackingId to monitor the process.
The processing status can be queried later using the /invoice/document-status/{trackingId} endpoint. The company identity can be provided either directly via ublDto.CompanyId or through an apiKey; both fields cannot be empty at the same time.
Endpoint Information
| Property | Value |
|---|---|
| URL | /invoice/send-document-async-json |
| Method | POST |
| Content-Type | application/json |
| Base URL | Stage Environment URLhttps://api-stage.evatrauae.com/ Production Environment URLhttps://api.evatrauae.com/ |
| Authorization | Bearer Token (R-Auth Header) Required |
Example Request
curl --location 'https://api-stage.evatrauae.com/invoice/send-document-async-json' \
--header 'accept: */*' \
--header 'R-Auth: {{jwt_token}}' \
--header 'Content-Type: application/json' \
--data-raw '{
"apiKey": "{{your_api_key}}",
"businessType": "B2B",
"receiverEmails": [
"user@example.com"
],
"mailTemplateId": null,
"ublDto": {
"Type": "UAE_PINT",
"Format": "EASY_INVOICE",
"ProfileType": "EN16931",
"CompanyId": "{{company_uuid}}",
"PartnerUuid": "{{partner_uuid}}",
"IsPeppolParticipant": false,
"PeppolParticipantId": "",
"ExternalInvoiceId": "",
"ID": { "Value": "INV-2026-001" },
"UUID": { "Value": "{{invoice_uuid}}" },
"IssueDate": { "Value": "2026-03-12" },
"DueDate": { "Value": "2026-03-26" },
"DocumentCurrencyCode": { "Value": "AED", "listAgencyID": "", "listID": "", "listVersionID": "" },
"InvoiceTypeCode": { "Value": "380", "listAgencyID": "", "listID": "" },
"BuyerReference": { "Value": "PO-REF-001" },
"Note": [{ "Value": "Thank you for your order." }],
"CustomizationID": { "Value": "urn:peppol:pint:billing-1@ae-1" },
"ProfileID": { "Value": "urn:peppol:bis:billing" },
"UBLVersionID": { "Value": "2.1" },
"AccountingCost": { "Value": "2" },
"AccountingSupplierParty": {
"Party": {
"EndpointID": { "schemeID": "0235", "Value": "1004000145" },
"PartyName": [{ "Name": { "Value": "Supplier Company Name" } }],
"PostalAddress": {
"StreetName": { "Value": "Test Address" },
"Country": { "IdentificationCode": { "Value": "AE" } }
},
"PartyTaxScheme": [{ "CompanyID": { "Value": "100400014520003" }, "TaxScheme": { "ID": { "Value": "VAT" } } }],
"PartyLegalEntity": [{ "RegistrationName": { "Value": "Supplier Company Name" }, "CompanyID": { "Value": "100400014520003", "schemeAgencyID": "TL" } }],
"Contact": { "ElectronicMail": { "Value": "user@example.com" }, "Telephone": { "Value": "+49 170 1234567" } }
}
},
"AccountingCustomerParty": {
"Party": {
"EndpointID": { "schemeID": "0235", "Value": "1004000145" },
"PartyName": [{ "Name": { "Value": "Customer Company Name" } }],
"PostalAddress": {
"StreetName": { "Value": "Customer Address" },
"Country": { "IdentificationCode": { "Value": "AE" } }
},
"PartyTaxScheme": [{ "CompanyID": { "Value": "126598855988803" }, "TaxScheme": { "ID": { "Value": "FC" } } }],
"PartyLegalEntity": [{ "RegistrationName": { "Value": "Customer Company Name" }, "CompanyID": { "Value": "126598855988803", "schemeAgencyID": "TL" } }],
"Contact": { "Name": { "Value": "Contact Name" }, "ElectronicMail": { "Value": "user@example.com" } }
}
},
"PaymentMeans": [{
"PaymentMeansCode": { "Value": "30" },
"PaymentDueDate": { "Value": "2026-03-26" },
"PayeeFinancialAccount": { "ID": { "Value": "GL9188990000088999" } }
}],
"TaxTotal": [{
"TaxAmount": { "Value": "0.10", "currencyID": "AED" },
"TaxSubtotal": [{
"TaxableAmount": { "Value": "2.00", "currencyID": "AED" },
"TaxAmount": { "Value": "0.10", "currencyID": "AED" },
"TaxCategory": { "ID": { "Value": "S" }, "Percent": { "Value": "5" }, "TaxScheme": { "ID": { "Value": "VAT" } } }
}]
}],
"LegalMonetaryTotal": {
"LineExtensionAmount": { "Value": "2", "currencyID": "AED" },
"TaxExclusiveAmount": { "Value": "2", "currencyID": "AED" },
"TaxInclusiveAmount": { "Value": "2.10", "currencyID": "AED" },
"PayableAmount": { "Value": "2.10", "currencyID": "AED" }
},
"InvoiceLine": [{
"ID": { "Value": "1" },
"InvoicedQuantity": { "Value": "1", "unitCode": "XBA" },
"LineExtensionAmount": { "Value": "2", "currencyID": "AED" },
"Item": {
"Name": { "Value": "Product Name" },
"Description": [{ "Value": "Product description" }],
"ClassifiedTaxCategory": [{ "ID": { "Value": "S" }, "Percent": { "Value": "5" }, "TaxScheme": { "ID": { "Value": "VAT" } } }]
},
"Price": { "PriceAmount": { "Value": "2", "currencyID": "AED" }, "BaseQuantity": { "Value": 1, "unitCode": "XBA" } }
}]
}
}'
Request Parameters
Body Parameters
| Field Name | Type | Required | Description |
|---|---|---|---|
| apiKey | string | Conditional* | ERP integration API key. Required if ublDto.CompanyId is empty; the company UUID is resolved from this key. |
| businessType | string (enum) | Optional | Business model type. One of B2B, B2C, or B2G. |
| receiverEmails | Array<String> | Optional | List of recipient email addresses for invoice delivery. |
| mailTemplateId | string | Optional | Identifier of the mail template to be used for delivery. |
| ublDto | object | Yes | UBL 2.1 compliant e-invoice object. Contains all invoice data. |
| ublDto.CompanyId | string (UUID) | Conditional* | Unique identifier of the company performing the transaction. Required if apiKey is empty. |
| ublDto.Type | string (enum) | Optional | Invoice/document format type. E.g.: UAE_PINT, XRECHNUNG, PEPPOL_BIS, ZUGFERD, KSEF. |
| ublDto.Format | string (enum) | Optional | Invoice rendering template: EASY_INVOICE (summary) or DETAILED_INVOICE (detailed). |
| ublDto.ProfileType | string (enum) | Optional | UBL profile type. Default value: EN16931. |
| ublDto.IsPeppolParticipant | boolean | Optional | Whether the recipient is registered in the Peppol network. Default: false. |
| ublDto.PeppolParticipantId | string | Optional | Recipient's Peppol network participant ID. Used when IsPeppolParticipant=true. |
| ublDto.PartnerUuid | string (UUID) | Optional | UUID of the business partner/recipient record in the system. |
| ublDto.ExternalInvoiceId | string | Optional | Invoice reference ID in an external system. |
| ublDto.ID | object | Optional | Invoice number object. Value: invoice number string. |
| ublDto.UUID | object | Optional | Unique identifier for the invoice. Value: UUID format. |
| ublDto.IssueDate | object | Optional | Invoice issue date. Value: YYYY-MM-DD format. |
| ublDto.DueDate | object | Optional | Invoice due date. Value: YYYY-MM-DD format. |
| ublDto.DocumentCurrencyCode | object | Optional | Invoice currency. Value: ISO 4217 code (e.g. AED, EUR, USD). |
| ublDto.InvoiceTypeCode | object | Optional | Invoice type code (UN/EDIFACT). Value: 380 = Commercial Invoice, 381 = Credit Note. |
| ublDto.BuyerReference | object | Optional | Buyer's purchase order or reference number. Value: reference text. |
| ublDto.Note | Array<Object> | Optional | Invoice notes. Each element is a text wrapper object containing a Value field. |
| ublDto.CustomizationID | object | Optional | UBL customization profile identifier. Value: profile URI. |
| ublDto.ProfileID | object | Optional | Business process profile identifier. Value: process URI. |
| ublDto.UBLVersionID | object | Optional | UBL schema version. Value: e.g. 2.1. |
| ublDto.AccountingCost | object | Optional | Accounting cost/reference code. Value: accounting reference string. |
| ublDto.AccountingSupplierParty | object | Optional | Seller/supplier party information (UBL SupplierParty structure). |
| ublDto.AccountingCustomerParty | object | Optional | Buyer/customer party information (UBL CustomerParty structure). |
| ublDto.PayeeParty | object | Optional | Payee party information when different from the supplier. |
| ublDto.BuyerCustomerParty | object | Optional | Additional buyer customer party details. |
| ublDto.Delivery | Array<Object> | Optional | Delivery information list (address, date, carrier, etc.). |
| ublDto.PaymentMeans | Array<Object> | Optional | Payment method details. Contains PaymentMeansCode, account number, and due date. |
| ublDto.TaxTotal | Array<Object> | Optional | Total tax information. Contains TaxAmount and TaxSubtotal sub-structures. |
| ublDto.LegalMonetaryTotal | object | Optional | Legal monetary totals: line extension amount, tax exclusive/inclusive amount, and payable amount. |
| ublDto.InvoiceLine | Array<Object> | Optional | Invoice lines. Each line contains product/service, quantity, price, and tax information. |
| ublDto.AllowanceCharge | Array<Object> | Optional | Invoice-level discount and surcharge items. |
| ublDto.PricingExchangeRate | object | Optional | Foreign exchange rate information used for pricing. |
Parameter Value Reference
BusinessType Values
| Value | Description |
|---|---|
| B2B | Business to Business |
| B2C | Business to Consumer |
| B2G | Business to Government |
InvoiceType Values
| Value | Description |
|---|---|
| PEPPOL_BIS | Peppol BIS invoice format |
| XRECHNUNG | Germany XRechnung UBL format |
| UAE_PINT | United Arab Emirates PINT e-invoice format |
| MY_INVOIS | Malaysia e-invoice (MyInvois) format |
| MY_PINT | Malaysia PINT format |
| DK_OIOUBL | Denmark OIOUBL format |
| EG_INVOICE | Egypt e-invoice format |
| HR_INVOICE | Croatia e-invoice format |
| ZUGFERD | Germany ZUGFeRD PDF/A hybrid format |
| FACTUR_X | France Factur-X hybrid format |
| XRECHNUNG_CII | Germany XRechnung CII format |
| CII | UN/CEFACT Cross Industry Invoice (CII) |
| CID | UN/CEFACT CID format |
| Unstructured PDF invoice | |
| KZ_ESF_V2 | Kazakhstan ESF v2 e-invoice format |
| KSEF | Poland KSeF e-invoice format |
| RO_EFACTURA | Romania e-Factura format |
InvoiceFormat Values
| Value | Description |
|---|---|
| EASY_INVOICE | Summary/easy invoice view |
| DETAILED_INVOICE | Detailed invoice view |
ProfileType Values
| Value | Description |
|---|---|
| EN16931 | European e-invoice core data model — default |
| EXTENDED | Extended profile |
| BASIC | Basic profile |
| KSEF_FA2 | Poland KSeF FA(2) profile |
Notes
- At least one of apiKey or ublDto.CompanyId must be provided. If both are empty, a 400 Bad Request error is returned.
- When apiKey is provided, the company UUID is resolved automatically; ublDto.CompanyId is not required. Both fields can also be sent together.
- All nested objects inside ublDto follow the UBL 2.1 standard. Fields carrying values (IDs, dates, amounts, etc.) are generally wrapper objects containing a Value sub-field.
- Asynchronous processing: A successful request does not immediately process the document; it is first queued with PENDING status. The actual processing status must be queried separately using the trackingId.
Responses
200 - Successful Response
Document has been successfully queued for processing. Use the returned trackingId with /invoice/document-status/{trackingId} to poll for the processing status.
Response body (AsyncERPResponse)
{
"trackingId": "{{tracking_uuid}}",
"status": "PENDING",
"message": null
}
Response Fields
Root Fields
| Field | Type | Description |
|---|---|---|
| trackingId | string (UUID) | Unique tracking identifier for the document processing job. Used in the status query endpoint. |
| status | string (enum) | Current document processing status. Returns PENDING on successful submission. |
| message | string | Optional informational message about the processing job. Typically null on initial submission. |
Document Processing Status
| Value | Description |
|---|---|
| PENDING | Job queued, processing has not started yet |
| PROCESSING | Document is actively being processed |
| COMPLETED | Processing completed successfully and document was delivered |
| FAILED | Processing failed |
| SENDING_FAILED | Document was generated but delivery failed |
| PERMANENT_FAILED | Processing permanently failed; no retry will be attempted |
400 - Bad Request
Trigger
When both apiKey and ublDto.CompanyId are null.
Response body
{
"errorMessage": "Document process required fields: apiKey or companyId",
"errorType": "DOCUMENT_PROCESS_REQUIRED_FIELDS",
"errorTitle": "BAD_REQUEST",
"status": 400,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/invoice/send-document-async-json"
}
At least one of apiKey or ublDto.CompanyId must be provided. When both are null, an IllegalArgumentException is thrown and a 400 Bad Request is returned.
400 - Bad Request
Trigger
When an invalid or unrecognized apiKey is provided.
Response body
{
"errorMessage": "Api Key Didnt Match",
"errorType": "API_ERROR",
"errorTitle": "BAD_REQUEST",
"status": 400,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/invoice/send-document-async-json"
}
If the provided apiKey does not match any registered company in the system, an IllegalArgumentException is thrown and a 400 Bad Request is returned.
401 - Unauthorized
Trigger
When the JWT token is missing/invalid or the user is not authorized for the specified company.
Response body
{
"errorMessage": "Not authorized for this action",
"errorType": "NOT_AUTHORITY",
"errorTitle": "UNAUTHORIZED",
"status": 401,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/invoice/send-document-async-json"
}
If the authenticated user does not belong to the resolved company, an AuthorizationServiceException is thrown and a 401 Unauthorized is returned.
500 - Internal Server Error
Trigger
When an unexpected server error occurs.
Response body
{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"status": 500,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/invoice/send-document-async-json"
}
Returns a 500 Internal Server Error when an unexpected server-side error occurs.
5. Document Status GET
Purpose of Use: This endpoint is used to query the real-time processing status of a document (invoice or waybill) previously submitted via ERP integration.
The response returns the tracking ID, the current processing step (pending, processing, completed, or failed), document details, error information, and timestamps.
Endpoint Information
| Property | Value |
|---|---|
| URL | /invoice/document-status/{trackingId} |
| Method | GET |
| Content-Type | application/json |
| Base URL | Stage Environment URLhttps://api-stage.evatrauae.com/ Production Environment URLhttps://api.evatrauae.com/ |
| Authorization | Bearer Token (R-Auth Header) |
Example Request
curl --location 'https://api-stage.evatrauae.com/invoice/document-status/{{tracking_uuid}}' \
--header 'accept: */*' \
--header 'R-Auth: {{jwt_token}}'
Request Parameters
Path Parameters
| Field Name | Type | Required | Description |
|---|---|---|---|
| trackingId | string (UUID) | Yes | The unique tracking ID used to monitor a document processing job. Use the trackingId value returned by the /invoice/send-document-async or /invoice/send-document-async-json endpoints. |
Responses
200 - Successful Response
Document processing status returned successfully. The status field indicates the current processing step. When processing is complete, the documentId field contains the system ID of the saved document.
Response body (DocumentProcessDto)
{
"trackingId": "{{tracking_uuid}}",
"companyId": "{{company_uuid}}",
"direction": "OUTGOING",
"documentType": "PEPPOL_BIS",
"waybillType": null,
"source": "ERP",
"target": "PEPPOL",
"status": "COMPLETED",
"filename": "invoice_2026_001.xml",
"invoiceNumber": "INV-2026-001",
"documentId": "{{invoice_uuid}}",
"sendingResult": "AP_ACKNOWLEDGED",
"errorType": null,
"errors": null,
"createdAt": "2026-01-15T10:00:00",
"statusUpdatedAt": "2026-01-15T10:02:30",
"completedAt": "2026-01-15T10:02:30"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| trackingId | string (UUID) | Unique tracking identifier for this document processing job |
| companyId | string (UUID) | Unique identifier of the company that initiated the processing job |
| direction | string (enum) | Direction of the document: incoming or outgoing |
| documentType | string (enum) | Format or standard of the document (e.g. PEPPOL_BIS, XRECHNUNG, ZUGFERD) |
| waybillType | string (enum) | Waybill document type. Populated only for waybill processing jobs; null for invoice jobs |
| source | string (enum) | Origin system of the document (e.g. ERP, PORTAL, EMAIL) |
| target | string (enum) | Target system for the document (e.g. PEPPOL, KSEF). Null if no target is defined |
| status | string (enum) | Current processing step of the document |
| filename | string | File name of the processed document |
| invoiceNumber | string | Invoice number associated with the document. May be null before processing completes |
| documentId | string (UUID) | ID of the document saved in the system after processing completes. Populated in COMPLETED status |
| sendingResult | string | Additional information or status message about the transmission result |
| errorType | string (enum) | Indicates the error type when a failure occurs; null for successful jobs |
| errors | object | Error details. May be a String, List<String>, or List<ValidationError> depending on the failure type. Null for successful jobs |
| createdAt | string (ISO 8601) | Date and time the processing record was created |
| statusUpdatedAt | string (ISO 8601) | Date and time the processing status was last updated |
| completedAt | string (ISO 8601) | Date and time the processing job was completed (successfully or with failure) |
Parameter Value Reference
Direction Values
| Value | Description |
|---|---|
| INCOMING | Incoming document |
| OUTGOING | Outgoing document |
DataType Values
| Value | Description |
|---|---|
| PEPPOL_BIS | Peppol BIS standard UBL format |
| XRECHNUNG | Germany XRechnung standard |
| ZUGFERD | ZUGFeRD hybrid PDF/XML format |
| FACTUR_X | France Factur-X standard |
| XRECHNUNG_CII | CII-based XRechnung |
| MY_INVOIS | Malaysia e-InvoIS standard |
| MY_PINT | Malaysia PINT standard |
| DK_OIOUBL | Denmark OIOUBL standard |
| EG_INVOICE | Egypt e-invoice standard |
| HR_INVOICE | Croatia e-invoice standard |
| UAE_PINT | United Arab Emirates PINT standard |
| RO_EFACTURA | Romania e-Factura standard |
| CII | UN/CEFACT CII format |
| CID | CID format |
| KZ_ESF_V2 | Kazakhstan ESF v2 standard |
| KSEF | Poland KSeF standard |
WaybillType Values
| Value | Description |
|---|---|
| RS_WAYBILL_DESPATCH | Serbia despatch waybill |
| RS_WAYBILL_RECEIPT | Serbia receipt waybill |
| RS_APPLICATION_RESPONSE | Serbia application response document |
| RO_ETRANSPORT | Romania e-Transport document |
Source / Target Values
| Value | Description |
|---|---|
| ERP | ERP integration system |
| PORTAL | Web portal |
| PORTAL_OCR | Portal upload processed via OCR |
| Email channel | |
| EMAIL_OCR | Email attachment processed via OCR |
| PEPPOL | Peppol network |
| LHDNM | Malaysia LHDN system |
| NEMHANDEL | Denmark Nemhandel network |
| SFTP | SFTP file transfer |
| KSEF | Poland KSeF system |
| RS_API | Serbia API integration |
| ETA | Egypt ETA tax portal |
| ERACUN | Croatia eRacun system |
| ANAF | Romania ANAF tax authority |
| SERVICE | Internal service processing |
| HARVEST | Harvest accounting integration |
| SHOPIFY | Shopify e-commerce integration |
| AMAZON_SP | Amazon Seller Partner integration |
| EBAY | eBay e-commerce integration |
| HUBSPOT | HubSpot CRM integration |
| LAZADA | Lazada e-commerce integration |
| STRIPE | Stripe payment integration |
Document Processing Status
| Value | Description |
|---|---|
| PENDING | Job queued, not yet started |
| PROCESSING | Document is actively being processed |
| COMPLETED | Processing completed successfully |
| FAILED | Processing failed; may be retried |
| SENDING_FAILED | Document was processed but transmission failed |
| PERMANENT_FAILED | Processing permanently failed and will not be retried |
404 - Not Found
Trigger
When no processing record is found for the given trackingId.
The documentProcessService.getStatus() method throws ApiError(INVOICE_PROCESS_NOT_FOUND) when no record matches the provided trackingId. The controller catches this and returns a 404 Not Found response with an empty body.
500 - Internal Server Error
Trigger
When an unexpected server error occurs.
When an unexpected server-side error occurs, the controller catches the generic Exception and returns a 500 Internal Server Error response with an empty body.
6. Search Processing History POST
Purpose of Use: This endpoint is used to query the document processing queue history with filters. Results can be filtered by company, status, source, direction, and date range.
Results are returned in a paginated format. Page number (pageNumber) and page size (pageSize) are specified via URL query parameters. Processing history can be monitored using the trackingId field returned in each record.
Endpoint Information
| Property | Value |
|---|---|
| URL | /invoice/document-process/search |
| Method | POST |
| Content-Type | application/json |
| Base URL | Stage Environment URLhttps://api-stage.evatrauae.com/ Production Environment URLhttps://api.evatrauae.com/ |
| Authorization | Bearer Token (R-Auth Header) — Required |
Example Request
curl -X POST 'https://api-stage.evatrauae.com/invoice/document-process/search?pageNumber=0&pageSize=20' \
-H 'R-Auth: {{jwt_token}}' \
-H 'Content-Type: application/json' \
-d '{
"companyId": "{{company_uuid}}",
"createdAt": {
"from": "2026-03-12",
"to": "2026-03-12"
},
"direction": "OUTGOING",
"filename": null,
"source": "ERP",
"status": "COMPLETED"
}'
Request Parameters
Query Parameters
| Field Name | Type | Required | Description |
|---|---|---|---|
| pageNumber | number | Optional | Page number (0-indexed). Default: 0 |
| pageSize | number | Optional | Number of records per page. Default: 20 |
Body Parameters
| Field Name | Type | Required | Description |
|---|---|---|---|
| companyId | string (UUID) | Yes | Unique identifier of the company to query processing records for |
| direction | string (enum) | Optional | Document direction: incoming (INCOMING) or outgoing (OUTGOING) |
| source | string (enum) | Optional | Source system of the document (ERP, PORTAL, PEPPOL, etc.) |
| filename | string | Optional | Filter by document filename |
| status | string (enum) | Optional | Filter by processing status: PENDING, PROCESSING, COMPLETED, FAILED, etc. |
| createdAt | object | Optional | Date range filter for record creation time |
| createdAt.from | string (ISO 8601 — date) | Optional | Start of the date range (e.g. 2026-03-12) |
| createdAt.to | string (ISO 8601 — date) | Optional | End of the date range (e.g. 2026-03-12) |
Parameter Value Reference
Direction Values
| Value | Description |
|---|---|
| INCOMING | Incoming document |
| OUTGOING | Outgoing document |
Source Values
| Value | Description |
|---|---|
| ERP | ERP system integration |
| PORTAL | Web portal |
| PORTAL_OCR | Portal upload with OCR processing |
| EMAIL_OCR | Email attachment with OCR |
| PEPPOL | Peppol network |
| LHDNM | Malaysia LHDN integration |
| NEMHANDEL | Denmark NemHandel network |
| SERVICE | Internal service |
| HARVEST | Harvest integration |
| SHOPIFY | Shopify integration |
| AMAZON_SP | Amazon Seller Partner integration |
| EBAY | eBay integration |
| HUBSPOT | HubSpot integration |
| ANAF | Romania ANAF integration |
| LAZADA | Lazada integration |
| SFTP | SFTP file transfer |
| KSEF | Poland KSeF system |
| RS_API | Serbia API integration |
| ETA | Egypt ETA integration |
| ERACUN | Croatia eRacun system |
| STRIPE | Stripe payment integration |
DataType Values
| Value | Description |
|---|---|
| PEPPOL_BIS | Peppol BIS invoice format |
| XRECHNUNG | Germany XRechnung UBL format |
| XRECHNUNG_CII | Germany XRechnung CII format |
| ZUGFERD | ZUGFeRD PDF/A-3 format |
| FACTUR_X | France Factur-X format |
| CII | UN/CEFACT CII format |
| CID | CID format |
| Unstructured PDF (paper invoice, image) | |
| RO_EFACTURA | Romania e-Factura format |
| MY_INVOIS | Malaysia MyInvois format |
| MY_PINT | Malaysia PINT format |
| DK_OIOUBL | Denmark OIOUBL format |
| EG_INVOICE | Egypt e-invoice format |
| HR_INVOICE | Croatia e-invoice format |
| UAE_PINT | United Arab Emirates PINT format |
| KSEF | Poland KSeF invoice format |
| KSEF_OFFLINE | Poland KSeF offline mode |
| KZ_ESF_V2 | Kazakhstan ESF v2 format |
WaybillType Values
| Value | Description |
|---|---|
| RS_WAYBILL_DESPATCH | Serbia despatch waybill |
| RS_WAYBILL_RECEIPT | Serbia receipt waybill |
| RS_APPLICATION_RESPONSE | Serbia application response |
| RO_ETRANSPORT | Romania e-Transport document |
Responses
200 - Successful Response
Search successful. Returns paginated document processing records matching the applied filters.
Response body (Page<DocumentProcessDto>)
{
"content": [
{
"trackingId": "{{entity_uuid}}",
"companyId": "{{company_uuid}}",
"direction": "OUTGOING",
"documentType": "PEPPOL_BIS",
"waybillType": null,
"source": "ERP",
"target": null,
"status": "COMPLETED",
"filename": "invoice.xml",
"invoiceNumber": "invoiceNumber",
"documentId": "{{entity_uuid}}",
"sendingResult": "SUCCESS",
"errorType": null,
"createdAt": "2026-03-12T10:00:00",
"statusUpdatedAt": "2026-03-12T10:05:00",
"completedAt": "2026-03-12T10:05:00",
"errors": null,
"additionalData": null
}
],
"totalElements": 1,
"totalPages": 1,
"size": 20,
"number": 0,
"first": true,
"last": true,
"empty": false
}
Response Fields
Pagination (Page)
| Field | Type | Description |
|---|---|---|
| totalElements | number | Total number of matching records |
| totalPages | number | Total number of pages |
| size | number | Number of records per page |
| number | number | Current page number (0-indexed) |
| first | boolean | Whether this is the first page |
| last | boolean | Whether this is the last page |
| empty | boolean | Whether the result list is empty |
Content item (content[])
| Field | Type | Description |
|---|---|---|
| content[].trackingId | string (UUID) | Document processing tracking identifier |
| content[].companyId | string (UUID) | Company identifier associated with the processing record |
| content[].direction | string (enum) | Document direction: INCOMING or OUTGOING |
| content[].documentType | string (enum) | Document format/type (PEPPOL_BIS, XRECHNUNG, ZUGFERD, KSEF, etc.) |
| content[].waybillType | string (enum) | Waybill type — only populated for waybill documents, otherwise null |
| content[].source | string (enum) | Source system of the document (ERP, PORTAL, PEPPOL, etc.) |
| content[].target | string (enum) | Target system of the document — populated if applicable, otherwise null |
| content[].status | string (enum) | Current processing status (PENDING, PROCESSING, COMPLETED, FAILED, etc.) |
| content[].filename | string | Filename of the uploaded document |
| content[].invoiceNumber | string | Invoice number extracted from the processed document |
| content[].documentId | string (UUID) | System invoice/document identifier — populated after successful processing |
| content[].sendingResult | string | Sending result — status message returned by the country/portal system |
| content[].errorType | string (enum) | Error code — only populated when status is FAILED or SENDING_FAILED |
| content[].createdAt | string (ISO 8601) | Timestamp when the processing record was created |
| content[].statusUpdatedAt | string (ISO 8601) | Timestamp of the last status update |
| content[].completedAt | string (ISO 8601) | Timestamp when processing was completed |
| content[].errors | object | Error details — can be a String, array of Strings, or array of ValidationError objects. Null when no error. |
| content[].additionalData | object | Country/document-type-specific metadata. Structure varies by document type. |
Document Processing Status
| Value | Description |
|---|---|
| PENDING | Awaiting processing |
| PROCESSING | Currently being processed |
| COMPLETED | Successfully completed |
| FAILED | Processing failed |
| SENDING_FAILED | Processing succeeded but sending to the destination failed |
| PERMANENT_FAILED | Permanent failure — will not be retried |
400 - Bad Request
Trigger
When companyId is missing or contains an invalid value.
Response body
{
"errorMessage": "companyId must not be null",
"errorType": "BAD_REQUEST",
"errorTitle": "BAD_REQUEST",
"status": 400,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/invoice/document-process/search"
}
The companyId field is annotated with @NotNull. If this field is omitted or null, an IllegalArgumentException is thrown and a 400 Bad Request response is returned.
401 - Unauthorized
Trigger
When the JWT token is invalid, expired, or the user lacks the required authority for the company.
Response body
{
"errorMessage": "Not authorized for this action",
"errorType": "NOT_AUTHORITY",
"errorTitle": "UNAUTHORIZED",
"status": 401,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/invoice/document-process/search"
}
An AuthorizationServiceException is thrown when the JWT token is invalid/expired or the user does not have ADMIN, INCOMING_INVOICE_DISPLAY, or OUTGOING_INVOICE_DISPLAY authority for the specified company.
500 - Internal Server Error
Trigger
When an unexpected server error occurs.
Response body
{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"status": 500,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/invoice/document-process/search"
}
Returns a 500 Internal Server Error when an unexpected server-side error occurs.
7. Generate PDF POST
Purpose of Use: This endpoint accepts a base64-encoded UBL/XML invoice and converts it to PDF format, returning the raw PDF byte array.
Supported format types include PEPPOL BIS, XRECHNUNG, UAE PINT, ZUGFeRD, KSEF, and other country-specific e-invoice standards. The optional country code and VAT number fields are used in SAP-ERP integrations for country-specific or company-specific XSLT template selection.
Endpoint Information
| Property | Value |
|---|---|
| URL | /invoice/generate/pdf |
| Method | POST |
| Content-Type | application/json |
| Base URL | Stage Environment URLhttps://api-stage.evatrauae.com/ Production Environment URLhttps://api.evatrauae.com/ |
| Authorization | Bearer Token (R-Auth Header) |
Example Request
curl --location 'https://api-stage.evatrauae.com/invoice/generate/pdf' \
--header 'accept: */*' \
--header 'R-Auth: {{jwt_token}}' \
--header 'Content-Type: application/json' \
--data '{
"base64XML": "{{base64_encoded_xml}}",
"country": "AE",
"type": "UAE_PINT"
}'
Request Parameters
Body Parameters
| Field Name | Type | Required | Description |
|---|---|---|---|
| base64XML | string | Yes | Base64-encoded invoice XML content. Must be a valid UBL/XML document compatible with the selected format type. |
| type | string (enum) | Yes | The invoice format type. Must be one of the DataType values listed in the Parameter Value Reference section below. |
| country | string (enum) | Optional | ISO 3166-1 alpha-2 country code. Used in SAP-ERP integrations to select a country-specific visualization template. |
| vatNumber | string | Optional | VAT number. Used in SAP-ERP integrations for company-specific XSLT template selection. |
Parameter Value Reference
DataType Values
| Value | Description |
|---|---|
| PEPPOL_BIS | PEPPOL BIS Billing 3.0 UBL format |
| RO_EFACTURA | Romania e-Invoice (eFattura) UBL format |
| XRECHNUNG | Germany XRechnung UBL format |
| MY_INVOIS | Malaysia MyInvois e-invoice format |
| MY_PINT | Malaysia PINT (Peppol International) format |
| DK_OIOUBL | Denmark OIOUBL e-invoice format |
| EG_INVOICE | Egypt e-Invoice format |
| HR_INVOICE | Croatia e-invoice format |
| UAE_PINT | United Arab Emirates PINT (Peppol International) format |
| ZUGFERD | Germany ZUGFeRD (XML embedded in PDF/A-3) format |
| FACTUR_X | France Factur-X format |
| XRECHNUNG_CII | Germany XRechnung CII (Cross Industry Invoice) format |
| CII | UN/CEFACT Cross Industry Invoice generic format |
| CID | CID invoice format |
| Unstructured invoice (paper invoice, image scan, etc.) | |
| KZ_ESF_V2 | Kazakhstan ESF V2 electronic invoice format |
| KSEF | Poland KSeF (Krajowy System e-Faktur) format |
CountryCode Values
| Value | Description |
|---|---|
| AE | United Arab Emirates |
| DE | Germany |
| AT | Austria |
| FR | France |
| BE | Belgium |
| NL | Netherlands |
| SE | Sweden |
| NO | Norway |
| DK | Denmark |
| PL | Poland |
| RO | Romania |
| HR | Croatia |
| MY | Malaysia |
| EG | Egypt |
| KZ | Kazakhstan |
| TR | Turkey |
| GB | United Kingdom |
| IT | Italy |
| ES | Spain |
| SK | Slovakia |
Responses
200 - Successful Response
PDF conversion successful. The response body is raw PDF binary content. The Content-Type is application/pdf or application/octet-stream. The returned byte array can be saved directly as a PDF file or rendered inline on the client side.
Response
Binary (byte[]). Raw PDF binary content. This is not a JSON object but a direct PDF byte stream. The client can save this content as a PDF file or display it inline.
400 - Bad Request
Trigger
When invalid or unsupported XML content is submitted, or when the XML-to-PDF conversion process fails.
Response body
{
"errorMessage": "PDF convert error: Invalid XML structure",
"errorType": "PDF_CONVERT_ERROR",
"errorTitle": "BAD_REQUEST",
"status": 400,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/invoice/generate/pdf"
}
An IllegalArgumentException is thrown and a 400 Bad Request response is returned when the base64XML content is invalid, an unsupported format type is used, or the XML-to-PDF conversion fails.
500 - Internal Server Error
Trigger
When an unexpected server error occurs.
Response body
{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"status": 500,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/invoice/generate/pdf"
}
Returns a 500 Internal Server Error when an unexpected server-side error occurs.
8. Retrieve document by ID and type GET
Purpose of Use: This endpoint returns the Base64-encoded content of an uploaded invoice in the requested format (XML, PDF, or JSON).
A single format type (e.g. XML) or multiple format types separated by a dash (e.g. XML-PDF, XML-PDF-JSON) can be requested. The response contains a separate Document object for each requested format.
Endpoint Information
| Property | Value |
|---|---|
| URL | /invoice/get-document/{documentId}/{documentTypes} |
| Method | GET |
| Content-Type | application/json |
| Base URL | Stage Environment URLhttps://api-stage.evatrauae.com/ Production Environment URLhttps://api.evatrauae.com/ |
| Authorization | Bearer Token (R-Auth Header) |
Example Request
curl --location 'https://api-stage.evatrauae.com/invoice/get-document/{{invoice_uuid}}/XML' \
--header 'accept: */*' \
--header 'R-Auth: {{jwt_token}}'
Request Parameters
Path Parameters
| Field Name | Type | Required | Description |
|---|---|---|---|
| documentId | string (UUID) | Yes | Unique identifier (UUID) of the invoice whose document is being requested |
| documentTypes | string (enum) | Yes | Requested document format type. Can be a single format (XML) or multiple dash-separated formats (XML-PDF) |
Parameter Value Reference
DocumentTypes Values
| Value | Description |
|---|---|
| XML | UBL XML document |
| PDF document | |
| JSON | UBL DTO JSON document (only for invoices with COMPLETED_BY_MELA_AI status) |
FormatType Values
| Value | Description |
|---|---|
| XML | UBL XML document |
| PDF document | |
| JSON | UBL DTO in JSON format |
| SIGN | Signed document |
| GPDF | Generated PDF document |
| HTML | HTML document |
Notes
- Use a dash (-) to request multiple formats simultaneously. Example: XML-PDF, XML-PDF-JSON
- JSON format is only supported for invoices with status COMPLETED_BY_MELA_AI
Responses
200 - Successful Response
Successful response. Returns Base64-encoded document content for each requested format.
Response body (DocumentResponse)
{
"documents": [
{
"file_type": "XML",
"data": "{{base64_encoded_content}}"
}
]
}
Response Fields
Root Fields
| Field | Type | Description |
|---|---|---|
| documents | Array<Document> | List of documents for the requested formats |
Document (documents[])
| Field | Type | Description |
|---|---|---|
| documents[].file_type | string (enum) | Document format type (XML, PDF, JSON, etc.) |
| documents[].data | string | Base64-encoded document content |
400 - Bad Request
Trigger
When the invoice is still waiting for OCR processing.
Response body
{
"errorMessage": "Invoice is waiting for MelaAIParser. Please try again later!",
"errorType": "BAD_REQUEST",
"errorTitle": "BAD_REQUEST",
"status": 400,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/invoice/get-document/{{invoice_uuid}}/XML"
}
An IllegalStateException is thrown if the invoice is still being processed by the OCR pipeline. Retry the request after a short delay.
400 - Bad Request
Trigger
When an unsupported document format type is requested.
Response body
{
"errorMessage": "Unsupported document type: HTML",
"errorType": "BAD_REQUEST",
"errorTitle": "BAD_REQUEST",
"status": 400,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/invoice/get-document/{{invoice_uuid}}/HTML"
}
An IllegalArgumentException is thrown when a value other than XML, PDF, or JSON is provided in the documentTypes parameter.
404 - Not Found
Trigger
When JSON format is requested but the invoice does not exist in the database.
Response body
{
"errorMessage": "{{invoice_uuid}} Invoice not found!",
"errorType": "NOT_FOUND",
"errorTitle": "NOT_FOUND",
"status": 404,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/invoice/get-document/{{invoice_uuid}}/JSON"
}
A NotFoundException is thrown when JSON format is requested but the invoice cannot be found in the database, returning a 404 Not Found response.
500 - Internal Server Error
Trigger
When an unexpected server error occurs.
Response body
{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"status": 500,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/invoice/get-document/{{invoice_uuid}}/XML"
}
Returns a 500 Internal Server Error when an unexpected server-side error occurs.
9. Search Document with Filter POST
Purpose of Use: This endpoint allows searching company documents (invoices and other records) using various filter criteria.
It supports filtering by date range, document status, document direction, and format type, along with pagination. The response includes total count, currency-based financial summaries, and a paginated document list.
Endpoint Information
| Property | Value |
|---|---|
| URL | /invoice/search-documents |
| Method | POST |
| Content-Type | application/json |
| Base URL | Stage Environment URLhttps://api-stage.evatrauae.com/ Production Environment URLhttps://api.evatrauae.com/ |
| Authorization | R-Auth Header (JWT Token) Required |
Example Request
curl -X POST 'https://api-stage.evatrauae.com/invoice/search-documents' \
-H 'Content-Type: application/json' \
-H 'R-Auth: {{jwt_token}}' \
-d '{
"companyId": "{{company_uuid}}",
"startDate": "2025-03-26",
"endDate": "2026-03-26",
"page": 1,
"size": 20,
"status": "SAVED_AS_UBL"
}'
Request Parameters
Body Parameters
| Field Name | Type | Required | Description |
|---|---|---|---|
| companyId | string (UUID) | Optional | Unique identifier of the company to search documents for |
| tin | string | Optional | Filter by tax identification number |
| uit | string | Optional | Filter by UIT number |
| status | string (enum) | Optional | Filter by document status. |
| documentType | string (enum) | Optional | Filter by document direction: INCOMING or OUTGOING |
| referenceDocument | string | Optional | Filter by reference document number |
| startDate | string (ISO 8601) | Optional | Search start date (e.g. 2025-03-26) |
| endDate | string (ISO 8601) | Optional | Search end date (e.g. 2026-03-26) |
| page | number | Optional | Page number (starts from 1) |
| size | number | Optional | Number of records per page. Maximum value is 200. |
| type | string (enum) | Optional | Filter by document format type. |
Note
The size field has a maximum value of 200; requests exceeding this limit will be rejected with a validation error.
Responses
200 - Successful Response
Search successful. Returns total count, currency-based financial summaries, and a paginated list of matching documents.
Response body (DocumentSearchResponse)
{
"totalCount": 142,
"currencyTotals": [
{
"currency": "EUR",
"totalAmount": 25000.00,
"netAmount": 21008.40,
"taxAmount": 3991.60,
"payableAmount": 25000.00
}
],
"invoiceList": [
{
"id": "{{invoice_uuid}}",
"companyId": "{{company_uuid}}",
"userId": "{{user_uuid}}",
"customerName": "Example Customer Inc.",
"supplierName": "Example Supplier GmbH",
"supplierId": "{{entity_uuid}}",
"supplierVat": "100691836423203",
"status": "SAVED_AS_UBL",
"invoiceNumber": "INV-2025-00042",
"taxExclusiveAmount": 840.34,
"taxInclusiveAmount": 1000.00,
"lineExtensionAmount": 840.34,
"payableAmount": 1000.00,
"allowanceTotalAmount": 0.00,
"currency": "AED",
"createdTime": "2026-01-15T12:00:00",
"localCreatedTime": "2026-01-15T14:00:00",
"issueDate": "2026-01-15",
"deliveryDate": "2026-01-20",
"dueDate": "2026-02-15",
"supplierCountryCode": "AE",
"supplierEndpoint": "iso6523-actorid-upis::0088:1234567890",
"customerId": "{{entity_uuid}}",
"customerVat": "100691836423203",
"customerEndpoint": "iso6523-actorid-upis::0088:0987654321",
"customerCountryCode": "AE",
"typeCode": "380",
"documentType": "OUTGOING",
"errorMessage": null,
"lastUpdatedTime": "2026-01-15T12:05:00",
"localLastUpdatedTime": "2026-01-15T14:05:00",
"type": "UAE_PINT",
"idIncarcare": null,
"idDescarcare": null,
"source": "PORTAL",
"sendViaPeppol": false,
"statusTime": "2026-01-15T12:00:00",
"localStatusTime": "2026-01-15T14:00:00",
"fileName": "invoice_INV-2025-00042.xml",
"ocrParser": null,
"paymentDetails": {
"paymentStatus": "SENT",
"paidAmount": 0.00,
"totalAmount": 1000.00,
"remainingAmount": 1000.00,
"paymentDate": null
},
"profileType": "EN16931",
"isActive": true,
"countrySpecificData": null,
"isRead": true,
"governmentStatus": null,
"orderReference": "PO-2025-001",
"purchaseOrder": "PO-2025-001"
}
]
}
Response Fields
Root Fields
| Field | Type | Description |
|---|---|---|
| totalCount | number | Total number of documents matching the filter criteria |
| currencyTotals | Array<Object> | Financial summary grouped by currency |
| invoiceList | Array<Object> | List of document records matching the filter criteria |
Currency Summary (currencyTotals[])
| Field | Type | Description |
|---|---|---|
| currencyTotals[].currency | string | Currency code (ISO 4217, e.g. EUR, USD) |
| currencyTotals[].totalAmount | number | Total amount including tax |
| currencyTotals[].netAmount | number | Net amount excluding tax |
| currencyTotals[].taxAmount | number | Total tax amount |
| currencyTotals[].payableAmount | number | Total payable amount |
Invoice / Document Fields (invoiceList[])
| Field | Type | Description |
|---|---|---|
| invoiceList[].id | string (UUID) | Unique identifier of the document |
| invoiceList[].companyId | string (UUID) | Identifier of the company that owns this document |
| invoiceList[].userId | string (UUID) | Identifier of the user who created the document |
| invoiceList[].customerName | string | Customer / buyer name |
| invoiceList[].supplierName | string | Supplier / seller name |
| invoiceList[].supplierId | string | Supplier identifier |
| invoiceList[].supplierVat | string | Supplier VAT number |
| invoiceList[].status | string (enum) | Current document status (InvoiceStatus) |
| invoiceList[].invoiceNumber | string | Invoice number |
| invoiceList[].taxExclusiveAmount | number | Amount excluding tax |
| invoiceList[].taxInclusiveAmount | number | Amount including tax |
| invoiceList[].lineExtensionAmount | number | Line extension amount (before allowances) |
| invoiceList[].payableAmount | number | Total payable amount |
| invoiceList[].allowanceTotalAmount | number | Total allowance / discount amount |
| invoiceList[].currency | string | Invoice currency code |
| invoiceList[].createdTime | string (ISO 8601) | Document creation time (UTC) |
| invoiceList[].localCreatedTime | string (ISO 8601) | Document creation time in local timezone |
| invoiceList[].issueDate | string (ISO 8601) | Invoice issue date |
| invoiceList[].deliveryDate | string (ISO 8601) | Delivery date |
| invoiceList[].dueDate | string (ISO 8601) | Payment due date |
| invoiceList[].supplierCountryCode | string | Supplier country code (ISO 3166-1 alpha-2) |
| invoiceList[].supplierEndpoint | string | Supplier Peppol endpoint address |
| invoiceList[].customerId | string | Customer identifier |
| invoiceList[].customerVat | string | Customer VAT number |
| invoiceList[].customerEndpoint | string | Customer Peppol endpoint address |
| invoiceList[].customerCountryCode | string | Customer country code (ISO 3166-1 alpha-2) |
| invoiceList[].typeCode | string | UBL document type code (e.g. 380 = Invoice) |
| invoiceList[].documentType | string (enum) | Document direction: INCOMING or OUTGOING |
| invoiceList[].errorMessage | string | Error message in case of failure; null on success |
| invoiceList[].lastUpdatedTime | string (ISO 8601) | Last update time (UTC) |
| invoiceList[].localLastUpdatedTime | string (ISO 8601) | Last update time in local timezone |
| invoiceList[].type | string (enum) | Document format type (DataType) |
| invoiceList[].idIncarcare | string | Romania ANAF upload ID |
| invoiceList[].idDescarcare | string | Romania ANAF download ID |
| invoiceList[].source | string (enum) | Origin of the document (InvoiceSource) |
| invoiceList[].sendViaPeppol | boolean | Whether the document was sent via the Peppol network |
| invoiceList[].statusTime | string (ISO 8601) | Time when the current status was assigned (UTC) |
| invoiceList[].localStatusTime | string (ISO 8601) | Time when the current status was assigned (local timezone) |
| invoiceList[].fileName | string | Document file name |
| invoiceList[].ocrParser | string (enum) | OCR parser engine used; null if no OCR processing was performed |
| invoiceList[].profileType | string (enum) | ZUGFeRD / Factur-X profile type (ProfileType) |
| invoiceList[].isActive | boolean | Whether the document is active |
| invoiceList[].countrySpecificData | object | Country-specific additional data; structure varies per country |
| invoiceList[].isRead | boolean | Whether the document has been read |
| invoiceList[].governmentStatus | string (enum) | Government portal processing status (InvoiceGovernmentStatus); null if not applicable |
| invoiceList[].orderReference | string | Order reference number |
| invoiceList[].purchaseOrder | string | Purchase order number |
Payment Details (invoiceList[].paymentDetails)
| Field | Type | Description |
|---|---|---|
| invoiceList[].paymentDetails.paymentStatus | string (enum) | Payment status (PaymentStatus) |
| invoiceList[].paymentDetails.paidAmount | number | Amount already paid |
| invoiceList[].paymentDetails.totalAmount | number | Total invoice amount |
| invoiceList[].paymentDetails.remainingAmount | number | Remaining unpaid amount |
| invoiceList[].paymentDetails.paymentDate | string (ISO 8601) | Payment date; null if not yet paid |
Parameter Value Reference
InvoiceStatus Values
| Value | Description |
|---|---|
| CREATED | Document created |
| SAVED_AS_UBL | Saved in UBL format |
| SAVED_AS_ZUGFERD | Saved in ZUGFeRD format |
| SAVED_AS_FACTUR_X | Saved in Factur-X format |
| SAVED_AS_CII | Saved in CII format |
| SAVED_AS_CID | Saved in CID format |
| READY_FOR_KSEF | Ready for KSeF submission |
| SENT_TO_ACCESS_POINT | Sent to access point |
| OCR_WAITING | Awaiting OCR processing |
| OCR_PARSED | OCR processing completed |
| OCR_FAILED | OCR processing failed |
| OCR_PARSED_PENDING_PAYMENT | OCR done, awaiting payment |
| OCR_WAITING_TOKEN | Waiting for OCR token |
| CANCELED | Canceled |
| PENDING | Pending |
| SAVED_AS_PDF | Saved as PDF |
| DELETED | Deleted |
| COMPLETED_BY_MELA_AI | Completed by Mela AI |
| SENT_VIA_EMAIL | Sent via email |
| LHDNM_SUBMITTED | [MY] Submitted to LHDNM |
| LHDNM_VALID | [MY] Valid according to LHDNM |
| LHDNM_INVALID | [MY] Invalid according to LHDNM |
| LHDNM_CANCELLED | [MY] Cancelled by LHDNM |
| LHDNM_REJECT_REQUESTED | [MY] Rejection requested |
| LHDNM_REJECTED | [MY] Rejected by LHDNM |
| LHDNM_ERROR | [MY] LHDNM error |
| ETA_SUBMITTED | [EG] Submitted to ETA |
| KSEF_PENDING | [PL] KSeF pending |
| KSEF_ACCEPTED | [PL] Accepted by KSeF |
| KSEF_REJECTED | [PL] Rejected by KSeF |
| KSEF_DUPLICATE | [PL] KSeF duplicate document |
| ERACUN_ERROR | [HR] eRacun error |
| ERACUN_PENDING | [HR] eRacun pending |
| ERACUN_WAITING_TO_SEND | [HR] eRacun waiting to send |
| ERACUN_SENT | [HR] eRacun sent |
| ERACUN_RECEIVED | [HR] eRacun received |
| ERACUN_APPROVED | [HR] eRacun approved |
| ERACUN_REJECTED | [HR] eRacun rejected |
| ERACUN_FULLY_PAID | [HR] eRacun fully paid |
| ERACUN_PARTIALLY_PAID | [HR] eRacun partially paid |
| ERACUN_DELIVERY_FAILED | [HR] eRacun delivery failed |
| SENT_TO_ANAF | [RO] Sent to ANAF |
| PORTAL_OKAY | [RO] Approved by portal |
| PORTAL_ERROR | [RO] Portal error |
| PORTAL_ERRORS | [RO] Multiple portal errors |
| PORTAL_SYSTEM_ERROR | [RO] Portal system error |
| PORTAL_IN_PROCESS | [RO] Portal processing |
| SENT_TO_NEMHANDEL | [DK] Sent to Nemhandel |
| SENT_TO_PEPPOL | [Peppol] Sent to Peppol network |
| SUCCESS | [Peppol] Successfully delivered |
| INVALID_PARAMETERS | [Peppol] Invalid parameters |
| TRANSPORT_ERROR | [Peppol] Transport error |
| TRANSPORT_ERROR_NO_RETRY | [Peppol] Transport error, no retry |
| NO_SIGNAL_MESSAGE_RECEIVED | [Peppol] No signal message received |
| AS4_ERROR_MESSAGE_RECEIVED | [Peppol] AS4 error message received |
| INVALID_SIGNAL_MESSAGE_RECEIVED | [Peppol] Invalid signal message received |
| SMP_LOOKUP_FAILED | [Peppol] SMP lookup failed |
| INCOMING_RESPONSE_ACKNOWLEDGED | [Peppol] Incoming response (MLR/MLS) acknowledged |
| INCOMING_RESPONSE_REJECTED | [Peppol] Incoming response rejected |
| INCOMING_RESPONSE_ACCEPTED | [Peppol] Incoming response accepted |
| OUTGOING_RESPONSE_ACKNOWLEDGED | [Peppol] Outgoing response (MLR/MLS) acknowledged |
| OUTGOING_RESPONSE_REJECTED | [Peppol] Outgoing response rejected |
| OUTGOING_RESPONSE_ACCEPTED | [Peppol] Outgoing response accepted |
| CREDIT_BLOCKED | Blocked due to insufficient credit |
| FR_DEPOSITED | [FR] Deposited to CDV |
| FR_REJECTED | [FR] Rejected by CDV |
| FR_RECEIVED | [FR] Received by CDV |
| FR_AVAILABLE | [FR] Available in CDV |
| FR_PROCESSING | [FR] CDV processing |
| FR_APPROVED | [FR] Approved by CDV |
| FR_PARTIALLY_APPROVED | [FR] Partially approved by CDV |
| FR_DISPUTED | [FR] Disputed |
| FR_SUSPENDED | [FR] Suspended |
| FR_PLATFORM_ISSUED | [FR] Issued by platform |
| FR_REFUSED | [FR] Refused |
| FR_PAYMENT_SENT | [FR] Payment sent |
| FR_COLLECTED | [FR] Collected |
| FR_COMPLETED | [FR] Completed |
| FR_CANCELLED | [FR] Cancelled |
DocumentType Values
| Value | Description |
|---|---|
| INCOMING | Incoming document (received invoice) |
| OUTGOING | Outgoing document (issued invoice) |
DataType Values
| Value | Description |
|---|---|
| PEPPOL_BIS | Peppol BIS Billing 3.0 format |
| RO_EFACTURA | Romania e-Factura format |
| UBL_NL | Netherlands UBL format |
| MY_INVOIS | Malaysia MyInvois format |
| MY_PINT | Malaysia PINT format |
| DK_OIOUBL | Denmark OIOUBL format |
| EG_INVOICE | Egypt e-Invoice format |
| HR_INVOICE | Croatia e-Invoice format |
| UAE_PINT | UAE PINT format |
| ZUGFERD | ZUGFeRD PDF/A-3 format |
| FACTUR_X | Factur-X format (ZUGFeRD compatible) |
| XRECHNUNG_CII | Germany XRechnung CII format |
| CII | Cross Industry Invoice (CII) format |
| CID | Cross Industry Document (CID) format |
| Unstructured PDF (paper invoices, images, etc.) | |
| KZ_ESF_V2 | Kazakhstan ESF v2 format |
| KSEF | Poland KSeF format |
| KSEF_OFFLINE | Poland KSeF offline format |
InvoiceSource Values
| Value | Description |
|---|---|
| PORTAL_OCR | Uploaded via portal with OCR processing |
| EMAIL_OCR | Received via email with OCR processing |
| Sent via email | |
| PORTAL | Created through the portal interface |
| ERP | Submitted via ERP integration |
| PEPPOL | Received from Peppol network |
| LHDNM | Received from Malaysia LHDNM portal |
| NEMHANDEL | Received from Denmark Nemhandel network |
| SERVICE | Created by service layer |
| HARVEST | Harvest integration |
| SHOPIFY | Shopify integration |
| AMAZON_SP | Amazon Selling Partner integration |
| EBAY | eBay integration |
| HUBSPOT | HubSpot integration |
| ANAF | Romania ANAF portal |
| LAZADA | Lazada integration |
| SFTP | Uploaded via SFTP |
| KSEF | Poland KSeF system |
| RS_API | Serbia API integration |
| ETA | Egypt ETA portal |
| ERACUN | Croatia eRacun portal |
| STRIPE | Stripe payment integration |
| PPF | France PPF portal |
ProfileType Values
| Value | Description |
|---|---|
| KSEF_FA2 | Poland KSeF FA (2) profile |
| KSEF_FA3 | Poland KSeF FA (3) profile |
| MINIMUM | Factur-X MINIMUM profile |
| BASICWL | Factur-X BASICWL profile |
| BASIC | Factur-X BASIC profile |
| EN16931 | EN16931 profile |
| EXTENDED | Factur-X EXTENDED profile |
| XRECHNUNG | XRechnung profile |
| BASIC_V1 | Factur-X BASIC v1 profile |
| COMFORT_V1 | Factur-X COMFORT v1 profile |
| EXTENDED_V1 | Factur-X EXTENDED v1 profile |
PaymentStatus Values
| Value | Description |
|---|---|
| SENT | Invoice sent, payment pending |
| PAID | Fully paid |
| PARTIAL_PAID | Partially paid |
| LATE | Payment is overdue |
InvoiceGovernmentStatus Values
| Value | Description |
|---|---|
| TDD_SEND | Sent to TDD |
| TDD_FAILED | TDD submission failed |
| TDD_APPROVED | Approved by TDD |
| TDD_ACKNOWLEDGED | Acknowledged by TDD |
| TDD_REJECTED | Rejected by TDD |
| WITHDRAW_SEND | Withdrawal request sent |
| WITHDRAW_FAILED | Withdrawal request failed |
400 - Bad Request
Trigger
When the size field exceeds 200 or any @Valid constraint is violated.
Response body
{
"errorMessage": "size must be less than or equal to 200",
"errorType": "VALIDATION_ERROR",
"errorTitle": "BAD_REQUEST",
"status": 400,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/invoice/search-documents"
}
Spring Validation returns a 400 Bad Request when the @Max(200) constraint on the size field is violated.
401 - Unauthorized
Trigger
When the R-Auth header is missing or contains an invalid/expired JWT token.
Response body
{
"errorMessage": "Unauthorized",
"errorType": "NOT_AUTHORITY",
"errorTitle": "UNAUTHORIZED",
"status": 401,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/invoice/search-documents"
}
A 401 Unauthorized response is returned when the request is made with an invalid or expired JWT token.
500 - Internal Server Error
Trigger
When an unexpected server error occurs.
Response body
{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"status": 500,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/invoice/search-documents"
}
Returns a 500 Internal Server Error when an unexpected server-side error occurs.
10. Get TDD Detail GET
Purpose of Use: This endpoint retrieves the Tax Data Document (TDD) detail information associated with the specified company and invoice ID.
A TDD is a tax reporting document submitted to the UAE PEPPOL system. The response includes the document's status, type, scope, and financial summary. If no TDD has been submitted for the given invoice, the response body will be null.
Endpoint Information
| Property | Value |
|---|---|
| URL | /peppol/get-tdd |
| Method | GET |
| Content-Type | application/json |
| Base URL | Stage Environment URLhttps://api-stage.evatrauae.com/ Production Environment URLhttps://api.evatrauae.com/ |
| Authorization | Bearer Token (R-Auth Header) Required |
Example Request
curl --location 'https://api-stage.evatrauae.com/peppol/get-tdd?companyId={{company_uuid}}&invoiceId={{invoice_uuid}}' \
--header 'accept: */*' \
--header 'R-Auth: {{jwt_token}}'
Request Parameters
Query Parameters
| Field Name | Type | Required | Description |
|---|---|---|---|
| companyId | string (UUID) | Yes | Unique identifier of the company for which the TDD is being queried |
| invoiceId | string (UUID) | Yes | Unique identifier of the invoice associated with the TDD |
Responses
200 - Successful Response
Returns TDD detail information on success. The response body may be null if no TDD has been submitted for the given invoice.
Response body (TddDetail)
{
"createdDate": "2026-01-15T10:00:00",
"updateDate": "2026-01-15T12:30:00",
"documentType": "SUBMIT",
"documentScope": "DOMESTIC",
"role": "SENDER",
"totalAmount": 150.00,
"taxExclusiveAmount": 1000.00,
"status": "TDD_SEND"
}
Response Fields
Root Fields
| Field | Type | Description |
|---|---|---|
| createdDate | string (ISO 8601) | Date and time the TDD record was created |
| updateDate | string (ISO 8601) | Date and time the TDD record was last updated |
| documentType | string (enum) | TDD document type: SUBMIT, RESUBMIT, WITHDRAW, or FAILED |
| documentScope | string (enum) | TDD document scope: DOMESTIC, INTERNATIONAL_PEPPOL, or INTERNATIONAL_NON_PEPPOL |
| role | string (enum) | Role of the reporting party: SENDER or RECEIVER |
| totalAmount | number | Total tax amount (tax inclusive minus tax exclusive) |
| taxExclusiveAmount | number | Total invoice amount excluding tax |
| status | string (enum) | Current TDD status: TDD_SEND, TDD_FAILED, or MLS_RECEIVED_FOR_TDD |
Parameter Value Reference
TddDocumentType Values
| Value | Description |
|---|---|
| SUBMIT | Initial submission (code: S) |
| RESUBMIT | Re-submission of an existing TDD (code: R) |
| WITHDRAW | Withdrawal of a previously submitted TDD (code: W) |
| FAILED | Failed submission (code: F) |
TddDocumentScope Values
| Value | Description |
|---|---|
| DOMESTIC | Domestic transaction — both supplier and customer are in UAE (code: D) |
| INTERNATIONAL_PEPPOL | International transaction via PEPPOL network (code: IP) |
| INTERNATIONAL_NON_PEPPOL | International transaction outside PEPPOL (code: INP) |
TddReporterRole Values
| Value | Description |
|---|---|
| SENDER | The party sending the invoice (code: 01) |
| RECEIVER | The party receiving the invoice (code: 02) |
TddStatus Values
| Value | Description |
|---|---|
| TDD_SEND | TDD was successfully submitted |
| TDD_FAILED | TDD submission failed |
| MLS_RECEIVED_FOR_TDD | A Message Level Status (MLS) response was received for this TDD |
401 - Unauthorized
Trigger
When an invalid or expired R-Auth token is provided, or the authenticated user does not belong to the specified company.
Response body
{
"errorMessage": "Authorization failed!",
"errorType": "AUTHORIZATION_FAILED",
"errorTitle": "UNAUTHORIZED",
"status": 401,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/peppol/get-tdd"
}
An AuthorizationServiceException is thrown when the user is not associated with the specified company or the JWT token is invalid, returning a 401 Unauthorized response.
500 - Internal Server Error
Trigger
When an unexpected server error occurs.
Response body
{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"status": 500,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/peppol/get-tdd"
}
Returns a 500 Internal Server Error when an unexpected server-side error occurs.
11. Invalid Peppol Documents List GET
Purpose of Use: This endpoint returns a paginated list of invalid Peppol documents belonging to a specific company. Invalid documents are incoming Peppol documents that could not be processed due to validation errors, format errors, or processing failures.
Results are returned in descending order by creation time (newest first). The companyId parameter is required, and authentication must be performed via a JWT token in the R-Auth header.
Endpoint Information
| Property | Value |
|---|---|
| URL | /peppol/invalid-documents |
| Method | GET |
| Content-Type | application/json |
| Base URL | Stage Environment URLhttps://api-stage.evatrauae.com/ Production Environment URLhttps://api.evatrauae.com/ |
| Authorization | Bearer Token (R-Auth Header) Required |
Example Request
curl --location 'https://api-stage.evatrauae.com/peppol/invalid-documents?companyId={{company_uuid}}&pageNumber=0&pageSize=20' \
--header 'accept: */*' \
--header 'R-Auth: {{jwt_token}}'
Request Parameters
Query Parameters
| Field Name | Type | Required | Description |
|---|---|---|---|
| companyId | string (UUID) | Yes | Unique identifier of the company whose invalid documents are being queried |
| pageNumber | number | Optional | Page number (starts from 0). Default value: 0 |
| pageSize | number | Optional | Number of records per page. Default value: 20 |
Responses
200 - Successful Response
Success. Returns a paginated list of invalid Peppol documents belonging to the company. Results are sorted by creation time in descending order.
Response body (Page<InvalidPeppolDocumentDTO>)
{
"content": [
{
"id": "{{entity_uuid}}",
"companyId": "{{company_uuid}}",
"trackingId": "TRK-20260115-001",
"instanceIdentifier": "urn:uuid:{{entity_uuid}}",
"invoiceNumber": "INV-2026-0042",
"typeCode": "380",
"currency": "AED",
"issueDate": "2026-01-15",
"dueDate": "2026-02-15",
"deliveryDate": "2026-01-20",
"supplierEndpoint": "iso6523-actorid-upis::0088:1234567890",
"supplierName": "Supplier Company Ltd.",
"supplierCountryCode": "AE",
"supplierVAT": "100691836423203",
"supplierId": "1374529842",
"customerEndpoint": "iso6523-actorid-upis::0088:0987654321",
"customerName": "Customer Company Inc.",
"customerCountryCode": "AE",
"customerVAT": "100691836423203",
"customerId": "1374529842",
"lineExtensionAmount": 1000.00,
"taxExclusiveAmount": 1000.00,
"taxInclusiveAmount": 1050.00,
"allowanceTotalAmount": 0.00,
"payableAmount": 1050.00,
"documentType": "INCOMING",
"dataType": "UAE_PINT",
"errorType": "VALIDATION_ERROR",
"errorMessage": "Schema validation failed for document",
"validationErrors": "[{\"field\":\"TaxTotal\",\"message\":\"TaxTotal amount mismatch\"}]",
"receivedTime": "2026-01-15T10:30:00",
"createdTime": "2026-01-15T10:30:05",
"status": null,
"governmentStatus": "TDD_FAILED"
}
],
"pageable": {
"sort": {
"empty": false,
"sorted": true,
"unsorted": false
},
"offset": 0,
"pageNumber": 0,
"pageSize": 20,
"paged": true,
"unpaged": false
},
"totalElements": 1,
"last": true,
"totalPages": 1,
"sort": {
"empty": false,
"sorted": true,
"unsorted": false
},
"size": 20,
"number": 0,
"first": true,
"numberOfElements": 1,
"empty": false
}
Response Fields
Pagination Fields
| Field | Type | Description |
|---|---|---|
| totalElements | number | Total number of records |
| totalPages | number | Total number of pages |
| size | number | Number of records per page |
| number | number | Current page number (starts from 0) |
| numberOfElements | number | Number of records on this page |
| first | boolean | Whether this is the first page |
| last | boolean | Whether this is the last page |
| empty | boolean | Whether the page is empty |
| content | Array<InvalidPeppolDocumentDTO> | List of invalid Peppol documents |
Document Basic Fields (content[])
| Field | Type | Description |
|---|---|---|
| content[].id | string (UUID) | Unique identifier of the invalid document record |
| content[].companyId | string (UUID) | Identifier of the company the document belongs to |
| content[].trackingId | string | Document tracking identifier |
| content[].instanceIdentifier | string | Peppol document instance identifier (URN format) |
| content[].invoiceNumber | string | Invoice number |
| content[].typeCode | string | Document type code (e.g. 380 = Invoice, 381 = Credit Note) |
| content[].currency | string | Currency code (ISO 4217) |
| content[].issueDate | string (ISO 8601) | Invoice issue date |
| content[].dueDate | string (ISO 8601) | Payment due date |
| content[].deliveryDate | string (ISO 8601) | Delivery date |
| content[].documentType | string (enum) | Document direction: INCOMING or OUTGOING |
| content[].dataType | string (enum) | Document data format (Peppol profile type) |
| content[].errorType | string | Text describing the error type |
| content[].errorMessage | string | Human-readable error description |
| content[].validationErrors | string | JSON string array of validation errors (if any) |
| content[].receivedTime | string (ISO 8601) | Time the document was received by the system |
| content[].createdTime | string (ISO 8601) | Time the record was created |
| content[].status | string (enum) | Processing status of the document |
| content[].governmentStatus | string (enum) | Government portal processing status (for TDD flow, may be null) |
Supplier Information (content[].supplier*)
| Field | Type | Description |
|---|---|---|
| content[].supplierEndpoint | string | Supplier's Peppol endpoint identifier |
| content[].supplierName | string | Supplier company name |
| content[].supplierCountryCode | string | Supplier country code (ISO 3166-1 alpha-2) |
| content[].supplierVAT | string | Supplier VAT number |
| content[].supplierId | string | Supplier business identifier |
Customer Information (content[].customer*)
| Field | Type | Description |
|---|---|---|
| content[].customerEndpoint | string | Customer's Peppol endpoint identifier |
| content[].customerName | string | Customer company name |
| content[].customerCountryCode | string | Customer country code (ISO 3166-1 alpha-2) |
| content[].customerVAT | string | Customer VAT number |
| content[].customerId | string | Customer business identifier |
Financial Fields (content[].*Amount)
| Field | Type | Description |
|---|---|---|
| content[].lineExtensionAmount | number | Line extension amount (tax exclusive sum of line items) |
| content[].taxExclusiveAmount | number | Total amount excluding tax |
| content[].taxInclusiveAmount | number | Total amount including tax |
| content[].allowanceTotalAmount | number | Total allowance/discount amount |
| content[].payableAmount | number | Net amount payable |
Parameter Value Reference
DocumentType Values
| Value | Description |
|---|---|
| INCOMING | Incoming Peppol document |
| OUTGOING | Outgoing Peppol document |
DataType Values
| Value | Description |
|---|---|
| PEPPOL_BIS | Peppol BIS Billing 3.0 format |
| RO_EFACTURA | Romania e-Invoice format |
| XRECHNUNG | Germany XRechnung format |
| MY_INVOIS | Malaysia MyInvois format |
| MY_PINT | Malaysia PINT format |
| DK_OIOUBL | Denmark OIOUBL format |
| EG_INVOICE | Egypt e-Invoice format |
| HR_INVOICE | Croatia e-Invoice format |
| UAE_PINT | UAE PINT format |
| ZUGFERD | ZUGFeRD format |
| FACTUR_X | Factur-X format |
| XRECHNUNG_CII | XRechnung CII format |
| CII | Cross Industry Invoice (CII) format |
| CID | Cross Industry Document (CID) format |
| Unstructured PDF invoice (paper/image invoice) | |
| KZ_ESF_V2 | Kazakhstan ESF v2 format |
| KSEF | Poland KSeF format |
| KSEF_OFFLINE | Poland KSeF offline format |
InvoiceStatus Values
| Value | Description |
|---|---|
| TRANSPORT_ERROR | A transport error occurred |
| TRANSPORT_ERROR_NO_RETRY | Transport error with no retry allowed |
| INVALID_PARAMETERS | Invalid parameters detected |
| SMP_LOOKUP_FAILED | SMP lookup failed |
| AS4_ERROR_MESSAGE_RECEIVED | AS4 error message received |
| INVALID_SIGNAL_MESSAGE_RECEIVED | Invalid signal message received |
| NO_SIGNAL_MESSAGE_RECEIVED | No signal message received |
| SENT_TO_PEPPOL | Sent to the Peppol network |
| SUCCESS | Processing completed successfully |
| INCOMING_RESPONSE_ACKNOWLEDGED | Incoming response acknowledged (MLR/MLS) |
| INCOMING_RESPONSE_REJECTED | Incoming response rejected |
| INCOMING_RESPONSE_ACCEPTED | Incoming response accepted |
| OUTGOING_RESPONSE_ACKNOWLEDGED | Outgoing response acknowledged |
| OUTGOING_RESPONSE_REJECTED | Outgoing response rejected |
| OUTGOING_RESPONSE_ACCEPTED | Outgoing response accepted |
| PENDING | Awaiting processing |
| CANCELED | Cancelled |
| CREDIT_BLOCKED | Blocked due to insufficient credit |
InvoiceGovernmentStatus Values
| Value | Description |
|---|---|
| TDD_SEND | TDD has been sent |
| TDD_FAILED | TDD sending failed |
| TDD_APPROVED | TDD approved |
| TDD_ACKNOWLEDGED | TDD acknowledged |
| TDD_REJECTED | TDD rejected |
| WITHDRAW_SEND | Withdrawal request sent |
| WITHDRAW_FAILED | Withdrawal request failed |
401 - Unauthorized
Trigger
When the user is not a member of the specified company or an invalid JWT token is provided.
Response body
{
"errorMessage": "Authorization failed!",
"errorType": "AUTHORIZATION_FAILED",
"errorTitle": "UNAUTHORIZED",
"status": 401,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/peppol/invalid-documents"
}
An AuthorizationServiceException is thrown when the user is not associated with the specified company, returning a 401 Unauthorized response.
500 - Internal Server Error
Trigger
When an unexpected server error occurs.
Response body
{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"status": 500,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/peppol/invalid-documents"
}
Returns a 500 Internal Server Error when an unexpected server-side error occurs.
12. Invoice MLS List GET
Purpose of Use: This endpoint retrieves the list of Message Level Status (MLS) records associated with a specific invoice. MLS represents transaction-level responses received against invoices sent over the PEPPOL network.
Each MLS record contains the response type (acceptance, acknowledgement, rejection), the received timestamp, direction (incoming/outgoing), MLS type, and any error lines if present. Access requires the authenticated user to belong to the specified company.
Endpoint Information
| Property | Value |
|---|---|
| URL | /peppol/invoice-mls-list |
| Method | GET |
| Content-Type | application/json |
| Base URL | Stage Environment URLhttps://api-stage.evatrauae.com/ Production Environment URLhttps://api.evatrauae.com/ |
| Authorization | Bearer Token (R-Auth Header) Required |
Example Request
curl --location 'https://api-stage.evatrauae.com/peppol/invoice-mls-list?companyId={{company_uuid}}&invoiceId={{invoice_uuid}}' \
--header 'accept: */*' \
--header 'R-Auth: {{jwt_token}}'
Request Parameters
Query Parameters
| Field Name | Type | Required | Description |
|---|---|---|---|
| companyId | string (UUID) | Yes | The unique identifier of the company used for authorization. The authenticated user must belong to this company. |
| invoiceId | string (UUID) | Yes | The unique identifier of the invoice whose MLS records are to be retrieved. |
Responses
200 - Successful Response
Returns the list of MLS records for the specified invoice. The list may be empty if no MLS records exist for the invoice.
Response body (List<MlsDetailDto>)
[
{
"responseType": "ACCEPTANCE",
"receivedTime": "2026-03-15T10:30:00",
"direction": "INCOMING",
"mlsType": "INVOICE_RESPONSE",
"errorLines": []
},
{
"responseType": "REJECTION",
"receivedTime": "2026-03-14T08:45:00",
"direction": "OUTGOING",
"mlsType": "INVOICE_RESPONSE",
"errorLines": [
{
"errorField": "TaxAmount",
"responseCode": "REJECTION",
"description": "Tax amount does not match invoice total",
"statusReasonCode": "BUSINESS_RULE_FATAL"
}
]
}
]
Response Fields
Root Fields
| Field | Type | Description |
|---|---|---|
| responseType | string (enum) | MLS response type: ACCEPTANCE, ACKNOWLEDGING, or REJECTION |
| receivedTime | string (ISO 8601) | The timestamp when the MLS message was received or sent |
| direction | string (enum) | Message direction: INCOMING (received from counterpart) or OUTGOING (sent by your side) |
| mlsType | string (enum) | MLS type: INVOICE_RESPONSE, TDD_RESPONSE, or TDD_REPORT |
| errorLines | Array<MLSErrorLine> | List of error lines. May be populated when responseType is REJECTION. Typically empty for ACCEPTANCE. |
Parameter Value Reference
MLSResponseCode Values
| Value | Description |
|---|---|
| ACCEPTANCE | Invoice accepted (code: AP) |
| ACKNOWLEDGING | Invoice is being processed, result pending (code: AB) |
| REJECTION | Invoice rejected (code: RE) |
MLRDirection Values
| Value | Description |
|---|---|
| INCOMING | Incoming MLS message (received from the counterpart) |
| OUTGOING | Outgoing MLS message (sent by your side) |
MLSType Values
| Value | Description |
|---|---|
| INVOICE_RESPONSE | Response to an invoice |
| TDD_RESPONSE | Response to a transport delivery document (TDD) |
| TDD_REPORT | Report for a transport delivery document (TDD) |
MLSStatusReasonCode Values
| Value | Description |
|---|---|
| BUSINESS_RULE_FATAL | Business rule violation - fatal error (code: BV) |
| BUSINESS_RULE_WARNING | Business rule violation - warning (code: BW) |
| DELIVERY_FAILURE | Failure of delivery (code: FD) |
| SYNTAX_VIOLATION | Syntax violation (code: SV) |
Error Lines (errorLines[])
| Field | Type | Description |
|---|---|---|
| errorLines[].errorField | string | The name of the field where the error occurred (e.g., TaxAmount, InvoiceId) |
| errorLines[].responseCode | string (enum) | MLS response code for this error line: ACCEPTANCE, ACKNOWLEDGING, or REJECTION |
| errorLines[].description | string | Free-text description explaining the error detail |
| errorLines[].statusReasonCode | string (enum) | Error reason code: BUSINESS_RULE_FATAL, BUSINESS_RULE_WARNING, DELIVERY_FAILURE, or SYNTAX_VIOLATION |
401 - Unauthorized
Trigger
When the authenticated user does not belong to the specified company, or the R-Auth header is invalid or expired.
Response body
{
"errorMessage": "Authorization failed",
"errorType": "AUTHORIZATION_FAILED",
"errorTitle": "UNAUTHORIZED",
"status": 401,
"errorId": "{{correlation_id}}",
"timestamp": "2026-03-15T10:30:00",
"path": "/peppol/invoice-mls-list"
}
An AuthorizationServiceException is thrown when the checkIfCompanyUser check fails, returning a 401 Unauthorized response. This also occurs when the R-Auth header is missing or contains an expired JWT token.
500 - Internal Server Error
Trigger
When an unexpected server error occurs.
Response body
{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"status": 500,
"errorId": "{{correlation_id}}",
"timestamp": "2026-03-15T10:30:00",
"path": "/peppol/invoice-mls-list"
}
Returns a 500 Internal Server Error when an unexpected server-side error occurs.
13. TDD MLS List GET
Purpose of Use: This endpoint retrieves all MLS (Message Level Status) responses associated with a specific TDD (Transaction Document Data) record.
Users can retrieve the MLS responses for a given company (companyId) and TDD record (tddId) to review the communication status and any potential error lines. Only users belonging to the specified company are authorized to access this endpoint.
Endpoint Information
| Property | Value |
|---|---|
| URL | /peppol/tdd-mls-list |
| Method | GET |
| Content-Type | application/json |
| Base URL | Stage Environment URLhttps://api-stage.evatrauae.com/ Production Environment URLhttps://api.evatrauae.com/ |
| Authorization | Bearer Token (R-Auth Header) |
Example Request
curl --location 'https://api-stage.evatrauae.com/peppol/tdd-mls-list?companyId={{company_uuid}}&tddId={{tdd_uuid}}' \
--header 'accept: */*' \
--header 'R-Auth: {{jwt_token}}'
Request Parameters
Query Parameters
| Field Name | Type | Required | Description |
|---|---|---|---|
| companyId | string (UUID) | Yes | The unique identifier of the company whose MLS list is being queried. The requesting user must be a member of this company. |
| tddId | string (UUID) | Yes | The unique identifier of the TDD record for which MLS responses are to be listed. |
Responses
200 - Successful Response
Successful. Returns a list of MLS responses for the specified TDD record. Returns an empty array if no MLS responses exist for the TDD.
Response body (List<MlsDetailDto>)
[
{
"responseType": "ACCEPTANCE",
"receivedTime": "2026-01-15T12:00:00",
"direction": "INCOMING",
"mlsType": "TDD_RESPONSE",
"errorLines": []
},
{
"responseType": "REJECTION",
"receivedTime": "2026-01-14T09:30:00",
"direction": "OUTGOING",
"mlsType": "TDD_REPORT",
"errorLines": [
{
"errorField": "InvoiceTypeCode",
"responseCode": "REJECTION",
"description": "Syntax error in InvoiceTypeCode field",
"statusReasonCode": "SYNTAX_VIOLATION"
}
]
}
]
Response Fields
Root Fields
| Field | Type | Description |
|---|---|---|
| responseType | string (enum) | The type of MLS response: acceptance, acknowledging, or rejection |
| receivedTime | string (ISO 8601) | The date and time when the MLS response was received or sent |
| direction | string (enum) | The direction of the MLS response: incoming or outgoing |
| mlsType | string (enum) | The type of MLS message: invoice response, TDD response, or TDD report |
| errorLines | Array<MLSErrorLine> | List of error detail lines. Returns an empty array when no errors are present. |
Parameter Value Reference
MLSResponseCode Values
| Value | Description |
|---|---|
| ACCEPTANCE | Acceptance — message was successfully accepted (code: AP) |
| ACKNOWLEDGING | Acknowledging — message was received and is being processed (code: AB) |
| REJECTION | Rejection — message was rejected (code: RE) |
MLRDirection Values
| Value | Description |
|---|---|
| INCOMING | Incoming MLS response |
| OUTGOING | Outgoing MLS response |
MLSType Values
| Value | Description |
|---|---|
| INVOICE_RESPONSE | Invoice response message |
| TDD_RESPONSE | TDD response message |
| TDD_REPORT | TDD report message |
MLSStatusReasonCode Values
| Value | Description |
|---|---|
| BUSINESS_RULE_FATAL | Business rule violation — fatal error (code: BV) |
| BUSINESS_RULE_WARNING | Business rule violation — warning (code: BW) |
| DELIVERY_FAILURE | Failure of delivery (code: FD) |
| SYNTAX_VIOLATION | Syntax violation (code: SV) |
Error Line Information (errorLines[])
| Field | Type | Description |
|---|---|---|
| errorLines[].errorField | string | The name of the field related to the error |
| errorLines[].responseCode | string (enum) | The MLS response code for this error line |
| errorLines[].description | string | A human-readable description of the error |
| errorLines[].statusReasonCode | string (enum) | The status reason code identifying the cause of the error |
401 - Unauthorized
Trigger
When the user does not belong to the specified company or the R-Auth token is invalid.
Response body
{
"errorMessage": "Authorization failed",
"errorType": "AUTHORIZATION_FAILED",
"errorTitle": "UNAUTHORIZED",
"status": 401,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/peppol/tdd-mls-list"
}
An AuthorizationServiceException is thrown when the requesting user is not a member of the company identified by companyId, returning a 401 Unauthorized response.
500 - Internal Server Error
Trigger
When an unexpected server error occurs.
Response body
{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"status": 500,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/peppol/tdd-mls-list"
}
Returns a 500 Internal Server Error when an unexpected server-side error occurs.
14. Retry Failed TDD POST
Purpose of Use: This endpoint is used to re-submit a Tax Data Document (TDD) record that is currently in TDD_FAILED or TDD_REJECTED status.
During the operation, the related invoice or invalid document is located and the TDD is reprocessed with the RESUBMIT type. Both regular invoices (invoiceId) and invalid Peppol documents (invalidInvoiceId) are supported; at least one of the parameters must be provided.
Endpoint Information
| Property | Value |
|---|---|
| URL | /peppol/tdd/retry-failed |
| Method | POST |
| Content-Type | application/json |
| Base URL | Stage Environment URLhttps://api-stage.evatrauae.com/ Production Environment URLhttps://api.evatrauae.com/ |
| Authorization | Bearer Token (R-Auth Header) Required |
Example Request
curl --location --request POST 'https://api-stage.evatrauae.com/peppol/tdd/retry-failed?companyId={{company_uuid}}&invoiceId={{invoice_uuid}}' \
--header 'accept: */*' \
--header 'R-Auth: {{jwt_token}}'
Request Parameters
Query Parameters
| Field Name | Type | Required | Description |
|---|---|---|---|
| companyId | string (UUID) | Yes | Unique identifier of the company performing the operation |
| invoiceId | string (UUID) | Conditional* | Unique identifier of the invoice to be retried |
| invalidInvoiceId | string (UUID) | Conditional* | Unique identifier of the invalid Peppol document to be retried |
Note
- At least one of invoiceId or invalidInvoiceId must be provided. If both are omitted, a 400 Bad Request error is returned.
Responses
200 - Successful Response
The retry operation was successfully initiated. The response body is empty.
Response
No JSON body. The server returns HTTP 200 OK with an empty response body on success.
Response Fields
Root Fields
| Field | Type | Description |
|---|---|---|
| (empty) | Void | This endpoint returns an empty HTTP 200 OK response on success. No JSON body is included. |
400 - Bad Request
Trigger
When both invoiceId and invalidInvoiceId are omitted, or when the TDD record's status is not TDD_FAILED or TDD_REJECTED.
Response body
{
"errorMessage": "Status not allowed for this operation",
"errorType": "STATUS_NOT_ALLOWED",
"errorTitle": "BAD_REQUEST",
"status": 400,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/peppol/tdd/retry-failed"
}
An IllegalArgumentException is thrown in two cases: (1) when neither invoiceId nor invalidInvoiceId is provided, (2) when the TDD record's current status is not TDD_FAILED or TDD_REJECTED.
401 - Unauthorized
Trigger
When the authenticated user is not a member of the specified company.
Response body
{
"errorMessage": "Authorization failed!",
"errorType": "AUTHORIZATION_FAILED",
"errorTitle": "UNAUTHORIZED",
"status": 401,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/peppol/tdd/retry-failed"
}
An AuthorizationServiceException is thrown when the JWT token holder is not a member of the company identified by companyId, returning a 401 Unauthorized response.
404 - Not Found
Trigger
When no TDD record is found matching the provided invoiceId or invalidInvoiceId.
Response body
{
"errorMessage": "Document not found",
"errorType": "DOCUMENT_NOT_FOUND",
"errorTitle": "NOT_FOUND",
"status": 404,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/peppol/tdd/retry-failed"
}
A NotFoundException is thrown when no TaxDataDocument record can be found in the database matching the provided invoiceId or invalidInvoiceId, returning a 404 Not Found response.
500 - Internal Server Error
Trigger
When an unexpected server error occurs.
Response body
{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"status": 500,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/peppol/tdd/retry-failed"
}
Returns a 500 Internal Server Error when an unexpected server-side error occurs.
15. TDD Withdraw POST
Purpose of Use: This endpoint initiates the withdrawal of a previously submitted Tax Data Document (TDD). The target TDD is identified via an invoice ID or an invalid document ID.
The document must not be in TDD_FAILED or WITHDRAW_SEND status. On success, the endpoint returns HTTP 200 with no response body.
Endpoint Information
| Property | Value |
|---|---|
| URL | /peppol/tdd/withdraw |
| Method | POST |
| Content-Type | Not Required |
| Base URL | Stage Environment URLhttps://api-stage.evatrauae.com/ Production Environment URLhttps://api.evatrauae.com/ |
| Authorization | Bearer Token (R-Auth Header) |
Example Request
curl --location --request POST 'https://api-stage.evatrauae.com/peppol/tdd/withdraw?companyId={{company_uuid}}&invoiceId={{invoice_uuid}}' \
--header 'accept: */*' \
--header 'R-Auth: {{jwt_token}}'
Request Parameters
Query Parameters
| Field Name | Type | Required | Description |
|---|---|---|---|
| companyId | string (UUID) | Yes | Unique identifier of the company performing the operation (Query Parameter) |
| invoiceId | string (UUID) | Conditional* | Unique identifier of the invoice linked to the TDD to be withdrawn (Query Parameter) |
| invalidInvoiceId | string (UUID) | Conditional* | Unique identifier of the invalid document linked to the TDD to be withdrawn (Query Parameter) |
Note
- At least one of invoiceId or invalidInvoiceId must be provided. If both are omitted, a 400 error is returned.
Parameter Value Reference
TddWithdrawalStatus Values
| Value | Description |
|---|---|
| TDD_SEND | TDD submitted, eligible for withdrawal |
| TDD_APPROVED | TDD approved, eligible for withdrawal |
| TDD_ACKNOWLEDGED | TDD acknowledged, eligible for withdrawal |
| TDD_REJECTED | TDD rejected, eligible for withdrawal |
| WITHDRAW_FAILED | Previous withdrawal failed, can be retried |
| TDD_FAILED | NOT eligible — withdrawal attempt returns 400 |
| WITHDRAW_SEND | NOT eligible — withdrawal attempt returns 400 |
Responses
200 - Successful Response
TDD withdrawal was successfully initiated. No response body is returned.
Response
No JSON body. The server returns HTTP 200 OK with an empty response body on success.
Response Fields
Root Fields
| Field | Type | Description |
|---|---|---|
| — | — | This endpoint returns no response body (HTTP 200 with empty body). |
400 - Bad Request
Trigger
When both invoiceId and invalidInvoiceId are omitted, or the TDD's current status does not allow withdrawal (TDD_FAILED or WITHDRAW_SEND).
Response body
{
"errorMessage": "Status not allowed for this operation",
"errorType": "STATUS_NOT_ALLOWED",
"errorTitle": "BAD_REQUEST",
"status": 400,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/peppol/tdd/withdraw"
}
An IllegalArgumentException is thrown when the TDD is in TDD_FAILED or WITHDRAW_SEND status, or when neither ID parameter is provided, returning 400 Bad Request.
401 - Unauthorized
Trigger
When an invalid or expired JWT token is used, or the user does not belong to the specified company.
Response body
{
"errorMessage": "Access denied",
"errorType": "NOT_AUTHORITY",
"errorTitle": "UNAUTHORIZED",
"status": 401,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/peppol/tdd/withdraw"
}
Returns 401 Unauthorized when the user does not have access to the company or the token is invalid.
404 - Not Found
Trigger
When no TDD entity is found matching the given invoiceId or invalidInvoiceId.
Response body
{
"errorMessage": "Document not found",
"errorType": "DOCUMENT_NOT_FOUND",
"errorTitle": "NOT_FOUND",
"status": 404,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/peppol/tdd/withdraw"
}
A NotFoundException is thrown when no TDD entity exists for the provided ID, returning 404 Not Found.
422 - Unprocessable Entity
Trigger
When a file processing error occurs while withdrawing a TDD linked to an invalid document.
Response body
{
"errorMessage": "File processing error occurred",
"errorType": "FILE_PROCESSING_ERROR",
"errorTitle": "UNPROCESSABLE_ENTITY",
"status": 422,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/peppol/tdd/withdraw"
}
A GeneralException is thrown when the file content cannot be accessed during TDD withdrawal for an invalid document, returning 422 Unprocessable Entity.
500 - Internal Server Error
Trigger
When an unexpected server error occurs.
Response body
{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"status": 500,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/peppol/tdd/withdraw"
}
Returns a 500 Internal Server Error when an unexpected server-side error occurs.