Skip to main content
Version: 1.0.0

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​

PropertyValue
URLPOST /invoice/send-document-async-json
MethodPOST
R-AuthR-Auth: {company-jwt}
Base URLStage 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​

FieldValueDescription
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​

FieldTypeRequiredDescription
apiKeystringRequiredCompany API key.
ublDtoobjectRequiredUBL invoice object. See the full schema in the sections below.
receiverEmailsarrayOptionalEmail 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​

FieldRequiredDescription
TypeRequiredMust be "FACTUR_X".
ProfileTypeRequiredMust be "EN16931".
CustomizationID.ValueRequiredMust be "urn:cen.eu:en16931:2017" — exact match.
CompanyIdRequiredDocnova company UUID.
ID.ValueRequiredUnique invoice number. Duplicates return INVOICE_ALREADY_EXISTS.
IssueDate.ValueRequiredInvoice date — YYYY-MM-DD format.
InvoiceTypeCode.ValueRequired"380" commercial invoice, "381" credit note, "384" corrected invoice.
DocumentCurrencyCode.ValueRequiredISO 4217 invoice currency, e.g. "EUR".
DueDate.ValueOptionalPayment due date — YYYY-MM-DD format.
BuyerReference.ValueOptionalBuyer-assigned reference such as a purchase order number.
NoteOptionalFree-text notes. Array of {"Value": "..."} objects.

Seller required fields​

FieldRequiredDescription
Party.PartyNameRequiredSeller name.
Party.PostalAddress.CityName.ValueRequiredSeller city.
Party.PostalAddress.PostalZone.ValueRequiredPostal/ZIP code.
Party.PostalAddress.Country.IdentificationCode.ValueRequiredISO 3166-1 alpha-2 country code, e.g. "FR".
Party.PartyTaxScheme[].CompanyID.ValueRequiredSeller VAT number. French format: "FR" + 2-digit key + 9-digit SIREN.
Party.PartyTaxScheme[].TaxScheme.ID.ValueRequiredMust be "VAT".
Party.PartyLegalEntity[].RegistrationName.ValueRequiredSeller legal entity name.
Party.PartyLegalEntity[].CompanyID.ValueRequiredSeller company ID. French format: "FR" + 2-digit key + 9-digit SIREN.
Party.PostalAddress.StreetName.ValueOptionalStreet address.
Party.EndpointIDOptionalPeppol endpoint ID. Include when sending via Peppol. schemeID: "0225" for French SIREN.

Buyer required fields​

FieldRequiredDescription
Party.PartyNameRequiredBuyer name.
Party.PostalAddress.CityName.ValueRequiredBuyer city.
Party.PostalAddress.PostalZone.ValueRequiredPostal/ZIP code.
Party.PostalAddress.Country.IdentificationCode.ValueRequiredISO 3166-1 alpha-2 buyer country code.
Party.PartyLegalEntity[].RegistrationName.ValueRequiredBuyer legal entity name.
Party.EndpointIDOptionalPeppol endpoint ID. Include when sending via Peppol. schemeID: "0225" for French SIREN.

Tax required fields​

FieldRequiredDescription
TaxTotal[].TaxAmount.ValueRequiredTotal VAT amount. Max 2 decimal places.
TaxTotal[].TaxAmount.currencyIDRequiredMust match DocumentCurrencyCode.
TaxSubtotal[].TaxableAmount.ValueRequiredNet taxable base for this category.
TaxSubtotal[].TaxAmount.ValueRequiredVAT amount for this category.
TaxCategory.ID.ValueRequired"S" Standard, "Z" Zero rate, "E" Exempt, "AE" Reverse charge.
TaxCategory.Percent.ValueRequiredTax rate, e.g. "20", "10", "5.5", "0".
TaxCategory.TaxScheme.ID.ValueRequiredMust be "VAT".

Monetary totals required fields​

info

All amount values must have at most 2 decimal places. Include the currencyID attribute on every amount object.

FieldRequiredDescription
LineExtensionAmountRequiredSum of all line extension amounts before tax.
TaxExclusiveAmountRequiredNet total after allowances/charges, before tax.
TaxInclusiveAmountRequiredGross total including all taxes.
PayableAmountRequiredAmount due for payment.
AllowanceTotalAmountOptionalSum of document-level discounts.
PrepaidAmountOptionalAmount already paid, such as advance payments.

Invoice line required fields​

