curl --request POST \
--url https://thirdparty.qonto.com/v2/sepa/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",
"transfer": {
"beneficiary_id": "66b7e300-0126-4905-9688-27b445a48c4e",
"bank_account_id": "420e13ac-9d3e-4c11-93a1-0c3c8304f2df",
"reference": "Lease payment",
"amount": "1100.50",
"note": "Lease payment for offices in Paris",
"attachment_ids": [
"394f77f1-0d2c-46fb-8a7e-a959dbdeee63"
],
"scheduled_date": "2027-01-11"
}
}
'import requests
url = "https://thirdparty.qonto.com/v2/sepa/transfers"
payload = {
"vop_proof_token": "proof_1234567890abcdef",
"transfer": {
"beneficiary_id": "66b7e300-0126-4905-9688-27b445a48c4e",
"bank_account_id": "420e13ac-9d3e-4c11-93a1-0c3c8304f2df",
"reference": "Lease payment",
"amount": "1100.50",
"note": "Lease payment for offices in Paris",
"attachment_ids": ["394f77f1-0d2c-46fb-8a7e-a959dbdeee63"],
"scheduled_date": "2027-01-11"
}
}
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',
transfer: {
beneficiary_id: '66b7e300-0126-4905-9688-27b445a48c4e',
bank_account_id: '420e13ac-9d3e-4c11-93a1-0c3c8304f2df',
reference: 'Lease payment',
amount: '1100.50',
note: 'Lease payment for offices in Paris',
attachment_ids: ['394f77f1-0d2c-46fb-8a7e-a959dbdeee63'],
scheduled_date: '2027-01-11'
}
})
};
fetch('https://thirdparty.qonto.com/v2/sepa/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/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',
'transfer' => [
'beneficiary_id' => '66b7e300-0126-4905-9688-27b445a48c4e',
'bank_account_id' => '420e13ac-9d3e-4c11-93a1-0c3c8304f2df',
'reference' => 'Lease payment',
'amount' => '1100.50',
'note' => 'Lease payment for offices in Paris',
'attachment_ids' => [
'394f77f1-0d2c-46fb-8a7e-a959dbdeee63'
],
'scheduled_date' => '2027-01-11'
]
]),
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/transfers"
payload := strings.NewReader("{\n \"vop_proof_token\": \"proof_1234567890abcdef\",\n \"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 \"note\": \"Lease payment for offices in Paris\",\n \"attachment_ids\": [\n \"394f77f1-0d2c-46fb-8a7e-a959dbdeee63\"\n ],\n \"scheduled_date\": \"2027-01-11\"\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/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 \"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 \"note\": \"Lease payment for offices in Paris\",\n \"attachment_ids\": [\n \"394f77f1-0d2c-46fb-8a7e-a959dbdeee63\"\n ],\n \"scheduled_date\": \"2027-01-11\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://thirdparty.qonto.com/v2/sepa/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 \"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 \"note\": \"Lease payment for offices in Paris\",\n \"attachment_ids\": [\n \"394f77f1-0d2c-46fb-8a7e-a959dbdeee63\"\n ],\n \"scheduled_date\": \"2027-01-11\"\n }\n}"
response = http.request(request)
puts response.read_body{
"transfer": {
"id": "08c9b6a2-9281-4aa9-93ab-d424d146e66a",
"initiator_id": "0348cfd2-9ce1-4260-88c3-66bf8f840e67",
"amount": 1100.5,
"amount_cents": 110050,
"amount_currency": "EUR",
"beneficiary_id": "66b7e300-0126-4905-9688-27b445a48c4e",
"reference": "Lease payment",
"note": "Lease payment for offices in Paris",
"status": "pending",
"declined_reason": null,
"scheduled_date": "2027-01-11",
"created_at": "2026-07-14T10:00:00.000Z",
"updated_at": "2026-07-14T10:00:00.000Z",
"processed_at": null,
"completed_at": null,
"transaction_id": null,
"bank_account_id": "420e13ac-9d3e-4c11-93a1-0c3c8304f2df",
"recurring_transfer_id": null
}
}Create a SEPA transfer
Creates a new SEPA 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/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",
"transfer": {
"beneficiary_id": "66b7e300-0126-4905-9688-27b445a48c4e",
"bank_account_id": "420e13ac-9d3e-4c11-93a1-0c3c8304f2df",
"reference": "Lease payment",
"amount": "1100.50",
"note": "Lease payment for offices in Paris",
"attachment_ids": [
"394f77f1-0d2c-46fb-8a7e-a959dbdeee63"
],
"scheduled_date": "2027-01-11"
}
}
'import requests
url = "https://thirdparty.qonto.com/v2/sepa/transfers"
payload = {
"vop_proof_token": "proof_1234567890abcdef",
"transfer": {
"beneficiary_id": "66b7e300-0126-4905-9688-27b445a48c4e",
"bank_account_id": "420e13ac-9d3e-4c11-93a1-0c3c8304f2df",
"reference": "Lease payment",
"amount": "1100.50",
"note": "Lease payment for offices in Paris",
"attachment_ids": ["394f77f1-0d2c-46fb-8a7e-a959dbdeee63"],
"scheduled_date": "2027-01-11"
}
}
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',
transfer: {
beneficiary_id: '66b7e300-0126-4905-9688-27b445a48c4e',
bank_account_id: '420e13ac-9d3e-4c11-93a1-0c3c8304f2df',
reference: 'Lease payment',
amount: '1100.50',
note: 'Lease payment for offices in Paris',
attachment_ids: ['394f77f1-0d2c-46fb-8a7e-a959dbdeee63'],
scheduled_date: '2027-01-11'
}
})
};
fetch('https://thirdparty.qonto.com/v2/sepa/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/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',
'transfer' => [
'beneficiary_id' => '66b7e300-0126-4905-9688-27b445a48c4e',
'bank_account_id' => '420e13ac-9d3e-4c11-93a1-0c3c8304f2df',
'reference' => 'Lease payment',
'amount' => '1100.50',
'note' => 'Lease payment for offices in Paris',
'attachment_ids' => [
'394f77f1-0d2c-46fb-8a7e-a959dbdeee63'
],
'scheduled_date' => '2027-01-11'
]
]),
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/transfers"
payload := strings.NewReader("{\n \"vop_proof_token\": \"proof_1234567890abcdef\",\n \"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 \"note\": \"Lease payment for offices in Paris\",\n \"attachment_ids\": [\n \"394f77f1-0d2c-46fb-8a7e-a959dbdeee63\"\n ],\n \"scheduled_date\": \"2027-01-11\"\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/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 \"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 \"note\": \"Lease payment for offices in Paris\",\n \"attachment_ids\": [\n \"394f77f1-0d2c-46fb-8a7e-a959dbdeee63\"\n ],\n \"scheduled_date\": \"2027-01-11\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://thirdparty.qonto.com/v2/sepa/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 \"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 \"note\": \"Lease payment for offices in Paris\",\n \"attachment_ids\": [\n \"394f77f1-0d2c-46fb-8a7e-a959dbdeee63\"\n ],\n \"scheduled_date\": \"2027-01-11\"\n }\n}"
response = http.request(request)
puts response.read_body{
"transfer": {
"id": "08c9b6a2-9281-4aa9-93ab-d424d146e66a",
"initiator_id": "0348cfd2-9ce1-4260-88c3-66bf8f840e67",
"amount": 1100.5,
"amount_cents": 110050,
"amount_currency": "EUR",
"beneficiary_id": "66b7e300-0126-4905-9688-27b445a48c4e",
"reference": "Lease payment",
"note": "Lease payment for offices in Paris",
"status": "pending",
"declined_reason": null,
"scheduled_date": "2027-01-11",
"created_at": "2026-07-14T10:00:00.000Z",
"updated_at": "2026-07-14T10:00:00.000Z",
"processed_at": null,
"completed_at": null,
"transaction_id": null,
"bank_account_id": "420e13ac-9d3e-4c11-93a1-0c3c8304f2df",
"recurring_transfer_id": null
}
}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).
Untrusted beneficiary
Untrusted beneficiary
- The transfer is above 5,000 EUR;
- More than 20,000 EUR have been sent to this beneficairy within 24 hours.
Trusted beneficiary
Trusted beneficiary
- The transfer is above 10,000 EUR;
- More than 50,000 EUR have been sent to this beneficairy within 24 hours.
400 with code: payment_policy_approval_required or code: payment_policy_approver_missing. In that case, resubmit the same transfer via Create transfer request — the request will go through the organization’s approval workflow before the transfer is executed.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 transfer created successfully
Show child attributes
Show child attributes
Was this page helpful?