Skip to main content

Serbia E-Invoice


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

PropertyValue
Endpoint/auth/login
MethodPOST
Content-Typeapplication/json
Base URL
Stage Environment URLhttps://app-stage.docnova.ai/
Production Environment URLhttps://api.docnova.ai/
AuthorizationNone (Initial access)

Request Body (JSON)

The following fields are used to define login criteria:

FieldTypeDescription
apiKeyStringA 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”)
emailStringThe 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:

FieldTypeDescription
jwtThe secure session token that must be used as a 'R-Auth' API Key in all subsequent API calls.
expirationDateDateTimeIndicates 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

PropertyValue
KeyEnter R-Auth in the Key field.
Value{{apiKey}} or {{jwt}} (Copy the jwt string returned from the login endpoint.)
Header SettingNavigate to the "Headers" tab of the request to be sent.

1. Introduction

This document is designed to provide a comprehensive technical and functional overview of the API integration processes for the erechnungen24 e-invoicing portal.

erechnungen24 is a Peppol-accredited software platform fully compliant with Germany’s digital transformation and e-invoicing (e-Rechnung) requirements.

Our API infrastructure enables enterprise systems to generate and transmit data in legal standards such as XRechnung and ZUGFeRD, while facilitating real-time status tracking across international networks.

This guide is structured to allow development teams to incorporate portal features into their business workflows with minimum effort and maximum compliance.

2. Authentication POST

Purpose of Use: This endpoint is utilized by ERP systems to obtain the session key (JWT Token) required to establish a secure connection and initiate data exchange with the erechnungen24 portal.

An enterprise ERP system must trigger this endpoint to receive a valid authentication token before performing actions such as transmitting invoices or querying compliance reports via the portal. The acquired token is then provided in the "Authorization" header for all subsequent API requests. This mechanism ensures that data traffic between the ERP and the portal is conducted via a secure, time-bound key rather than transmitting sensitive user credentials for every transaction.

Endpoint Information

PropertyValue
URL/auth/login
MethodPOST
Content-Typeapplication/json
Base URL
Stage Environment URLhttps://app-stage.docnova.ai/
Production Environment URLhttps://api.docnova.ai/
AuthorizationNot required (public endpoint)

Example Request

curl --location 'https://api-stage.docnova.ai/auth/login' \
--header 'Content-Type: application/json' \
--header 'Accept: */*' \
--data-raw '{
"apiKey": "{{your_api_key}}",
"email": "user@example.com"
}'

Request Parameters

FieldTypeRequiredDescription
emailStringOptionalUser's registered email address
apiKeyStringYesObtained from the portal, via the settings > ERP Management > API Management menu.

Responses


200 - Login Successful

Full Response (AccountInfo)

{
"id": "a1b2c3d4-e5f6-7890-abcd-...",
"superAdmin": false,
"companies": [
{
"id": "60ccd1a7-5348-47b2-9ef6-...",
"name": "Example Company Ltd.",
"taxNumber": "1234567890",
"vatNumber": "DE123456789",
"email": "info@examplecompany.com",
"website": "https://www.examplecompany.com",
"address": "Example Street No: 1",
"city": "Berlin",
"state": "Berlin",
"country": "DE",
"postalCode": "10115",
"phoneNumber": "+49 30 1234567",
"credit": 1000,
"userCount": 5,
"portalType": "RECHNUNG",
"mailLanguage": "DE",
"currencyCode": "EUR",
"sftp": false,
"isSubCompany": false,
"featureAllowed": true,
"participants": [
{
"id": "participant-uuid",
"peppolId": "0088:1234567890"
}
]
}
],
"jwt": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"expirationDate": "2026-01-30T10:30:00.000Z",
"refreshToken": "refresh-token-string",
"refreshTokenExpiration": "2026-02-28T10:30:00.000Z",
"user": {
"id": "user-uuid",
"email": "user@example.com",
"firstName": "John",
"lastName": "Doe",
"phoneNumber": "+49 170 1234567",
"photoUrl": "https://example.com/photo.jpg",
"mailLang": "EN",
"isSuperAdmin": false,
"lastLoginTime": "2026-01-29T10:30:00",
"featureAllowed": true
},
"mfaEnabled": false,
"mfaType": null,
"secretImageUri": null,
"lastCompanyId": "60ccd1a7-5348-47b2-9ef6-...",
"requiresRecaptchaV2": false,
"message": null,
"active": true,
"isAppLogin": false
}

Basic Response (JwtBasicResponse)

{
"jwt": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"expirationDate": "2026-01-30T10:30:00.000Z"
}

Response Fields


Account Information Fields

FieldTypeDescription
idStringUser unique identifier
superAdminBooleanWhether user has super admin privileges
companiesArray<AuthorizedCompany>List of companies user is authorized to access
jwtStringJWT access token. Used in R-Auth header for API requests
expirationDateDateTimeJWT token expiration date
refreshTokenStringRefresh token for obtaining new access tokens
refreshTokenExpirationDateTimeRefresh token expiration date
userObjectUser detail information
mfaEnabledBooleanWhether multi factor authentication is enabled
mfaTypeEnumMFA type (GOOGLE, WHATSAPP)
secretImageUriStringGoogle Authenticator QR code URI
lastCompanyIdStringLast selected company ID
requiresRecaptchaV2BooleanWhether reCAPTCHA v2 verification is required
messageStringStatus message (e.g., "MFA required")
activeBooleanWhether user account is active
isAppLoginBooleanWhether this is a mobile app login

Parameter Values Reference Table

currentCountry Values (Sample List)

ValueDescription
DEGermany
ATAustria
RORomania
KZKazakhstan
TRTurkey
FIFinland
FRFrance
ITItaly
NLNetherlands
ESSpain
SESweden
PLPoland
BEBelgium
DKDenmark
NONorway
MYMalaysia
SGSingapore
AUAustralia
NZNew Zealand
JPJapan
EGEgypt
RSSerbia
GLOBALGlobal (default)

Company Information Fields

FieldTypeDescription
idStringCompany unique identifier
nameStringCompany name
taxNumberStringTax number
vatNumberStringVAT number
emailStringCompany email address
websiteStringCompany website
addressStringAddress
cityStringCity
stateStringState or Region
countryEnumCountry code
postalCodeStringPostal code
phoneNumberStringPhone number
faxNumberStringFax number
creditIntegerAvailable credit
userCountIntegerTotal user count
portalTypeEnumPortal type
mailLanguageEnumEmail language
currencyCodeStringCurrency code
sftpBooleanWhether SFTP integration is active
isSubCompanyBooleanWhether it's a sub company
featureAllowedBooleanWhether feature access is granted
participantsArrayPeppol participant information

User Information Fields

FieldTypeDescription
idStringUser unique identifier
emailStringUser email address
firstNameStringUser first name
lastNameStringUser last name
phoneNumberStringUser phone number
photoUrlStringUser photo URL
mailLangEnumUser email language
isSuperAdminBooleanWhether user has super admin privileges
lastLoginTimeDateTimeLast login time
featureAllowedBooleanWhether feature access is granted

Enum Values Reference Table

mfaType Values

ValueDescription
GOOGLEGoogle Authenticator verification
WHATSAPPWhatsApp verification

portalType Values

ValueDescription
DEFAULTDefault portal
RECHNUNGGermany main portal
KZKazakhstan portal
RORomania portal
AUAustralia portal
ATAustria portal
BEBelgium portal
DKDenmark portal
EGEgypt portal
FIFinland portal
FRFrance portal
ITItaly portal
MYMalaysia portal
NLNetherlands portal
NONorway portal
PLPoland portal
RSSerbia portal
SESweden portal
SGSingapore portal

mailLanguage Values

ValueDescription
DEGerman
ENEnglish
TRTurkish
RORomanian
PLPolish
FRFrench
ITItalian
ESSpanish
NLDutch

200 - Login Successful

Basic Response (JwtBasicResponse)

{
"jwt": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"expirationDate": "2026-01-30T10:30:00.000Z"
}

401 - Unauthorized

{
"timestamp": "2026-01-29T10:30:00.000Z",
"status": 401,
"error": "Unauthorized",
"message": "Invalid email or password"
}

403 - MFA Required

{
"id": "user-uuid",
"mfaEnabled": true,
"mfaType": "GOOGLE",
"message": "MFA verification required",
"jwt": null
}

429 - Too Many Requests

{
"timestamp": "2026-01-29T10:30:00.000Z",
"status": 429,
"error": "Too Many Requests",
"message": "Too many failed login attempts. Please try again later.",
"requiresRecaptchaV2": true
}

3. Search Processing History POST

Purpose of Use: The POST /invoice/document-process/search endpoint serves as the central monitoring and querying interface for all document processing activities within the system. Every document whether it is an invoice, credit note, or waybill that enters or leaves the platform passes through an asynchronous processing pipeline. This endpoint provides full visibility into that pipeline.

Endpoint Information

PropertyValue
URL/invoice/document-process/search
MethodPOST
Content-Typeapplication/json
Base URL
Stage Environment URLhttps://app-stage.docnova.ai/
Production Environment URLhttps://api.docnova.ai/
AuthorizationR-Auth header (JWT token)
Required AuthorityADMIN, INCOMING_INVOICE_DISPLAY, or OUTGOING_INVOICE_DISPLAY (at least one)

Example Request

curl --location 'https://api-stage.docnova.ai/invoice/document-process/search?page=0&size=20&sort=createdAt,desc' \
--header 'Content-Type: application/json' \
--header 'Accept: */*' \
--header 'R-Auth: <JWT_TOKEN>' \
--data '{
"companyId": "<COMPANY_UUID>",
"createdAt": {
"from": "2024-01-01",
"to": "2026-02-28"
}
}'

Request Parameters

FieldTypeRequiredDescription
companyIdUUIDYesUnique identifier of the company to search
directionString (Enum)NoDocument direction filter (INCOMING or OUTGOING)
sourceString (Enum)NoSource system filter
filenameStringNoExact match filter by filename
statusString (Enum)NoDocument processing status filter
createdAtObject (DateRange)NoCreation date range filter
createdAt.fromString (LocalDate)NoStart date (inclusive). Format: yyyy-MM-dd. Must be past or present
createdAt.toString (LocalDate)NoEnd date (inclusive). Format: yyyy-MM-dd. Must be past or present

Query Parameters (Pagination)

FieldTypeDefaultDescription
pageInteger0Page number (0 indexed)
sizeInteger20Number of records per page (max 100)
sortStringcreatedAt,descSort field and direction. Format: field,asc|desc

Enum Value Reference

direction Values (Document Direction)

ValueDescription
INCOMINGIncoming document
OUTGOINGOutgoing document

status Values (Processing Status)

ValueDescription
PENDINGQueued and waiting for processing
PROCESSINGCurrently being processed
COMPLETEDSuccessfully completed
FAILEDProcessing failed (retriable)
SENDING_FAILEDFailed at the sending stage
PERMANENT_FAILEDPermanently failed (will not be retried)

source Values (Source and Target System)

ValueDescription
ERPERP integration
PORTALWeb portal
PORTAL_OCRPortal upload via OCR
EMAIL_OCROCR via email
EMAILEmail
PEPPOLPeppol network
SFTPSFTP connection
KSEFPoland KSeF system
ANAFRomania ANAF system
LHDNMMalaysia LHDNM system
NEMHANDELDenmark NemHandel
RS_APISerbia API
ETAEgypt ETA system
ERACUNeRacun system
HARVESTHarvest integration
SHOPIFYShopify integration
AMAZON_SPAmazon SP API
EBAYeBay integration
HUBSPOTHubSpot integration
LAZADALazada integration
STRIPEStripe integration
SERVICEInternal service

