Send invoice (async)
This endpoint allows invoice data compliant with UBL 2.1 / PEPPOL BIS standards to be submitted asynchronously as a JSON object (ublDto). No base64-encoded file upload is required; all invoice details are provided directly in a structured JSON format.
When the request is accepted, the document is placed in the processing queue and a trackingId is returned. The processing status can be queried at any time using this ID via the /invoice/document-status/{trackingId} endpoint.
Endpoint
| Property | Value |
|---|---|
| URL | POST /invoice/send-document-async-json |
| Method | POST |
| R-Auth | R-Auth: {company-jwt} |
| Base URL | Stage Environment https://api-stage.docnova.ai/ Production Environment https://api.docnova.ai/ |
Example Request
curl --location '{{baseUrl}}/invoice/send-document-async-json' \
--header 'Content-Type: application/json' \
--header 'R-Auth: {{companyJwt}}' \
--data-raw '{
"apiKey": "{{companyApiKey}}",
"ublDto": { ... },
"receiverEmails": []
}'
Request body
{
"apiKey": "<company-apiKey>",
"ublDto": {},
"receiverEmails": ["recipient@example.com"]
}
The request body contains the top-level wrapper with authentication and the ublDto invoice object.
Request fields
| Field | Type | Required | Description |
|---|---|---|---|
| apiKey | string | Required | Company API key. |
| ublDto | object | Required | UBL invoice object. See the full schema in the sections below. |
| receiverEmails | array | Optional | Email addresses to notify on delivery. |
Full example
curl --location 'https://api-stage.docnova.ai/invoice/send-document-async-json' \
-H 'accept: */*' \
-H 'R-Auth: {{jwt_token}}' \
-H 'Content-Type: application/json' \
-d '{
"apiKey": "{{your_api_key}}",
"ublDto": {
"Type": "PEPPOL_BIS",
"IsPeppolParticipant": true,
"CompanyId": "{{company_uuid}}",
"ProfileType": "EN16931",
"CustomizationID": { "Value": "urn:cen.eu:en16931:2017#conformant#urn:factur-x.eu:1p0:extended" },
"ID": { "Value": "INV-2025-001" },
"IssueDate": { "Value": "2025-12-08" },
"DueDate": { "Value": "2025-12-05" },
"InvoiceTypeCode": { "Value": "380" },
"Note": [{ "Value": "Thank you for the good cooperation." }],
"DocumentCurrencyCode": { "Value": "EUR" },
"BuyerReference": { "Value": "buyer-ref-001" },
"OrderReference": { "ID": { "Value": "PO-12345" }, "SalesOrderID": { "Value": "SO-67890" } },
"AccountingSupplierParty": {
"Party": {
"EndpointID": { "Value": "DE123456789", "schemeID": "9930" },
"PartyName": [{ "Name": { "Value": "Supplier Company GmbH" } }],
"PostalAddress": { "StreetName": { "Value": "Musterstraße 12" }, "CityName": { "Value": "Berlin" }, "PostalZone": { "Value": "10115" }, "Country": { "IdentificationCode": { "Value": "DE" } } },
"PartyTaxScheme": [{ "CompanyID": { "Value": "DE123456789" }, "TaxScheme": { "ID": { "Value": "VAT" } } }],
"PartyLegalEntity": [{ "RegistrationName": { "Value": "Supplier Company GmbH" }, "CompanyID": { "Value": "DE123456789" } }],
"Contact": { "Name": { "Value": "Contact Name" }, "Telephone": { "Value": "+49 170 1234567" }, "ElectronicMail": { "Value": "user@example.com" } }
}
},
"AccountingCustomerParty": {
"Party": {
"EndpointID": { "Value": "DE987654321", "schemeID": "9930" },
"PartyName": [{ "Name": { "Value": "Buyer Company GmbH" } }],
"PostalAddress": { "StreetName": { "Value": "Kaufstraße 5" }, "CityName": { "Value": "Hamburg" }, "PostalZone": { "Value": "20095" }, "Country": { "IdentificationCode": { "Value": "DE" } } },
"PartyTaxScheme": [{ "CompanyID": { "Value": "DE987654321" }, "TaxScheme": { "ID": { "Value": "VAT" } } }],
"PartyLegalEntity": [{ "RegistrationName": { "Value": "Buyer Company GmbH" }, "CompanyID": { "Value": "DE987654321" } }],
"Contact": { "Name": { "Value": "Buyer Contact" }, "Telephone": { "Value": "+49 170 1234567" }, "ElectronicMail": { "Value": "user@example.com" } }
}
},
"Delivery": [{
"ActualDeliveryDate": { "Value": "2025-12-13" },
"DeliveryLocation": { "Address": { "StreetName": { "Value": "Delivery Street 5" }, "CityName": { "Value": "Berlin" }, "PostalZone": { "Value": "10115" }, "Country": { "IdentificationCode": { "Value": "DE" } } } },
"DeliveryParty": { "PartyName": [{ "Name": { "Value": "Delivery Recipient" } }] }
}],
"PaymentMeans": [{
"PaymentMeansCode": { "name": "SEPA credit transfer", "Value": "58" },
"PayeeFinancialAccount": { "ID": { "Value": "DE89370400440532013000" }, "Name": { "Value": "Account Holder Name" } }
}],
"PaymentTerms": [{ "Note": [{ "Value": "Please remit until 05.12.2025" }] }],
"TaxTotal": [{
"TaxAmount": { "currencyID": "EUR", "Value": 210 },
"TaxSubtotal": [{
"TaxableAmount": { "currencyID": "EUR", "Value": 2100 },
"TaxAmount": { "currencyID": "EUR", "Value": 210 },
"TaxCategory": { "ID": { "Value": "S" }, "Percent": { "Value": 10 }, "TaxScheme": { "ID": { "Value": "VAT" } } }
}]
}],
"LegalMonetaryTotal": {
"LineExtensionAmount": { "currencyID": "EUR", "Value": 2100 },
"TaxExclusiveAmount": { "currencyID": "EUR", "Value": 2100 },
"TaxInclusiveAmount": { "currencyID": "EUR", "Value": 2310 },
"AllowanceTotalAmount": { "currencyID": "EUR", "Value": 0 },
"ChargeTotalAmount": { "currencyID": "EUR", "Value": 0 },
"PrepaidAmount": { "currencyID": "EUR", "Value": 0 },
"PayableAmount": { "currencyID": "EUR", "Value": 2310 }
},
"InvoiceLine": [{
"ID": { "Value": "1" },
"InvoicedQuantity": { "unitCode": "MTQ", "Value": 20 },
"LineExtensionAmount": { "currencyID": "EUR", "Value": 2100 },
"Item": {
"Name": { "Value": "Product 1" },
"SellersItemIdentification": { "ID": { "Value": "01" } },
"ClassifiedTaxCategory": [{ "ID": { "Value": "S" }, "Percent": { "Value": 10 }, "TaxScheme": { "ID": { "Value": "VAT" } } }]
},
"Price": { "PriceAmount": { "currencyID": "EUR", "Value": 105 }, "BaseQuantity": { "Value": 1 } }
}]
}
}'
ublDto — Document Object
| Field Name | Type | Required | Description |
|---|---|---|---|
| ublDto.Type | string (enum) | Optional | Document format type. E.g.: PEPPOL_BIS, XRECHNUNG, ZUGFERD. See Parameter Values Reference table for full list. |
| ublDto.IsPeppolParticipant | boolean | Optional | Indicates whether the recipient is registered on the Peppol network. If true, the document is routed via Peppol. |
| ublDto.CompanyId | string (UUID) | Conditional | UUID of the sending company. Required if apiKey is not provided. |
| ublDto.ProfileType | string (enum) | Optional | ZUGFeRD / Factur-X profile type. Default: EN16931. |
| ublDto.CustomizationID.Value | string | Optional | Invoice customization identifier (urn value). Specifies PEPPOL / EN16931 compliance. |
| ublDto.ID.Value | string | Optional | Invoice number / unique document identifier. |
| ublDto.IssueDate.Value | string (ISO 8601) | Optional | Invoice issue date. Format: YYYY-MM-DD. |
| ublDto.DueDate.Value | string (ISO 8601) | Optional | Invoice due date. Format: YYYY-MM-DD. |
| ublDto.InvoiceTypeCode.Value | string | Optional | UN/CEFACT invoice type code. E.g.: 380 = Commercial Invoice, 381 = Credit Note, 384 = Corrected Invoice. |
| ublDto.Note[].Value | string | Optional | Free-text note attached to the invoice. |
| ublDto.DocumentCurrencyCode.Value | string | Optional | Invoice currency code (ISO 4217). E.g.: EUR, USD, GBP. |
| ublDto.BuyerReference.Value | string | Optional | Buyer reference number (Buyer Reference / Leitweg-ID). |
| ublDto.OrderReference.ID.Value | string | Optional | Purchase order number. |
| ublDto.OrderReference.SalesOrderID.Value | string | Optional | Sales order number. |
| ublDto.AccountingSupplierParty | object | Optional | Supplier / seller information. The Party object contains EndpointID (Peppol ID), PartyName, PostalAddress, PartyTaxScheme, PartyLegalEntity, and Contact sub-objects. |
| ublDto.AccountingSupplierParty.Party.EndpointID.Value | string | Optional | Supplier's Peppol Endpoint ID value. |
| ublDto.AccountingSupplierParty.Party.EndpointID.schemeID | string | Optional | Endpoint ID scheme code. E.g.: 9930 = German Tax No, 0088 = GLN. |
| ublDto.AccountingCustomerParty | object | Optional | Customer / buyer information. The Party object contains EndpointID, PartyName, PostalAddress, PartyTaxScheme, PartyLegalEntity, and Contact sub-objects. |
| ublDto.Delivery[].ActualDeliveryDate.Value | string (ISO 8601) | Optional | Actual delivery date. Format: YYYY-MM-DD. |
| ublDto.Delivery[].DeliveryLocation.Address | object | Optional | Delivery address. Contains StreetName, CityName, PostalZone, and Country sub-fields. |
| ublDto.PaymentMeans[].PaymentMeansCode.Value | string | Optional | Payment method code. E.g.: 58 = SEPA Credit Transfer, 30 = Credit Transfer, 49 = Direct Debit. |
| ublDto.PaymentMeans[].PayeeFinancialAccount.ID.Value | string | Optional | Payee bank account IBAN number. |
| ublDto.PaymentMeans[].PayeeFinancialAccount.Name.Value | string | Optional | Bank account holder name. |
| ublDto.PaymentTerms[].Note[].Value | string | Optional | Free-text description of payment terms. |
| ublDto.TaxTotal[].TaxAmount.Value | number | Optional | Total tax amount. |
| ublDto.TaxTotal[].TaxAmount.currencyID | string | Optional | Currency code for the tax amount (ISO 4217). |
| ublDto.TaxTotal[].TaxSubtotal[].TaxableAmount.Value | number | Optional | Taxable base amount. |
| ublDto.TaxTotal[].TaxSubtotal[].TaxCategory.ID.Value | string | Optional | Tax category code. E.g.: S = Standard, Z = Zero Rated, E = Exempt, AE = Reverse Charge. |
| ublDto.TaxTotal[].TaxSubtotal[].TaxCategory.Percent.Value | number | Optional | Tax rate percentage. E.g.: 19, 7, 10. |
| ublDto.LegalMonetaryTotal.LineExtensionAmount.Value | number | Optional | Sum of invoice line net amounts (excluding tax). |
| ublDto.LegalMonetaryTotal.TaxExclusiveAmount.Value | number | Optional | Total amount excluding VAT. |
| ublDto.LegalMonetaryTotal.TaxInclusiveAmount.Value | number | Optional | Total amount including VAT. |
| ublDto.LegalMonetaryTotal.PayableAmount.Value | number | Optional | Net payable amount. |
| ublDto.InvoiceLine[].ID.Value | string | Optional | Invoice line sequence number. |
| ublDto.InvoiceLine[].InvoicedQuantity.Value | number | Optional | Invoiced quantity. |
| ublDto.InvoiceLine[].InvoicedQuantity.unitCode | string | Optional | Unit of measure code (UN/ECE Rec. 20). E.g.: MTQ = Cubic Metre, C62 = Each, KGM = Kilogram. |
| ublDto.InvoiceLine[].LineExtensionAmount.Value | number | Optional | Invoice line net amount (excluding tax). |
| ublDto.InvoiceLine[].Item.Name.Value | string | Optional | Product / service name. |
| ublDto.InvoiceLine[].Item.SellersItemIdentification.ID.Value | string | Optional | Seller's item/product code. |
| ublDto.InvoiceLine[].Price.PriceAmount.Value | number | Optional | Unit price. |
| ublDto.InvoiceLine[].Price.BaseQuantity.Value | number | Optional | Base quantity the price applies to. Typically 1. |
| receiverEmails | array (string) | Optional | Recipient email addresses for sending the invoice via email after processing. |
| mailTemplateId | string | Optional | Custom mail template ID to be used for email delivery. |
| businessType | string (enum) | Optional | Business model type: B2B, B2C, or B2G. |
200 — Succesfull Response
{
"trackingId": "uuid",
"status": "PENDING",
"message": "Document process started successfully"
}
ERROR
{
"trackingId": "uuid",
"status": "FAILED",
"errors": ["[BR-CO-15]..."],
"errorType": "VALIDATION_ERROR"
}
A 200 OK only means the document was accepted, not delivered. Always check the final status with GET /invoice/document-status/{trackingId}.
Response fields
| Field | Type | Description |
|---|---|---|
| trackingId | UUID | Use this to poll GET /invoice/document-status/{trackingId} for processing updates. |
| status | string | Initial status — always "PENDING" on acceptance. |
| message | string | Human-readable message confirming the document was queued. |
Use the trackingId to check delivery status via Document status.