curl --request POST \
--url https://thirdparty.qonto.com/v2/client_invoices/{id}/send_by_einvoice \
--header 'Authorization: Bearer <token>'import requests
url = "https://thirdparty.qonto.com/v2/client_invoices/{id}/send_by_einvoice"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://thirdparty.qonto.com/v2/client_invoices/{id}/send_by_einvoice', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://thirdparty.qonto.com/v2/client_invoices/{id}/send_by_einvoice",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://thirdparty.qonto.com/v2/client_invoices/{id}/send_by_einvoice"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://thirdparty.qonto.com/v2/client_invoices/{id}/send_by_einvoice")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://thirdparty.qonto.com/v2/client_invoices/{id}/send_by_einvoice")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_bodySend a client invoice via e-invoice
OAuth scope: client_invoice.write
Sends the client invoice identified by the id path parameter via e-invoice.
French specificity: For French organizations and partners, e-invoice refers to using Qonto’s Plateforme Agréée (also referred to as “PA”)
Eligibility (prerequisites)
- The client on the invoice must be reachable on the e-invoicing network:
e_invoicing_reachableon the client (from Retrieve a client or List clients) must betrue. If it isfalse, do not call this endpoint, use Send a client invoice via email instead. This is not checked when you call this endpoint: an invoice sent to an unreachable recipient is reported as not transmitted ineinvoicing_lifecycle_events. - The client invoice must also not already have been submitted for e-invoice. If a send was already requested, calling this endpoint again completes successfully and does not resubmit the invoice. To send again after a rejection, import or create a new invoice.
Processing (asynchronous)
Relative to the e-invoicing network, delivery is asynchronous. A 204 means the request was accepted for processing, not that the invoice was fully delivered or issued on the network. The client invoice status does not change when you call this endpoint.
Tracking and observability
Track downstream steps on the invoice via einvoicing_lifecycle_events. The status_code values follow the platform’s lifecycle; a typical sequence is:
- 200 — Submitted (deposited for e-invoicing)
- 201 — Issued by the platform (released into the network)
- 202 — Received from the platform (the receiving platform acknowledges receipt from the sender), when applicable
There is no separate lifecycle-only endpoint. Use Retrieve a client invoice (GET /v2/client_invoices/{id}): the client_invoice object includes einvoicing_lifecycle_events (each event has a lifecycle status_code—for example 201 for Issued by the platform when that milestone is recorded) and einvoicing_status. Client invoice webhooks support updated (and created) events; treat them as a signal to fetch the invoice again if you need the latest lifecycle list. The documented webhook payload includes einvoicing_status but not the full einvoicing_lifecycle_events array.
E-invoicing API flows
Flow 1 — Invoices created in Qonto
Flow 1 — Invoices created in Qonto
- Create a client invoice in Qonto
- Send it via e-invoice using the endpoint
POST /v2/client_invoices/{id}/send_by_einvoice - Use the Qonto invoice
idto track its lifecycle (einvoicing_lifecycle_events) and Mark it as paid, Unmark it as paid, etc.
Flow 2 — Invoices created in a third-party invoicing tool
Flow 2 — Invoices created in a third-party invoicing tool
This flow lets you send an invoice initially generated with a third-party invoicing tool via e-invoice, by importing it into Qonto while preserving your original Factur-X file:
- Generate the invoice in the Factur-X format, including the correct
.xmlfile - Import the invoice into Qonto using
POST /v2/client_invoices/bulk— this preserves your original file and returns a Qonto invoiceid - Send the invoice via e-invoice using the endpoint
POST /v2/client_invoices/{id}/send_by_einvoice - Use the Qonto invoice
idto track its lifecycle (einvoicing_lifecycle_events) and Mark it as paid, Unmark it as paid, etc.
Attachments
Supporting documents attached to the invoice are not carried by this endpoint. If the invoice has an upload_id, that document is not embedded in the emitted XML and the upload_id is ignored. The call still succeeds and no error is returned.
This means the e-invoicing channel cannot currently satisfy a recipient who requires supporting documents inside the XML file (the attached document, BT-125 of EN 16931). Attachments are delivered only by Send a client invoice via email.
Environment limitations
The e-invoicing flow is only available in the production environment. Sandbox does not support e-invoicing, as the underlying e-invoicing network operates exclusively in production - this is a platform-level constraint.
Errors
Eligibility is not validated synchronously: invalid invoice data or an unreachable recipient does not return an error on this call. Check einvoicing_lifecycle_events on the invoice to confirm it was transmitted.
curl --request POST \
--url https://thirdparty.qonto.com/v2/client_invoices/{id}/send_by_einvoice \
--header 'Authorization: Bearer <token>'import requests
url = "https://thirdparty.qonto.com/v2/client_invoices/{id}/send_by_einvoice"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://thirdparty.qonto.com/v2/client_invoices/{id}/send_by_einvoice', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://thirdparty.qonto.com/v2/client_invoices/{id}/send_by_einvoice",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://thirdparty.qonto.com/v2/client_invoices/{id}/send_by_einvoice"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://thirdparty.qonto.com/v2/client_invoices/{id}/send_by_einvoice")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://thirdparty.qonto.com/v2/client_invoices/{id}/send_by_einvoice")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_bodyAuthorizations
Bearer authorization header: Bearer <token>, where <token> is the access token received from the authorization server at the end of the OAuth 2.0 flow.
Headers
Required only for Sandbox API requests; to get one, please sign up to the Developer Portal.
Path Parameters
The ID of the client invoice to send
Response
Request accepted for processing; e-invoice flow continues asynchronously
Was this page helpful?