documentType Values (Document Format)

ValueDescription
PEPPOL_BISPeppol BIS 3.0
XRECHNUNGXRechnung (UBL)
XRECHNUNG_CIIXRechnung (CII)
ZUGFERDZUGFeRD
FACTUR_XFactur X
CIICross Industry Invoice
CIDCID format
RO_EFACTURARomania e Factura
MY_INVOISMalaysia MyInvois
MY_PINTMalaysia PINT
DK_OIOUBLDenmark OIOUBL
EG_INVOICEEgypt invoice
HR_INVOICECroatia invoice
UAE_PINTUAE PINT
KZ_ESF_V2Kazakhstan ESF v2
KSEFPoland KSeF
KSEF_OFFLINEPoland KSeF (offline)

waybillType Values (Waybill Type)

ValueDescription
RS_WAYBILL_DESPATCHSerbia despatch waybill
RS_WAYBILL_RECEIPTSerbia receipt waybill
RS_APPLICATION_RESPONSESerbia application response
RO_ETRANSPORTRomania e Transport

Responses


200 - Successful Response

{
"content": [
{
"trackingId": "a1b2c3d4-...",
"companyId": "60ccd1a7-...",
"direction": "INCOMING",
"documentType": "XRECHNUNG",
"waybillType": null,
"source": "ERP",
"target": "PEPPOL",
"status": "COMPLETED",
"filename": "invoice_2024_001.xml",
"invoiceNumber": "INV-2024-001",
"documentId": "f5e6d7c8-...",
"sendingResult": "OK",
"errorType": null,
"errors": null,
"additionalData": null,
"createdAt": "2024-06-15T10:30:00",
"statusUpdatedAt": "2024-06-15T10:30:45",
"completedAt": "2024-06-15T10:31:00"
}
],
"totalElements": 150,
"totalPages": 8,
"number": 0,
"size": 20
}

Response Fields

FieldTypeDescription
contentArray<Object>Page content (document processing records)
content[].trackingIdUUIDProcessing tracking identifier
content[].companyIdUUIDCompany identifier
content[].directionString (Enum)Document direction (INCOMING / OUTGOING)
content[].documentTypeString (Enum)Document format (see documentType enum table)
content[].waybillTypeString (Enum) | nullWaybill type (only for waybill documents)
content[].sourceString (Enum)Source system of the document
content[].targetString (Enum) | nullTarget system for the document
content[].statusString (Enum)Current processing status
content[].filenameStringOriginal filename
content[].invoiceNumberString | nullInvoice number
content[].documentIdUUID | nullAssociated document identifier
content[].sendingResultString | nullSending result message
content[].errorTypeString (Enum) | nullError type code (on failed processes)
content[].errorsObject | nullError details (validation errors, message list, or text)
content[].additionalDataObject | nullCountry or document type specific metadata
content[].createdAtString (DateTime)Creation timestamp. Format: yyyy-MM-ddTHH:mm:ss
content[].statusUpdatedAtString (DateTime)Last status update timestamp
content[].completedAtString (DateTime) | nullCompletion timestamp (only when COMPLETED)
totalElementsLongTotal number of matching records
totalPagesIntegerTotal number of pages
numberIntegerCurrent page number (0-indexed)
sizeIntegerNumber of records per page

400 - Bad Request

Trigger: When the companyId field is sent as null in the request body (@NotNull validation) or when required fields are missing.
Scenario: Sending a request without providing companyId.

{
"errorMessage": "Document process required fields: companyId",
"errorType": "DOCUMENT_PROCESS_REQUIRED_FIELDS",
"errorTitle": "BAD_REQUEST",
"errorId": "corr-8f2a1b3c",
"status": 400,
"timestamp": "2026-02-11T14:30:00",
"path": "/invoice/document-process/search"
}

400 - Bad Request

Trigger: When the request body JSON format is malformed, an invalid enum value is sent, or the date format is incorrect.

Scenario: Sending a value like "UNKNOWN_STATUS" that is not defined in the enum for the status field, or sending an invalid date like "2024-13-45" for the createdAt.from field.

{
"errorMessage": "Invalid request. Cannot deserialize value of type `DocumentProcessStatus` from String \"UNKNOWN_STATUS\"",
"errorType": "INVALID_REQUEST",
"errorTitle": "BAD_REQUEST",
"errorId": "corr-4d5e6f7a",
"status": 400,
"timestamp": "2026-02-11T14:30:00",
"path": "/invoice/document-process/search"
}

401 - Unauthorized

Trigger: When the R-Auth header is not provided or the JWT token signature is invalid. This error is caught at the Spring Security filter chain and does not reach the RestExceptionHandler.

Scenario: Sending a request without the header or with a corrupted/tampered token.

{
"error": "Unauthorized",
"message": "Full authentication is required to access this resource",
"status": 401
}

401 - Unauthorized

Trigger: When the JWT token is valid but the user does not have any of the ADMIN, INCOMING_INVOICE_DISPLAY, or OUTGOING_INVOICE_DISPLAY authorities on the specified companyId. Thrown by AuthorizationService.checkAnyAuthorityByCompanyAndUser().

Scenario: Performing a search with a companyId for which the user has no access permissions.

{ 

"errorMessage": "User is not authorized for this operation",
"errorType": "AUTHORIZATION_FAILED",
"errorTitle": "UNAUTHORIZED",
"errorId": "corr-9a8b7c6d",
"status": 401,
"timestamp": "2026-02-11T14:30:00",
"path": "/invoice/document-process/search"
}

498 - Token Expired

Trigger: When the JWT token has expired. Returned by CustomAuthenticationEntryPoint at the Spring Security filter level.

Scenario: Sending a request with an expired JWT token.

{
"errorMessage": "Your session has expired. Please login again.",
"errorType": "TOKEN_EXPIRED",
"errorTitle": "UNAUTHORIZED",
"status": null,
"timestamp": null,
"path": null
}

Note: Since this response is generated at the Security filter level, the timestamp, path, and status fields are not populated by enrichResponse and return null. A custom HTTP status code of 498 is used.

404 - Not Found

Trigger: When the provided companyId value is not found in the database. A NotFoundException is thrown by CompanyService.

Scenario: Sending a UUID as companyId that has been deleted or never existed.

{
"errorMessage": "Company not found!",
"errorType": "COMPANY_NOT_FOUND",
"errorTitle": "NOT_FOUND",
"errorId": "corr-1b2c3d4e",
"status": 404,
"timestamp": "2026-02-11T14:30:00",
"path": "/invoice/document-process/search"
}

500 - Internal Server Error

Trigger: When an unexpected error occurs on the server side (database connection failure, NullPointerException, etc.). Caught by the RestExceptionHandler catch-all handler.

Scenario: Database access failure, unexpected runtime exception.

{
"errorMessage": "An unexpected error occurred",
"errorType": "SERVER_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"errorId": "corr-5e6f7a8b",
"status": 500,
"timestamp": "2026-02-11T14:30:00",
"path": "/invoice/document-process/search"
}

Response Structure Reference (ExceptionResponse)

FieldTypeDescriptionInclusion Condition
errorMessageStringHuman readable error descriptionAlways
errorTypeStringMachine readable error code (ErrorType enum name)Always
errorTitleString (HttpStatus)HTTP status description (BAD_REQUEST, UNAUTHORIZED, etc.)Always
errorIdStringCorrelation ID (for log tracing)If present in ThreadContext
statusIntegerHTTP status code (numeric)Always
timestampString (DateTime)Timestamp when the error occurredBy RestExceptionHandler
pathStringURI of the requestBy RestExceptionHandler
dataStringAdditional data informationIf present (@JsonInclude NON_NULL)
detailsMap<String, Object>Additional detail informationIf present (@JsonInclude NON_NULL)
validationErrorsArray<ValidationError>Field level validation errorsIf present (@JsonInclude NON_NULL)

Note: The ExceptionResponse class uses @JsonInclude(JsonInclude.Include.NON_NULL). Therefore, fields with null values are excluded from the JSON response.

4. Send Document Async POST

Purpose of Use: This endpoint enables ERP systems to transmit e-invoice data to the erechnungen24 portal asynchronously. It is designed to enhance system responsiveness and efficiently manage the process queue during high-volume data transfers.

After generating an invoice in compliance with German legal standards (XRechnung or ZUGFeRD), the ERP system converts the document into base64 format and transmits it to the portal. Since this method operates asynchronously, the ERP system receives a tracking ID (trackingId) without waiting for the full processing of the document. This prevents delays in ERP-side workflows, and the final status of the document can be queried later using the provided tracking ID.

Endpoint Information

PropertyValue
URL/invoice/send-document-async
MethodPOST
Content-Typeapplication/json
Base URL
Stage Environment URLhttps://app-stage.docnova.ai/
Production Environment URLhttps://api.docnova.ai/
AuthorizationJWT Token (R-Auth header) or API Key

Example Request

curl --location 'https://api-stage.docnova.ai/invoice/send-document-async' \
--header 'Content-Type: application/json' \
--header 'Accept: */*' \
--header 'R-Auth: {{jwt_token}}' \
--data-raw '{
"apiKey": "{{your_api_key}}",
"base64Document": "{{base64_encoded_xml}}",
"base64Pdf": "{{base64_encoded_pdf}}",
"businessType": "B2B",
"compId": "{{company_uuid}}",
"invoiceSource": "PORTAL",
"invoiceType": "ZUGFERD",
"receiverEmails": [
"recipient@example.com"
],
"mailTemplateId": "{{template_id}}"
}'

Request Parameters

FieldTypeRequiredDescription
compIdString (UUID)Conditional*Company unique identifier. Required if apiKey is not provided.
apiKeyStringConditional*API key. Required if compId is not provided.
base64DocumentStringConditional**Base64-encoded XML document. Required if base64Pdf is not provided.
base64PdfStringConditional**Base64-encoded PDF document. Required if base64Document is not provided.
invoiceTypeEnumConditional***Invoice format type. Required if waybillType is not provided.
waybillTypeEnumConditional***Waybill format type. Required if invoiceType is not provided.
businessTypeEnumNoBusiness model type (B2B, B2C, B2G).
invoiceSourceEnumNoDocument source.
receiverEmailsArray<String>NoList of recipient email addresses.
mailTemplateIdStringNoEmail template identifier.

Note:

  • (*) At least one of compId or apiKey must be provided.
  • (**) At least one of base64Document or base64Pdf must be provided.
  • (***) At least one of invoiceType or waybillType must be provided.

businessType Values

ValueDescription
B2BBusiness to Business
B2CBusiness to Consumer
B2GBusiness to Government

invoiceSource Values

ValueDescription
PORTALSubmission via web portal
PORTAL_OCRPortal with OCR processing
EMAILVia email
EMAIL_OCREmail with OCR processing
ERPERP system integration
PEPPOLVia Peppol network
LHDNMMalaysia LHDNM system
NEMHANDELDenmark NemHandel
SERVICEService integration
HARVESTHarvest integration
SHOPIFYShopify integration
AMAZON_SPAmazon SP-API integration
EBAYeBay integration
HUBSPOTHubSpot integration
ANAFRomania ANAF system
LAZADALazada integration
SFTPVia SFTP
KSEFPoland KSeF system
RS_APISerbia API
ETAEgypt ETA system
ERACUNIndonesia e-Racun
STRIPEStripe integration

invoiceType Values

