Slovakia E-Invoice Peppol
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.docnova.ai/ Production Environment URLhttps://api.docnova.ai/ |
| 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. |
How to register your test company on Peppol?
This guide shows how to complete your Peppol registration in the Docnova Slovakia test environment with the test webhook tool.

Step 1: Open the test webhook tool

https://www.overtoken.sk/generate
Step 2: Enter the endpoint URL

https://api-stage.docnova.ai/webhook/SK/peppol/onboarding
Step 3: Enter the webhook secret

8e37d6de6c781bde9739410d7c729fec65bbb88467683737e810a858c3888484
Step 4: Enter DIC1 (access point)

01423948591
Step 5: Enter your company's tax number

Step 6: Enter your company name

Step 7: Enter your company e-mail

Step 8: Send the webhook

Step 9: Check your Peppol registration

You can also download the full guide as a PDF.
Open PDF Guide
1. Introduction
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 docnova 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
| Property | Value |
|---|---|
| URL | /auth/login |
| Method | POST |
| Content-Type | application/json |
| Base URL | Stage Environment URLhttps://api-stage.docnova.ai/ Production Environment URLhttps://api.docnova.ai/ |
| Authorization | Not 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
| Field | Type | Required | Description |
|---|---|---|---|
| String | Optional | User's registered email address | |
| apiKey | String | Yes | Obtained from the portal, via the settings > ERP Management > API Management menu. |
Responses
200 - Login Successful
Full Response (AccountInfo)
{
"id": "b32636cd-ec05-4c48-b102-...",
"superAdmin": true,
"companies": [
{
"id": "ba876f6b-e20d-48b4-9ce8-...",
"name": "Demo Slovakia s.r.o.",
"taxNumber": "2029999999",
"website": null,
"address": "Testovacia 123",
"city": "Bratislava",
"state": null,
"country": "SK",
"portalType": "DEFAULT",
"postalCode": "81101",
"phoneNumber": null,
"credit": 5,
"iconUrl": null,
"email": "test@demo-slovakia.example",
"userCount": 1,
"vatNumber": "SK2029999999",
"siretNumber": null,
"frVatRegime": null,
"faxNumber": null,
"mailLanguage": "EN",
"subscriptionType": "6rtHLfnEgfyT7US9XKxVP0s6V4bzDF/mGGe8S/fIatQ=",
"cif": null,
"sftp": false,
"isSubCompany": false,
"participants": [],
"featureAllowed": false,
"subCompanies": [],
"stripeObj": {
"stripeCustomerId": "cus_V4PXDBMLV4t6dV",
"type": "FREE",
"renewalDate": "2026-09-14T08:43:23",
"docnovaAiProductCredits": 0,
"docnovaAiFeatureCredits": 0,
"googleAiFeatureCredits": 0,
"renewal": true
},
"authorities": "WqvBsTh6Pd8fcwTOW93xQB7b6jCQyv/530wsgy5dBU4=",
"compAuthTypes": "Pv24DAWwUcFHwNEg2oKn8vtYU6DqlUpw4VGiJ1afT1M=",
"currencyCode": "EUR",
"remainingDocumentPercentage": 0.0,
"remainingPromotionDays": null,
"trialUsed": false,
"defaultParticipantId": null
}
],
"jwt": "eyJhbGciOiJIUzUxMiJ9...",
"expirationDate": "2026-08-15T08:48:38.587+00:00",
"user": {
"id": null,
"email": "ayse.arslan@melasoft.com",
"firstName": "Ayşe",
"lastName": "Arslan",
"phoneNumber": "905419717819",
"creationTime": null,
"photoUrl": "https://graph.microsoft.com/v1.0/me/photo/$value",
"mailLang": "MS",
"isSuperAdmin": null,
"lastLoginTime": null,
"authorities": null,
"adminAuthorities": "ah+hOi4mUW5o7WqqHQW+FZZBApX8Th/...",
"featureAllowed": false
},
"mfaEnabled": true,
"secretImageUri": null,
"lastCompanyId": "ba876f6b-e20d-48b4-9ce8-cd650ccb6182",
"requiresRecaptchaV2": null,
"message": null,
"active": true,
"isAppLogin": false,
"mfaType": "EMAIL",
"refreshToken": "qI8a9ize1vax_2Yj5EYG-RB8pTLEyM7oZGfo_AHctGspBSCCKgIJtjM-...",
"refreshTokenExpiration": "2026-09-13T08:48:38.592+00:00"
}
Basic Response (JwtBasicResponse)
{
"jwt": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"expirationDate": "2026-01-30T10:30:00.000Z"
}
Response Fields
Account Information Fields
| Field | Type | Description |
|---|---|---|
| id | String | User unique identifier |
| superAdmin | Boolean | Whether user has super admin privileges |
| companies | Array<AuthorizedCompany> | List of companies user is authorized to access |
| jwt | String | JWT access token. Used in R-Auth header for API requests |
| expirationDate | DateTime | JWT token expiration date |
| refreshToken | String | Refresh token for obtaining new access tokens |
| refreshTokenExpiration | DateTime | Refresh token expiration date |
| user | Object | User detail information |
| mfaEnabled | Boolean | Whether multi factor authentication is enabled |
| mfaType | Enum | MFA type (GOOGLE, WHATSAPP) |
| secretImageUri | String | Google Authenticator QR code URI |
| lastCompanyId | String | Last selected company ID |
| requiresRecaptchaV2 | Boolean | Whether reCAPTCHA v2 verification is required |
| message | String | Status message (e.g., "MFA required") |
| active | Boolean | Whether user account is active |
| isAppLogin | Boolean | Whether this is a mobile app login |
Parameter Values Reference Table
currentCountry Values (Sample List)
| Value | Description |
|---|---|
| SK | Slovakia |
| GLOBAL | Global (default) |
Company Information Fields
| Field | Type | Description |
|---|---|---|
| id | String | Company unique identifier |
| name | String | Company name |
| taxNumber | String | Tax number |
| vatNumber | String | VAT number |
| String | Company email address | |
| website | String | Company website |
| address | String | Address |
| city | String | City |
| state | String | State or Region |
| country | Enum | Country code |
| postalCode | String | Postal code |
| phoneNumber | String | Phone number |
| faxNumber | String | Fax number |
| credit | Integer | Available credit |
| userCount | Integer | Total user count |
| portalType | Enum | Portal type |
| mailLanguage | Enum | Email language |
| currencyCode | String | Currency code |
| sftp | Boolean | Whether SFTP integration is active |
| isSubCompany | Boolean | Whether it's a sub company |
| featureAllowed | Boolean | Whether feature access is granted |
| participants | Array | Peppol participant information |
User Information Fields
| Field | Type | Description |
|---|---|---|
| id | String | User unique identifier |
| String | User email address | |
| firstName | String | User first name |
| lastName | String | User last name |
| phoneNumber | String | User phone number |
| photoUrl | String | User photo URL |
| mailLang | Enum | User email language |
| isSuperAdmin | Boolean | Whether user has super admin privileges |
| lastLoginTime | DateTime | Last login time |
| featureAllowed | Boolean | Whether feature access is granted |
Enum Values Reference Table
mfaType Values
| Value | Description |
|---|---|
| Google Authenticator verification | |
| WhatsApp verification |
portalType Values
| Value | Description |
|---|---|
| DEFAULT | Default portal |
| SK | Slovakia portal |
mailLanguage Values
| Value | Description |
|---|---|
| EN | English |
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. Peppol - Check Participant GET
Purpose of Use: This endpoint checks whether a given Peppol participant identifier is reachable on the Peppol network (i.e. registered in an SMP/SML lookup) before an ERP system sends an invoice to it, or before submitting the company's own Peppol registration request. It is the recommended first step before calling send-document-async for a new trading partner, so the ERP can decide whether to route the document via Peppol or fall back to e-mail/PDF delivery.
Endpoint Information
| Property | Value |
|---|---|
| URL | /peppol/check-participant |
| Method | GET |
| Content-Type | application/json |
| Base URL | Stage Environment URLhttps://api-stage.docnova.ai/ Production Environment URLhttps://api.docnova.ai/ |
| Authorization | R-Auth header (JWT token) |
Example Request
curl --location 'https://api-stage.docnova.ai/peppol/check-participant?companyId={{company_uuid}}&participantId=0245:2029999999' \
--header 'Accept: */*' \
--header 'R-Auth: {{jwt_token}}'
Request Parameters
Query Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| companyId | UUID | Yes | Unique identifier of the company performing the lookup |
| participantId | String | Yes | Peppol participant identifier in icd:value format, e.g. 0245:2029999999 for a Slovak IČO-based identifier |
Slovakia Identifier Reference
| ICD | Scheme | Description |
|---|---|---|
| 0245 | IČO | Slovak Business Registration Number |
| 9944 | VAT | Slovak VAT number (SK prefix) |
| 0088 | GLN | Global Location Number (alternative identifier) |
Note: Confirm the exact ICD scheme to use against the counterparty's Peppol directory entry or your company's own SMP registration — Peppol's eDEC code list is maintained by OpenPeppol and may be updated over time.
Responses
200 - Successful Response
{
"participantId": "0245:2029999999",
"exists": true,
"checkedAt": "2026-02-11T14:30:00"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| participantId | String | The participant identifier that was checked |
| exists | Boolean | Whether the identifier is currently registered/reachable on the Peppol network |
| checkedAt | DateTime | Timestamp of the lookup |
400 - Bad Request
Trigger: participantId is missing or not in the expected icd:value format.
{
"errorMessage": "Invalid participantId format, expected icd:value",
"errorType": "INVALID_REQUEST",
"errorTitle": "BAD_REQUEST",
"errorId": "corr-4a3b5c6d",
"status": 400,
"timestamp": "2026-02-11T14:30:00",
"path": "/peppol/check-participant"
}
401 - Unauthorized
Trigger: The R-Auth header is missing/expired, or the user does not belong to the specified company.
{
"errorMessage": "Authorization failed!",
"errorType": "AUTHORIZATION_FAILED",
"errorTitle": "UNAUTHORIZED",
"errorId": "corr-5b4c6d7e",
"status": 401,
"timestamp": "2026-02-11T14:30:00",
"path": "/peppol/check-participant"
}
500 - Internal Server Error
Trigger: The SMP/SML lookup service is unreachable, or an unexpected error occurs.
{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"errorId": "corr-6c5d7e8f",
"status": 500,
"timestamp": "2026-02-11T14:30:00",
"path": "/peppol/check-participant"
}
4. Send Document Async POST
Purpose of Use: This endpoint enables ERP systems to transmit e-invoice data to the docnova 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 Slovak legal standards (Peppol BIS Billing 3.0, UBL format, aligned with EN 16931), 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
| Property | Value |
|---|---|
| URL | /invoice/send-document-async |
| Method | POST |
| Content-Type | application/json |
| Base URL | Stage Environment URLhttps://api-stage.docnova.ai/ Production Environment URLhttps://api.docnova.ai/ |
| Authorization | JWT 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}}",
"invoiceType": "PEPPOL_BIS",
"receiverEmails": [
"recipient@example.com"
],
"mailTemplateId": "{{template_id}}"
}'
Request Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| compId | String (UUID) | Conditional* | Company unique identifier. Required if apiKey is not provided. |
| apiKey | String | Conditional* | API key. Required if compId is not provided. |
| base64Document | String | Conditional** | Base64-encoded XML document. Required if base64Pdf is not provided. |
| base64Pdf | String | Conditional** | Base64-encoded PDF document. Required if base64Document is not provided. |
| invoiceType | Enum | Conditional*** | Invoice format type. Required if waybillType is not provided. |
| waybillType | Enum | Conditional*** | Waybill format type. Required if invoiceType is not provided. |
| businessType | Enum | No | Business model type (B2B, B2C, B2G). |
| receiverEmails | Array<String> | No | List of recipient email addresses. |
| mailTemplateId | String | No | Email 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
| Value | Description |
|---|---|
| B2B | Business to Business |
| B2C | Business to Consumer |
| B2G | Business to Government |
invoiceType Values
| Value | Group | Description |
|---|---|---|
| PEPPOL_BIS | Peppol | Peppol BIS 3.0 format (the only invoice format used for Slovakia) |
Note: The waybillType parameter is not used for Slovakia; it only applies to other country modules.
Responses
200 - Successful Response
{
"trackingId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "PENDING",
"message": "Document queued for processing"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| trackingId | UUID | Unique process tracking identifier. This ID can be used to query the processing status. |
| status | Enum | Current status of the process. |
| message | String | Descriptive message about the status. |
status Values
| Value | Description |
|---|---|
| PENDING | Process queued, not yet started |
| PROCESSING | Process in progress |
| COMPLETED | Process completed successfully |
| FAILED | Process failed |
| SENDING_FAILED | Sending failed |
| PERMANENT_FAILED | Permanent 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. Send Document Async JSON POST
Purpose of Use: This endpoint allows ERP systems to submit a Peppol BIS Billing 3.0 / EN 16931 compliant UBL invoice as a structured JSON object (ublDto), instead of sending a Base64-encoded XML file through send-document-async. This is useful for ERP systems that can map their internal invoice model directly to the UBL JSON structure without generating XML themselves.
As with the file-based variant, the call is asynchronous: the portal immediately returns a trackingId, and the final result (success, Peppol delivery, or failure) is retrieved later via GET /invoice/document-status/{trackingId}.
Endpoint Information
| Property | Value |
|---|---|
| URL | /invoice/send-document-async-json |
| Method | POST |
| Content-Type | application/json |
| Base URL | Stage Environment URLhttps://api-stage.docnova.ai/ Production Environment URLhttps://api.docnova.ai/ |
| Authorization | JWT Token (R-Auth header) or API Key |
Example Request
curl --location 'https://api-stage.docnova.ai/invoice/send-document-async-json' \
--header 'R-Auth: {{jwt_token}}' \
--header 'Content-Type: application/json' \
--data-raw '{
"apiKey": "{{your_api_key}}",
"ublDto": {
"Type": "PEPPOL_BIS",
"IsPeppolParticipant": true,
"ProfileType": "EN16931",
"CustomizationID": {
"Value": "urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0"
},
"ProfileID": {
"Value": "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0"
},
"ID": {
"Value": "2701-1510"
},
"IssueDate": {
"Value": "2026-04-22"
},
"DueDate": {
"Value": "2026-05-22"
},
"InvoiceTypeCode": {
"Value": "380"
},
"DocumentCurrencyCode": {
"Value": "EUR"
},
"AccountingSupplierParty": {
"Party": {
"EndpointID": {
"Value": "SK2029999999",
"schemeID": "0245"
},
"PartyName": [
{ "Name": { "Value": "Demo Slovakia s.r.o." } }
],
"PostalAddress": {
"StreetName": { "Value": "Testovacia 123" },
"CityName": { "Value": "Bratislava" },
"PostalZone": { "Value": "81101" },
"Country": { "IdentificationCode": { "Value": "SK" } }
},
"PartyTaxScheme": [
{
"CompanyID": { "schemeID": "VAT", "Value": "SK2029999999" },
"TaxScheme": { "ID": { "Value": "VAT" } }
}
],
"PartyLegalEntity": [
{
"RegistrationName": { "Value": "Demo Slovakia s.r.o." },
"CompanyID": { "Value": "2029999999", "schemeID": "0245" }
}
]
}
},
"AccountingCustomerParty": {
"Party": {
"EndpointID": {
"Value": "SK1234567890",
"schemeID": "0245"
},
"PartyName": [
{ "Name": { "Value": "Partner Customer s.r.o." } }
],
"PostalAddress": {
"StreetName": { "Value": "Hlavná 1" },
"CityName": { "Value": "Košice" },
"PostalZone": { "Value": "04001" },
"Country": { "IdentificationCode": { "Value": "SK" } }
},
"PartyTaxScheme": [
{
"CompanyID": { "schemeID": "VAT", "Value": "SK1234567890" },
"TaxScheme": { "ID": { "Value": "VAT" } }
}
],
"PartyLegalEntity": [
{
"RegistrationName": { "Value": "Partner Customer s.r.o." },
"CompanyID": { "Value": "1234567890", "schemeID": "0245" }
}
]
}
},
"TaxTotal": [
{
"TaxAmount": { "currencyID": "EUR", "Value": 320.00 },
"TaxSubtotal": [
{
"TaxableAmount": { "currencyID": "EUR", "Value": 1600.00 },
"TaxAmount": { "currencyID": "EUR", "Value": 320.00 },
"TaxCategory": {
"ID": { "Value": "S" },
"Percent": { "Value": 20.00 },
"TaxScheme": { "ID": { "Value": "VAT" } }
}
}
]
}
],
"LegalMonetaryTotal": {
"LineExtensionAmount": { "currencyID": "EUR", "Value": 1600.00 },
"TaxExclusiveAmount": { "currencyID": "EUR", "Value": 1600.00 },
"TaxInclusiveAmount": { "currencyID": "EUR", "Value": 1920.00 },
"PayableAmount": { "currencyID": "EUR", "Value": 1920.00 }
},
"InvoiceLine": [
{
"ID": { "Value": "1" },
"InvoicedQuantity": { "unitCode": "C62", "Value": 1.000 },
"LineExtensionAmount": { "currencyID": "EUR", "Value": 1600.00 },
"Item": {
"Name": { "Value": "Consulting services" },
"ClassifiedTaxCategory": [
{
"ID": { "Value": "S" },
"Percent": { "Value": 20.00 },
"TaxScheme": { "ID": { "Value": "VAT" } }
}
]
},
"Price": {
"PriceAmount": { "currencyID": "EUR", "Value": 1600.00 },
"BaseQuantity": { "Value": 1 }
}
}
]
}
}'
Request Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| apiKey | String | Conditional* | API key. Required if ublDto.CompanyId is not provided |
| ublDto | Object (UBLDto) | Yes | UBL 2.1 / Peppol BIS compliant invoice data structure |
| ublDto.Type | Enum | No | Document format type. For Slovakia this is always PEPPOL_BIS |
| ublDto.IsPeppolParticipant | Boolean | No | If true, the document is routed via the Peppol network when the recipient is reachable there |
| ublDto.CompanyId | UUID | Conditional* | Sending company's unique identifier. Required if apiKey is not provided |
| ublDto.ID.Value | String | No | Invoice number |
| ublDto.IssueDate.Value | String (ISO Date) | No | Invoice issue date (YYYY-MM-DD) |
| ublDto.DueDate.Value | String (ISO Date) | No | Payment due date (YYYY-MM-DD) |
| ublDto.InvoiceTypeCode.Value | String | No | UN/CEFACT code (380 = commercial invoice, 381 = credit note) |
| ublDto.DocumentCurrencyCode.Value | String | No | Currency (ISO 4217). EUR for Slovakia |
| ublDto.AccountingSupplierParty | Object | No | Supplier party: EndpointID (Peppol participant ID), name, address, VAT, legal entity |
| ublDto.AccountingSupplierParty.Party.EndpointID.schemeID | String | No | Peppol participant scheme (ICD). For Slovakia IČO-based identifiers this is typically 0245 |
| ublDto.AccountingCustomerParty | Object | No | Customer party, same structure as the supplier |
| ublDto.TaxTotal[].TaxSubtotal[].TaxCategory.ID.Value | String | No | VAT category code (S = standard rate, Z = zero rate, E = exempt) |
| ublDto.TaxTotal[].TaxSubtotal[].TaxCategory.Percent.Value | Number | No | VAT rate. Slovakia's standard rate is 20% |
| ublDto.LegalMonetaryTotal | Object | No | Monetary summary: LineExtensionAmount, TaxExclusiveAmount, TaxInclusiveAmount, PayableAmount |
| ublDto.InvoiceLine[] | Array<Object> | No | Invoice line items |
| businessType | Enum | No | B2B, B2C, or B2G |
| receiverEmails | Array<String> | No | Recipient e-mail addresses for notification |
| mailTemplateId | String | No | E-mail template identifier |
Note:
- (*) At least one of apiKey or ublDto.CompanyId must be provided.
- schemeID values follow the Peppol eDEC participant identifier code list (ICD). Confirm the exact scheme against your company's Peppol SMP registration.
Responses
200 - Successful Response
{
"trackingId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "PENDING",
"message": "Document process started successfully"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| trackingId | UUID | Tracking identifier, used with GET /invoice/document-status/{trackingId} |
| status | Enum | Initial status (typically PENDING) |
| message | String | Informational message |
400 - Bad Request
Scenario: Both apiKey and ublDto.CompanyId are missing.
{
"errorMessage": "apiKey or companyId field is required",
"errorType": "DOCUMENT_PROCESS_REQUIRED_FIELDS",
"errorTitle": "BAD_REQUEST",
"errorId": "corr-0c9d1e2f",
"status": 400,
"timestamp": "2026-02-11T14:30:00",
"path": "/invoice/send-document-async-json"
}
400 - Bad Request
Scenario: apiKey does not match any registered company.
{
"errorMessage": "Api Key Didnt Match",
"errorType": "API_ERROR",
"errorTitle": "BAD_REQUEST",
"errorId": "corr-1d0e2f3a",
"status": 400,
"timestamp": "2026-02-11T14:30:00",
"path": "/invoice/send-document-async-json"
}
401 - Unauthorized
Scenario: JWT in R-Auth is invalid or expired, or the user is not authorized for the company.
{
"errorMessage": "Not authorized for this action",
"errorType": "NOT_AUTHORITY",
"errorTitle": "UNAUTHORIZED",
"errorId": "corr-2e1f3a4b",
"status": 401,
"timestamp": "2026-02-11T14:30:00",
"path": "/invoice/send-document-async-json"
}
500 - Internal Server Error
Scenario: Unexpected server error.
{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"errorId": "corr-3f2a4b5c",
"status": 500,
"timestamp": "2026-02-11T14:30:00",
"path": "/invoice/send-document-async-json"
}
6. 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
| Property | Value |
|---|---|
| URL | /invoice/document-status/{trackingId} |
| Method | GET |
| Authorization | R-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
| Field | Type | Required | Description |
|---|---|---|---|
| trackingId | UUID | Yes | The 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
| Field | Type | Required | Description |
|---|---|---|---|
| R-Auth | String (JWT) | Yes | User authentication token. A JWT signed with the HS512 algorithm. The payload carries userId, companyId, authorities, and userType information. |
| Accept | String | No | Response media type. Default: / |
Responses
200 - Successful Response
{
"trackingId": "e20a112a-fcb2-4da2-9efd-...",
"companyId": "a1b2c3d4-e5f6-7890-abcd-...",
"direction": "OUTGOING",
"documentType": "PEPPOL_BIS",
"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
| Field | Type | Description |
|---|---|---|
| trackingId | UUID | Unique tracking identifier for the document processing |
| companyId | UUID | Unique identifier of the company the document belongs to |
| direction | String (Enum) | Document direction: INCOMING or OUTGOING |
| documentType | String (Enum) | Document format (e.g.,PEPPOL BIS) |
| waybillType | String (Enum) | Waybill type. Only populated for waybill operations |
| source | String (Enum) | Source platform the document was submitted from (e.g., ERP, PORTAL) |
| target | String (Enum) | null | Target platform for the document |
| status | String (Enum) | Current processing status: PENDING, PROCESSING, COMPLETED, FAILED, SENDING_FAILED, PERMANENT_FAILED |
| filename | String | Name of the processed file |
| invoiceNumber | String | null | Invoice number assigned to the document. Populated when processing completes |
| documentId | UUID | null | Unique system identifier of the created document. Populated when processing completes |
| sendingResult | String | null | Sending result (e.g., SUCCESS, SENT_TO_PEPPOL). Populated when processing completes |
| errorType | String (Enum) | null | Error category when an error occurs. Null for successful operations |
| errors | Object | null | Error details. Variable type: can be List<ValidationError>, List<String>, or String |
| additionalData | Object | Additional metadata for the document, if any. Generally null for Slovak Peppol documents |
| createdAt | DateTime | Timestamp when the processing record was created (ISO 8601) |
| statusUpdatedAt | DateTime | Timestamp when the status was last updated (ISO 8601) |
| completedAt | DateTime | null | Timestamp when processing completed. Null while processing is ongoing |
Parameter Value Reference
DocumentProcessStatus — Possible Status Values
| Value | Description |
|---|---|
| PENDING | Document is queued, processing has not started yet |
| PROCESSING | Document is actively being processed (conversion, validation, sending, etc.) |
| COMPLETED | Document processing completed successfully |
| FAILED | An error occurred during document processing (may be retried) |
| SENDING_FAILED | Document was created but failed during the sending phase |
| PERMANENT_FAILED | Document processing permanently failed (will not be retried) |
DocumentType — Document Direction
| Value | Description |
|---|---|
| INCOMING | Incoming document |
| OUTGOING | Outgoing document |
DataType — Document Format
| Value | Description |
|---|---|
| PEPPOL_BIS | Peppol BIS 3.0 UBL format (the only format used for Slovakia) |
Note: The waybillType field is not used for Slovakia; it only applies to other country modules.
ErrorType — Error Types Specific to This Endpoint
| Value | Message |
|---|---|
| INVOICE_PROCESS_NOT_FOUND | Tracking ID not found |
| VALIDATION_FAILED | Validation failed! |
| INVOICE_NULL_COULD_NOT_SAVE | Invoice is NULL and/or could not be saved! |
| INVOICE_CREATION_FAILED | Invoice creation failed! |
| INVOICE_SENDING_FAILED | Invoice sending failed: {details} |
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"
}
| Detail | Description |
|---|---|
| HTTP Status | 401 Unauthorized |
| Trigger | JWT token is missing, malformed, expired, or signature verification failed |
| Resolution | Send a valid, non-expired JWT token in the R-Auth header |
404 - Not Found
Returned when the provided trackingId does not exist in the database.
Response Body: null (body is empty)
| Detail | Description |
|---|---|
| HTTP Status | 404 Not Found |
| Response Body | null (body is empty) |
| Trigger | No DocumentProcessEntity record matches the given trackingId in the database |
| Internal Error Type | INVOICE_PROCESS_NOT_FOUND — "Tracking ID not found" |
| Resolution | Verify the trackingId value is correct. Use the value returned in the response of the async submission endpoint |
500 - Internal Server Error
Returned when an unexpected server error occurs during the status query.
Response Body: null (body is empty)
| Detail | Description |
|---|---|
| HTTP Status | 500 Internal Server Error |
| Response Body | null (body is empty) |
| Trigger | Database connection failure, entity conversion error, or other unexpected runtime exceptions |
| Resolution | Check 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": "PEPPOL_BIS",
"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": "PEPPOL_BIS",
"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": "PEPPOL_BIS",
"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": "PEPPOL_BIS",
"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"
}
7. Get Invoice/Document Status GET
Purpose of Use: This endpoint is used to query the real-time processing status of an invoice/document by using the trackingId returned from an asynchronous document submission request.
After an invoice or document is submitted through an async flow, the first response may only contain a trackingId. This endpoint allows the client to follow the internal processing lifecycle of that document, including whether it is queued, processing, failed, or completed.
Once a documentId has been assigned to the document, this endpoint also returns invoice-level status information such as invoiceStatus and invoiceStatusDate. If the document has not yet been assigned a final documentId, those fields may be null, and only the process-level status fields should be used.
The request requires that the authenticated user in the R-Auth JWT has authority over the queried companyId.
Endpoint Information
| Property | Value |
|---|---|
| URL | /invoice/get-document-status-by-tracking |
| Method | GET |
| Content-Type | None — query parameters only, no request body |
| Base URL | Stage Environment URLhttps://api-stage.docnova.ai/ Production Environment URLhttps://api.docnova.ai/ |
| Authorization | R-Auth: {{jwt_token}} |
Example Request
curl -X GET 'https://api-stage.docnova.ai/invoice/get-document-status-by-tracking?companyId={{company_uuid}}&trackingId={{tracking_uuid}}' \
-H 'accept: */*' \
-H 'R-Auth: {{jwt_token}}'
Request Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| companyId | String(UUID) | Yes | Unique identifier of the company that the queried tracking record belongs to. The requesting user must hold a role in this company. |
| trackingId | String(UUID) | Yes | The tracking identifier returned in the response of the document's asynchronous submission request. The document status is looked up via this identifier. |
Notes
- The
R-Authheader is mandatory. - The user in the JWT must have a role in the company matching
companyId. - If
trackingIdis not associated withcompanyId, for example when trying to access a record belonging to another company, a401 Unauthorizedresponse is returned. - If the tracking process is found but no
documentIdhas been assigned yet, only the process-level status fields are returned.
Responses
200 - Successful Response
{
"trackingId": "{{tracking_uuid}}",
"documentId": "{{document_uuid}}",
"invoiceStatus": "SENT_TO_PEPPOL",
"invoiceStatusDate": "2026-01-15T12:00:00",
"processStatus": "COMPLETED",
"processStatusUpdatedAt": "2026-01-15T12:00:00"
}
Description: Request succeeded. If the document has not yet been assigned a documentId, the documentId, invoiceStatus, and invoiceStatusDate fields are null, and only processStatus / processStatusUpdatedAt are meaningful.
Response Fields
| Field | Type | Description |
|---|---|---|
| trackingId | String(UUID) | Echoes the trackingId sent in the request. Always populated. |
| documentId | String(UUID) | Populated once the document is assigned a final ID. null if the document has not yet been assigned. |
| invoiceStatus | String(Enum) | Populated once documentId is assigned. Contains the invoice's country/channel-specific final status. null if documentId is not yet assigned. |
| invoiceStatusDate | String(ISO8601) | Timestamp of the last update to invoiceStatus. null if documentId is not yet assigned. |
| processStatus | String(Enum) | Status of the document's own processing pipeline. Always populated, even before documentId is assigned. |
| processStatusUpdatedAt | String(ISO8601) | Timestamp of the last update to processStatus. Always populated. |
Parameter Values Reference Table
processStatus Values
| Value | Description |
|---|---|
| PENDING | Process has not started yet; queued. |
| PROCESSING | Document is currently being processed. |
| FAILED | Processing failed; may be retried. |
| SENDING_FAILED | An error occurred during the sending stage. |
| PERMANENT_FAILED | Permanent failure; will not be retried. |
| COMPLETED | Process completed successfully. |
invoiceStatus Values
| Value | Description |
|---|---|
| CREATED | Invoice/document has been created. |
| SAVED_AS_UBL | Saved in UBL format. |
| SENT_TO_ACCESS_POINT | Sent to the Access Point. |
| OCR_WAITING | Waiting for OCR processing. |
| OCR_PARSED | Successfully parsed by OCR. |
| OCR_FAILED | OCR processing failed. |
| OCR_PARSED_PENDING_PAYMENT | OCR completed, awaiting payment. |
| OCR_WAITING_TOKEN | Waiting for a token for OCR. |
| 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. |
| SENT_VIA_SFTP | Sent via SFTP. |
| SENT_TO_PEPPOL | Sent to the Peppol network. |
| SUCCESS | Operation succeeded. |
| INVALID_PARAMETERS | Invalid parameters. |
| TRANSPORT_ERROR | Peppol transport error; no automatic retry. |
| TRANSPORT_ERROR_NO_RETRY | Peppol transport error; retry disabled. |
| NO_SIGNAL_MESSAGE_RECEIVED | No signal message received. |
| AS4_ERROR_MESSAGE_RECEIVED | AS4 error message received. |
| INVALID_SIGNAL_MESSAGE_RECEIVED | Invalid signal message received. |
| SMP_LOOKUP_FAILED | SMP lookup failed. |
| CREDIT_BLOCKED | Payment blocked due to credit limit. |
All error responses share the following structure:
{
"errorMessage": "<human-readable message>",
"errorType": "<error type key>",
"errorTitle": "<HTTP status name>",
"status": 400,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/invoice/get-document-status-by-tracking"
}
400 - Bad Request
Tracking ID Not Found
{
"errorMessage": "Tracking ID not found",
"errorType": "INVOICE_PROCESS_NOT_FOUND",
"errorTitle": "BAD_REQUEST",
"status": 400,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/invoice/get-document-status-by-tracking"
}
Description: An ApiError(INVOICE_PROCESS_NOT_FOUND) is thrown when the trackingId is not found in the database.
Note: Although Swagger annotation documents this case as 404, the code currently calls withStatus() on this exception, so RestExceptionHandler returns the default 400 Bad Request.
401 - Unauthorized
{
"errorMessage": "User is not authorized for this operation",
"errorType": "AUTHORIZATION_FAILED",
"errorTitle": "UNAUTHORIZED",
"status": 401,
"errorId": "{{correlation_id}}",
"timestamp": "2026-01-15T12:00:00",
"path": "/invoice/get-document-status-by-tracking"
}
Trigger: The user in the R-Auth JWT has no role or authority in the given companyId, or the trackingId belongs to a different company than the given companyId.
500 - Internal Server Error
{
"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-status-by-tracking"
}
Trigger: An unexpected server-side error occurs.
This may happen because of a database connectivity issue, an unhandled exception, or another server-side runtime error.
8. 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
| Property | Value |
|---|---|
| URL | /invoice/document-process/search |
| Method | POST |
| Content-Type | application/json |
| Base URL | Stage Environment URLhttps://api-stage.docnova.ai/ Production Environment URLhttps://api.docnova.ai/ |
| Authorization | R-Auth header (JWT token) |
| Required Authority | ADMIN, 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
| Field | Type | Required | Description |
|---|---|---|---|
| companyId | UUID | Yes | Unique identifier of the company to search |
| direction | String (Enum) | No | Document direction filter (INCOMING or OUTGOING) |
| source | String (Enum) | No | Source system filter |
| filename | String | No | Exact match filter by filename |
| status | String (Enum) | No | Document processing status filter |
| createdAt | Object (DateRange) | No | Creation date range filter |
| createdAt.from | String (LocalDate) | No | Start date (inclusive). Format: yyyy-MM-dd. Must be past or present |
| createdAt.to | String (LocalDate) | No | End date (inclusive). Format: yyyy-MM-dd. Must be past or present |
Query Parameters (Pagination)
| Field | Type | Default | Description |
|---|---|---|---|
| page | Integer | 0 | Page number (0 indexed) |
| size | Integer | 20 | Number of records per page (max 100) |
| sort | String | createdAt,desc | Sort field and direction. Format: field,asc|desc |
Enum Value Reference
direction Values (Document Direction)
| Value | Description |
|---|---|
| INCOMING | Incoming document |
| OUTGOING | Outgoing document |
status Values (Processing Status)
| Value | Description |
|---|---|
| PENDING | Queued and waiting for processing |
| PROCESSING | Currently being processed |
| COMPLETED | Successfully completed |
| FAILED | Processing failed (retriable) |
| SENDING_FAILED | Failed at the sending stage |
| PERMANENT_FAILED | Permanently failed (will not be retried) |
source Values (Source and Target System)
| Value | Description |
|---|---|
| ERP | ERP integration |
| PORTAL | Web portal |
| PORTAL_OCR | Portal upload via OCR |
| EMAIL_OCR | OCR via email |
| PEPPOL | Peppol network |
| SFTP | SFTP connection |
| HARVEST | Harvest integration |
| SHOPIFY | Shopify integration |
| AMAZON_SP | Amazon SP API |
| EBAY | eBay integration |
| HUBSPOT | HubSpot integration |
| LAZADA | Lazada integration |
| STRIPE | Stripe integration |
| SERVICE | Internal service |
documentType Values (Document Format)
| Value | Description |
|---|---|
| PEPPOL_BIS | Peppol BIS 3.0 (the only document format used for Slovakia) |
Note: The waybillType field may appear in responses but is not used for Slovakia (always null); it is populated only for other country modules.
Responses
200 - Successful Response
{
"content": [
{
"trackingId": "a1b2c3d4-...",
"companyId": "60ccd1a7-...",
"direction": "INCOMING",
"documentType": "PEPPOL_BIS",
"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
| Field | Type | Description |
|---|---|---|
| content | Array<Object> | Page content (document processing records) |
| content[].trackingId | UUID | Processing tracking identifier |
| content[].companyId | UUID | Company identifier |
| content[].direction | String (Enum) | Document direction (INCOMING / OUTGOING) |
| content[].documentType | String (Enum) | Document format (see documentType enum table) |
| content[].waybillType | String (Enum) | null | Waybill type (only for waybill documents) |
| content[].source | String (Enum) | Source system of the document |
| content[].target | String (Enum) | null | Target system for the document |
| content[].status | String (Enum) | Current processing status |
| content[].filename | String | Original filename |
| content[].invoiceNumber | String | null | Invoice number |
| content[].documentId | UUID | null | Associated document identifier |
| content[].sendingResult | String | null | Sending result message |
| content[].errorType | String (Enum) | null | Error type code (on failed processes) |
| content[].errors | Object | null | Error details (validation errors, message list, or text) |
| content[].additionalData | Object | null | Country or document type specific metadata |
| content[].createdAt | String (DateTime) | Creation timestamp. Format: yyyy-MM-ddTHH:mm:ss |
| content[].statusUpdatedAt | String (DateTime) | Last status update timestamp |
| content[].completedAt | String (DateTime) | null | Completion timestamp (only when COMPLETED) |
| totalElements | Long | Total number of matching records |
| totalPages | Integer | Total number of pages |
| number | Integer | Current page number (0-indexed) |
| size | Integer | Number 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"
}
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"
}
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.
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)
| Field | Type | Description | Inclusion Condition |
|---|---|---|---|
| errorMessage | String | Human readable error description | Always |
| errorType | String | Machine readable error code (ErrorType enum name) | Always |
| errorTitle | String (HttpStatus) | HTTP status description (BAD_REQUEST, UNAUTHORIZED, etc.) | Always |
| errorId | String | Correlation ID (for log tracing) | If present in ThreadContext |
| status | Integer | HTTP status code (numeric) | Always |
| timestamp | String (DateTime) | Timestamp when the error occurred | By RestExceptionHandler |
| path | String | URI of the request | By RestExceptionHandler |
| data | String | Additional data information | If present (@JsonInclude NON_NULL) |
| details | Map<String, Object> | Additional detail information | If present (@JsonInclude NON_NULL) |
| validationErrors | Array<ValidationError> | Field level validation errors | If 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.
9. 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
| Property | Value |
|---|---|
| URL | /invoice/get-document//{documentTypes} |
| Method | GET |
| Authorization | R-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 Name | Type | Required | Description |
|---|---|---|---|
| documentId | String (UUID) | Yes | Unique identifier of the document. Must be in UUID v4 format. Example: 550e8400-e29b-41d4-a716-... |
| documentTypes | String (Enum) | Yes | Requested document format type. Multiple types can be separated by hyphen -. Example: PDF, XML |
Header Parameters
| Field Name | Type | Required | Description |
|---|---|---|---|
| R-Auth | String (JWT) | Yes | Authentication token. JWT signed with HS512 algorithm. |
| Accept | String | No | Accepted response media type. Default: / |
documentTypes Parameter Values
| Value | Format Type | Description |
|---|---|---|
| FormatType.PDF | Returns Base64-encoded PDF representation of the invoice | |
| XML | FormatType.XML | Returns Base64-encoded UBL XML content of the invoice |
| JSON | FormatType.JSON | Returns Base64-encoded UBL DTO JSON content of the invoice |
| PDF-XML | Multiple formats | Multiple formats can be requested simultaneously using hyphen separator |
| XML-PDF-JSON | Multiple formats | All 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 Name | Type | Description |
|---|---|---|
| documents | List<Document> | List of documents in requested formats. Contains one Document object per format. |
| documents[].file_type | String (Enum) | Document format type. Possible values: PDF, XML, JSON |
| documents[].data | String (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)"
}
]
}
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"
}
| Field | Description |
|---|---|
| errorMessage | Specifies the unsupported document type and which type was invalid. |
| errorType | INVALID_ARGUMENT An invalid parameter was provided. |
| status | 400 |
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"
}
| Field | Description |
|---|---|
| errorMessage | Indicates the invoice has not been processed by MelaAI yet and should be retried later. |
| errorType | INVALID_ARGUMENT The invoice is not in a processable state currently. |
| status | 400 |
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"
}
| Field | Description |
|---|---|
| errorMessage | Indicates that the authentication process must be completed. |
| errorType | AUTHENTICATION_REQUIRED Token is missing, expired, or invalid. |
| status | 401 |
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"
}
| Field | Description |
|---|---|
| errorMessage | Returns a not found message along with the document UUID. |
| errorType | NOT_FOUND_INVOICE No matching invoice record exists in the database. |
| status | 404 |
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"
}
| Field | Description |
|---|---|
| errorMessage | Generic server error message. |
| errorType | SERVER_ERROR An unexpected error occurred. |
| status | 500 |
Common Error Response Field Descriptions
| Field Name | Type | Description |
|---|---|---|
| errorMessage | String | Human readable description of the error |
| errorType | String | Programmatic classification code of the error |
| errorTitle | String (HttpStatus) | Text representation of the HTTP status code |
| errorId | String | Request correlation ID (for log tracking) |
| status | Integer | HTTP status code (numeric) |
| timestamp | String (ISO 8601) | Timestamp when the error occurred |
| path | String | Endpoint path where the error occurred |
| details | Map<String, Object> | Additional error details (if available) |
| validationErrors | List<ValidationError> | List of validation errors (if available) |
10. 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 (PEPPOL BIS). 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
| Property | Value |
|---|---|
| URL | /invoice/search-documents |
| Method | POST |
| Content-Type | application/json |
| Base URL | Stage Environment URLhttps://api-stage.docnova.ai/ Production Environment URLhttps://api.docnova.ai/ |
| Authorization | R-Auth header (JWT token) |
Example Request
curl --location 'api-stage.docnova.ai/invoice/search-documents' \
--header 'Content-Type: application/json' \
--header 'Accept: */*' \
--header 'R-Auth: eyJhbGciOiJIUzUxMiJ9....' \
--data '{
"companyId": "cfffb7b0-608d-49e3-8aa2-8a81109680e2",
"documentType": "OUTGOING",
"endDate": "2026-06-14",
"page": 1,
"status": "SAVED_AS_UBL",
"size": 20,
"startDate": "2026-01-25",
"type": "PEPPOL_BIS"
}'
Request Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| companyId | UUID | Yes | Unique identifier of the company to search documents for |
| documentType | String (Enum) | No | Document direction filter. Used to filter incoming or outgoing documents |
| status | String (Enum) | No | Invoice status filter. Returns invoices in a specific status |
| type | String (Enum) | No | Document format type filter. Filters by invoice format |
| startDate | String (ISO Date) | No | Search start date. Format: YYYY-MM-DD |
| endDate | String (ISO Date) | No | Search end date. Format: YYYY-MM-DD |
| tin | String | No | Tax Identification Number filter |
| uit | String | No | UIT identifier filter |
| referenceDocument | String | No | Search by reference document number |
| page | Integer | No | Page number (0-based). Default: 0 |
| size | Integer | No | Number of records per page. Default: 50 |
Parameter Values
documentType Values
| Value | Description |
|---|---|
| INCOMING | Incoming documents (invoices sent by suppliers) |
| OUTGOING | Outgoing documents (invoices sent to customers) |
type Values
| Value | Group | Description |
|---|---|---|
| PEPPOL_BIS | UBL | Peppol BIS 3.0 format (the format used for Slovakia) |
| Unstructured invoices (paper, images, etc.) |
Note: Due to a current platform limitation, the type filter only actively filters results for a specific subset of document formats that does not include PEPPOL_BIS. Sending type: "PEPPOL_BIS" on this endpoint will not narrow the result set — all of the company's documents are returned regardless of the value sent. Use the documentType (direction) and status filters instead to narrow Slovak Peppol document searches.
status Values
| Category | Value | Description |
|---|---|---|
| General | CREATED | Invoice created |
| PENDING | Awaiting processing | |
| CANCELED | Cancelled | |
| DELETED | Deleted | |
| SENT_VIA_EMAIL | Sent via email | |
| Saved | SAVED_AS_UBL | Saved as UBL |
| SAVED_AS_PDF | Saved as PDF | |
| OCR | OCR_WAITING | OCR processing pending |
| OCR_PARSED | OCR completed successfully | |
| OCR_FAILED | OCR processing failed | |
| OCR_PARSED_PENDING_PAYMENT | OCR completed, payment pending | |
| OCR_WAITING_TOKEN | OCR waiting for token | |
| COMPLETED_BY_MELA_AI | Completed by Mela AI | |
| Peppol | SENT_TO_PEPPOL | Sent to Peppol network |
| SENT_TO_ACCESS_POINT | Sent to Access Point | |
| SUCCESS | Successfully delivered | |
| TRANSPORT_ERROR | Transport error | |
| INVALID_PARAMETERS | Invalid parameters | |
| NO_SIGNAL_MESSAGE_RECEIVED | No signal message received | |
| AS4_ERROR_MESSAGE_RECEIVED | AS4 error message received | |
| INVALID_SIGNAL_MESSAGE_RECEIVED | Invalid signal message received | |
| 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 (MLR/MLS) | |
| OUTGOING_RESPONSE_REJECTED | Outgoing response rejected | |
| OUTGOING_RESPONSE_ACCEPTED | Outgoing response accepted | |
| Other | CREDIT_BLOCKED | Credit blocked (returns masked data) |
Responses
200 - Successful Response
{
"totalCount": 1,
"currencyTotals": [
{
"currency": "EUR",
"totalAmount": 419283.43,
"netAmount": 354187.94,
"taxAmount": 65095.49,
"payableAmount": 416194.42
}
],
"invoiceList": [
{
"id": "c62739c4-ea6a-4aeb-86b0-...",
"companyId": "cfffb7b0-608d-49e3-8aa2-...",
"customerName": "partner",
"supplierName": "Demo Slovakia s.r.o.",
"supplierId": "5342382",
"supplierVat": "SK2029999999",
"status": "SAVED_AS_UBL",
"invoiceNumber": "2701-1509",
"taxExclusiveAmount": 1600.0,
"taxInclusiveAmount": 1760.0,
"lineExtensionAmount": 1600.0,
"payableAmount": 1760.0,
"currency": "EUR",
"issueDate": "2026-03-14",
"dueDate": "2026-05-02",
"supplierCountryCode": "SK",
"supplierEndpoint": "iso6523-actorid-upis::9930:de610083641",
"customerId": "5625652",
"customerVat": "DE5665661",
"customerEndpoint": "iso6523-actorid-upis::9930:DE456982314",
"customerCountryCode": "DE",
"typeCode": "380",
"documentType": "OUTGOING",
"type": "PEPPOL_BIS",
"source": "PORTAL",
"sendViaPeppol": true,
"paymentDetails": {
"paymentStatus": "LATE",
"paidAmount": 0.0,
"totalAmount": 1760.0,
"remainingAmount": 1760.0,
"paymentDate": null
},
"profileType": "EN16931",
"isActive": true,
"isRead": false
}
]
}
Successful Response Field Descriptions
Top-Level Fields
| Field | Type | Description |
|---|---|---|
| totalCount | Long | Total number of documents matching the filters |
| netTotal | Double | Tax-exclusive total amount (excludes CREDIT_BLOCKED) |
| total | Double | Tax-inclusive total amount (excludes CREDIT_BLOCKED) |
| invoiceList | Array<Invoice> | List of invoice objects |
Invoice Object Fields
| Field | Type | Description |
|---|---|---|
| id | String (UUID) | Unique identifier of the invoice |
| companyId | String (UUID) | Company ID the invoice belongs to |
| userId | String (UUID) | User ID who created the invoice |
| customerName | String | Customer (buyer) name |
| supplierName | String | Supplier (seller) name |
| supplierId | String | Supplier ID |
| supplierVat | String | Supplier VAT number |
| status | String (Enum) | Current invoice status |
| invoiceNumber | String | Invoice number |
| taxExclusiveAmount | Double | Tax-exclusive amount |
| taxInclusiveAmount | Double | Tax-inclusive amount |
| lineExtensionAmount | Double | Line items total amount |
| payableAmount | Double | Amount payable |
| allowanceTotalAmount | Double | Total allowance/discount amount |
| currency | String | Currency code (ISO 4217: EUR, USD, TRY, etc.) |
| createdTime | String (DateTime) | Creation timestamp (UTC) |
| localCreatedTime | String (DateTime) | Creation timestamp (local time) |
| issueDate | String (Date) | Invoice issue date |
| deliveryDate | String (Date) | Delivery date |
| dueDate | String (Date) | Due date |
| supplierCountryCode | String | Supplier country code (ISO 3166-1 alpha-2) |
| supplierEndpoint | String | Supplier Peppol endpoint |
| customerId | String | Customer ID |
| customerVat | String | Customer VAT number |
| customerEndpoint | String | Customer Peppol endpoint |
| customerCountryCode | String | Customer country code |
| typeCode | String | Invoice type code (e.g., 380=Invoice, 381=Credit Note) |
| documentType | String (Enum) | Document direction: INCOMING or OUTGOING |
| errorMessage | String | Error message (if any) |
| lastUpdatedTime | String (DateTime) | Last update timestamp (UTC) |
| localLastUpdatedTime | String (DateTime) | Last update timestamp (local time) |
| type | String (Enum) | Document format type (DataType) |
| source | String (Enum) | Invoice source (PORTAL, ERP, PEPPOL, EMAIL, etc.) |
| sendViaPeppol | Boolean | Whether sent via Peppol |
| statusTime | String (DateTime) | Status change timestamp (UTC) |
| localStatusTime | String (DateTime) | Status change timestamp (local time) |
| fileName | String | File name |
| ocrParser | String (Enum) | OCR parser type |
| paymentDetails | Object | Payment details (null for certain statuses) |
| profileType | String (Enum) | ZUGFeRD profile type: BASIC, EN16931, EXTENDED |
| isActive | Boolean | Whether the invoice is active |
| countrySpecificData | Object | Country-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
| Field | Type | Description |
|---|---|---|
| errorMessage | String | Human-readable error description |
| errorType | String | Error type code |
| errorTitle | String | HTTP status name |
| errorId | String | Correlation ID (for log tracing) |
| status | Integer | HTTP status code |
| timestamp | String (DateTime) | Error occurrence time |
| path | String | Request 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
| Field | Type | Description |
|---|---|---|
| errorMessage | String | Authorization error description |
| errorType | String | Fixed value: NOT_AUTHORITY |
| errorTitle | String | HTTP status name: UNAUTHORIZED |
| errorId | String | Correlation ID |
| status | Integer | 401 |
| timestamp | String (DateTime) | Error occurrence time |
| path | String | Request 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
| Field | Type | Description |
|---|---|---|
| errorMessage | String | General error message |
| errorType | String | RUNTIME_ERROR, IO_ERROR, or SERVER_ERROR |
| errorTitle | String | HTTP status name: INTERNAL_SERVER_ERROR |
| errorId | String | Correlation ID (for log tracing) |
| status | Integer | 500 |
| timestamp | String (DateTime) | Error occurrence time |
| path | String | Request path |
11. Get Invoice Details GET
Purpose of Use:
The GET /invoice/get-invoice/{invoiceId} endpoint allows retrieving the full structured details of a single invoice, including header data, party details, tax breakdown, and all invoice line items, in one consistent JSON structure regardless of the invoice's underlying document format, such as UBL, CII, Factur-X, etc.
Endpoint Information
| Property | Value |
|---|---|
| URL | /invoice/get-invoice/{invoiceId} |
| Method | GET |
| Content-Type | application/json |
| Base URL | Stage Environment URLhttps://api-stage.docnova.ai/ Production Environment URLhttps://api.docnova.ai/ |
| Authorization | R-Auth header, JWT token |
Example Request
curl -X GET 'https://api-stage.docnova.ai/invoice/get-invoice/{invoiceId}' \
--header 'R-Auth: {your JWT}'
Request Parameters
| Field Name | Type | Required | Description |
|---|---|---|---|
| invoiceId | String (UUID) | Yes | Unique identifier of the invoice. Must be in UUID v4 format. Obtained from the id field in the search-documents response. |
| R-Auth | String (JWT) | Yes | Authentication token. JWT signed with HS512 algorithm. |
Responses
200 - Successful Response
Returns an object with two top-level fields: invoice, the full invoice data, and paymentDetails, the payment status summary.
{
"invoice": {
"Type": "PEPPOL_BIS",
"StandardBusinessDocumentHeader": null,
"LeitwegId": null,
"IsPeppolParticipant": false,
"CompanyId": null,
"DraftUuid": null,
"OcrUuid": null,
"InvoiceUuid": null,
"PartnerUuid": null,
"ExternalInvoiceId": null,
"Format": null,
"ProfileType": "EN16931",
"BusinessModelType": null,
"UBLExtensions": null,
"UBLVersionID": {
"schemeID": null,
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "2.1"
},
"CustomizationID": {
"schemeID": null,
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0"
},
"ProfileID": {
"schemeID": null,
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0"
},
"ProfileExecutionID": null,
"ID": {
"schemeID": null,
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "2701-15893"
},
"CopyIndicator": null,
"UUID": null,
"IssueDate": {
"Value": "2026-08-14"
},
"IssueTime": null,
"DueDate": {
"Value": "2026-08-20"
},
"InvoiceTypeCode": {
"listID": null,
"listAgencyID": null,
"listAgencyName": null,
"listName": null,
"listVersionID": null,
"name": null,
"Value": "380"
},
"Note": [
{
"languageID": null,
"Value": "Thank you for your order."
}
],
"TaxPointDate": {
"Value": "2026-08-14"
},
"DocumentCurrencyCode": {
"listID": null,
"listAgencyID": null,
"listAgencyName": null,
"listName": null,
"listVersionID": null,
"name": null,
"Value": "EUR"
},
"TaxCurrencyCode": null,
"PricingCurrencyCode": null,
"PaymentCurrencyCode": null,
"PaymentAlternativeCurrencyCode": null,
"AccountingCostCode": null,
"AccountingCost": {
"languageID": null,
"Value": "68"
},
"LineCountNumeric": null,
"BuyerReference": {
"languageID": null,
"Value": "buyer reference"
},
"InvoicePeriod": null,
"DiscrepancyResponse": null,
"OrderReference": {
"ID": {
"schemeID": null,
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "purchase order"
},
"SalesOrderID": {
"schemeID": null,
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "sales order reference"
},
"CopyIndicator": null,
"UUID": null,
"IssueDate": null,
"IssueTime": null,
"CustomerReference": null,
"DocumentReference": null
},
"BillingReference": null,
"DespatchDocumentReference": null,
"ReceiptDocumentReference": null,
"StatementDocumentReference": null,
"OriginatorDocumentReference": null,
"ContractDocumentReference": null,
"AdditionalDocumentReference": [
{
"ID": {
"schemeID": null,
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "docnova-document.pdf"
},
"CopyIndicator": null,
"UUID": null,
"IssueDate": null,
"DocumentTypeCode": null,
"DocumentType": null,
"XPath": null,
"DocumentStatusCode": null,
"DocumentDescription": null,
"Attachment": {
"EmbeddedDocumentBinaryObject": {
"mimeCode": "application/pdf",
"encodingCode": null,
"characterSetCode": null,
"filename": "docnova-document.pdf",
"Value": "JVBERi0xLjcKJeLjz9MKOCAwIG9iago8PC9..."
},
"ExternalReference": null
},
"ResultOfVerification": null
}
],
"ProjectReference": null,
"Signature": null,
"AccountingSupplierParty": {
"CustomerAssignedAccountID": null,
"AdditionalAccountID": null,
"Party": {
"WebsiteURI": null,
"LogoReferenceID": null,
"EndpointID": {
"schemeID": "0245",
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "2029999999"
},
"IndustryClassificationCode": null,
"PartyIdentification": [
{
"ID": {
"schemeID": null,
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "5342382"
}
}
],
"PartyName": [
{
"Name": {
"languageID": null,
"Value": "Demo Slovakia s.r.o."
}
}
],
"Language": null,
"PostalAddress": {
"ID": null,
"AddressTypeCode": null,
"AddressFormatCode": null,
"Postbox": null,
"Floor": null,
"Room": null,
"StreetName": {
"languageID": null,
"Value": "Testovacia 123, Bratislava, Slovakia"
},
"AdditionalStreetName": null,
"BuildingName": null,
"BuildingNumber": null,
"InhouseMail": null,
"Department": null,
"MarkAttention": null,
"MarkCare": null,
"PlotIdentification": null,
"CitySubdivisionName": null,
"CityName": {
"languageID": null,
"Value": "Bratislava"
},
"PostalZone": {
"languageID": null,
"Value": "10115"
},
"CountrySubentity": null,
"CountrySubentityCode": null,
"Region": null,
"District": null,
"AddressLine": [
{
"Line": {
"languageID": null,
"Value": "Testovacia 123, Bratislava, Slovakia"
}
}
],
"Country": {
"Name": null,
"IdentificationCode": {
"listID": null,
"listAgencyID": null,
"listAgencyName": null,
"listName": null,
"listVersionID": null,
"Value": "SK"
}
}
},
"PhysicalLocation": null,
"PartyTaxScheme": [
{
"RegistrationName": null,
"CompanyID": {
"schemeID": null,
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "SK2029999999"
},
"ExemptionReasonCode": null,
"ExemptionReason": null,
"RegistrationAddress": null,
"TaxScheme": {
"ID": {
"schemeID": null,
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "VAT"
},
"Name": null,
"TaxTypeCode": null,
"CurrencyCode": null,
"JurisdictionRegionAddress": null
}
}
],
"PartyLegalEntity": [
{
"RegistrationName": {
"languageID": null,
"Value": "Demo Slovakia s.r.o."
},
"CompanyID": {
"schemeID": null,
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "SK2029999999"
},
"CompanyLegalForm": null,
"RegistrationAddress": null
}
],
"Contact": {
"ID": null,
"Name": {
"languageID": null,
"Value": "Demo Slovakia s.r.o."
},
"Telephone": {
"languageID": null,
"Value": "+49301234567"
},
"Telefax": null,
"ElectronicMail": {
"languageID": null,
"Value": "demo@yopmail.com"
},
"Note": null,
"OtherCommunication": null
},
"Person": null
},
"DespatchContact": null,
"AccountingContact": null,
"SellerContact": null
},
"AccountingCustomerParty": {
"CustomerAssignedAccountID": null,
"SupplierAssignedAccountID": null,
"AdditionalAccountID": null,
"Party": {
"WebsiteURI": null,
"LogoReferenceID": null,
"EndpointID": {
"schemeID": "9930",
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "DE610083641"
},
"IndustryClassificationCode": null,
"PartyIdentification": [
{
"ID": {
"schemeID": null,
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "DE123658956"
}
}
],
"PartyName": [
{
"Name": {
"languageID": null,
"Value": "ABC Innovations GmBH"
}
}
],
"Language": null,
"PostalAddress": {
"ID": null,
"AddressTypeCode": null,
"AddressFormatCode": null,
"Postbox": null,
"Floor": null,
"Room": null,
"StreetName": {
"languageID": null,
"Value": "address"
},
"AdditionalStreetName": null,
"BuildingName": null,
"BuildingNumber": null,
"InhouseMail": null,
"Department": null,
"MarkAttention": null,
"MarkCare": null,
"PlotIdentification": null,
"CitySubdivisionName": null,
"CityName": {
"languageID": null,
"Value": "Berlin"
},
"PostalZone": {
"languageID": null,
"Value": "1093"
},
"CountrySubentity": null,
"CountrySubentityCode": null,
"Region": null,
"District": null,
"AddressLine": [
{
"Line": {
"languageID": null,
"Value": "address"
}
}
],
"Country": {
"Name": null,
"IdentificationCode": {
"listID": null,
"listAgencyID": null,
"listAgencyName": null,
"listName": null,
"listVersionID": null,
"Value": "DE"
}
}
},
"PhysicalLocation": null,
"PartyTaxScheme": [
{
"RegistrationName": null,
"CompanyID": {
"schemeID": null,
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "DE123658956"
},
"ExemptionReasonCode": null,
"ExemptionReason": null,
"RegistrationAddress": null,
"TaxScheme": {
"ID": {
"schemeID": null,
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "VAT"
},
"Name": null,
"TaxTypeCode": null,
"CurrencyCode": null,
"JurisdictionRegionAddress": null
}
}
],
"PartyLegalEntity": [
{
"RegistrationName": {
"languageID": null,
"Value": "DataCore Innovations AG-ebru"
},
"CompanyID": {
"schemeID": null,
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "DE123658956"
},
"CompanyLegalForm": null,
"RegistrationAddress": null
}
],
"Contact": {
"ID": null,
"Name": {
"languageID": null,
"Value": "partner name"
},
"Telephone": {
"languageID": null,
"Value": "5544332"
},
"Telefax": null,
"ElectronicMail": {
"languageID": null,
"Value": "partner@yopmail.com"
},
"Note": null,
"OtherCommunication": null
},
"Person": null
},
"DeliveryContact": null,
"AccountingContact": null,
"BuyerContact": null
},
"PayeeParty": null,
"BuyerCustomerParty": null,
"SellerSupplierParty": null,
"TaxRepresentativeParty": null,
"Delivery": [
{
"ID": null,
"Quantity": null,
"MinimumQuantity": null,
"MaximumQuantity": null,
"ActualDeliveryDate": {
"Value": "2026-01-30"
},
"LatestDeliveryDate": null,
"LatestDeliveryTime": null,
"TrackingID": null,
"DeliveryLocation": {
"ID": null,
"Description": null,
"Conditions": null,
"CountrySubentity": null,
"CountrySubentityCode": null,
"ValidityPeriod": null,
"Address": {
"ID": null,
"AddressTypeCode": null,
"AddressFormatCode": null,
"Postbox": null,
"Floor": null,
"Room": null,
"StreetName": {
"languageID": null,
"Value": "address"
},
"AdditionalStreetName": null,
"BuildingName": null,
"BuildingNumber": null,
"InhouseMail": null,
"Department": null,
"MarkAttention": null,
"MarkCare": null,
"PlotIdentification": null,
"CitySubdivisionName": null,
"CityName": {
"languageID": null,
"Value": "berlin"
},
"PostalZone": {
"languageID": null,
"Value": "10309"
},
"CountrySubentity": null,
"CountrySubentityCode": null,
"Region": null,
"District": null,
"AddressLine": [
{
"Line": {
"languageID": null,
"Value": "address"
}
}
],
"Country": {
"Name": null,
"IdentificationCode": {
"listID": null,
"listAgencyID": null,
"listAgencyName": null,
"listName": null,
"listVersionID": null,
"Value": "DE"
}
}
}
},
"RequestedDeliveryPeriod": null,
"PromisedDeliveryPeriod": null,
"EstimatedDeliveryPeriod": null,
"DeliveryParty": {
"WebsiteURI": null,
"LogoReferenceID": null,
"EndpointID": null,
"IndustryClassificationCode": null,
"PartyIdentification": null,
"PartyName": [
{
"Name": {
"languageID": null,
"Value": "Delivery Recipient Name"
}
}
],
"Language": null,
"PostalAddress": null,
"PhysicalLocation": null,
"PartyTaxScheme": null,
"PartyLegalEntity": null,
"Contact": null,
"Person": null
},
"Despatch": null,
"DeliveryTerms": null,
"Shipment": null
}
],
"DeliveryTerms": null,
"PaymentMeans": [
{
"ID": null,
"PaymentMeansCode": {
"listID": null,
"listAgencyID": null,
"listAgencyName": null,
"listName": null,
"listVersionID": null,
"name": null,
"Value": "30"
},
"PaymentDueDate": null,
"PaymentChannelCode": null,
"InstructionID": null,
"InstructionNote": null,
"PaymentID": null,
"CardAccount": null,
"PayerFinancialAccount": null,
"PayeeFinancialAccount": {
"ID": {
"schemeID": null,
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "SK8975000000000012345671"
},
"Name": {
"languageID": null,
"Value": "Account holder name"
},
"AccountTypeCode": null,
"CurrencyCode": null,
"PaymentNote": null,
"FinancialInstitutionBranch": {
"ID": {
"schemeID": null,
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "BICnumber"
},
"Name": null,
"FinancialInstitution": null,
"Address": null
}
},
"CreditAccount": null,
"PaymentMandate": null
}
],
"PaymentTerms": null,
"PrepaidPayment": null,
"AllowanceCharge": null,
"TaxExchangeRate": null,
"PricingExchangeRate": null,
"PaymentExchangeRate": null,
"PaymentAlternativeExchangeRate": null,
"TaxTotal": [
{
"TaxAmount": {
"currencyID": "EUR",
"Value": 12.92
},
"RoundingAmount": null,
"TaxEvidenceIndicator": null,
"TaxIncludedIndicator": null,
"TaxSubtotal": [
{
"TaxableAmount": {
"currencyID": "EUR",
"Value": 68.00
},
"TaxAmount": {
"currencyID": "EUR",
"Value": 12.92
},
"CalculationSequenceNumeric": null,
"TransactionCurrencyTaxAmount": null,
"Percent": null,
"BaseUnitMeasure": null,
"PerUnitAmount": null,
"TaxCategory": {
"ID": {
"schemeID": null,
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "S"
},
"Name": null,
"Percent": {
"format": null,
"Value": 19
},
"BaseUnitMeasure": null,
"PerUnitAmount": null,
"TaxExemptionReasonCode": null,
"TaxExemptionReason": null,
"TaxScheme": {
"ID": {
"schemeID": null,
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "VAT"
},
"Name": null,
"TaxTypeCode": null,
"CurrencyCode": null,
"JurisdictionRegionAddress": null
}
}
}
]
}
],
"LegalMonetaryTotal": {
"LineExtensionAmount": {
"currencyID": "EUR",
"Value": 68
},
"TaxExclusiveAmount": {
"currencyID": "EUR",
"Value": 68
},
"TaxInclusiveAmount": {
"currencyID": "EUR",
"Value": 80.92
},
"AllowanceTotalAmount": null,
"ChargeTotalAmount": null,
"PrepaidAmount": null,
"PayableRoundingAmount": null,
"PayableAmount": {
"currencyID": "EUR",
"Value": 80.92
}
},
"InvoiceLine": [
{
"ID": {
"schemeID": null,
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "1"
},
"UUID": null,
"Note": null,
"InvoicedQuantity": {
"unitCode": "XBA",
"Value": 2
},
"LineExtensionAmount": {
"currencyID": "EUR",
"Value": 68
},
"TaxPointDate": null,
"AccountingCostCode": null,
"AccountingCost": null,
"FreeOfChargeIndicator": null,
"InvoicePeriod": null,
"OrderLineReference": null,
"DespatchLineReference": null,
"ReceiptLineReference": null,
"BillingReference": null,
"PricingReference": null,
"DocumentReference": [
{
"ID": {
"schemeID": null,
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "1"
},
"CopyIndicator": null,
"UUID": null,
"IssueDate": null,
"DocumentTypeCode": {
"listID": null,
"listAgencyID": null,
"listAgencyName": null,
"listName": null,
"listVersionID": null,
"name": null,
"Value": "130"
},
"DocumentType": null,
"XPath": null,
"DocumentStatusCode": null,
"DocumentDescription": null,
"Attachment": null,
"ResultOfVerification": null
}
],
"OriginatorParty": null,
"Delivery": null,
"AllowanceCharge": null,
"TaxTotal": null,
"Item": {
"Description": null,
"PackQuantity": null,
"PackSizeNumeric": null,
"CatalogueIndicator": null,
"Name": {
"languageID": null,
"Value": "product"
},
"HazardousRiskIndicator": null,
"AdditionalInformation": null,
"Keyword": null,
"BrandName": null,
"ModelName": null,
"BuyersItemIdentification": null,
"SellersItemIdentification": {
"ID": {
"schemeID": null,
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "1"
}
},
"ManufacturersItemIdentification": null,
"StandardItemIdentification": null,
"CatalogueItemIdentification": null,
"AdditionalItemIdentification": null,
"CatalogueDocumentReference": null,
"ItemSpecificationDocumentReference": null,
"OriginCountry": null,
"CommodityClassification": null,
"TransactionConditions": null,
"HazardousItem": null,
"ClassifiedTaxCategory": [
{
"ID": {
"schemeID": null,
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "S"
},
"Name": null,
"Percent": {
"format": null,
"Value": 19
},
"BaseUnitMeasure": null,
"PerUnitAmount": null,
"TaxExemptionReasonCode": null,
"TaxExemptionReason": null,
"TaxScheme": {
"ID": {
"schemeID": null,
"schemeName": null,
"schemeAgencyID": null,
"schemeAgencyName": null,
"schemeVersionID": null,
"Value": "VAT"
},
"Name": null,
"TaxTypeCode": null,
"CurrencyCode": null,
"JurisdictionRegionAddress": null
}
}
],
"AdditionalItemProperty": null,
"ManufacturerParty": null,
"InformationContentProviderParty": null,
"OriginAddress": null,
"ItemInstance": null
},
"Price": {
"PriceAmount": {
"currencyID": "EUR",
"Value": 34
},
"BaseQuantity": null,
"PriceChangeReason": null,
"PriceTypeCode": null,
"PriceType": null,
"OrderableUnitFactorRate": null,
"ValidityPeriod": null,
"PriceList": null,
"AllowanceCharge": null
},
"ItemPriceExtension": null,
"CatalogItemId": null
}
]
},
"paymentDetails": {
"paymentStatus": "SENT",
"paidAmount": 0.0,
"totalAmount": 80.92,
"remainingAmount": 80.92,
"paymentDate": null
}
}
Response Fields
| Field | Type | Description |
|---|---|---|
| invoice | object | Full structured invoice data. |
| invoice.Type | string | Underlying invoice document type. PEPPOL_BIS for Slovak documents. |
| invoice.ProfileType | string | Invoice profile type, e.g. EN16931. |
| invoice.ID.Value | string | Business invoice number. |
| invoice.IssueDate.Value | date | Invoice issue date. |
| invoice.DueDate.Value | date | Invoice due date. |
| invoice.InvoiceTypeCode.Value | string | Invoice type code, e.g. 380. |
| invoice.DocumentCurrencyCode.Value | string | Invoice currency, e.g. EUR. |
| invoice.AccountingSupplierParty | object | Supplier party details. |
| invoice.AccountingCustomerParty | object | Customer party details. |
| invoice.TaxTotal | array | Tax total and tax breakdown information. |
| invoice.LegalMonetaryTotal | object | Invoice monetary totals. |
| invoice.InvoiceLine | array | Invoice line items. |
| paymentDetails | object | Payment status summary. |
| paymentDetails.paymentStatus | string | Current payment status. |
| paymentDetails.paidAmount | number | Amount already paid. |
| paymentDetails.totalAmount | number | Total invoice amount. |
| paymentDetails.remainingAmount | number | Remaining unpaid amount. |
| paymentDetails.paymentDate | datetime | Payment date, if available. |
401 - Unauthorized
{
"errorMessage": "User is not authorized for this operation",
"errorType": "NOT_AUTHORITY",
"status": 401,
"timestamp": "2026-07-29T12:00:00",
"path": "/invoice/get-invoice/{invoiceId}"
}
404 - Not Found
Returned when no invoice exists with the given invoiceId.
{
"errorMessage": "{invoiceId} Invoice not found!",
"errorType": "NOT_FOUND_INVOICE",
"status": 404,
"timestamp": "2026-07-29T12:00:00",
"path": "/invoice/get-invoice/{invoiceId}"
}
500 - Internal Server Error
Returned when invoiceId is not a valid UUID.
{
"errorMessage": "Invalid UUID string: {invoiceId}",
"errorType": "RUNTIME_ERROR",
"status": 500,
"timestamp": "2026-07-29T12:00:00",
"path": "/invoice/get-invoice/{invoiceId}"
}
12. 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.docnova.ai/ Production Environment URLhttps://api.docnova.ai/ |
| Authentication | R-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": "SK",
"type": "PEPPOL_BIS",
"vatNumber": "SK2029999999"
}
Request Parameters
| Field Name | Type | Required | Description |
|---|---|---|---|
| base64XML | String | Yes | Base64-encoded invoice XML data. Must be a valid Peppol BIS 3.0 UBL 2.1 XML for Slovak documents. |
| type | Enum (DataType) | Yes | Invoice format type. Specifies the standard of the provided XML. Valid values are listed in the table below. |
| country | Enum (Country) | No | Country 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. |
| vatNumber | String | No | VAT number of the invoicing company. When used together with country, it matches against the company record in the system. |
Valid Values for type Parameter
| Value | Description | XSLT Group |
|---|---|---|
| PEPPOL_BIS | PEPPOL BIS 3.0 standard (the format used for Slovakia) | XRECHNUNG |
| Unstructured invoice (paper invoices, images, etc.) | ZUGFERD |
country Parameter
| Country Code | Country | PDF Language |
|---|---|---|
| SK | Slovakia | Slovak (SK) |
| All others | — | English (EN) |
Responses
200 - Successful Response
| Property | Value |
|---|---|
| HTTP Status | 200 |
| Content-Type | application/octet-stream |
| Body | Binary 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 Name | Type | Description |
|---|---|---|
| errorMessage | String | Detailed description of the error |
| errorType | String | Error type identifier |
| errorTitle | String | HTTP status name (BAD_REQUEST, INTERNAL_SERVER_ERROR, etc.) |
| errorId | String | Correlation ID (for log tracing) |
| status | Integer | HTTP status code (400, 500, etc.) |
| timestamp | String (ISO 8601) | Time when the error occurred |
| path | String | Requested URL path |
13. Peppol - 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.docnova.ai/ Production Environment URLhttps://api.docnova.ai/ |
| Authorization | R-Auth header (JWT token) |
Example Request
curl --location 'https://api-stage.docnova.ai/peppol/invoice-mls-list?companyId={{company_uuid}}&invoiceId={{invoice_uuid}}' \
--header 'Accept: */*' \
--header 'R-Auth: {{jwt_token}}'
Request Parameters
Query Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| companyId | UUID | Yes | The unique identifier of the company used for authorization. The authenticated user must belong to this company |
| invoiceId | 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.
[
{
"responseType": "ACCEPTANCE",
"receivedTime": "2026-02-10T10:30:00",
"direction": "INCOMING",
"mlsType": "INVOICE_RESPONSE",
"errorLines": []
},
{
"responseType": "REJECTION",
"receivedTime": "2026-02-09T08: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
| Field | Type | Description |
|---|---|---|
| responseType | Enum | MLS response type: ACCEPTANCE, ACKNOWLEDGING, or REJECTION |
| receivedTime | DateTime | Timestamp when the MLS message was received or sent |
| direction | Enum | Message direction: INCOMING or OUTGOING |
| mlsType | Enum | MLS type: INVOICE_RESPONSE, TDD_RESPONSE, or TDD_REPORT |
| errorLines | Array<Object> | List of error lines. May be populated when responseType is REJECTION |
| errorLines[].errorField | String | The name of the field where the error occurred |
| errorLines[].responseCode | Enum | MLS response code for this error line |
| errorLines[].description | String | Free-text description explaining the error detail |
| errorLines[].statusReasonCode | Enum | BUSINESS_RULE_FATAL, BUSINESS_RULE_WARNING, DELIVERY_FAILURE, or SYNTAX_VIOLATION |
401 - Unauthorized
Trigger: The authenticated user does not belong to the specified company, or the R-Auth header is invalid or expired.
{
"errorMessage": "Authorization failed",
"errorType": "AUTHORIZATION_FAILED",
"errorTitle": "UNAUTHORIZED",
"errorId": "corr-1f0a2b3c",
"status": 401,
"timestamp": "2026-02-11T14:30:00",
"path": "/peppol/invoice-mls-list"
}
500 - Internal Server Error
Trigger: An unexpected server error occurs.
{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"errorId": "corr-2a1b3c4d",
"status": 500,
"timestamp": "2026-02-11T14:30:00",
"path": "/peppol/invoice-mls-list"
}
14. Peppol - 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 record generated alongside a Peppol document to support additional government/tax authority reporting obligations. 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.docnova.ai/ Production Environment URLhttps://api.docnova.ai/ |
| Authorization | R-Auth header (JWT token) |
Example Request
curl --location 'https://api-stage.docnova.ai/peppol/get-tdd?companyId={{company_uuid}}&invoiceId={{invoice_uuid}}' \
--header 'Accept: */*' \
--header 'R-Auth: {{jwt_token}}'
Request Parameters
Query Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| companyId | UUID | Yes | Unique identifier of the company for which the TDD is being queried |
| invoiceId | 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.
{
"createdDate": "2026-02-10T10:00:00",
"updateDate": "2026-02-10T10:05:00",
"documentType": "SUBMIT",
"documentScope": "DOMESTIC",
"role": "SENDER",
"totalAmount": 320.00,
"taxExclusiveAmount": 1600.00,
"status": "TDD_SEND"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| createdDate | DateTime | Date and time the TDD record was created |
| updateDate | DateTime | Date and time the TDD record was last updated |
| documentType | Enum | TDD document type: SUBMIT, RESUBMIT, WITHDRAW, or FAILED |
| documentScope | Enum | TDD document scope: DOMESTIC, INTERNATIONAL_PEPPOL, or INTERNATIONAL_NON_PEPPOL |
| role | 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 | Enum | Current TDD status: TDD_SEND, TDD_FAILED, or MLS_RECEIVED_FOR_TDD |
Parameter Value Reference
documentType Values
| Value | Description |
|---|---|
| SUBMIT | Initial submission |
| RESUBMIT | Re-submission of an existing TDD |
| WITHDRAW | Withdrawal of a previously submitted TDD |
| FAILED | Failed submission |
documentScope Values
| Value | Description |
|---|---|
| DOMESTIC | Domestic transaction — both supplier and customer are in Slovakia |
| INTERNATIONAL_PEPPOL | Cross-border transaction carried over the Peppol network |
| INTERNATIONAL_NON_PEPPOL | Cross-border transaction outside Peppol |
role Values
| Value | Description |
|---|---|
| SENDER | The party sending the invoice |
| RECEIVER | The party receiving the invoice |
status 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: An invalid or expired R-Auth token is provided, or the authenticated user does not belong to the specified company.
{
"errorMessage": "Authorization failed!",
"errorType": "AUTHORIZATION_FAILED",
"errorTitle": "UNAUTHORIZED",
"errorId": "corr-7b6c8d9e",
"status": 401,
"timestamp": "2026-02-11T14:30:00",
"path": "/peppol/get-tdd"
}
500 - Internal Server Error
Trigger: An unexpected server error occurs.
{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"errorId": "corr-8c7d9e0f",
"status": 500,
"timestamp": "2026-02-11T14:30:00",
"path": "/peppol/get-tdd"
}
15. Peppol - TDD MLS List GET
Purpose of Use: This endpoint retrieves all MLS (Message Level Status) responses associated with a specific TDD (Tax Data Document) 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.docnova.ai/ Production Environment URLhttps://api.docnova.ai/ |
| Authorization | R-Auth header (JWT token) |
Example Request
curl --location 'https://api-stage.docnova.ai/peppol/tdd-mls-list?companyId={{company_uuid}}&tddId={{tdd_uuid}}' \
--header 'Accept: */*' \
--header 'R-Auth: {{jwt_token}}'
Request Parameters
Query Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| companyId | 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 | UUID | Yes | The unique identifier of the TDD record for which MLS responses are to be listed |
Responses
200 - Successful Response
Returns a list of MLS responses for the specified TDD record. Returns an empty array if no MLS responses exist for the TDD.
[
{
"responseType": "ACCEPTANCE",
"receivedTime": "2026-02-10T12:00:00",
"direction": "INCOMING",
"mlsType": "TDD_RESPONSE",
"errorLines": []
},
{
"responseType": "REJECTION",
"receivedTime": "2026-02-09T09:30:00",
"direction": "OUTGOING",
"mlsType": "TDD_REPORT",
"errorLines": [
{
"errorField": "InvoiceTypeCode",
"responseCode": "REJECTION",
"description": "Syntax error in InvoiceTypeCode field",
"statusReasonCode": "SYNTAX_VIOLATION"
}
]
}
]
Response Fields
| Field | Type | Description |
|---|---|---|
| responseType | Enum | The type of MLS response: ACCEPTANCE, ACKNOWLEDGING, or REJECTION |
| receivedTime | DateTime | The date and time when the MLS response was received or sent |
| direction | Enum | The direction of the MLS response: INCOMING or OUTGOING |
| mlsType | Enum | The type of MLS message: INVOICE_RESPONSE, TDD_RESPONSE, or TDD_REPORT |
| errorLines | Array<Object> | List of error detail lines. Returns an empty array when no errors are present |
401 - Unauthorized
Trigger: The user does not belong to the specified company or the R-Auth token is invalid.
{
"errorMessage": "Authorization failed",
"errorType": "AUTHORIZATION_FAILED",
"errorTitle": "UNAUTHORIZED",
"errorId": "corr-3b2c4d5e",
"status": 401,
"timestamp": "2026-02-11T14:30:00",
"path": "/peppol/tdd-mls-list"
}
500 - Internal Server Error
Trigger: An unexpected server error occurs.
{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"errorId": "corr-4c3d5e6f",
"status": 500,
"timestamp": "2026-02-11T14:30:00",
"path": "/peppol/tdd-mls-list"
}
16. Peppol - 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.docnova.ai/ Production Environment URLhttps://api.docnova.ai/ |
| Authorization | R-Auth header (JWT token) |
Example Request
curl --location --request POST 'https://api-stage.docnova.ai/peppol/tdd/retry-failed?companyId={{company_uuid}}&invoiceId={{invoice_uuid}}' \
--header 'Accept: */*' \
--header 'R-Auth: {{jwt_token}}'
Request Parameters
Query Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| companyId | UUID | Yes | Unique identifier of the company performing the operation |
| invoiceId | UUID | Conditional* | Unique identifier of the invoice to be retried |
| invalidInvoiceId | 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 server returns HTTP 200 OK with an empty response body.
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.
{
"errorMessage": "Status not allowed for this operation",
"errorType": "STATUS_NOT_ALLOWED",
"errorTitle": "BAD_REQUEST",
"errorId": "corr-5d4e6f7a",
"status": 400,
"timestamp": "2026-02-11T14:30:00",
"path": "/peppol/tdd/retry-failed"
}
401 - Unauthorized
Trigger: The authenticated user is not a member of the specified company.
{
"errorMessage": "Authorization failed!",
"errorType": "AUTHORIZATION_FAILED",
"errorTitle": "UNAUTHORIZED",
"errorId": "corr-6e5f7a8b",
"status": 401,
"timestamp": "2026-02-11T14:30:00",
"path": "/peppol/tdd/retry-failed"
}
404 - Not Found
Trigger: No TDD record is found matching the provided invoiceId or invalidInvoiceId.
{
"errorMessage": "Document not found",
"errorType": "DOCUMENT_NOT_FOUND",
"errorTitle": "NOT_FOUND",
"errorId": "corr-7f6a8b9c",
"status": 404,
"timestamp": "2026-02-11T14:30:00",
"path": "/peppol/tdd/retry-failed"
}
500 - Internal Server Error
Trigger: An unexpected server error occurs.
{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"errorId": "corr-8a7b9c0d",
"status": 500,
"timestamp": "2026-02-11T14:30:00",
"path": "/peppol/tdd/retry-failed"
}
17. Peppol - Withdraw TDD 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.docnova.ai/ Production Environment URLhttps://api.docnova.ai/ |
| Authorization | R-Auth header (JWT token) |
Example Request
curl --location --request POST 'https://api-stage.docnova.ai/peppol/tdd/withdraw?companyId={{company_uuid}}&invoiceId={{invoice_uuid}}' \
--header 'Accept: */*' \
--header 'R-Auth: {{jwt_token}}'
Request Parameters
Query Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| companyId | UUID | Yes | Unique identifier of the company performing the operation |
| invoiceId | UUID | Conditional* | Unique identifier of the invoice linked to the TDD to be withdrawn |
| invalidInvoiceId | UUID | Conditional* | Unique identifier of the invalid document linked to the TDD to be withdrawn |
Note: (*) At least one of invoiceId or invalidInvoiceId must be provided. If both are omitted, a 400 error is returned.
TDD Withdrawal Status Reference
| 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.
400 - Bad Request
Trigger: Both invoiceId and invalidInvoiceId are omitted, or the TDD's current status does not allow withdrawal (TDD_FAILED or WITHDRAW_SEND).
{
"errorMessage": "Status not allowed for this operation",
"errorType": "STATUS_NOT_ALLOWED",
"errorTitle": "BAD_REQUEST",
"errorId": "corr-9b8c0d1e",
"status": 400,
"timestamp": "2026-02-11T14:30:00",
"path": "/peppol/tdd/withdraw"
}
401 - Unauthorized
Trigger: An invalid or expired JWT token is used, or the user does not belong to the specified company.
{
"errorMessage": "Access denied",
"errorType": "NOT_AUTHORITY",
"errorTitle": "UNAUTHORIZED",
"errorId": "corr-0c9d1e2f",
"status": 401,
"timestamp": "2026-02-11T14:30:00",
"path": "/peppol/tdd/withdraw"
}
404 - Not Found
Trigger: No TDD entity is found matching the given invoiceId or invalidInvoiceId.
{
"errorMessage": "Document not found",
"errorType": "DOCUMENT_NOT_FOUND",
"errorTitle": "NOT_FOUND",
"errorId": "corr-1d0e2f3a",
"status": 404,
"timestamp": "2026-02-11T14:30:00",
"path": "/peppol/tdd/withdraw"
}
422 - Unprocessable Entity
Trigger: A file processing error occurs while withdrawing a TDD linked to an invalid document.
{
"errorMessage": "File processing error occurred",
"errorType": "FILE_PROCESSING_ERROR",
"errorTitle": "UNPROCESSABLE_ENTITY",
"errorId": "corr-2e1f3a4b",
"status": 422,
"timestamp": "2026-02-11T14:30:00",
"path": "/peppol/tdd/withdraw"
}
500 - Internal Server Error
Trigger: An unexpected server error occurs.
{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"errorId": "corr-3f2a4b5c",
"status": 500,
"timestamp": "2026-02-11T14:30:00",
"path": "/peppol/tdd/withdraw"
}
18. Peppol - Invalid 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.docnova.ai/ Production Environment URLhttps://api.docnova.ai/ |
| Authorization | R-Auth header (JWT token) |
Example Request
curl --location 'https://api-stage.docnova.ai/peppol/invalid-documents?companyId={{company_uuid}}&pageNumber=0&pageSize=20' \
--header 'Accept: */*' \
--header 'R-Auth: {{jwt_token}}'
Request Parameters
Query Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| companyId | UUID | Yes | Unique identifier of the company whose invalid documents are being queried |
| pageNumber | Integer | No | Page number (starts from 0). Default: 0 |
| pageSize | Integer | No | Number of records per page. Default: 20 |
Responses
200 - Successful Response
{
"content": [
{
"id": "d2c3b4a5-6e7f-8091-a2b3-...",
"companyId": "ba876f6b-e20d-48b4-9ce8-...",
"trackingId": "TRK-20260210-001",
"instanceIdentifier": "urn:uuid:d2c3b4a5-6e7f-8091-a2b3-...",
"invoiceNumber": "INV-2026-0042",
"typeCode": "380",
"currency": "EUR",
"issueDate": "2026-02-10",
"dueDate": "2026-03-10",
"deliveryDate": "2026-02-11",
"supplierEndpoint": "iso6523-actorid-upis::0245:1234567890",
"supplierName": "Partner Supplier s.r.o.",
"supplierCountryCode": "SK",
"supplierVAT": "SK1234567890",
"supplierId": "1234567890",
"customerEndpoint": "iso6523-actorid-upis::0245:2029999999",
"customerName": "Demo Slovakia s.r.o.",
"customerCountryCode": "SK",
"customerVAT": "SK2029999999",
"customerId": "2029999999",
"lineExtensionAmount": 1600.00,
"taxExclusiveAmount": 1600.00,
"taxInclusiveAmount": 1920.00,
"allowanceTotalAmount": 0.00,
"payableAmount": 1920.00,
"documentType": "INCOMING",
"dataType": "PEPPOL_BIS",
"errorType": "VALIDATION_ERROR",
"errorMessage": "Schema validation failed for document",
"validationErrors": "[{\"field\":\"TaxTotal\",\"message\":\"TaxTotal amount mismatch\"}]",
"receivedTime": "2026-02-10T10:30:00",
"createdTime": "2026-02-10T10:30:05",
"status": null,
"governmentStatus": null
}
],
"totalElements": 1,
"totalPages": 1,
"size": 20,
"number": 0,
"numberOfElements": 1,
"first": true,
"last": true,
"empty": false
}
Response Fields
| Field | Type | Description |
|---|---|---|
| totalElements | Long | Total number of records |
| totalPages | Integer | Total number of pages |
| size | Integer | Number of records per page |
| number | Integer | Current page number (starts from 0) |
| numberOfElements | Integer | 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<Object> | List of invalid Peppol documents |
| content[].id | UUID | Unique identifier of the invalid document record |
| content[].trackingId | String | Document tracking identifier |
| 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). EUR for Slovakia |
| content[].documentType | Enum | Document direction: INCOMING or OUTGOING |
| content[].dataType | Enum | Document data format. PEPPOL_BIS for Slovak Peppol documents |
| content[].supplierVAT / content[].customerVAT | String | VAT numbers (SK prefix for Slovak parties) |
| 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 | DateTime | Time the document was received by the system |
| content[].createdTime | DateTime | Time the record was created |
| content[].governmentStatus | Enum | Government/tax authority processing status, where applicable (may be null) |
401 - Unauthorized
Trigger: The authenticated user does not belong to the specified company.
{
"errorMessage": "Authorization failed!",
"errorType": "AUTHORIZATION_FAILED",
"errorTitle": "UNAUTHORIZED",
"errorId": "corr-9d8e0f1a",
"status": 401,
"timestamp": "2026-02-11T14:30:00",
"path": "/peppol/invalid-documents"
}
500 - Internal Server Error
Trigger: An unexpected server error occurs.
{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"errorId": "corr-0e9f1a2b",
"status": 500,
"timestamp": "2026-02-11T14:30:00",
"path": "/peppol/invalid-documents"
}
19. Delete Invoice (ERP) DELETE
Purpose of Use: This endpoint allows an ERP system to permanently delete a single invoice/document that was created on the Docnova Slovakia portal but has not yet been sent to the counterparty or to the Peppol network. It is typically used to clean up a document that was generated by mistake (wrong data, duplicate submission, test record) before it leaves the ERP ↔ portal boundary.
Only documents whose current status indicates that no transmission has occurred yet (e.g. CREATED, SAVED_AS_UBL, SAVED_AS_PDF) are eligible for deletion. Once a document reaches a sent status such as SENT_TO_PEPPOL, SENT_VIA_EMAIL, or SUCCESS, it can no longer be deleted through this endpoint — this is a deliberate safeguard, since Slovak e-invoices (Peppol BIS Billing 3.0 / EN 16931) must not disappear from the audit trail once transmitted.
Endpoint Information
| Property | Value |
|---|---|
| URL | /invoice/erp/{documentId} |
| Method | DELETE |
| Content-Type | application/json |
| Base URL | Stage Environment URLhttps://api-stage.docnova.ai/ Production Environment URLhttps://api.docnova.ai/ |
| Authorization | R-Auth header (JWT token) |
Example Request
curl --location --request DELETE 'https://api-stage.docnova.ai/invoice/erp/{documentId}?companyId={{company_uuid}}' \
--header 'Accept: */*' \
--header 'R-Auth: {{jwt_token}}'
Request Parameters
Path Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| documentId | UUID | Yes | Unique identifier of the invoice/document to delete. This is the documentId returned in the response of send-document-async, send-document-async-json, or shown as id in search-documents. |
Query Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| companyId | UUID | Yes | Unique identifier of the company that owns the document. Used for the ownership/authorization check. |
Responses
200 - Successful Response
{
"documentId": "c62739c4-ea6a-4aeb-86b0-...",
"status": "DELETED",
"message": "Document deleted successfully"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| documentId | UUID | Identifier of the deleted document |
| status | String (Enum) | Final status of the document after deletion. Always DELETED on success |
| message | String | Human readable confirmation message |
400 - Bad Request
Trigger: The document has already left the not sent state (e.g. its status is SENT_TO_PEPPOL, SENT_VIA_EMAIL, or SUCCESS) and can no longer be deleted.
{
"errorMessage": "Document has already been sent and cannot be deleted",
"errorType": "DOCUMENT_ALREADY_SENT",
"errorTitle": "BAD_REQUEST",
"errorId": "corr-2a1b3c4d",
"status": 400,
"timestamp": "2026-02-11T14:30:00",
"path": "/invoice/erp/{documentId}"
}
401 - Unauthorized
Trigger: The R-Auth header is missing, the JWT token is invalid/expired, or the user does not belong to the company that owns the document.
{
"errorMessage": "User is not authorized for this operation",
"errorType": "AUTHORIZATION_FAILED",
"errorTitle": "UNAUTHORIZED",
"errorId": "corr-3b2c4d5e",
"status": 401,
"timestamp": "2026-02-11T14:30:00",
"path": "/invoice/erp/{documentId}"
}
404 - Not Found
Trigger: No document matching the given documentId exists for the given companyId.
{
"errorMessage": "Document not found",
"errorType": "DOCUMENT_NOT_FOUND",
"errorTitle": "NOT_FOUND",
"errorId": "corr-4c3d5e6f",
"status": 404,
"timestamp": "2026-02-11T14:30:00",
"path": "/invoice/erp/{documentId}"
}
500 - Internal Server Error
Trigger: An unexpected error occurs on the server side.
{
"errorMessage": "An unexpected error occurred",
"errorType": "SERVER_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"errorId": "corr-5d4e6f7a",
"status": 500,
"timestamp": "2026-02-11T14:30:00",
"path": "/invoice/erp/{documentId}"
}
20. Delete Invoices (ERP, Bulk) POST
Purpose of Use: This endpoint allows an ERP system to delete several invoices/documents in a single call, instead of calling DELETE /invoice/erp/{documentId} one by one. It is typically used after a batch import error, to clean up a set of test/duplicate documents created on the Docnova Slovakia portal before any of them has been transmitted.
Each documentId in the request is evaluated independently against the same "not sent" rule described in the single-delete endpoint above: a document already in a sent status (SENT_TO_PEPPOL, SENT_VIA_EMAIL, SUCCESS, etc.) is skipped rather than failing the whole request.
Endpoint Information
| Property | Value |
|---|---|
| URL | /invoice/erp/delete |
| Method | POST |
| Content-Type | application/json |
| Base URL | Stage Environment URLhttps://api-stage.docnova.ai/ Production Environment URLhttps://api.docnova.ai/ |
| Authorization | R-Auth header (JWT token) |
Example Request
curl --location 'https://api-stage.docnova.ai/invoice/erp/delete' \
--header 'Content-Type: application/json' \
--header 'Accept: */*' \
--header 'R-Auth: {{jwt_token}}' \
--data-raw '{
"companyId": "{{company_uuid}}",
"documentIds": [
"c62739c4-ea6a-4aeb-86b0-...",
"d47a1f08-3b52-4c9e-9f21-..."
]
}'
Request Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| companyId | UUID | Yes | Unique identifier of the company that owns the documents |
| documentIds | Array<UUID> | Yes | List of document identifiers to delete. Must contain at least one element |
Responses
200 - Successful Response
{
"deletedIds": [
"c62739c4-ea6a-4aeb-86b0-..."
],
"skippedIds": [
{
"documentId": "d47a1f08-3b52-4c9e-9f21-...",
"reason": "Document has already been sent and cannot be deleted"
}
],
"deletedCount": 1,
"skippedCount": 1
}
Response Fields
| Field | Type | Description |
|---|---|---|
| deletedIds | Array<UUID> | Identifiers of documents that were successfully deleted |
| skippedIds | Array<Object> | Identifiers that were not deleted, with the reason why |
| skippedIds[].documentId | UUID | Identifier of the skipped document |
| skippedIds[].reason | String | Why the document was not deleted (already sent, not found, etc.) |
| deletedCount | Integer | Number of documents successfully deleted |
| skippedCount | Integer | Number of documents skipped |
400 - Bad Request
Trigger: documentIds is missing or sent as an empty array.
{
"errorMessage": "Document process required fields: documentIds",
"errorType": "DOCUMENT_PROCESS_REQUIRED_FIELDS",
"errorTitle": "BAD_REQUEST",
"errorId": "corr-6e5f7a8b",
"status": 400,
"timestamp": "2026-02-11T14:30:00",
"path": "/invoice/erp/delete"
}
401 - Unauthorized
Trigger: The R-Auth header is missing, invalid, expired, or the user does not belong to the specified companyId.
{
"errorMessage": "User is not authorized for this operation",
"errorType": "AUTHORIZATION_FAILED",
"errorTitle": "UNAUTHORIZED",
"errorId": "corr-7f6a8b9c",
"status": 401,
"timestamp": "2026-02-11T14:30:00",
"path": "/invoice/erp/delete"
}
404 - Not Found
Trigger: The provided companyId does not exist.
{
"errorMessage": "Company not found!",
"errorType": "COMPANY_NOT_FOUND",
"errorTitle": "NOT_FOUND",
"errorId": "corr-8a7b9c0d",
"status": 404,
"timestamp": "2026-02-11T14:30:00",
"path": "/invoice/erp/delete"
}
500 - Internal Server Error
Trigger: An unexpected error occurs on the server side.
{
"errorMessage": "An unexpected error occurred",
"errorType": "SERVER_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"errorId": "corr-9b8c0d1e",
"status": 500,
"timestamp": "2026-02-11T14:30:00",
"path": "/invoice/erp/delete"
}
21. Peppol - Get Register Request Status GET
Purpose of Use: This endpoint checks the current status of a Peppol registration request previously submitted for a company — for example, the registration completed through the test webhook onboarding flow described earlier in this guide (How to register your test company on Peppol?), or a registration submitted programmatically. ERP systems can poll this endpoint until the registration reaches a final state before starting to send Peppol documents.
Endpoint Information
| Property | Value |
|---|---|
| URL | /peppol/get-register-request-status |
| Method | GET |
| Content-Type | application/json |
| Base URL | Stage Environment URLhttps://api-stage.docnova.ai/ Production Environment URLhttps://api.docnova.ai/ |
| Authorization | R-Auth header (JWT token) |
Example Request
curl --location 'https://api-stage.docnova.ai/peppol/get-register-request-status?companyId={{company_uuid}}' \
--header 'Accept: */*' \
--header 'R-Auth: {{jwt_token}}'
Request Parameters
Query Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| companyId | UUID | Yes | Unique identifier of the company whose registration status is being queried |
| requestId | UUID | No | A specific registration request to check. When omitted, the most recent request for the company is returned |
Responses
200 - Successful Response
{
"requestId": "f5e6d7c8-1234-5678-9abc-...",
"companyId": "ba876f6b-e20d-48b4-9ce8-...",
"participantId": "0245:2029999999",
"status": "APPROVED",
"updatedAt": "2026-02-10T09:15:00"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| requestId | UUID | Registration request identifier |
| companyId | UUID | Company that submitted the request |
| participantId | String | Peppol participant identifier being registered |
| status | Enum | Current status. See status Values below |
| updatedAt | DateTime | Last updated timestamp |
status Values
| Value | Description |
|---|---|
| APPROVED | Registration completed; the participant identifier is live on the Peppol network |
| IN_PROCESS | Registration is pending manual review |
| REJECTED | Registration was rejected (e.g. duplicate or invalid business identifier) |
401 - Unauthorized
Trigger: The R-Auth header is missing/expired, or the user does not belong to the specified company.
{
"errorMessage": "Authorization failed!",
"errorType": "AUTHORIZATION_FAILED",
"errorTitle": "UNAUTHORIZED",
"errorId": "corr-4e3f5a6b",
"status": 401,
"timestamp": "2026-02-11T14:30:00",
"path": "/peppol/get-register-request-status"
}
404 - Not Found
Trigger: No registration request is found for the given companyId (and requestId, if provided).
{
"errorMessage": "Register request not found",
"errorType": "REGISTER_REQUEST_NOT_FOUND",
"errorTitle": "NOT_FOUND",
"errorId": "corr-5f4a6b7c",
"status": 404,
"timestamp": "2026-02-11T14:30:00",
"path": "/peppol/get-register-request-status"
}
500 - Internal Server Error
Trigger: An unexpected error occurs on the server side.
{
"errorMessage": "An unexpected error occurred",
"errorType": "RUNTIME_ERROR",
"errorTitle": "INTERNAL_SERVER_ERROR",
"errorId": "corr-6a5b7c8d",
"status": 500,
"timestamp": "2026-02-11T14:30:00",
"path": "/peppol/get-register-request-status"
}