curl --request POST \
--url https://thirdparty.qonto.com/v2/recurring_invoices \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"client_id": "5c1f4e3a-9b7d-4a1e-8f2c-3d6b8a0e7f11",
"start_date": "2030-01-01",
"frequency": {
"value": 1,
"recurrence": "monthly"
},
"payment_terms_days": 30,
"bank_account": {
"iban": "FR7630006000011234567890189"
},
"items": [
{
"title": "Consulting",
"quantity": "1",
"unit_price": {
"value": "100.00",
"currency": "EUR"
},
"vat_rate": "0.2",
"description": "<string>",
"unit": "<string>",
"vat_exemption_code": "<string>"
}
],
"invoice_status": "unpaid",
"currency": "EUR"
}
'import requests
url = "https://thirdparty.qonto.com/v2/recurring_invoices"
payload = {
"client_id": "5c1f4e3a-9b7d-4a1e-8f2c-3d6b8a0e7f11",
"start_date": "2030-01-01",
"frequency": {
"value": 1,
"recurrence": "monthly"
},
"payment_terms_days": 30,
"bank_account": { "iban": "FR7630006000011234567890189" },
"items": [
{
"title": "Consulting",
"quantity": "1",
"unit_price": {
"value": "100.00",
"currency": "EUR"
},
"vat_rate": "0.2",
"description": "<string>",
"unit": "<string>",
"vat_exemption_code": "<string>"
}
],
"invoice_status": "unpaid",
"currency": "EUR"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
client_id: '5c1f4e3a-9b7d-4a1e-8f2c-3d6b8a0e7f11',
start_date: '2030-01-01',
frequency: {value: 1, recurrence: 'monthly'},
payment_terms_days: 30,
bank_account: {iban: 'FR7630006000011234567890189'},
items: [
{
title: 'Consulting',
quantity: '1',
unit_price: {value: '100.00', currency: 'EUR'},
vat_rate: '0.2',
description: '<string>',
unit: '<string>',
vat_exemption_code: '<string>'
}
],
invoice_status: 'unpaid',
currency: 'EUR'
})
};
fetch('https://thirdparty.qonto.com/v2/recurring_invoices', 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/recurring_invoices",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'client_id' => '5c1f4e3a-9b7d-4a1e-8f2c-3d6b8a0e7f11',
'start_date' => '2030-01-01',
'frequency' => [
'value' => 1,
'recurrence' => 'monthly'
],
'payment_terms_days' => 30,
'bank_account' => [
'iban' => 'FR7630006000011234567890189'
],
'items' => [
[
'title' => 'Consulting',
'quantity' => '1',
'unit_price' => [
'value' => '100.00',
'currency' => 'EUR'
],
'vat_rate' => '0.2',
'description' => '<string>',
'unit' => '<string>',
'vat_exemption_code' => '<string>'
]
],
'invoice_status' => 'unpaid',
'currency' => 'EUR'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://thirdparty.qonto.com/v2/recurring_invoices"
payload := strings.NewReader("{\n \"client_id\": \"5c1f4e3a-9b7d-4a1e-8f2c-3d6b8a0e7f11\",\n \"start_date\": \"2030-01-01\",\n \"frequency\": {\n \"value\": 1,\n \"recurrence\": \"monthly\"\n },\n \"payment_terms_days\": 30,\n \"bank_account\": {\n \"iban\": \"FR7630006000011234567890189\"\n },\n \"items\": [\n {\n \"title\": \"Consulting\",\n \"quantity\": \"1\",\n \"unit_price\": {\n \"value\": \"100.00\",\n \"currency\": \"EUR\"\n },\n \"vat_rate\": \"0.2\",\n \"description\": \"<string>\",\n \"unit\": \"<string>\",\n \"vat_exemption_code\": \"<string>\"\n }\n ],\n \"invoice_status\": \"unpaid\",\n \"currency\": \"EUR\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
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/recurring_invoices")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"client_id\": \"5c1f4e3a-9b7d-4a1e-8f2c-3d6b8a0e7f11\",\n \"start_date\": \"2030-01-01\",\n \"frequency\": {\n \"value\": 1,\n \"recurrence\": \"monthly\"\n },\n \"payment_terms_days\": 30,\n \"bank_account\": {\n \"iban\": \"FR7630006000011234567890189\"\n },\n \"items\": [\n {\n \"title\": \"Consulting\",\n \"quantity\": \"1\",\n \"unit_price\": {\n \"value\": \"100.00\",\n \"currency\": \"EUR\"\n },\n \"vat_rate\": \"0.2\",\n \"description\": \"<string>\",\n \"unit\": \"<string>\",\n \"vat_exemption_code\": \"<string>\"\n }\n ],\n \"invoice_status\": \"unpaid\",\n \"currency\": \"EUR\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://thirdparty.qonto.com/v2/recurring_invoices")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"client_id\": \"5c1f4e3a-9b7d-4a1e-8f2c-3d6b8a0e7f11\",\n \"start_date\": \"2030-01-01\",\n \"frequency\": {\n \"value\": 1,\n \"recurrence\": \"monthly\"\n },\n \"payment_terms_days\": 30,\n \"bank_account\": {\n \"iban\": \"FR7630006000011234567890189\"\n },\n \"items\": [\n {\n \"title\": \"Consulting\",\n \"quantity\": \"1\",\n \"unit_price\": {\n \"value\": \"100.00\",\n \"currency\": \"EUR\"\n },\n \"vat_rate\": \"0.2\",\n \"description\": \"<string>\",\n \"unit\": \"<string>\",\n \"vat_exemption_code\": \"<string>\"\n }\n ],\n \"invoice_status\": \"unpaid\",\n \"currency\": \"EUR\"\n}"
response = http.request(request)
puts response.read_body{
"recurring_invoice": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "scheduled",
"start_date": "2023-12-25",
"frequency": {
"value": 123,
"recurrence": "weekly"
},
"payment_terms_days": 123,
"invoice_status": "draft",
"invoice_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}Create a recurring invoice
OAuth scope: client_invoice.write
Schedules recurring invoices for a client. On each occurrence’s invoice date, following the frequency you configure, an invoice is generated. Its due date is the invoice date plus payment_terms_days.
Price plans: this endpoint requires a price plan or add-on that includes recurring invoices, such as the Invoice Automation add-on. Without it, requests return 403. It is not available for organizations in Belgium or Portugal. Requests also return 403 with code permission_denied while the organization’s KYB is not yet accepted.
Automatic numbering required. The organization must have numbering_mode set to automatic (see GET /v2/settings) before a recurring invoice can be created. Otherwise this call returns a 412 with code invalid_numbering_mode. Call PUT /v2/settings with {"numbering_mode": "automatic"} first.
A create can generate a real invoice immediately. If start_date is today (UTC), the first invoice is created in the same request, its id is returned as invoice_id, and the recurring invoice’s status is active. When invoice_status is unpaid, that invoice is also emailed to the client straight away. If start_date is in the future, no invoice exists yet: invoice_id is absent and status is scheduled.
start_date cannot be in the past (UTC).
email_template is required when invoice_status is unpaid (the default), because the generated invoice is sent by email using it. It can be omitted when invoice_status is draft.
Organizations with an Italian legal country must send payment_reporting. Without it the create is rejected with a 422.
Not supported yet: a recurring invoice cannot carry a welfare fund, a withholding tax or a stamp duty. welfare_fund, withholding_tax and stamp_duty_amount are accepted on POST /v2/client_invoices. Here they are ignored if sent, and no recurring invoice endpoint returns them. Use the Qonto app for a recurring invoice that needs one of them.
Not supported at creation: discount (a discount covering the whole invoice), purchase_order, terms_and_conditions, header, footer, end_date and payment_link are ignored if sent here. They can be set afterwards with PUT /v2/recurring_invoices/{id}. A per-item discount is supported at creation.
curl --request POST \
--url https://thirdparty.qonto.com/v2/recurring_invoices \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"client_id": "5c1f4e3a-9b7d-4a1e-8f2c-3d6b8a0e7f11",
"start_date": "2030-01-01",
"frequency": {
"value": 1,
"recurrence": "monthly"
},
"payment_terms_days": 30,
"bank_account": {
"iban": "FR7630006000011234567890189"
},
"items": [
{
"title": "Consulting",
"quantity": "1",
"unit_price": {
"value": "100.00",
"currency": "EUR"
},
"vat_rate": "0.2",
"description": "<string>",
"unit": "<string>",
"vat_exemption_code": "<string>"
}
],
"invoice_status": "unpaid",
"currency": "EUR"
}
'import requests
url = "https://thirdparty.qonto.com/v2/recurring_invoices"
payload = {
"client_id": "5c1f4e3a-9b7d-4a1e-8f2c-3d6b8a0e7f11",
"start_date": "2030-01-01",
"frequency": {
"value": 1,
"recurrence": "monthly"
},
"payment_terms_days": 30,
"bank_account": { "iban": "FR7630006000011234567890189" },
"items": [
{
"title": "Consulting",
"quantity": "1",
"unit_price": {
"value": "100.00",
"currency": "EUR"
},
"vat_rate": "0.2",
"description": "<string>",
"unit": "<string>",
"vat_exemption_code": "<string>"
}
],
"invoice_status": "unpaid",
"currency": "EUR"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
client_id: '5c1f4e3a-9b7d-4a1e-8f2c-3d6b8a0e7f11',
start_date: '2030-01-01',
frequency: {value: 1, recurrence: 'monthly'},
payment_terms_days: 30,
bank_account: {iban: 'FR7630006000011234567890189'},
items: [
{
title: 'Consulting',
quantity: '1',
unit_price: {value: '100.00', currency: 'EUR'},
vat_rate: '0.2',
description: '<string>',
unit: '<string>',
vat_exemption_code: '<string>'
}
],
invoice_status: 'unpaid',
currency: 'EUR'
})
};
fetch('https://thirdparty.qonto.com/v2/recurring_invoices', 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/recurring_invoices",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'client_id' => '5c1f4e3a-9b7d-4a1e-8f2c-3d6b8a0e7f11',
'start_date' => '2030-01-01',
'frequency' => [
'value' => 1,
'recurrence' => 'monthly'
],
'payment_terms_days' => 30,
'bank_account' => [
'iban' => 'FR7630006000011234567890189'
],
'items' => [
[
'title' => 'Consulting',
'quantity' => '1',
'unit_price' => [
'value' => '100.00',
'currency' => 'EUR'
],
'vat_rate' => '0.2',
'description' => '<string>',
'unit' => '<string>',
'vat_exemption_code' => '<string>'
]
],
'invoice_status' => 'unpaid',
'currency' => 'EUR'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://thirdparty.qonto.com/v2/recurring_invoices"
payload := strings.NewReader("{\n \"client_id\": \"5c1f4e3a-9b7d-4a1e-8f2c-3d6b8a0e7f11\",\n \"start_date\": \"2030-01-01\",\n \"frequency\": {\n \"value\": 1,\n \"recurrence\": \"monthly\"\n },\n \"payment_terms_days\": 30,\n \"bank_account\": {\n \"iban\": \"FR7630006000011234567890189\"\n },\n \"items\": [\n {\n \"title\": \"Consulting\",\n \"quantity\": \"1\",\n \"unit_price\": {\n \"value\": \"100.00\",\n \"currency\": \"EUR\"\n },\n \"vat_rate\": \"0.2\",\n \"description\": \"<string>\",\n \"unit\": \"<string>\",\n \"vat_exemption_code\": \"<string>\"\n }\n ],\n \"invoice_status\": \"unpaid\",\n \"currency\": \"EUR\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
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/recurring_invoices")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"client_id\": \"5c1f4e3a-9b7d-4a1e-8f2c-3d6b8a0e7f11\",\n \"start_date\": \"2030-01-01\",\n \"frequency\": {\n \"value\": 1,\n \"recurrence\": \"monthly\"\n },\n \"payment_terms_days\": 30,\n \"bank_account\": {\n \"iban\": \"FR7630006000011234567890189\"\n },\n \"items\": [\n {\n \"title\": \"Consulting\",\n \"quantity\": \"1\",\n \"unit_price\": {\n \"value\": \"100.00\",\n \"currency\": \"EUR\"\n },\n \"vat_rate\": \"0.2\",\n \"description\": \"<string>\",\n \"unit\": \"<string>\",\n \"vat_exemption_code\": \"<string>\"\n }\n ],\n \"invoice_status\": \"unpaid\",\n \"currency\": \"EUR\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://thirdparty.qonto.com/v2/recurring_invoices")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"client_id\": \"5c1f4e3a-9b7d-4a1e-8f2c-3d6b8a0e7f11\",\n \"start_date\": \"2030-01-01\",\n \"frequency\": {\n \"value\": 1,\n \"recurrence\": \"monthly\"\n },\n \"payment_terms_days\": 30,\n \"bank_account\": {\n \"iban\": \"FR7630006000011234567890189\"\n },\n \"items\": [\n {\n \"title\": \"Consulting\",\n \"quantity\": \"1\",\n \"unit_price\": {\n \"value\": \"100.00\",\n \"currency\": \"EUR\"\n },\n \"vat_rate\": \"0.2\",\n \"description\": \"<string>\",\n \"unit\": \"<string>\",\n \"vat_exemption_code\": \"<string>\"\n }\n ],\n \"invoice_status\": \"unpaid\",\n \"currency\": \"EUR\"\n}"
response = http.request(request)
puts response.read_body{
"recurring_invoice": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "scheduled",
"start_date": "2023-12-25",
"frequency": {
"value": 123,
"recurrence": "weekly"
},
"payment_terms_days": 123,
"invoice_status": "draft",
"invoice_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}Authorizations
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.
Body
The client this recurring invoice bills.
"5c1f4e3a-9b7d-4a1e-8f2c-3d6b8a0e7f11"
The date of the first occurrence. Cannot be in the past (UTC).
"2030-01-01"
Together, value and recurrence define the schedule. For example, {"value": 2, "recurrence": "monthly"} bills every two months.
Show child attributes
Show child attributes
Days between an occurrence's invoice date and its due date.
0 <= x <= 36530
The bank account generated invoices are paid to, identified by IBAN.
Show child attributes
Show child attributes
The line items billed on every occurrence.
1Show child attributes
Show child attributes
The status each generated invoice is created as.
draft, unpaid Currency for the recurring invoice and its items, as an ISO 4217 trigram. Defaults to EUR. Every item without its own unit_price.currency uses this value.
"EUR"
How each generated invoice is emailed to the client. Required when invoice_status is unpaid (or omitted, since that's the default); optional when invoice_status is draft.
Show child attributes
Show child attributes
Italian payment reporting details, required for organizations with an Italian legal country. When sent, both method and conditions are required. Non-Italian organizations should not send this property.
Show child attributes
Show child attributes
Response
Returns the created recurring invoice.
Show child attributes
Show child attributes
Was this page helpful?