ValueGroupDescription
PEPPOL_BISXRECHNUNGPeppol BIS 3.0 format
XRECHNUNGXRECHNUNGGerman XRechnung format
RO_EFACTURAXRECHNUNGRomania e-Factura format
ZUGFERDZUGFERDZUGFeRD format (PDF/A-3 with XML)
FACTUR_XZUGFERDFactur-X format (France)
XRECHNUNG_CIIZUGFERDXRechnung CII profile
CIIZUGFERDCross Industry Invoice format
CIDZUGFERDCID format
PDFZUGFERDPDF format
MY_INVOISCountry-SpecificMalaysia MyInvois format
MY_PINTCountry-SpecificMalaysia PINT format
DK_OIOUBLCountry-SpecificDenmark OIOUBL format
EG_INVOICECountry-SpecificEgypt e-Invoice format
HR_INVOICECountry-SpecificCroatia e-Invoice format
UAE_PINTCountry-SpecificUAE PINT format
KZ_ESF_V2KazakhstanKazakhstan ESF v2
KSEFPolandPoland KSeF format
KSEF_OFFLINEPolandPoland KSeF offline

waybillType Values

ValueDescription
RS_WAYBILL_DESPATCHSerbia despatch waybill
RS_WAYBILL_RECEIPTSerbia receipt waybill
RS_APPLICATION_RESPONSESerbia application response
RO_ETRANSPORTRomania e-Transport

Responses

200 - Successful Response

{
"trackingId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "PENDING",
"message": "Document queued for processing"
}

Response Fields

FieldTypeDescription
trackingIdUUIDUnique process tracking identifier. This ID can be used to query the processing status.
statusEnumCurrent status of the process.
messageStringDescriptive message about the status.

status Values

ValueDescription
PENDINGProcess queued, not yet started
PROCESSINGProcess in progress
COMPLETEDProcess completed successfully
FAILEDProcess failed
SENDING_FAILEDSending failed
PERMANENT_FAILEDPermanent failure, will not be retried

400 - Bad Request

{
"trackingId": null,
"status": "FAILED",
"message": "Either invoiceType or waybillType must be provided"
}

401 - Unauthorized

{
"timestamp": "2026-01-29T10:30:00.000Z",
"status": 401,
"error": "Unauthorized",
"message": "Invalid or expired token"
}

500 - Internal Server Error

{
"trackingId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "FAILED",
"message": "An unexpected error occurred"
}

5. Document Status GET

Purpose of Use: The GET /invoice/document-status/{trackingId} endpoint is used to query the processing status of documents (invoices, waybills, etc.) that were submitted asynchronously.

When a document is submitted through any of the send-document-async, send-document-async-json, send-by-file-async, or send-portal-new-async endpoints, the system immediately returns a trackingId and begins processing the document in the background.

Polling stops when the status becomes COMPLETED or FAILED.

Endpoint Information

PropertyValue
URL/invoice/document-status/{trackingId}
MethodGET
AuthorizationR-Auth header (JWT token)

Example Request

curl --location 'https://api-stage.docnova.ai/invoice/document-status/{trackingId}' \ 

--header 'Accept: */*' \

--header 'R-Auth: {JWT_TOKEN}'
}'

Request Parameters

Path Parameters

FieldTypeRequiredDescription
trackingIdUUIDYesThe tracking identifier returned from an asynchronous document submission. This is the trackingId value included in the response of send-document-async, send-document-async-json, send-by-file-async, or send-portal-new-async endpoints.

Header Parameters

FieldTypeRequiredDescription
R-AuthString (JWT)YesUser authentication token. A JWT signed with the HS512 algorithm. The payload carries userId, companyId, authorities, and userType information.
AcceptStringNoResponse media type. Default: /

Responses

200 - Successful Response

{
"trackingId": "e20a112a-fcb2-4da2-9efd-...",
"companyId": "a1b2c3d4-e5f6-7890-abcd-...",
"direction": "OUTGOING",
"documentType": "XRECHNUNG",
"waybillType": null,
"source": "ERP",
"target": null,
"status": "COMPLETED",
"filename": "invoice_2025.xml",
"invoiceNumber": "INV-2025-001234",
"documentId": "f47ac10b-58cc-4372-a567-...",
"sendingResult": "SUCCESS",
"errorType": null,
"errors": null,
"additionalData": null,
"createdAt": "2025-06-15T10:30:00",
"statusUpdatedAt": "2025-06-15T10:30:45",
"completedAt": "2025-06-15T10:30:45"
}

Success Response Field Descriptions

FieldTypeDescription
trackingIdUUIDUnique tracking identifier for the document processing
companyIdUUIDUnique identifier of the company the document belongs to
directionString (Enum)Document direction: INCOMING or OUTGOING
documentTypeString (Enum)Document format (e.g., XRECHNUNG, UBL, ZUGFERD)
waybillTypeString (Enum)Waybill type. Only populated for waybill operations
sourceString (Enum)Source platform the document was submitted from (e.g., ERP, PORTAL)
targetString (Enum) | nullTarget platform for the document
statusString (Enum)Current processing status: PENDING, PROCESSING, COMPLETED, FAILED, SENDING_FAILED, PERMANENT_FAILED
filenameStringName of the processed file
invoiceNumberString | nullInvoice number assigned to the document. Populated when processing completes
documentIdUUID | nullUnique system identifier of the created document. Populated when processing completes
sendingResultString | nullSending result (e.g., SUCCESS, SENT_TO_PEPPOL). Populated when processing completes
errorTypeString (Enum) | nullError category when an error occurs. Null for successful operations
errorsObject | nullError details. Variable type: can be List<ValidationError>, List<String>, or String
additionalDataObjectCountry specific additional metadata. Structure varies by country/document type (e.g., Poland KSeF: ksefNumber, Romania: submissionId)
createdAtDateTimeTimestamp when the processing record was created (ISO 8601)
statusUpdatedAtDateTimeTimestamp when the status was last updated (ISO 8601)
completedAtDateTime | nullTimestamp when processing completed. Null while processing is ongoing

Parameter Value Reference

DocumentProcessStatus — Possible Status Values

ValueDescription
PENDINGDocument is queued, processing has not started yet
PROCESSINGDocument is actively being processed (conversion, validation, sending, etc.)
COMPLETEDDocument processing completed successfully
FAILEDAn error occurred during document processing (may be retried)
SENDING_FAILEDDocument was created but failed during the sending phase
PERMANENT_FAILEDDocument processing permanently failed (will not be retried)

DocumentType — Document Direction

ValueDescription
INCOMINGIncoming document
OUTGOINGOutgoing document

DataType — Document Format

ValueDescription
PEPPOL_BISPeppol BIS 3.0 UBL format
XRECHNUNGXRechnung (Germany) UBL format
RO_EFACTURARomania eFactura format
MY_INVOISMalaysia MyInvois format
MY_PINTMalaysia PINT format
DK_OIOUBLDenmark OIOUBL format
EG_INVOICEEgypt e-Invoice format
HR_INVOICECroatia e-Invoice format
UAE_PINTUAE PINT format
ZUGFERDZUGFeRD format
FACTUR_XFactur-X (France) format
XRECHNUNG_CIIXRechnung CII format
CIIUN/CEFACT CII format
PDFUnstructured PDF (paper invoices, images, etc.)
KSEFPoland KSeF format
KSEF_OFFLINEPoland KSeF Offline format
KZ_ESF_V2Kazakhstan ESF v2 format

InvoiceSource — Document Source

ValueDescription
ERPSubmitted via ERP integration
PORTALSubmitted via web portal
PEPPOLReceived via Peppol network
EMAILReceived via email
SFTPTransferred via SFTP
KSEFVia KSeF system
ANAFVia ANAF system (Romania)
ERACUNVia eRacun system (Croatia)
OthersPORTAL_OCR, EMAIL_OCR, LHDNM, NEMHANDEL, SERVICE, HARVEST, SHOPIFY, AMAZON_SP, EBAY, HUBSPOT, LAZADA, RS_API, ETA, STRIPE

WaybillDataType — Waybill Type

ValueDescription
RS_WAYBILL_DESPATCHSerbia despatch waybill
RS_WAYBILL_RECEIPTSerbia receipt waybill
RS_APPLICATION_RESPONSESerbia application response
RO_ETRANSPORTRomania eTransport waybill

ErrorType — Error Types Specific to This Endpoint

ValueMessage
INVOICE_PROCESS_NOT_FOUNDTracking ID not found
VALIDATION_FAILEDValidation failed!
INVOICE_NULL_COULD_NOT_SAVEInvoice is NULL and/or could not be saved!
ZUGFERD_VALIDATION_ERRORZUGFeRD validation error
INVOICE_CREATION_FAILEDInvoice creation failed!
INVOICE_SENDING_FAILEDInvoice sending failed: {details}

404 - Not Found

Returned when the provided trackingId does not exist in the database.
Response Body: null (body is empty)

DetailDescription
HTTP Status404 Not Found
Response Bodynull (body is empty)
TriggerNo DocumentProcessEntity record matches the given trackingId in the database
Internal Error TypeINVOICE_PROCESS_NOT_FOUND — "Tracking ID not found"
ResolutionVerify the trackingId value is correct. Use the value returned in the response of the async submission endpoint

401 - Unauthorized

Returned when the R-Auth header is missing, contains an invalid JWT token, or the token has expired.

{
"status": 401,
"error": "Unauthorized",
"message": "Full authentication is required to access this resource"
}
DetailDescription
HTTP Status401 Unauthorized
TriggerJWT token is missing, malformed, expired, or signature verification failed
ResolutionSend a valid, non-expired JWT token in the R-Auth header

500 - Internal Server Error

Returned when an unexpected server error occurs during the status query.
Response Body: null (body is empty)

DetailDescription
HTTP Status500 Internal Server Error
Response Bodynull (body is empty)
TriggerDatabase connection failure, entity conversion error, or other unexpected runtime exceptions
ResolutionCheck server logs. Contact the support team if the issue persists

Status-Based Response Examples

PENDING — Queued for Processing


{
"trackingId": "e20a112a-fcb2-4da2-9efd-...",
"companyId": "a1b2c3d4-e5f6-7890-abcd-...",
"direction": null,
"documentType": "XRECHNUNG",
"status": "PENDING",
"documentId": null,
"invoiceNumber": null,
"sendingResult": null,
"errorType": null,
"errors": null,
"createdAt": "2025-06-15T10:30:00",
"statusUpdatedAt": "2025-06-15T10:30:00",
"completedAt": null
}

PROCESSING — Currently Processing

{
"trackingId": "e20a112a-fcb2-4da2-9efd-...",
"companyId": "a1b2c3d4-e5f6-7890-abcd-...",
"direction": "OUTGOING",
"documentType": "XRECHNUNG",
"status": "PROCESSING",
"documentId": "f47ac10b-58cc-4372-a567-...",
"invoiceNumber": "INV-2025-001234",
"sendingResult": null,
"errorType": null,
"errors": null,
"createdAt": "2025-06-15T10:30:00",
"statusUpdatedAt": "2025-06-15T10:30:20",
"completedAt": null
}

FAILED — Processing Failed (Validation Error)


{
"trackingId": "e20a112a-fcb2-4da2-9efd-...",
"companyId": "a1b2c3d4-e5f6-7890-abcd-...",
"direction": null,
"documentType": "ZUGFERD",
"status": "FAILED",
"documentId": null,
"invoiceNumber": null,
"sendingResult": null,
"errorType": "VALIDATION_FAILED",
"errors": [
{
"field": "invoiceNumber",
"message": "Invoice number is required"
},
{
"field": "issueDate",
"message": "Issue date format is invalid"
}
],
"createdAt": "2025-06-15T10:30:00",
"statusUpdatedAt": "2025-06-15T10:30:15",
"completedAt": "2025-06-15T10:30:15"

}

FAILED — Processing Failed (General Error)