FieldRequiredDescription
ID.ValueRequiredUnique line identifier within the invoice.
InvoicedQuantity.ValueRequiredQuantity amount.
InvoicedQuantity.unitCodeRequiredUN/ECE Rec. 20 unit code. Common: "EA" each, "HUR" hour, "KGM" kg.
LineExtensionAmountRequiredLine net amount: quantity × unit price. Include currencyID.
Item.Name.ValueRequiredProduct or service name.
Item.ClassifiedTaxCategoryRequiredTax category for this line — same structure as TaxSubtotal.TaxCategory.
Price.PriceAmountRequiredUnit price. Include currencyID.
Item.Description.ValueOptionalExtended 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"
}
info

A 200 OK only means the document was accepted, not delivered. Always check the final status with GET /invoice/document-status/{trackingId}.

Response fields​

FieldTypeDescription
trackingIdUUIDUse this to poll GET /invoice/document-status/{trackingId} for processing updates.
statusstringInitial status — always "PENDING" on acceptance.
messagestringHuman-readable message confirming the document was queued.

Peppol BIS for France non-domestic

Submit an invoice for asynchronous processing and delivery.

Endpoint​

PropertyValue
URLPOST /invoice/send-document-async-json
MethodPOST
AuthR-Auth: <company-jwt>
Content-Typeapplication/json
Base URLStage Environment https://api-fr-stage.docnova.ai/
Production Environment https://api-fr.docnova.ai/
Company JWT required

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​

FieldTypeRequiredDescription
apiKeystringYesCompany API key
ublDtoobjectYesUBL invoice object. See the full schema below.
receiverEmailsarrayNoEmail 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​

FieldRequiredDescriptionExample
TypeYesInvoice typePEPPOL_BIS
ProfileTypeYesEN 16931 profileEN16931
ID.ValueYesUnique invoice numberINV-2026-001
IssueDate.ValueYesIssue dateYYYY-MM-DD
DueDate.ValueYes*Due dateRequired if no PaymentTerms
InvoiceTypeCode.ValueYesType code380 invoice, 381 credit note
DocumentCurrencyCode.ValueYesCurrencyISO 4217, for example EUR
BuyerReference.ValueYes*Buyer referenceRequired if no OrderReference
CompanyIdYesDocnova company UUIDf5e6d7c8-1234-5678-9abc-def012345678
PartnerUuidYesDocnova partner UUIDpartnerUuid
UBLVersionID.ValueYesUBL version2.1
IsPeppolParticipantYesPeppol flagtrue

Seller required fields​

FieldRequiredDescription
Party.EndpointID.ValueYesMust match businessIdentifier from Submit register request
Party.EndpointID.schemeIDYesICD code, for example 0002 for France SIREN or 9930 for Germany VAT
Party.PartyLegalEntity[0].RegistrationName.ValueYesLegal name
Party.PartyLegalEntity[0].CompanyID.ValueYesVAT identifier
Party.PostalAddress.Country.IdentificationCode.ValueYesISO country code

Buyer required fields​

FieldRequiredDescription
Party.EndpointID.ValueYesMust be a registered Peppol participant
Party.EndpointID.schemeIDYesICD code
Party.PartyLegalEntity[0].RegistrationName.ValueYesLegal name
Party.PostalAddress.Country.IdentificationCode.ValueYesISO country code

Tax required fields​

FieldRequiredDescription
TaxAmount.ValueYesTotal VAT amount, maximum 2 decimals
TaxSubtotal[0].TaxableAmount.ValueYesTaxable base amount
TaxSubtotal[0].TaxAmount.ValueYesVAT amount for this category
TaxSubtotal[0].TaxCategory.ID.ValueYesVAT category. S Standard, Z Zero, E Exempt, AE Reverse charge
TaxSubtotal[0].TaxCategory.Percent.ValueYesVAT 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​

FieldRequiredDescription
LineExtensionAmount.ValueYesSum of line net amounts
TaxExclusiveAmount.ValueYesTotal without VAT
TaxInclusiveAmount.ValueYesTotal including VAT
PayableAmount.ValueYesAmount due

Invoice line required fields​

FieldRequiredDescription
ID.ValueYesUnique line number
InvoicedQuantity.ValueYesQuantity
InvoicedQuantity.unitCodeYesUN/ECE Rec 20 code, for example HUR for hour
LineExtensionAmount.ValueYesNet line amount, quantity multiplied by unit price
Item.Name.ValueYesProduct or service name
Item.ClassifiedTaxCategory[0].ID.ValueYesVAT category
Item.ClassifiedTaxCategory[0].Percent.ValueYesVAT rate
Price.PriceAmount.ValueYesUnit price excluding VAT

Response​

{
"trackingId": "550e8400-e29b-41d4-a716-446655440000",
"status": "PENDING",
"message": "Document accepted for processing"
}

Response fields​

FieldDescription
trackingIdTracking UUID for the submitted document
statusInitial processing status, for example PENDING
messageHuman-readable processing message
Tracking

Use the trackingId to check delivery status via Document status.