curl --request POST \
--url https://thirdparty.qonto.com/v2/sepa/recurring_transfers \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'X-Qonto-Idempotency-Key: <x-qonto-idempotency-key>' \
--data '
{
"vop_proof_token": "proof_1234567890abcdef",
"recurring_transfer": {
"beneficiary_id": "66b7e300-0126-4905-9688-27b445a48c4e",
"bank_account_id": "420e13ac-9d3e-4c11-93a1-0c3c8304f2df",
"reference": "Lease payment",
"amount": "1100.50",
"frequency": "monthly",
"first_execution_date": "2025-04-22",
"last_execution_date": "2026-08-21",
"note": "Lease payment for offices in Paris",
"attachment_ids": [
"394f77f1-0d2c-46fb-8a7e-a959dbdeee63"
]
}
}
'import requests
url = "https://thirdparty.qonto.com/v2/sepa/recurring_transfers"
payload = {
"vop_proof_token": "proof_1234567890abcdef",
"recurring_transfer": {
"beneficiary_id": "66b7e300-0126-4905-9688-27b445a48c4e",
"bank_account_id": "420e13ac-9d3e-4c11-93a1-0c3c8304f2df",
"reference": "Lease payment",
"amount": "1100.50",
"frequency": "monthly",
"first_execution_date": "2025-04-22",
"last_execution_date": "2026-08-21",
"note": "Lease payment for offices in Paris",
"attachment_ids": ["394f77f1-0d2c-46fb-8a7e-a959dbdeee63"]
}
}
headers = {
"X-Qonto-Idempotency-Key": "<x-qonto-idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-Qonto-Idempotency-Key': '<x-qonto-idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
vop_proof_token: 'proof_1234567890abcdef',
recurring_transfer: {
beneficiary_id: '66b7e300-0126-4905-9688-27b445a48c4e',
bank_account_id: '420e13ac-9d3e-4c11-93a1-0c3c8304f2df',
reference: 'Lease payment',
amount: '1100.50',
frequency: 'monthly',
first_execution_date: '2025-04-22',
last_execution_date: '2026-08-21',
note: 'Lease payment for offices in Paris',
attachment_ids: ['394f77f1-0d2c-46fb-8a7e-a959dbdeee63']
}
})
};
fetch('https://thirdparty.qonto.com/v2/sepa/recurring_transfers', 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/sepa/recurring_transfers",
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([
'vop_proof_token' => 'proof_1234567890abcdef',
'recurring_transfer' => [
'beneficiary_id' => '66b7e300-0126-4905-9688-27b445a48c4e',
'bank_account_id' => '420e13ac-9d3e-4c11-93a1-0c3c8304f2df',
'reference' => 'Lease payment',
'amount' => '1100.50',
'frequency' => 'monthly',
'first_execution_date' => '2025-04-22',
'last_execution_date' => '2026-08-21',
'note' => 'Lease payment for offices in Paris',
'attachment_ids' => [
'394f77f1-0d2c-46fb-8a7e-a959dbdeee63'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"X-Qonto-Idempotency-Key: <x-qonto-idempotency-key>"
],
]);
$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/sepa/recurring_transfers"
payload := strings.NewReader("{\n \"vop_proof_token\": \"proof_1234567890abcdef\",\n \"recurring_transfer\": {\n \"beneficiary_id\": \"66b7e300-0126-4905-9688-27b445a48c4e\",\n \"bank_account_id\": \"420e13ac-9d3e-4c11-93a1-0c3c8304f2df\",\n \"reference\": \"Lease payment\",\n \"amount\": \"1100.50\",\n \"frequency\": \"monthly\",\n \"first_execution_date\": \"2025-04-22\",\n \"last_execution_date\": \"2026-08-21\",\n \"note\": \"Lease payment for offices in Paris\",\n \"attachment_ids\": [\n \"394f77f1-0d2c-46fb-8a7e-a959dbdeee63\"\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Qonto-Idempotency-Key", "<x-qonto-idempotency-key>")
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/sepa/recurring_transfers")
.header("X-Qonto-Idempotency-Key", "<x-qonto-idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"vop_proof_token\": \"proof_1234567890abcdef\",\n \"recurring_transfer\": {\n \"beneficiary_id\": \"66b7e300-0126-4905-9688-27b445a48c4e\",\n \"bank_account_id\": \"420e13ac-9d3e-4c11-93a1-0c3c8304f2df\",\n \"reference\": \"Lease payment\",\n \"amount\": \"1100.50\",\n \"frequency\": \"monthly\",\n \"first_execution_date\": \"2025-04-22\",\n \"last_execution_date\": \"2026-08-21\",\n \"note\": \"Lease payment for offices in Paris\",\n \"attachment_ids\": [\n \"394f77f1-0d2c-46fb-8a7e-a959dbdeee63\"\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://thirdparty.qonto.com/v2/sepa/recurring_transfers")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Qonto-Idempotency-Key"] = '<x-qonto-idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"vop_proof_token\": \"proof_1234567890abcdef\",\n \"recurring_transfer\": {\n \"beneficiary_id\": \"66b7e300-0126-4905-9688-27b445a48c4e\",\n \"bank_account_id\": \"420e13ac-9d3e-4c11-93a1-0c3c8304f2df\",\n \"reference\": \"Lease payment\",\n \"amount\": \"1100.50\",\n \"frequency\": \"monthly\",\n \"first_execution_date\": \"2025-04-22\",\n \"last_execution_date\": \"2026-08-21\",\n \"note\": \"Lease payment for offices in Paris\",\n \"attachment_ids\": [\n \"394f77f1-0d2c-46fb-8a7e-a959dbdeee63\"\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"recurring_transfer": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"initiator_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"bank_account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount": 1100.5,
"amount_cents": 110050,
"amount_currency": "EUR",
"beneficiary_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reference": "Lease payment",
"note": "Lease payment for offices in Paris",
"first_execution_date": "2025-04-22",
"last_execution_date": "2026-08-21",
"next_execution_date": "2025-05-22",
"frequency": "weekly",
"created_at": "2025-04-22T12:00:00Z",
"updated_at": "2025-04-22T12:00:00Z",
"status": "<string>"
}
}Create a SEPA recurring transfer
Creates a new SEPA recurring transfer for a beneficiary. You can either provide a beneficiary_id for a known beneficiary or beneficiary data which will create an untrusted beneficiary on the fly.
curl --request POST \
--url https://thirdparty.qonto.com/v2/sepa/recurring_transfers \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'X-Qonto-Idempotency-Key: <x-qonto-idempotency-key>' \
--data '
{
"vop_proof_token": "proof_1234567890abcdef",
"recurring_transfer": {
"beneficiary_id": "66b7e300-0126-4905-9688-27b445a48c4e",
"bank_account_id": "420e13ac-9d3e-4c11-93a1-0c3c8304f2df",
"reference": "Lease payment",
"amount": "1100.50",
"frequency": "monthly",
"first_execution_date": "2025-04-22",
"last_execution_date": "2026-08-21",
"note": "Lease payment for offices in Paris",
"attachment_ids": [
"394f77f1-0d2c-46fb-8a7e-a959dbdeee63"
]
}
}
'import requests
url = "https://thirdparty.qonto.com/v2/sepa/recurring_transfers"
payload = {
"vop_proof_token": "proof_1234567890abcdef",
"recurring_transfer": {
"beneficiary_id": "66b7e300-0126-4905-9688-27b445a48c4e",
"bank_account_id": "420e13ac-9d3e-4c11-93a1-0c3c8304f2df",
"reference": "Lease payment",
"amount": "1100.50",
"frequency": "monthly",
"first_execution_date": "2025-04-22",
"last_execution_date": "2026-08-21",
"note": "Lease payment for offices in Paris",
"attachment_ids": ["394f77f1-0d2c-46fb-8a7e-a959dbdeee63"]
}
}
headers = {
"X-Qonto-Idempotency-Key": "<x-qonto-idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-Qonto-Idempotency-Key': '<x-qonto-idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
vop_proof_token: 'proof_1234567890abcdef',
recurring_transfer: {
beneficiary_id: '66b7e300-0126-4905-9688-27b445a48c4e',
bank_account_id: '420e13ac-9d3e-4c11-93a1-0c3c8304f2df',
reference: 'Lease payment',
amount: '1100.50',
frequency: 'monthly',
first_execution_date: '2025-04-22',
last_execution_date: '2026-08-21',
note: 'Lease payment for offices in Paris',
attachment_ids: ['394f77f1-0d2c-46fb-8a7e-a959dbdeee63']
}
})
};
fetch('https://thirdparty.qonto.com/v2/sepa/recurring_transfers', 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/sepa/recurring_transfers",
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([
'vop_proof_token' => 'proof_1234567890abcdef',
'recurring_transfer' => [
'beneficiary_id' => '66b7e300-0126-4905-9688-27b445a48c4e',
'bank_account_id' => '420e13ac-9d3e-4c11-93a1-0c3c8304f2df',
'reference' => 'Lease payment',
'amount' => '1100.50',
'frequency' => 'monthly',
'first_execution_date' => '2025-04-22',
'last_execution_date' => '2026-08-21',
'note' => 'Lease payment for offices in Paris',
'attachment_ids' => [
'394f77f1-0d2c-46fb-8a7e-a959dbdeee63'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"X-Qonto-Idempotency-Key: <x-qonto-idempotency-key>"
],
]);
$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/sepa/recurring_transfers"
payload := strings.NewReader("{\n \"vop_proof_token\": \"proof_1234567890abcdef\",\n \"recurring_transfer\": {\n \"beneficiary_id\": \"66b7e300-0126-4905-9688-27b445a48c4e\",\n \"bank_account_id\": \"420e13ac-9d3e-4c11-93a1-0c3c8304f2df\",\n \"reference\": \"Lease payment\",\n \"amount\": \"1100.50\",\n \"frequency\": \"monthly\",\n \"first_execution_date\": \"2025-04-22\",\n \"last_execution_date\": \"2026-08-21\",\n \"note\": \"Lease payment for offices in Paris\",\n \"attachment_ids\": [\n \"394f77f1-0d2c-46fb-8a7e-a959dbdeee63\"\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Qonto-Idempotency-Key", "<x-qonto-idempotency-key>")
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/sepa/recurring_transfers")
.header("X-Qonto-Idempotency-Key", "<x-qonto-idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"vop_proof_token\": \"proof_1234567890abcdef\",\n \"recurring_transfer\": {\n \"beneficiary_id\": \"66b7e300-0126-4905-9688-27b445a48c4e\",\n \"bank_account_id\": \"420e13ac-9d3e-4c11-93a1-0c3c8304f2df\",\n \"reference\": \"Lease payment\",\n \"amount\": \"1100.50\",\n \"frequency\": \"monthly\",\n \"first_execution_date\": \"2025-04-22\",\n \"last_execution_date\": \"2026-08-21\",\n \"note\": \"Lease payment for offices in Paris\",\n \"attachment_ids\": [\n \"394f77f1-0d2c-46fb-8a7e-a959dbdeee63\"\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://thirdparty.qonto.com/v2/sepa/recurring_transfers")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Qonto-Idempotency-Key"] = '<x-qonto-idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"vop_proof_token\": \"proof_1234567890abcdef\",\n \"recurring_transfer\": {\n \"beneficiary_id\": \"66b7e300-0126-4905-9688-27b445a48c4e\",\n \"bank_account_id\": \"420e13ac-9d3e-4c11-93a1-0c3c8304f2df\",\n \"reference\": \"Lease payment\",\n \"amount\": \"1100.50\",\n \"frequency\": \"monthly\",\n \"first_execution_date\": \"2025-04-22\",\n \"last_execution_date\": \"2026-08-21\",\n \"note\": \"Lease payment for offices in Paris\",\n \"attachment_ids\": [\n \"394f77f1-0d2c-46fb-8a7e-a959dbdeee63\"\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"recurring_transfer": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"initiator_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"bank_account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount": 1100.5,
"amount_cents": 110050,
"amount_currency": "EUR",
"beneficiary_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"reference": "Lease payment",
"note": "Lease payment for offices in Paris",
"first_execution_date": "2025-04-22",
"last_execution_date": "2026-08-21",
"next_execution_date": "2025-05-22",
"frequency": "weekly",
"created_at": "2025-04-22T12:00:00Z",
"updated_at": "2025-04-22T12:00:00Z",
"status": "<string>"
}
}Scope:
payment.write Sensitive
- if a beneficiary with the same IBAN already exists, the provided details (such as name) will be updated;
- this endpoint is not trusting the beneficiary - you can trust a beneficiary through the Qonto app (for more details, please refer to this article) or through this endpoint (available for the Automate your business operations and Embed use cases).
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
Learn more in Strong Customer Authentication.
paired-device, passkey, mock, sms-otp Learn more in Idempotent Requests.
"123e4567-e89b-12d3-a456-426614174000"
Learn more in Strong Customer Authentication.
Learn more in the SMS OTP Flow.
Required only for Sandbox API requests; to get one, please sign up to the Developer Portal.
Body
Proof token from a payee verification attempt or skip verification request. Use the token from verify payee.
"proof_1234567890abcdef"
Show child attributes
Show child attributes
Response
SEPA recurring transfer created successfully
Show child attributes
Show child attributes
Was this page helpful?