{
"trackingId": "e20a112a-fcb2-4da2-9efd-...",
"companyId": "a1b2c3d4-e5f6-7890-abcd-...",
"direction": "OUTGOING",
"documentType": "XRECHNUNG",
"status": "FAILED",
"documentId": null,
"invoiceNumber": null,
"sendingResult": null,
"errorType": "INVOICE_NULL_COULD_NOT_SAVE",
"errors": [
"Invoice is NULL and/or could not be saved! XML parsing error at line 42"
],
"createdAt": "2025-06-15T10:30:00",
"statusUpdatedAt": "2025-06-15T10:30:12",
"completedAt": "2025-06-15T10:30:12"
}

SENDING_FAILED — Sending Failed

{
"trackingId": "e20a112a-fcb2-4da2-9efd-...",
"companyId": "a1b2c3d4-e5f6-7890-abcd-...",
"direction": "OUTGOING",
"documentType": "PEPPOL_BIS",
"status": "SENDING_FAILED",
"documentId": "f47ac10b-58cc-4372-a567-...",
"invoiceNumber": "INV-2025-001234",
"sendingResult": null,
"errorType": "INVOICE_SENDING_FAILED",
"errors": [
"Invoice sending failed: Peppol access point unreachable"
],
"createdAt": "2025-06-15T10:30:00",
"statusUpdatedAt": "2025-06-15T10:31:00",
"completedAt": "2025-06-15T10:31:00"
}

COMPLETED — With Country-Specific Metadata (Poland KSeF)

{
"trackingId": "e20a112a-fcb2-4da2-9efd-...",
"companyId": "a1b2c3d4-e5f6-7890-abcd-...",
"direction": "OUTGOING",
"documentType": "KSEF",
"status": "COMPLETED",
"documentId": "f47ac10b-58cc-4372-a567-...",
"invoiceNumber": "FA/2025/06/001",
"sendingResult": "SUCCESS",
"errorType": null,
"errors": null,
"additionalData": {
"sessionReferenceNumber": "20250615-SE-ABC123",
"invoiceReferenceNumber": "20250615-IR-DEF456",
"ksefNumber": "1234567890-20250615-..."
},
"createdAt": "2025-06-15T10:30:00",
"statusUpdatedAt": "2025-06-15T10:31:30",
"completedAt": "2025-06-15T10:31:30"

}

6. Retrieve Doc by ID and Type GET

Purpose of Use: The GET /invoice/get-document/{documentId}/{documentTypes} endpoint allows downloading a previously stored invoice or document in a specific format such as PDF, XML, or JSON.

The client provides the document UUID (documentId) and the desired output format (documentTypes). The API returns the document content as Base64 encoded data. This is mainly used in ERP integrations to programmatically fetch, view, archive, or store invoice documents.

When the requested format is pdf, the API returns the printable or viewable PDF file content as Base64 encoded data.

Endpoint Information

PropertyValue
URL/invoice/get-document//{documentTypes}
MethodGET
AuthorizationR-Auth header (JWT token)

Example Request

curl --location 'https://api-stage.docnova.ai/invoice/get-document/{documentId}/pdf' \
--header 'Accept: */*' \
--header 'R-Auth: {auth-token}'
}'

Request Parameters

Path Parameters

Field NameTypeRequiredDescription
documentIdString (UUID)YesUnique identifier of the document. Must be in UUID v4 format. Example: 550e8400-e29b-41d4-a716-...
documentTypesString (Enum)YesRequested document format type. Multiple types can be separated by hyphen -. Example: PDF, XML

Header Parameters

Field NameTypeRequiredDescription
R-AuthString (JWT)YesAuthentication token. JWT signed with HS512 algorithm.
AcceptStringNoAccepted response media type. Default: /

documentTypes Parameter Values

ValueFormat TypeDescription
PDFFormatType.PDFReturns Base64-encoded PDF representation of the invoice
XMLFormatType.XMLReturns Base64-encoded UBL XML content of the invoice
JSONFormatType.JSONReturns Base64-encoded UBL DTO JSON content of the invoice
PDF-XMLMultiple formatsMultiple formats can be requested simultaneously using hyphen separator
XML-PDF-JSONMultiple formatsAll three formats can be requested at once

Note: JSON format is only supported for invoices processed by OCR (OCR_PARSED) or completed by MelAI (COMPLETED_BY_MELAI_AI).

Responses

200 - Successful Response

{
"documents": [
{
"file_type": "PDF",
"data": "JVBERi0xLjQKJeLjz9MKMSAwIG9iago8PC..."
}
]
}

Successful Response Field Descriptions

Field NameTypeDescription
documentsList<Document>List of documents in requested formats. Contains one Document object per format.
documents[].file_typeString (Enum)Document format type. Possible values: PDF, XML, JSON
documents[].dataString (Base64)Base64-encoded content of the document. When decoded for PDF, produces a valid PDF file.

Multi-Format Response Example

{
"documents": [
{
"file_type": "XML",
"data": "PD94bWwgdmVy... (base64)"
},
{
"file_type": "PDF",
"data": "JVBERi0xLjQK... (base64)"
}
]
}

401 - Unauthorized

Returned when an invalid or missing R-Auth token is provided.


{
"errorMessage": "Authentication is required. Please complete the authentication process.",
"errorType": "AUTHENTICATION_REQUIRED",
"errorTitle": "UNAUTHORIZED",
"errorId": "corr-abc123",
"status": 401,
"timestamp": "2026-02-11T14:30:00",
"path": "/invoice/get-document/af6e8982-b791-4704-bc06-.../pdf"
}

FieldDescription
errorMessageIndicates that the authentication process must be completed.
errorTypeAUTHENTICATION_REQUIRED Token is missing, expired, or invalid.
status401

400 - Bad Request

Returned when an invalid documentTypes value is provided.


{

"errorMessage": "Unsupported document type: DOCX",
"errorType": "INVALID_ARGUMENT",
"errorTitle": "BAD_REQUEST",
"errorId": "corr-def456",
"status": 400,
"timestamp": "2026-02-11T14:31:00",
"path": "/invoice/get-document/af6e8982-b791-4704-bc06-.../docx"
}

FieldDescription
errorMessageSpecifies the unsupported document type and which type was invalid.
errorTypeINVALID_ARGUMENT An invalid parameter was provided.
status400

400 - Bad Request

Returned when the document's OCR processing has not yet completed (waiting state).

{
"errorMessage": "Invoice is waiting for MelaAIParser. Please try again later",
"errorType": "INVALID_ARGUMENT",
"errorTitle": "BAD_REQUEST",
"errorId": "corr-ghi789",
"status": 400,
"timestamp": "2026-02-11T14:32:00",
"path": "/invoice/get-document/af6e8982-b791-4704-bc06-.../json"
}

FieldDescription
errorMessageIndicates the invoice has not been processed by MelaAI yet and should be retried later.
errorTypeINVALID_ARGUMENT The invoice is not in a processable state currently.
status400

404 - Not Found

Returned when no document matches the provided UUID. Specifically occurs when JSON format is requested and the invoice is not found.

{
"errorMessage": "af6e8982-b791-4704-bc06-d4655faa4b4c Invoice not found!",
"errorType": "NOT_FOUND_INVOICE",
"errorTitle": "NOT_FOUND",
"errorId": "corr-jkl012",
"status": 404,
"timestamp": "2026-02-11T14:33:00",
"path": "/invoice/get-document/af6e8982-b791-4704-bc06-.../json"
}

FieldDescription
errorMessageReturns a not found message along with the document UUID.
errorTypeNOT_FOUND_INVOICE No matching invoice record exists in the database.
status404

500 - Internal Server Error

Returned when an unexpected error occurs (e.g., file cannot be retrieved from S3, PDF conversion fails).

{ 

"errorMessage": "Internal server error",
"errorType": "SERVER_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"errorId": "corr-mno345",
"status": 500,
"timestamp": "2026-02-11T14:34:00",
"path": "/invoice/get-document/af6e8982-b791-4704-bc06-.../pdf"
}
FieldDescription
errorMessageGeneric server error message.
errorTypeSERVER_ERROR An unexpected error occurred.
status500

Common Error Response Field Descriptions

Field NameTypeDescription
errorMessageStringHuman readable description of the error
errorTypeStringProgrammatic classification code of the error
errorTitleString (HttpStatus)Text representation of the HTTP status code
errorIdStringRequest correlation ID (for log tracking)
statusIntegerHTTP status code (numeric)
timestampString (ISO 8601)Timestamp when the error occurred
pathStringEndpoint path where the error occurred
detailsMap<String, Object>Additional error details (if available)
validationErrorsList<ValidationError>List of validation errors (if available)

7. Search Document with Filter POST

Purpose of Use: The POST /invoice/search-documents endpoint is used to search for invoices and documents belonging to a specific company using various filtering criteria.

This API enables users to list documents associated with their company by applying filters such as date range, document direction (incoming or outgoing), invoice status, and document format (ZUGFERD, XRECHNUNG, etc.). Results are returned with pagination support, and each page includes the total document count, tax exclusive total amount, and tax inclusive total amount.

Endpoint Information

PropertyValue
URL/invoice/search-documents
MethodPOST
Content-Typeapplication/json
Base URL
Stage Environment URLhttps://app-stage.docnova.ai/
Production Environment URLhttps://api.docnova.ai/
AuthorizationR-Auth header (JWT token)

Example Request

{ 
curl --location 'https://<BASE_URL>/invoice/search-documents' \
--header 'Content-Type: application/json' \
--header 'Accept: */*' \
--header 'R-Auth: <JWT_TOKEN>' \
--data '{
"companyId": "<COMPANY_UUID>",
"documentType": "OUTGOING",
"endDate": "2026-01-31",
"page": 0,
"size": 10,
"startDate": "2026-01-01",
"status": "SAVED_AS_ZUGFERD",
"type": "ZUGFERD"
}'
}

Request Parameters

FieldTypeRequiredDescription
companyIdUUIDYesUnique identifier of the company to search documents for
documentTypeString (Enum)NoDocument direction filter. Used to filter incoming or outgoing documents
statusString (Enum)NoInvoice status filter. Returns invoices in a specific status
typeString (Enum)NoDocument format type filter. Filters by invoice format
startDateString (ISO Date)NoSearch start date. Format: YYYY-MM-DD
endDateString (ISO Date)NoSearch end date. Format: YYYY-MM-DD
tinStringNoTax Identification Number filter
uitStringNoUIT identifier filter
referenceDocumentStringNoSearch by reference document number
pageIntegerNoPage number (0-based). Default: 0
sizeIntegerNoNumber of records per page. Default: 50

Parameter Values

documentType Values

ValueDescription
INCOMINGIncoming documents (invoices sent by suppliers)
OUTGOINGOutgoing documents (invoices sent to customers)

type Values

ValueGroupDescription
XRECHNUNGUBLGerman XRechnung format (UBL-based)
PEPPOL_BISUBLPeppol BIS 3.0 format
RO_EFACTURAUBLRomanian e-Invoice format
UBLUBLGeneral UBL 2.1 format
MY_INVOISMY_INVOISMalaysian MyInvois format
MY_PINTMY_PINTMalaysian PINT format
DK_OIOUBLDK_OIOUBLDanish OIOUBL format
EG_INVOICEEG_INVOICEEgyptian e-Invoice format
HR_INVOICEHR_INVOICECroatian eRacun format
UAE_PINTUAE_PINTUAE PINT format
ZUGFERDZUGFERDZUGFeRD format (PDF + embedded XML)
FACTUR_XZUGFERDFrench Factur-X format
XRECHNUNG_CIIZUGFERDXRechnung CII format
CIIZUGFERDUN/CEFACT CII format
CIDZUGFERDCID format
PDFZUGFERDUnstructured invoices (paper, images, etc.)
KSEFKSEFPolish KSeF format
KSEF_OFFLINEKSEF_OFFLINEPolish KSeF offline format
KZ_ESF_V2KZ_ESF_V2Kazakhstan e-Invoice v2 format

