Send invoice (async)
Factur-X EN16931
Send a Factur-X invoice in EN 16931 profile, the standard semantic data model for European e-invoicing, via the send-document-async-json 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-fr-stage.docnova.ai/ Production Environment https://api-fr.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. For Factur-X EN16931, the ublDto must include the three format identifier fields shown below.
Format Identifiers — Required in ublDto
| Field | Value | Description |
|---|---|---|
| Type | "FACTUR_X" | Must be FACTUR_X. |
| ProfileType | "EN16931" | Factur-X profile — selects the EN 16931 core data model. |
| CustomizationID.Value | "urn:cen.eu:en16931:2017" | Specification identifier URN — must match exactly. |
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 — France Factur-X EN16931
curl --location 'https://api-fr-stage.docnova.ai/invoice/send-document-async-json' \
--header 'Content-Type: application/json' \
--data '{
"apiKey": "{{YOUR_API_KEY}}",
"ublDto": {
"Type": "FACTUR_X",
"ProfileType": "EN16931",
"CustomizationID": {
"Value": "urn:cen.eu:en16931:2017"
},
"CompanyId": "17f81c76-fd84-45e0-bd39-...",
"ID": {
"Value": "INV-2026-003"
},
"IssueDate": {
"Value": "2026-07-03"
},
"InvoiceTypeCode": {
"Value": "380"
},
"DocumentCurrencyCode": {
"Value": "EUR"
},
"DueDate": {
"Value": "2026-07-10"
},
"BuyerReference": {
"Value": "PO-2026-001"
},
"AccountingSupplierParty": {
"Party": {
"EndpointID": {
"Value": "142057869",
"schemeID": "0225"
},
"PartyName": [
{
"Name": {
"Value": "SIREN_142057869"
}
}
],
"PostalAddress": {
"StreetName": {
"Value": "1 rue de paix"
},
"CityName": {
"Value": "Paris"
},
"PostalZone": {
"Value": "75000"
},
"Country": {
"IdentificationCode": {
"Value": "FR"
}
}
},
"PartyTaxScheme": [
{
"CompanyID": {
"Value": "FR99142057869"
},
"TaxScheme": {
"ID": {
"Value": "VAT"
}
}
}
],
"PartyLegalEntity": [
{
"RegistrationName": {
"Value": "SIREN_142057869"
},
"CompanyID": {
"Value": "FR99142057869"
}
}
]
}
},
"AccountingCustomerParty": {
"Party": {
"EndpointID": {
"Value": "271688503",
"schemeID": "0225"
},
"PartyName": [
{
"Name": {
"Value": "SIREN_271688503"
}
}
],
"PostalAddress": {
"StreetName": {
"Value": "12 Rue de la Montagne"
},
"CityName": {
"Value": "Paris"
},
"PostalZone": {
"Value": "75008"
},
"Country": {
"IdentificationCode": {
"Value": "FR"
}
}
},
"PartyLegalEntity": [
{
"RegistrationName": {
"Value": "SIREN_271688503"
}
}
]
}
},
"TaxTotal": [
{
"TaxAmount": {
"Value": "20000.00",
"currencyID": "EUR"
},
"TaxSubtotal": [
{
"TaxableAmount": {
"Value": "100000.00",
"currencyID": "EUR"
},
"TaxAmount": {
"Value": "20000.00",
"currencyID": "EUR"
},
"TaxCategory": {
"ID": {
"Value": "S"
},
"Percent": {
"Value": "20"
},
"TaxScheme": {
"ID": {
"Value": "VAT"
}
}
}
}
]
}
],
"LegalMonetaryTotal": {
"LineExtensionAmount": {
"Value": "100000.00",
"currencyID": "EUR"
},
"TaxExclusiveAmount": {
"Value": "100000.00",
"currencyID": "EUR"
},
"TaxInclusiveAmount": {
"Value": "120000.00",
"currencyID": "EUR"
},
"PayableAmount": {
"Value": "120000.00",
"currencyID": "EUR"
}
},
"InvoiceLine": [
{
"ID": {
"Value": "1"
},
"InvoicedQuantity": {
"Value": "100",
"unitCode": "EA"
},
"LineExtensionAmount": {
"Value": "100000.00",
"currencyID": "EUR"
},
"Item": {
"Name": {
"Value": "Product Name"
},
"ClassifiedTaxCategory": [
{
"ID": {
"Value": "S"
},
"Percent": {
"Value": "20"
},
"TaxScheme": {
"ID": {
"Value": "VAT"
}
}
}
]
},
"Price": {
"PriceAmount": {
"Value": "1000.00",
"currencyID": "EUR"
}
}
}
],
"Note": [
{
"Value": "Invoice note"
}
]
},
"receiverEmails": ["recipient@example.com"]
}'
Invoice header required fields
| Field | Required | Description |
|---|---|---|
| Type | Required | Must be "FACTUR_X". |
| ProfileType | Required | Must be "EN16931". |
| CustomizationID.Value | Required | Must be "urn:cen.eu:en16931:2017" — exact match. |
| CompanyId | Required | Docnova company UUID. |
| ID.Value | Required | Unique invoice number. Duplicates return INVOICE_ALREADY_EXISTS. |
| IssueDate.Value | Required | Invoice date — YYYY-MM-DD format. |
| InvoiceTypeCode.Value | Required | "380" commercial invoice, "381" credit note, "384" corrected invoice. |
| DocumentCurrencyCode.Value | Required | ISO 4217 invoice currency, e.g. "EUR". |
| DueDate.Value | Optional | Payment due date — YYYY-MM-DD format. |
| BuyerReference.Value | Optional | Buyer-assigned reference such as a purchase order number. |
| Note | Optional | Free-text notes. Array of {"Value": "..."} objects. |
Seller required fields
| Field | Required | Description |
|---|---|---|
| Party.PartyName | Required | Seller name. |
| Party.PostalAddress.CityName.Value | Required | Seller city. |
| Party.PostalAddress.PostalZone.Value | Required | Postal/ZIP code. |
| Party.PostalAddress.Country.IdentificationCode.Value | Required | ISO 3166-1 alpha-2 country code, e.g. "FR". |
| Party.PartyTaxScheme[].CompanyID.Value | Required | Seller VAT number. French format: "FR" + 2-digit key + 9-digit SIREN. |
| Party.PartyTaxScheme[].TaxScheme.ID.Value | Required | Must be "VAT". |
| Party.PartyLegalEntity[].RegistrationName.Value | Required | Seller legal entity name. |
| Party.PartyLegalEntity[].CompanyID.Value | Required | Seller company ID. French format: "FR" + 2-digit key + 9-digit SIREN. |
| Party.PostalAddress.StreetName.Value | Optional | Street address. |
| Party.EndpointID | Optional | Peppol endpoint ID. Include when sending via Peppol. schemeID: "0225" for French SIREN. |
Buyer required fields
| Field | Required | Description |
|---|---|---|
| Party.PartyName | Required | Buyer name. |
| Party.PostalAddress.CityName.Value | Required | Buyer city. |
| Party.PostalAddress.PostalZone.Value | Required | Postal/ZIP code. |
| Party.PostalAddress.Country.IdentificationCode.Value | Required | ISO 3166-1 alpha-2 buyer country code. |
| Party.PartyLegalEntity[].RegistrationName.Value | Required | Buyer legal entity name. |
| Party.EndpointID | Optional | Peppol endpoint ID. Include when sending via Peppol. schemeID: "0225" for French SIREN. |
Tax required fields
| Field | Required | Description |
|---|---|---|
| TaxTotal[].TaxAmount.Value | Required | Total VAT amount. Max 2 decimal places. |
| TaxTotal[].TaxAmount.currencyID | Required | Must match DocumentCurrencyCode. |
| TaxSubtotal[].TaxableAmount.Value | Required | Net taxable base for this category. |
| TaxSubtotal[].TaxAmount.Value | Required | VAT amount for this category. |
| TaxCategory.ID.Value | Required | "S" Standard, "Z" Zero rate, "E" Exempt, "AE" Reverse charge. |
| TaxCategory.Percent.Value | Required | Tax rate, e.g. "20", "10", "5.5", "0". |
| TaxCategory.TaxScheme.ID.Value | Required | Must be "VAT". |
Monetary totals required fields
All amount values must have at most 2 decimal places. Include the currencyID attribute on every amount object.
| Field | Required | Description |
|---|---|---|
| LineExtensionAmount | Required | Sum of all line extension amounts before tax. |
| TaxExclusiveAmount | Required | Net total after allowances/charges, before tax. |
| TaxInclusiveAmount | Required | Gross total including all taxes. |
| PayableAmount | Required | Amount due for payment. |
| AllowanceTotalAmount | Optional | Sum of document-level discounts. |
| PrepaidAmount | Optional | Amount already paid, such as advance payments. |
Invoice line required fields
| Field | Required | Description |
|---|---|---|
| ID.Value | Required | Unique line identifier within the invoice. |
| InvoicedQuantity.Value | Required | Quantity amount. |
| InvoicedQuantity.unitCode | Required | UN/ECE Rec. 20 unit code. Common: "EA" each, "HUR" hour, "KGM" kg. |
| LineExtensionAmount | Required | Line net amount: quantity × unit price. Include currencyID. |
| Item.Name.Value | Required | Product or service name. |
| Item.ClassifiedTaxCategory | Required | Tax category for this line — same structure as TaxSubtotal.TaxCategory. |
| Price.PriceAmount | Required | Unit price. Include currencyID. |
| Item.Description.Value | Optional | Extended item description. |
Response
The endpoint returns immediately with a trackingId. Processing is asynchronous — use the Document Status endpoint to poll for the final result.
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. |
Peppol BIS for France non-domestic
Submit an invoice for asynchronous processing and delivery.
Endpoint
| Property | Value |
|---|---|
| URL | POST /invoice/send-document-async-json |
| Method | POST |
| Auth | R-Auth: <company-jwt> |
| Content-Type | application/json |
| Base URL | Stage Environment https://api-fr-stage.docnova.ai/ Production Environment https://api-fr.docnova.ai/ |
This endpoint requires a company JWT obtained by logging in with the company API key, not the partner API key. See Authentication.
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"]
}
Request fields
| Field | Type | Required | Description |
|---|---|---|---|
apiKey | string | Yes | Company API key |
ublDto | object | Yes | UBL invoice object. See the full schema below. |
receiverEmails | array | No | Email addresses to notify on delivery |
Full example France Peppol BIS
{
"apiKey": "<companyApiKey>",
"ublDto": {
"Type": "PEPPOL_BIS",
"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": "INV/MIN-003"
},
"IssueDate": {
"Value": "2026-06-12"
},
"DueDate": {
"Value": "2026-06-30"
},
"InvoiceTypeCode": {
"Value": "380"
},
"DocumentCurrencyCode": {
"Value": "EUR"
},
"BuyerReference": {
"Value": "FR-BUYER-001"
},
"CompanyId": "<companyId>",
"PartnerUuid": "<partnerUuid>",
"UBLVersionID": {
"Value": "2.1"
},
"IsPeppolParticipant": true,
"AccountingSupplierParty": {
"Party": {
"EndpointID": {
"Value": "<siren>",
"schemeID": "0002"
},
"PartyLegalEntity": [
{
"RegistrationName": {
"Value": "<companyName>"
},
"CompanyID": {
"Value": "<vatNumber>"
}
}
],
"PartyTaxScheme": [
{
"CompanyID": {
"Value": "<vatNumber>"
},
"TaxScheme": {
"ID": {
"Value": "VAT"
}
}
}
],
"PostalAddress": {
"StreetName": {
"Value": "1 Rue de Rivoli"
},
"CityName": {
"Value": "Paris"
},
"PostalZone": {
"Value": "75001"
},
"Country": {
"IdentificationCode": {
"Value": "FR"
}
}
}
}
},
"AccountingCustomerParty": {
"Party": {
"EndpointID": {
"Value": "<buyerSiren>",
"schemeID": "0002"
},
"PartyLegalEntity": [
{
"RegistrationName": {
"Value": "<buyerCompanyName>"
}
}
],
"PostalAddress": {
"StreetName": {
"Value": "1 Rue de la Paix"
},
"CityName": {
"Value": "Paris"
},
"PostalZone": {
"Value": "75001"
},
"Country": {
"IdentificationCode": {
"Value": "FR"
}
}
}
}
},
"TaxTotal": [
{
"TaxAmount": {
"Value": "300.00",
"currencyID": "EUR"
},
"TaxSubtotal": [
{
"TaxableAmount": {
"Value": "1500.00",
"currencyID": "EUR"
},
"TaxAmount": {
"Value": "300.00",
"currencyID": "EUR"
},
"TaxCategory": {
"ID": {
"Value": "S"
},
"Percent": {
"Value": "20"
},
"TaxScheme": {
"ID": {
"Value": "VAT"
}
}
}
}
]
}
],
"LegalMonetaryTotal": {
"LineExtensionAmount": {
"Value": "1500",
"currencyID": "EUR"
},
"TaxExclusiveAmount": {
"Value": "1500",
"currencyID": "EUR"
},
"TaxInclusiveAmount": {
"Value": "1800.00",
"currencyID": "EUR"
},
"PayableAmount": {
"Value": "1800.00",
"currencyID": "EUR"
}
},
"InvoiceLine": [
{
"ID": {
"Value": "1"
},
"InvoicedQuantity": {
"Value": "10",
"unitCode": "HUR"
},
"LineExtensionAmount": {
"Value": 1500,
"currencyID": "EUR"
},
"Item": {
"Name": {
"Value": "Consulting Service"
},
"ClassifiedTaxCategory": [
{
"ID": {
"Value": "S"
},
"Percent": {
"Value": "20"
},
"TaxScheme": {
"ID": {
"Value": "VAT"
}
}
}
]
},
"Price": {
"PriceAmount": {
"Value": "150",
"currencyID": "EUR"
}
}
}
]
},
"receiverEmails": []
}
Invoice header required fields
| Field | Required | Description | Example |
|---|---|---|---|
Type | Yes | Invoice type | PEPPOL_BIS |
ProfileType | Yes | EN 16931 profile | EN16931 |
ID.Value | Yes | Unique invoice number | INV-2026-001 |
IssueDate.Value | Yes | Issue date | YYYY-MM-DD |
DueDate.Value | Yes* | Due date | Required if no PaymentTerms |
InvoiceTypeCode.Value | Yes | Type code | 380 invoice, 381 credit note |
DocumentCurrencyCode.Value | Yes | Currency | ISO 4217, for example EUR |
BuyerReference.Value | Yes* | Buyer reference | Required if no OrderReference |
CompanyId | Yes | Docnova company UUID | f5e6d7c8-1234-5678-9abc-def012345678 |
PartnerUuid | Yes | Docnova partner UUID | partnerUuid |
UBLVersionID.Value | Yes | UBL version | 2.1 |
IsPeppolParticipant | Yes | Peppol flag | true |
Seller required fields
| Field | Required | Description |
|---|---|---|
Party.EndpointID.Value | Yes | Must match businessIdentifier from Submit register request |
Party.EndpointID.schemeID | Yes | ICD code, for example 0002 for France SIREN or 9930 for Germany VAT |
Party.PartyLegalEntity[0].RegistrationName.Value | Yes | Legal name |
Party.PartyLegalEntity[0].CompanyID.Value | Yes | VAT identifier |
Party.PostalAddress.Country.IdentificationCode.Value | Yes | ISO country code |
Buyer required fields
| Field | Required | Description |
|---|---|---|
Party.EndpointID.Value | Yes | Must be a registered Peppol participant |
Party.EndpointID.schemeID | Yes | ICD code |
Party.PartyLegalEntity[0].RegistrationName.Value | Yes | Legal name |
Party.PostalAddress.Country.IdentificationCode.Value | Yes | ISO country code |
Tax required fields
| Field | Required | Description |
|---|---|---|
TaxAmount.Value | Yes | Total VAT amount, maximum 2 decimals |
TaxSubtotal[0].TaxableAmount.Value | Yes | Taxable base amount |
TaxSubtotal[0].TaxAmount.Value | Yes | VAT amount for this category |
TaxSubtotal[0].TaxCategory.ID.Value | Yes | VAT category. S Standard, Z Zero, E Exempt, AE Reverse charge |
TaxSubtotal[0].TaxCategory.Percent.Value | Yes | VAT rate, for example 20 |
Category-specific requirements
1: When using E (Exempt from VAT): TaxExemptionReasonCode or TaxExemptionReason is required.
2: When using AE (Reverse Charge): TaxExemptionReasonCode is required, and the buyer's VAT identifier (AccountingCustomerParty.Party.PartyTaxScheme.CompanyID) must be provided.
3: For the full list of supported VATEX exemption reason codes, see the Peppol UNCL5305 codelist
(https://docs.peppol.eu/poacc/billing/3.0/codelist/UNCL5305/).
Monetary totals required fields
| Field | Required | Description |
|---|---|---|
LineExtensionAmount.Value | Yes | Sum of line net amounts |
TaxExclusiveAmount.Value | Yes | Total without VAT |
TaxInclusiveAmount.Value | Yes | Total including VAT |
PayableAmount.Value | Yes | Amount due |
Invoice line required fields
| Field | Required | Description |
|---|---|---|
ID.Value | Yes | Unique line number |
InvoicedQuantity.Value | Yes | Quantity |
InvoicedQuantity.unitCode | Yes | UN/ECE Rec 20 code, for example HUR for hour |
LineExtensionAmount.Value | Yes | Net line amount, quantity multiplied by unit price |
Item.Name.Value | Yes | Product or service name |
Item.ClassifiedTaxCategory[0].ID.Value | Yes | VAT category |
Item.ClassifiedTaxCategory[0].Percent.Value | Yes | VAT rate |
Price.PriceAmount.Value | Yes | Unit price excluding VAT |
Response
{
"trackingId": "550e8400-e29b-41d4-a716-446655440000",
"status": "PENDING",
"message": "Document accepted for processing"
}
Response fields
| Field | Description |
|---|---|
trackingId | Tracking UUID for the submitted document |
status | Initial processing status, for example PENDING |
message | Human-readable processing message |
Use the trackingId to check delivery status via Document status.