Skip to main content
Version: 1.0.1

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.