Note: When using the type filter on the search-documents endpoint, only XRECHNUNG, ZUGFERD, and FACTUR_X values actively filter results. Other values return an empty result set.

status Values

CategoryValueDescription
GeneralCREATEDInvoice created
PENDINGAwaiting processing
CANCELEDCancelled
DELETEDDeleted
SENT_VIA_EMAILSent via email
SavedSAVED_AS_UBLSaved as UBL
SAVED_AS_ZUGFERDSaved as ZUGFeRD
SAVED_AS_FACTUR_XSaved as Factur-X
SAVED_AS_CIISaved as CII
SAVED_AS_CIDSaved as CID
SAVED_AS_KSEFSaved as KSeF
SAVED_AS_PDFSaved as PDF
OCROCR_WAITINGOCR processing pending
OCR_PARSEDOCR completed successfully
OCR_FAILEDOCR processing failed
OCR_PARSED_PENDING_PAYMENTOCR completed, payment pending
OCR_WAITING_TOKENOCR waiting for token
COMPLETED_BY_MELA_AICompleted by Mela AI
PeppolSENT_TO_PEPPOLSent to Peppol network
SENT_TO_ACCESS_POINTSent to Access Point
SUCCESSSuccessfully delivered
TRANSPORT_ERRORTransport error
INVALID_PARAMETERSInvalid parameters
NO_SIGNAL_MESSAGE_RECEIVEDNo signal message received
AS4_ERROR_MESSAGE_RECEIVEDAS4 error message received
INVALID_SIGNAL_MESSAGE_RECEIVEDInvalid signal message received
INCOMING_RESPONSE_ACKNOWLEDGEDIncoming response acknowledged (MLR/MLS)
INCOMING_RESPONSE_REJECTEDIncoming response rejected
INCOMING_RESPONSE_ACCEPTEDIncoming response accepted
OUTGOING_RESPONSE_ACKNOWLEDGEDOutgoing response acknowledged (MLR/MLS)
OUTGOING_RESPONSE_REJECTEDOutgoing response rejected
OUTGOING_RESPONSE_ACCEPTEDOutgoing response accepted
Romania (ANAF)SENT_TO_ANAFSent to ANAF
PORTAL_OKAYPortal approved
PORTAL_ERRORPortal error
PORTAL_ERRORSPortal multiple errors
PORTAL_SYSTEM_ERRORPortal system error
PORTAL_IN_PROCESSPortal processing
Poland (KSeF)KSEF_PENDINGKSeF processing
KSEF_ACCEPTEDKSeF accepted
KSEF_REJECTEDKSeF rejected
KSEF_DUPLICATEKSeF duplicate record
Malaysia (LHDNM)LHDNM_SUBMITTEDSubmitted to LHDNM
LHDNM_VALIDLHDNM valid
LHDNM_INVALIDLHDNM invalid
LHDNM_CANCELLEDLHDNM cancelled
LHDNM_REJECT_REQUESTEDLHDNM rejection requested
LHDNM_REJECTEDLHDNM rejected
LHDNM_ERRORLHDNM error
Egypt (ETA)ETA_SUBMITTEDSubmitted to ETA
Croatia (eRacun)ERACUN_ERROReRacun error
ERACUN_PENDINGeRacun pending
ERACUN_WAITING_TO_SENDeRacun waiting to send
ERACUN_SENTeRacun sent
ERACUN_RECEIVEDeRacun received
ERACUN_APPROVEDeRacun approved
ERACUN_REJECTEDeRacun rejected
ERACUN_FULLY_PAIDeRacun fully paid
ERACUN_PARTIALLY_PAIDeRacun partially paid
ERACUN_DELIVERY_FAILEDeRacun delivery failed
DenmarkSENT_TO_NEMHANDELSent to Nemhandel
OtherCREDIT_BLOCKEDCredit blocked (returns masked data)

Responses

200 - Successful Response

{ 
"totalCount": 2,
"netTotal": 1500.00,
"total": 1785.00,
"invoiceList": [
{
{
"id": "a1b2c3d4-e5f6-7890-abcd-...",
"companyId": "60ccd1a7-5348-47b2-9ef6-...",
"userId": "user-uuid",
"customerName": "Muster GmbH",
"supplierName": "Lieferant AG",
"supplierId": "supplier-uuid",
"supplierVat": "DE123456789",
"status": "SAVED_AS_ZUGFERD",
"invoiceNumber": "INV-2026-001",
"taxExclusiveAmount": 750.00,
"taxInclusiveAmount": 892.50,
"lineExtensionAmount": 750.00,
"payableAmount": 892.50,
"allowanceTotalAmount": 0.00,
"currency": "EUR",
"createdTime": "2026-01-15T10:30:00",
"localCreatedTime": "2026-01-15T11:30:00",
"issueDate": "2026-01-15",
"deliveryDate": "2026-01-20",
"dueDate": "2026-02-15",
"supplierCountryCode": "DE",
"supplierEndpoint": "0204:DE123456789",
"customerId": "customer-uuid",
"customerVat": "DE987654321",
"customerEndpoint": "0204:DE987654321",
"customerCountryCode": "DE",
"typeCode": "380",
"documentType": "OUTGOING",
"errorMessage": null,
"lastUpdatedTime": "2026-01-15T10:30:00",
"localLastUpdatedTime": "2026-01-15T11:30:00",
"type": "ZUGFERD",
"source": "PORTAL",
"sendViaPeppol": false,
"statusTime": "2026-01-15T10:30:00",
"localStatusTime": "2026-01-15T11:30:00",
"fileName": "invoice_001.pdf",
"ocrParser": null,
"paymentDetails": null,
"profileType": "EN16931",
"isActive": true,
"countrySpecificData": null
}

]
}
}

Successful Response Field Descriptions

Top-Level Fields

FieldTypeDescription
totalCountLongTotal number of documents matching the filters
netTotalDoubleTax-exclusive total amount (excludes CREDIT_BLOCKED)
totalDoubleTax-inclusive total amount (excludes CREDIT_BLOCKED)
invoiceListArray<Invoice>List of invoice objects

Invoice Object Fields

FieldTypeDescription
idString (UUID)Unique identifier of the invoice
companyIdString (UUID)Company ID the invoice belongs to
userIdString (UUID)User ID who created the invoice
customerNameStringCustomer (buyer) name
supplierNameStringSupplier (seller) name
supplierIdStringSupplier ID
supplierVatStringSupplier VAT number
statusString (Enum)Current invoice status
invoiceNumberStringInvoice number
taxExclusiveAmountDoubleTax-exclusive amount
taxInclusiveAmountDoubleTax-inclusive amount
lineExtensionAmountDoubleLine items total amount
payableAmountDoubleAmount payable
allowanceTotalAmountDoubleTotal allowance/discount amount
currencyStringCurrency code (ISO 4217: EUR, USD, TRY, etc.)
createdTimeString (DateTime)Creation timestamp (UTC)
localCreatedTimeString (DateTime)Creation timestamp (local time)
issueDateString (Date)Invoice issue date
deliveryDateString (Date)Delivery date
dueDateString (Date)Due date
supplierCountryCodeStringSupplier country code (ISO 3166-1 alpha-2)
supplierEndpointStringSupplier Peppol endpoint
customerIdStringCustomer ID
customerVatStringCustomer VAT number
customerEndpointStringCustomer Peppol endpoint
customerCountryCodeStringCustomer country code
typeCodeStringInvoice type code (e.g., 380=Invoice, 381=Credit Note)
documentTypeString (Enum)Document direction: INCOMING or OUTGOING
errorMessageStringError message (if any)
lastUpdatedTimeString (DateTime)Last update timestamp (UTC)
localLastUpdatedTimeString (DateTime)Last update timestamp (local time)
typeString (Enum)Document format type (DataType)
sourceString (Enum)Invoice source (PORTAL, ERP, PEPPOL, EMAIL, etc.)
sendViaPeppolBooleanWhether sent via Peppol
statusTimeString (DateTime)Status change timestamp (UTC)
localStatusTimeString (DateTime)Status change timestamp (local time)
fileNameStringFile name
ocrParserString (Enum)OCR parser type
paymentDetailsObjectPayment details (null for certain statuses)
profileTypeString (Enum)ZUGFeRD profile type: BASIC, EN16931, EXTENDED
isActiveBooleanWhether the invoice is active
countrySpecificDataObjectCountry-specific additional data

Note: Invoices with CREDIT_BLOCKED status are masked — only id, companyId, documentType, type,invoiceNumber ,supplierName,supplierVat , status and isActive fields are returned; all other fields are null.

400 - Bad Request

Returned when an invalid parameter value is provided (e.g., incorrect enum value, malformed UUID format).

{
"errorMessage": "Invalid value 'INVALID_STATUS' for parameter 'status'",
"errorType": "ILLEGAL_ARGUMENT",
"errorTitle": "BAD_REQUEST",
"errorId": "corr-abc123-def456",
"status": 400,
"timestamp": "2026-01-15T10:30:00",
"path": "/invoice/search-documents"
}

Error Response Fields

FieldTypeDescription
errorMessageStringHuman-readable error description
errorTypeStringError type code
errorTitleStringHTTP status name
errorIdStringCorrelation ID (for log tracing)
statusIntegerHTTP status code
timestampString (DateTime)Error occurrence time
pathStringRequest path

401 - Unauthorized

Returned when an invalid, expired, or missing JWT token is provided.

{
"errorMessage": "Not authorized for this action",
"errorType": "NOT_AUTHORITY",
"errorTitle": "UNAUTHORIZED",
"errorId": "corr-abc123-def456",
"status": 401,
"timestamp": "2026-01-15T10:30:00",
"path": "/invoice/search-documents"
}

Unauthorized Error Response Fields

FieldTypeDescription
errorMessageStringAuthorization error description
errorTypeStringFixed value: NOT_AUTHORITY
errorTitleStringHTTP status name: UNAUTHORIZED
errorIdStringCorrelation ID
statusInteger401
timestampString (DateTime)Error occurrence time
pathStringRequest path

500 - Internal Server Error

Returned in case of database connection errors, unexpected runtime exceptions, or other server-side failures.

{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"errorId": "corr-abc123-def456",
"status": 500,
"timestamp": "2026-01-15T10:30:00",
"path": "/invoice/search-documents"
}

Server Error Response Fields

FieldTypeDescription
errorMessageStringGeneral error message
errorTypeStringRUNTIME_ERROR, IO_ERROR, or SERVER_ERROR
errorTitleStringHTTP status name: INTERNAL_SERVER_ERROR
errorIdStringCorrelation ID (for log tracing)
statusInteger500
timestampString (DateTime)Error occurrence time
pathStringRequest path

8. Merge PDF and XML POST

Purpose of Use: This endpoint is used to merge a PDF invoice document with a ZUGFeRD/Factur-X compliant XML invoice data to create a ZUGFeRD-compliant PDF/A-3 document.

Detailed Description:

  • Combines the visual PDF invoice with the structured XML invoice data into a single file intended for the recipient.
  • The XML data is embedded into the PDF document as an attachment named factur-x.xml.
  • Before merging, the XML data is validated against the ZUGFeRD schema. If validation fails, an error is returned.
  • The result is a hybrid e-invoice document that is both human-readable (PDF) and machine-processable (embedded XML).
  • This endpoint is specifically designed for producing ZUGFeRD/Factur-X standard-compliant documents used in German (DE) e-invoicing processes.

Endpoint Information

PropertyValue
URLPOST /invoice/merge-zugferd-pdf-xml
MethodPOST
Content-Typeapplication/json
Base URL
Stage Environment URLhttps://app-stage.docnova.ai/
Production Environment URLhttps://api.docnova.ai/
AuthenticationR-Auth header (JWT Token)

Example Request

curl --location 'https://api-stage.docnova.ai/invoice/merge-zugferd-pdf-xml' \
--header 'Content-Type: application/json' \
--header 'Accept: */*' \
--header 'R-Auth: <JWT_TOKEN>' \
--data '{
"base64Pdf": "<BASE64_ENCODED_PDF>",
"base64Xml": "<BASE64_ENCODED_XML>"
}'

Request Parameters

HeaderTypeRequiredDescription
Content-TypeStringYesRequest body format. Fixed value: application/json
Base URL
Stage Environment URLhttps://app-stage.docnova.ai/
Production Environment URLhttps://api.docnova.ai/
AcceptStringNoAccepted response format. Default: /
R-AuthStringYesJWT authentication token. Signed with HS512 algorithm.

Request Body Parameters

Field NameTypeRequiredDescription
base64PdfStringYesBase64-encoded PDF document to be merged. Must contain a valid PDF file.
base64XmlStringYesBase64-encoded ZUGFeRD/Factur-X XML invoice data to be merged. Must conform to the ZUGFeRD schema (EN 16931).

Parameter Value Constraints

ParameterAccepted ValueConstraintSource
base64PdfValid Base64 StringMust be a Base64 encoding of a valid PDF document. Invalid Base64 or corrupted PDF returns an error.ErpController.java
base64XmlValid Base64 StringMust be XML conforming to ZUGFeRD EN 16931:2017 schema. Validated by Mustang ZUGFeRDValidator.ValidationService.java
file_type (response)PDF, XML, SIGN, JSON, GPDF, HTMLThis endpoint always returns PDF.FormatType.java

Responses

200 - Successful Response

{
"file_type": "PDF",
"data": "<BASE64_ENCODED_MERGED_PDF>"
}

Successful Response Field Descriptions

Field NameTypeDescription
file_typeStringFormat of the returned file. Always PDF for this endpoint.
dataStringBase64-encoded merged ZUGFeRD PDF document. Contains the XML data embedded as factur-x.xml.

400 - Bad Request

Returned when the base64Pdf or base64Xml is not a valid Base64 string or the decoded data is corrupted.

{
"errorMessage": "Illegal base64 character ...",
"errorType": "API_ERROR",
"errorTitle": "BAD_REQUEST",
"status": 400,
"errorId": "<CORRELATION_ID>",
"timestamp": "2026-02-11T10:30:00",
"path": "/invoice/merge-zugferd-pdf-xml"
}
Field NameTypeDescription
errorMessageStringDetailed description of the error
errorTypeStringError classification. API_ERROR in this case
errorTitleStringHTTP status code name: BAD_REQUEST
statusIntegerHTTP status code: 400
errorIdStringRequest tracking identifier (Correlation ID)
timestampString (ISO 8601)Time when the error occurred
pathStringRequest URL path

400 - Bad Request

Returned when the XML data does not conform to the ZUGFeRD schema, along with validation errors.

{
"errorMessage": "Validation failed!",
"errorType": "VALIDATION_FAILED",
"errorTitle": "BAD_REQUEST",
"status": 400,
"errorId": "<CORRELATION_ID>",
"timestamp": "2026-02-11T10:30:00",
"path": "/invoice/merge-zugferd-pdf-xml",
"validationErrors": [
{
"field": "/rsm:CrossIndustryInvoice/rsm:ExchangedDocument/ram:ID",
"code": "BR-02",
"message": "An Invoice shall have an Invoice number."
}
]
}

validationErrors Array Field Descriptions

Field NameTypeDescription
fieldStringXML XPath location where the error was found
codeStringZUGFeRD/EN 16931 business rule code (e.g., BR-02, BR-CO-15)
messageStringDetailed description of the validation error

400 - Bad Request

Returned when the ZUGFeRD validation result cannot be parsed.

{
"errorMessage": "JAXBException occurred: ...",
"errorType": "VALIDATION_FAILED",
"errorTitle": "BAD_REQUEST",
"status": 400,
"errorId": "<CORRELATION_ID>",
"timestamp": "2026-02-11T10:30:00",
"path": "/invoice/merge-zugferd-pdf-xml"
}

401 - Unauthorized

Returned when the R-Auth header is missing, the JWT token is expired, or the token is invalid.

{
"errorMessage": "Unauthorized",
"errorType": "UNAUTHORIZED",
"errorTitle": "UNAUTHORIZED",
"status": 401,
"errorId": "<CORRELATION_ID>",
"timestamp": "2026-02-11T10:30:00",
"path": "/invoice/merge-zugferd-pdf-xml"
}

500 - Internal Server Error

Returned when an unexpected error occurs during PDF merging (corrupted PDF structure, memory issues, etc.).

{
"errorMessage": "An unexpected error occurred during PDF merging",
"errorType": "API_ERROR",
"errorTitle": "BAD_REQUEST",
"status": 400,
"errorId": "<CORRELATION_ID>",
"timestamp": "2026-02-11T10:30:00",
"path": "/invoice/merge-zugferd-pdf-xml"
}

Note: The "catch (Exception e)" block in the controller throws all exceptions as ApiError, which defaults to HTTP 400. However, errors caught at the Spring framework level (e.g., JSON parse errors) may return HTTP 500.

9. Generate PDF POST

Purpose of Use: This API endpoint generates a human-readable PDF invoice document from structured XML invoice data (UBL, ZUGFeRD, Factur-X, XRechnung, etc.). The submitted Base64-encoded XML data is first transformed into HTML via XSLT templates, then converted into a professionally formatted PDF file using the iText 7 library. For ZUGFeRD/Factur-X/CII formats, the original XML data is embedded within the PDF file (PDF/A-3 compliant), creating a hybrid invoice. Optionally, the country and vatNumber fields can be used to match company records, enabling company logo placement and country-specific language settings on the PDF. It is specifically designed for invoice visualization, printing, and archiving processes in ERP integrations (SAP, etc.).

Endpoint Information

PropertyValue
URL/invoice/generate/pdf
MethodPOST
Content-Typeapplication/json
Base URL
Stage Environment URLhttps://app-stage.docnova.ai/
Production Environment URLhttps://api.docnova.ai/
AuthenticationR-Auth header (JWT Bearer Token)

Example Request

curl --location 'https://api-stage.docnova.ai/invoice/generate/pdf' \
--header 'Content-Type: application/json' \
--header 'Accept: */*' \
--header 'R-Auth: eyJhbGciOiJIUzUxMiJ9.eyJpc3MiOiJNTU0iLCJzdWIiOiJwNjR9.IpGPX...' \
--data '{
"base64XML": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KC...",
"country": "DE",
"type": "ZUGFERD",
"vatNumber": "DE777111222"
}

Request Parameters

Field NameTypeRequiredDescription
base64XMLStringYesBase64-encoded invoice XML data. Must be a valid XML in UBL 2.1, CrossIndustryInvoice (CII), or the relevant country-specific format.
typeEnum (DataType)YesInvoice format type. Specifies the standard of the provided XML. Valid values are listed in the table below.
countryEnum (Country)NoCountry code of the invoice (ISO 3166-1 alpha-2). When used together with vatNumber, company matching is performed to add logo and language settings to the PDF.
vatNumberStringNoVAT number of the invoicing company. When used together with country, it matches against the company record in the system.

Valid Values for type Parameter

UBL-Based Formats

ValueDescriptionXSLT Group
XRECHNUNGGerman XRechnung standard (EN 16931 compliant)XRECHNUNG
PEPPOL_BISPEPPOL BIS 3.0 standardXRECHNUNG
RO_EFACTURARomania e-Factura formatXRECHNUNG
MY_INVOISMalaysia MyInvois formatMY_INVOIS
MY_PINTMalaysia PINT formatMY_PINT
DK_OIOUBLDenmark OIOUBL formatDK_OIOUBL
EG_INVOICEEgypt invoice formatEG_INVOICE
HR_INVOICECroatia invoice formatHR_INVOICE
UAE_PINTUAE PINT formatUAE_PINT

CII / ZUGFeRD-Based Formats

ValueDescriptionXSLT Group
ZUGFERDZUGFeRD 2.x format (XML-embedded PDF)ZUGFERD
FACTUR_XFrench Factur-X formatZUGFERD
XRECHNUNG_CIIXRechnung CII formatZUGFERD
CIIUN/CEFACT CrossIndustryInvoiceZUGFERD
CIDCrossIndustryDocument formatZUGFERD
PDFUnstructured invoice (paper invoices, images, etc.)ZUGFERD

Other Formats

ValueDescriptionXSLT Group
KZ_ESF_V2Kazakhstan ESF v2 formatKZ_ESF_V2
KSEFPoland KSeF formatKSEF
KSEF_OFFLINEPoland KSeF offline formatKSEF_OFFLINE

country Parameter

Country CodeCountryPDF Language
DEGermanyGerman (DE)
ATAustriaGerman (DE)
FRFranceFrench (FR)
ITItalyItalian (IT)
NLNetherlandsDutch (NL)
RORomaniaRomanian (RO)
ESSpainSpanish (ES)
TRTurkeyTurkish (TR)
KZKazakhstanKazakh (KK)
MYMalaysiaMalay (MS)
BNBruneiMalay (MS)
All othersEnglish (EN)

Responses

200 - Successful Response

PropertyValue
HTTP Status200
Content-Typeapplication/octet-stream
BodyBinary PDF data (byte array)
%PDF-1.7
%����
1 0 obj
<<
/Pages 2 0 R
/Type /Catalog
/Names 21 0 R
/Metadata 27 0 R
>>
endobj
5 0 obj
<<

400 - Bad Request

Trigger Condition: When the XML data is invalid, Base64 cannot be decoded, XSLT transformation fails, or any error occurs during iText PDF generation.

{
"errorMessage": "PDF convert error: [detail message]",
"errorType": "PDF_CONVERT_ERROR",
"errorTitle": "BAD_REQUEST",
"errorId": "a1b2c3d4-e5f6-7890-abcd-...",
"status": 400,
"timestamp": "2026-02-11T14:30:00",
"path": "/invoice/generate/pdf"
}

Possible Detail Messages:

  • PDF convert error: PDF conversion failed due to an unexpected error — XSLT template not found or unexpected error during HTML-to-PDF conversion
  • PDF convert error: Illegal base64 character — The base64XML field is not in valid Base64 format
  • PDF convert error: [XSLT transformation error]` — XML structure does not match the expected format

400 - Bad Request — Invalid Parameter

Trigger Condition: When an invalid enum value is sent for the type field or required fields are missing.

{
"errorMessage": "Invalid argument! Argument: type",
"errorType": "INVALID_ARGUMENT",
"errorTitle": "BAD_REQUEST",
"errorId": "a1b2c3d4-e5f6-7890-abcd-...",
"status": 400,
"timestamp": "2026-02-11T14:30:00",
"path": "/invoice/generate/pdf"
}

400 - Bad Request — Invalid PDF Type

Trigger Condition: When the submitted type value is an unsupported format for PDF conversion.

{
"errorMessage": "Invalid PDF type",
"errorType": "INVALID_PDF_TYPE",
"errorTitle": "BAD_REQUEST",
"errorId": "a1b2c3d4-e5f6-7890-abcd-...",
"status": 400,
"timestamp": "2026-02-11T14:30:00",
"path": "/invoice/generate/pdf"
}

400 - Bad Request — Empty XML Data

Trigger Condition: When the base64XML field is sent as null or empty.

{
"errorMessage": "Data XML cannot be NULL!",
"errorType": "NULL_DATA_XML",
"errorTitle": "BAD_REQUEST",
"errorId": "a1b2c3d4-e5f6-7890-abcd-...",
"status": 400,
"timestamp": "2026-02-11T14:30:00",
"path": "/invoice/generate/pdf"
}

401 - Unauthorized

Trigger Condition: When the R-Auth header is missing, the JWT token has expired, or an invalid token is provided.

{
"errorMessage": "Not authorized for this action",
"errorType": "NOT_AUTHORITY",
"errorTitle": "UNAUTHORIZED",
"errorId": "a1b2c3d4-e5f6-7890-abcd-...",
"status": 401,
"timestamp": "2026-02-11T14:30:00",
"path": "/invoice/generate/pdf"
}

500 - Internal Server Error

Trigger Condition: When an unexpected server error occurs (XSLT file cannot be loaded, insufficient memory, etc.).

{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"errorId": "a1b2c3d4-e5f6-7890-abcd-...",
"status": 500,
"timestamp": "2026-02-11T14:30:00",
"path": "/invoice/generate/pdf"
}

Error Codes and Response Details

The following errors are specific to this endpoint. All error responses follow the ExceptionResponse format:

Error Response Structure

Field NameTypeDescription
errorMessageStringDetailed description of the error
errorTypeStringError type identifier
errorTitleStringHTTP status name (BAD_REQUEST, INTERNAL_SERVER_ERROR, etc.)
errorIdStringCorrelation ID (for log tracing)
statusIntegerHTTP status code (400, 500, etc.)
timestampString (ISO 8601)Time when the error occurred
pathStringRequested URL path

10. Send Invoice via E-mail POST

Purpose of Use This API endpoint enables sending invoices to recipients via email. Users can select one or more invoices and send them in the desired format (PDF, XML, etc.) to specified email addresses. Invoice files are automatically converted to the requested format and attached to the email. Before sending, the user’s authorization is verified; only users with ADMIN or OUTGOING_INVOICE_SEND_EMAIL authority can perform this operation. Email delivery is first attempted via AWS SES; if that fails, an SMTP fallback mechanism is activated. Upon successful delivery, the invoice status is updated to SENT_VIA_EMAIL and the action is logged in the invoice history.

Endpoint Information

PropertyValue
URL/email/send
MethodPOST
Content-Typemultipart/form-data
Base URL
Stage Environment URLhttps://app-stage.docnova.ai/
Production Environment URLhttps://api.docnova.ai/
AuthenticationR-Auth header (JWT token)

Example Request

curl --location 'https://api-stage.docnova.ai/email/send' \
--header 'Content-Type: multipart/form-data' \
--header 'Accept: */*' \
--header 'R-Auth: <JWT_TOKEN>' \
--form 'invoiceIdList="<INVOICE_UUID>"' \
--form 'companyId="<COMPANY_UUID>"' \
--form 'body="Your Invoice is attached."' \
--form 'subject="2026_006"' \
--form 'formatTypes="PDF"' \
--form 'toList="recipient@example.com"'

Request Parameters

FieldTypeRequiredDescription
invoiceIdListList<UUID>YesList of invoice IDs to be sent. Multiple invoices can be included.
companyIdUUIDYesThe company ID that the invoices belong to.
formatTypesList<FormatType>YesFormat(s) in which invoice attachments will be generated. Multiple formats can be specified.
toListList<String>NoList of recipient email addresses.
ccListList<String>NoList of CC (Carbon Copy) recipient email addresses.
bccListList<String>NoList of BCC (Blind Carbon Copy) recipient email addresses.
subjectStringNoEmail subject line. If omitted, a template or default subject is used.
bodyStringNoEmail body text. If omitted, a template or default content is used.
attachmentsList<MultipartFile>NoAdditional file attachments (beyond the auto-generated invoice files).

FormatType Values

ValueDescription
PDFInvoice attached in PDF format
XMLInvoice attached in XML (UBL/CII) format
SIGNSigned invoice file attached
JSONInvoice attached in JSON format
GPDFInvoice attached in graphic PDF format
HTMLInvoice attached in HTML format

Attachment Constraints

ConstraintValue
Maximum file count3
Maximum file size (per file)5 MB
Allowed content typesapplication/pdf, application/xml, text/xml, image/png, image/jpg, image/jpeg, message/rfc822, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

Responses

200 - Successful Response

FieldTypeValueDescription
HTTP StatusInteger200Operation successful
BodyBooleantrueEmail sent successfully
true

400 - Bad Request

Condition: invoiceIdList field is empty or not provided.

{
"errorMessage": "Validation failed",
"errorType": "VALIDATION_ERROR",
"errorTitle": "BAD_REQUEST",
"status": 400,
"timestamp": "2026-02-11T14:30:00",
"path": "/email/send",
"validationErrors": [
{
"field": "invoiceIdList",
"message": "must not be empty"
}
]
}

400 - Bad Request — Validation Error (companyId null)

Condition: companyId field is not provided.

{
"errorMessage": "Validation failed",
"errorType": "VALIDATION_ERROR",
"errorTitle": "BAD_REQUEST",
"status": 400,
"timestamp": "2026-02-11T14:30:00",
"path": "/email/send",
"validationErrors": [
{
"field": "companyId",
"message": "must not be null"
}
]
}

400 - Bad Request — Validation Error (formatTypes empty)

Condition: formatTypes field is empty or not provided.

{
"errorMessage": "Validation failed",
"errorType": "VALIDATION_ERROR",
"errorTitle": "BAD_REQUEST",
"status": 400,
"timestamp": "2026-02-11T14:30:00",
"path": "/email/send",
"validationErrors": [
{
"field": "formatTypes",
"message": "must not be empty"
}
]
}

400 - Bad Request — Invoice Not Found

Condition: No invoice found matching the provided invoiceIdList and companyId combination.

{
"errorMessage": "Invoices not found with id list [d2fc7bb5-4ffe-44ab-b9e9-92a833df65ec]",
"errorType": "INVALID_ARGUMENT",
"errorTitle": "BAD_REQUEST",
"status": 400,
"timestamp": "2026-02-11T14:30:00",
"path": "/email/send"
}

400 - Bad Request — Invoice Attachment Generation Failed

Condition: Invoice file could not be generated in the requested format (e.g., file not found in S3).

{
"errorMessage": "Attachments not found with invoice id list [d2fc7bb5-4ffe-44ab-b9e9-92a833df65ec]",
"errorType": "INVALID_ARGUMENT",
"errorTitle": "BAD_REQUEST",
"status": 400,
"timestamp": "2026-02-11T14:30:00",
"path": "/email/send"
}

400 - Bad Request — Attachment Count Exceeded

Condition: More than 3 additional files were uploaded.

{
"errorMessage": "Maximum 3 files are allowed, found 5",
"errorType": "EMAIL_ATTACHMENT_COUNT_EXCEED",
"errorTitle": "BAD_REQUEST",
"status": 400,
"timestamp": "2026-02-11T14:30:00",
"path": "/email/send"
}

400 - Bad Request — Attachment File Size Exceeded

Condition: An attachment exceeds the 5 MB limit.

{
"errorMessage": "Maximum 5MB file size is allowed, report.pdf file size is 8MB",
"errorType": "EMAIL_ATTACHMENT_FILE_SIZE_EXCEED",
"errorTitle": "BAD_REQUEST",
"status": 400,
"timestamp": "2026-02-11T14:30:00",
"path": "/email/send"
}

400 - Bad Request — Attachment Content Type Not Allowed

Condition: The uploaded file's content type is not in the allowed list.

{
"errorMessage": "Allowed content types are [application/pdf, application/xml, text/xml, image/png, image/jpg, image/jpeg, message/rfc822, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet], malware.exe file content type is application/octet-stream",
"errorType": "EMAIL_ATTACHMENT_CONTENT_TYPE_NOT_ALLOWED",
"errorTitle": "BAD_REQUEST",
"status": 400,
"timestamp": "2026-02-11T14:30:00",
"path": "/email/send"
}

400 - Bad Request — Email Sending Failed

Condition: Email could not be sent via both AWS SES and SMTP.

{
"errorMessage": "Failed to send email: Connection refused",
"errorType": "EMAIL_SENDING_FAILED",
"errorTitle": "BAD_REQUEST",
"status": 400,
"timestamp": "2026-02-11T14:30:00",
"path": "/email/send"
}

401 - Unauthorized

Condition: Invalid or expired JWT token provided in the R-Auth header.

{
"errorMessage": "Unauthorized",
"errorType": "UNAUTHORIZED",
"errorTitle": "UNAUTHORIZED",
"status": 401,
"timestamp": "2026-02-11T14:30:00",
"path": "/email/send"
}

403 - Forbidden

Condition: The user does not have ADMIN or OUTGOING_INVOICE_SEND_EMAIL authority.

{ 

"errorMessage": "Access denied",
"errorType": "FORBIDDEN",
"errorTitle": "FORBIDDEN",
"status": 403,
"timestamp": "2026-02-11T14:30:00",
"path": "/email/send"

}

11. Peppol - Get MLR GET

Purpose of Use This endpoint is used to query Message Level Response (MLR) records for invoices sent or received through the Peppol network.
MLR is a message level response mechanism in the Peppol infrastructure that indicates whether a document was successfully delivered, accepted, or rejected by the receiving party.

With this API you can:

  • List all MLR responses belonging to a specific company
  • Query MLR status for a specific invoice (invoiceId) or document (documentId)
  • Filter by the counterpart’s Peppol participant identifier (counterpartParticipantId)
  • Perform time based searches by specifying a date range (fromDate, toDate)
  • Returned responses include detail lines for each MLR record (error field, status reason, description)

This enables developers to programmatically track the final status of the invoice delivery process and take necessary actions in case of errors.

Endpoint Information

PropertyValue
URL/peppol/search-mlr
MethodGET
AuthenticationR-Auth header (JWT token)

Example Request

{
curl --location 'https://api-stage.docnova.ai/peppol/search-mlr?companyId={companyId}&counterpartParticipantId={counterpartParticipantId}&documentId={documentId}&fromDate={fromDate}&invoiceId={invoiceId}&toDate={toDate}' \
--header 'Accept: */*' \
--header 'R-Auth: {jwt_token}'
}

Request Parameters

FieldTypeRequiredFormatDescription
companyIdString (UUID)Yesxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxUnique identifier of the company to query
documentIdString (UUID)Noxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxPeppol document identifier (instance identifier)
counterpartParticipantIdStringNo{scheme}:{identifier} (e.g., 9930:de111222777)Counterpart’s Peppol participant identifier
invoiceIdStringNoFree textInvoice number or identifier
fromDateString (ISO Date)Noyyyy-MM-dd (e.g., 2025-09-09)Search start date (inclusive)
toDateString (ISO Date)Noyyyy-MM-dd (e.g., 2026-09-09)Search end date (inclusive)

Request Headers

HeaderTypeRequiredDescription
R-AuthString (JWT)YesUser authentication token. JWT signed with HS512 algorithm
AcceptStringNoDefault /. Response is returned as application/json

Parameter Values

counterpartParticipantId Format

SchemeDescriptionExample
9930Germany VAT number9930:de111222777
0204Leitweg-ID0204:1234567890123
0088EAN location code0088:1234567890123

responseType Response Type Enum Values

ValueDescription
ACCEPTANCEDocument was accepted by the counterpart
ACKNOWLEDGINGDocument was acknowledged (received) by the counterpart
REJECTIONDocument was rejected by the counterpart

statusReasonCode Status Reason Code Enum Values

ValueDescription
BUSINESS_RULE_VIOLATION_FATALBusiness rule violation. Critical error. Document was not processed
BUSINESS_RULE_VIOLATION_WARNINGBusiness rule violation. Warning. Document can still be processed
SYNTAX_VIOLATIONSyntax error. Document format is invalid

Responses

200 - Successful Response

Type: List<SearchMLRResponse>

{
[
{
"id": "a1b2c3d4-e5f6-7890-abcd-...",
"companyId": "60ccd1a7-5348-47b2-9ef6-...",
"documentId": "8fa4606f-94f2-45e1-a8cb-...",
"responseType": "ACCEPTANCE",
"receivedTime": "2026-01-15T14:30:00",
"counterpartParticipantId": "9930:de111222777",
"invoiceId": "2026_007_peppol",
"responseLines": [
{
"id": "f1e2d3c4-b5a6-7890-abcd-...",
"errorField": null,
"responseCode": "ACCEPTANCE",
"description": "Document successfully processed",
"statusReasonCode": null
}
]
}
]
}

Response Fields

FieldTypeDescription
idUUIDUnique identifier of the MLR record
companyIdStringIdentifier of the related company
documentIdStringPeppol document identifier
responseTypeEnum (MessageLevelResponseType)Overall response type: ACCEPTANCE, ACKNOWLEDGING, REJECTION
receivedTimeDateTime (ISO 8601)Date and time the MLR response was received
counterpartParticipantIdStringCounterpart’s Peppol participant identifier
invoiceIdStringRelated invoice number
responseLinesList<SearchMLRLineResponse>MLR detail lines

Response Detail Lines

FieldTypeDescription
idUUIDUnique identifier of the detail line
errorFieldString (nullable)The field / XPath expression where the error occurred
responseCodeEnum (MessageLevelResponseType)Line level response code: ACCEPTANCE, ACKNOWLEDGING, REJECTION
descriptionString (nullable)Error or status description
statusReasonCodeEnum (MLRStatusReasonCode) (nullable)Status reason code: BUSINESS_RULE_VIOLATION_FATAL, BUSINESS_RULE_VIOLATION_WARNING, SYNTAX_VIOLATION

400 - Bad Request

Occurs when the required companyId parameter is missing or when the date format is invalid.

{
"errorMessage": "Required request parameter 'companyId' for method parameter type String is not present",
"errorType": "BAD_REQUEST",
"errorTitle": "BAD_REQUEST",
"status": 400,
"errorId": "corr-xxx-xxx",
"timestamp": "2026-01-15T14:30:00",
"path": "/peppol/search-mlr"
}

Description: The companyId parameter is mandatory and Spring framework automatically returns this error when it is missing. Additionally, if fromDate or toDate parameters do not conform to the yyyy-MM-dd ISO format, the same error code is returned.

401 - Unauthorized

Occurs when the JWT token is invalid, expired, or the R-Auth header is missing. Also returned when the user is not associated with the specified companyId.

{
"errorMessage": "Not authorized for this action",
"errorType": "NOT_AUTHORITY",
"errorTitle": "UNAUTHORIZED",
"status": 401,
"errorId": "corr-xxx-xxx",
"timestamp": "2026-01-15T14:30:00",
"path": "/peppol/search-mlr"
}

Description: The authorizationService.checkIfCompanyUser(companyId, userId) method verifies that the user identity in the JWT token matches the specified companyId. If they do not match, an AuthorizationServiceException is thrown. This error is also returned when the token is expired or its signature is invalid.

500 - Internal Server Error

Returned in case of database access errors, unexpected runtime exceptions, or other server-side failures.

{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"status": 500,
"errorId": "corr-xxx-xxx",
"timestamp": "2026-01-15T14:30:00",
"path": "/peppol/search-mlr"
}

Description: Returned in case of database connection errors, JPA/Hibernate query failures, or unexpected internal server errors. The errorId (correlation id) field can be used to trace detailed error information from log records.

Error Response General Format

FieldTypeDescription
errorMessageStringHuman readable description of the error
errorTypeStringError classification code (e.g., NOT_AUTHORITY, RUNTIME_ERROR)
errorTitleString (HttpStatus)HTTP status code name (e.g., BAD_REQUEST, UNAUTHORIZED, INTERNAL_SERVER_ERROR)
statusIntegerHTTP status code numeric value (e.g., 400, 401, 500)
errorIdString (nullable)Correlation ID used for log tracing
dataString (nullable)Additional data (if available)
detailsMap<String, Object> (nullable)Detailed error information (if available)
validationErrorsList<ValidationError> (nullable)Field level validation errors (if available)
timestampDateTime (ISO 8601)Time when the error occurred
pathStringEndpoint path where the error occurred

12. Peppol - Send MLR POST

Purpose of Use The POST /peppol/send-mlr endpoint is used to send a Message Level Response (MLR) within the Peppol infrastructure.

An MLR is the official response given by the receiving party to an e-invoice received through Peppol. This response communicates to the sender whether the invoice was successfully received and accepted, is being processed (acknowledged), or has been rejected. The receiver can inform the sender in detail by specifying errors in the invoice (IBAN error, syntax error, business rule violation, etc.).

After the MLR is sent, the related invoice status is automatically updated.

Endpoint Information

PropertyValue
URL/peppol/send-mlr
MethodPOST
Content-Typeapplication/json
Base URL
Stage Environment URLhttps://app-stage.docnova.ai/
Production Environment URLhttps://api.docnova.ai/
AuthenticationR-Auth header (JWT token)

Example Request


curl --location 'https://api-stage.docnova.ai/peppol/send-mlr' \
--header 'Content-Type: application/json' \
--header 'Accept: */*' \
--header 'R-Auth: <JWT_TOKEN>' \
--data '{
"errorLines": [
{
"description": "The IBAN number provided in the payment instructions is invalid or missing",
"errorField": "PaymentMeans/PayeeFinancialAccount/ID",
"responseCode": "ACKNOWLEDGING",
"statusReasonCode": "BUSINESS_RULE_VIOLATION_WARNING"
}
],
"invoiceId": "<INVOICE_UUID>",
"responseCode": "ACCEPTANCE"
}'

Request Parameters


Root Level Parameters
Field NameTypeRequiredDescription
invoiceIdString (UUID)YesUnique identifier of the invoice to send the MLR for (UUID format)
responseCodeEnum (MessageLevelResponseType)YesOverall response code for the invoice
errorLinesArray<MLRErrorLine>NoList of error details in the invoice. Can be left empty
errorLines Array Element
Field NameTypeRequiredDescription
descriptionStringNoHuman readable description of the error
errorFieldStringNoUBL/XML field path where the error was detected (XPath-like)
responseCodeEnum (MessageLevelResponseType)NoResponse code specific to this error line
statusReasonCodeEnum (MLRStatusReasonCode)NoClassification code of the error

Allowed Parameter Values


MessageLevelResponseType (responseCode)
ValueDescription
ACCEPTANCEInvoice accepted. It has been processed and approved
ACKNOWLEDGINGInvoice received. Receipt is confirmed but not yet fully processed
REJECTIONInvoice rejected. Not processed due to errors
MLRStatusReasonCode (statusReasonCode)
ValueDescription
BUSINESS_RULE_VIOLATION_FATALFatal business rule violation. A critical error that prevents the invoice from being processed
BUSINESS_RULE_VIOLATION_WARNINGWarning level business rule violation. The invoice can be processed but correction is recommended
SYNTAX_VIOLATIONSyntax error. Format or schema incompatibility in the XML/UBL structure

Responses

200 - Successful Response

FieldTypeValueDescription
HTTP StatusInteger200Operation successful
BodyString"MLR sent successfully"Response text returned from the Access Point service
"MLR sent successfully"

404 - Not Found

Trigger Condition: When no invoice matching the provided invoiceId is found in the database.

{
"errorMessage": "<invoiceId> Invoice not found",
"errorType": "NOT_FOUND_INVOICE",
"errorTitle": "NOT_FOUND",
"errorId": "<correlation-id>",
"status": 404,
"timestamp": "2026-02-12T14:30:00",
"path": "/peppol/send-mlr"
}

Description: The invoiceId parameter contains an invalid or unregistered UUID in the database. Ensure the invoice ID is correct.

400 - Bad Request

Trigger Condition: When an error occurs while forwarding the MLR to the Access Point service (connection error, timeout, Access Point rejection).

{
"errorMessage": "Failed to send MLR: <detailed error message>",
"errorType": "API_ERROR",
"errorTitle": "BAD_REQUEST",
"errorId": "<correlation-id>",
"status": 400,
"timestamp": "2026-02-12T14:30:00",
"path": "/peppol/send-mlr"
}

Description: The MLR was saved to the database but could not be forwarded to the Access Point. The error message contains the detail returned from the Access Point. Check your network connectivity and Access Point service availability.

400 - Bad Request — Invalid responseCode

Trigger Condition: When the responseCode field contains an invalid enum value (i.e., a value other than ACCEPTANCE, ACKNOWLEDGING, REJECTION).

{
"errorMessage": "Unknown response code: <invalid_value>",
"errorType": "API_ERROR",
"errorTitle": "BAD_REQUEST",
"errorId": "<correlation-id>",
"status": 400,
"timestamp": "2026-02-12T14:30:00",
"path": "/peppol/send-mlr"
}

Description: The responseCode field only accepts ACCEPTANCE, ACKNOWLEDGING, or REJECTION values. Verify the value you are sending.

400 - Bad Request — Invalid UUID Format

Trigger Condition: When the invoiceId field is not in a valid UUID format.

{
"errorMessage": "Invalid UUID string: <invalid_value>",
"errorType": "API_ERROR",
"errorTitle": "BAD_REQUEST",
"errorId": "<correlation-id>",
"status": 400,
"timestamp": "2026-02-12T14:30:00",
"path": "/peppol/send-mlr"
}

Description: : The invoiceId value must be a valid UUID in the format xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.

401 - Unauthorized

Trigger Condition: When the R-Auth header is missing, invalid, or contains an expired JWT token.

{
"errorMessage": "Not authorized for this action",
"errorType": "NOT_AUTHORITY",
"errorTitle": "UNAUTHORIZED",
"errorId": "<correlation-id>",
"status": 401,
"timestamp": "2026-02-12T14:30:00",
"path": "/peppol/send-mlr"
}

Description:  The JWT token has expired or is malformed. Obtain a new token and retry.

500 - Internal Server Error

Trigger Condition: When a database error, network error, or unexpected exception occurs.

{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"errorId": "<correlation-id>",
"status": 500,
"timestamp": "2026-02-12T14:30:00",
"path": "/peppol/send-mlr"
}

Description: An unexpected error occurred on the server side. Forward the errorId (correlation ID) value to the support team for detailed investigation.

Error Response Model (ExceptionResponse)

Field NameTypeDescription
errorMessageStringDetailed description of the error
errorTypeStringError classification code (e.g., NOT_FOUND_INVOICE, API_ERROR)
errorTitleString (HttpStatus)HTTP status name (e.g., NOT_FOUND, BAD_REQUEST)
errorIdStringCorrelation identifier (for log tracing)
statusIntegerHTTP status code (e.g., 400, 404, 500)
dataStringAdditional data (if available)
detailsMap<String, Object>Additional detail information (if available)
validationErrorsArray<ValidationError>Validation error list (if available)
timestampString (ISO 8601)Timestamp of when the error occurred
pathStringEndpoint path of the request