curl --request POST \
--url https://api.next.orenda.finance/v1/customers/{customerId}/accounts/{accountId}/payments \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"amount": "150.00",
"currency": "GBP",
"reference": "Invoice 1024",
"beneficiaryId": "8c2f1b3e-4d5a-4f6b-9c7d-0e1f2a3b4c5d",
"purpose": "PP001",
"chargeBearer": "SHA"
}
'import requests
url = "https://api.next.orenda.finance/v1/customers/{customerId}/accounts/{accountId}/payments"
payload = {
"amount": "150.00",
"currency": "GBP",
"reference": "Invoice 1024",
"beneficiaryId": "8c2f1b3e-4d5a-4f6b-9c7d-0e1f2a3b4c5d",
"purpose": "PP001",
"chargeBearer": "SHA"
}
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({
amount: '150.00',
currency: 'GBP',
reference: 'Invoice 1024',
beneficiaryId: '8c2f1b3e-4d5a-4f6b-9c7d-0e1f2a3b4c5d',
purpose: 'PP001',
chargeBearer: 'SHA'
})
};
fetch('https://api.next.orenda.finance/v1/customers/{customerId}/accounts/{accountId}/payments', 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://api.next.orenda.finance/v1/customers/{customerId}/accounts/{accountId}/payments",
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([
'amount' => '150.00',
'currency' => 'GBP',
'reference' => 'Invoice 1024',
'beneficiaryId' => '8c2f1b3e-4d5a-4f6b-9c7d-0e1f2a3b4c5d',
'purpose' => 'PP001',
'chargeBearer' => 'SHA'
]),
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://api.next.orenda.finance/v1/customers/{customerId}/accounts/{accountId}/payments"
payload := strings.NewReader("{\n \"amount\": \"150.00\",\n \"currency\": \"GBP\",\n \"reference\": \"Invoice 1024\",\n \"beneficiaryId\": \"8c2f1b3e-4d5a-4f6b-9c7d-0e1f2a3b4c5d\",\n \"purpose\": \"PP001\",\n \"chargeBearer\": \"SHA\"\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://api.next.orenda.finance/v1/customers/{customerId}/accounts/{accountId}/payments")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": \"150.00\",\n \"currency\": \"GBP\",\n \"reference\": \"Invoice 1024\",\n \"beneficiaryId\": \"8c2f1b3e-4d5a-4f6b-9c7d-0e1f2a3b4c5d\",\n \"purpose\": \"PP001\",\n \"chargeBearer\": \"SHA\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.next.orenda.finance/v1/customers/{customerId}/accounts/{accountId}/payments")
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 \"amount\": \"150.00\",\n \"currency\": \"GBP\",\n \"reference\": \"Invoice 1024\",\n \"beneficiaryId\": \"8c2f1b3e-4d5a-4f6b-9c7d-0e1f2a3b4c5d\",\n \"purpose\": \"PP001\",\n \"chargeBearer\": \"SHA\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"bankTransfer": {
"status": "success",
"requestId": "3f1c9b7e-1f4a-4d2b-9c11-2f8a6b0e4d31"
}
}
}Create a payment
Sends a payment from the account, now or on a schedule. Send a saved beneficiaryId, the payee details inline, or a cryptoQuote for a crypto-funded payment; sending none of these is rejected. Don’t send programId or sandbox; they come from your token.
Reference length. The field allows up to 140 characters but some accounts accept as few as 35. accounts[].payments.reference (min, max, charset) in GET /v1/capabilities has the limit for the account you’re paying from; going over max is rejected.
Scheduling. Add scheduledDate to run the payment on a later day, and frequency (DAILY, WEEKLY, FORTNIGHTLY, MONTHLY; omit or NEVER for one-off) to repeat it. For MONTHLY the day is taken from scheduledDate; months without that day use the last day of the month. Only the calendar day counts: the date is read as a UTC day, any time is ignored, and the payment runs at about 02:00 UTC. A date that is today or in the past is not rejected; the payment is sent immediately as if scheduledDate had been left out. A scheduled 200 carries no requestId because what was created is the schedule, not a payment; find it with List scheduled payments and the payment id appears once it runs.
Retries. Send an Idempotency-Key header and reuse it on every retry of the same payment. A retry returns the original payment instead of paying twice, scheduled payments included.
A 200 means accepted, not settled. It always says status: "success". Anything that stops the payment before acceptance is a 422 (for example INSUFFICIENT_FUNDS or LIMIT_EXCEEDED), never a 200 with a failed status. The payment then appears on List payment requests as PENDING (or PENDING_TM while held for compliance review) and lands in transactions once settled. One that fails after acceptance stays on the requests list as FAILED.
curl --request POST \
--url https://api.next.orenda.finance/v1/customers/{customerId}/accounts/{accountId}/payments \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"amount": "150.00",
"currency": "GBP",
"reference": "Invoice 1024",
"beneficiaryId": "8c2f1b3e-4d5a-4f6b-9c7d-0e1f2a3b4c5d",
"purpose": "PP001",
"chargeBearer": "SHA"
}
'import requests
url = "https://api.next.orenda.finance/v1/customers/{customerId}/accounts/{accountId}/payments"
payload = {
"amount": "150.00",
"currency": "GBP",
"reference": "Invoice 1024",
"beneficiaryId": "8c2f1b3e-4d5a-4f6b-9c7d-0e1f2a3b4c5d",
"purpose": "PP001",
"chargeBearer": "SHA"
}
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({
amount: '150.00',
currency: 'GBP',
reference: 'Invoice 1024',
beneficiaryId: '8c2f1b3e-4d5a-4f6b-9c7d-0e1f2a3b4c5d',
purpose: 'PP001',
chargeBearer: 'SHA'
})
};
fetch('https://api.next.orenda.finance/v1/customers/{customerId}/accounts/{accountId}/payments', 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://api.next.orenda.finance/v1/customers/{customerId}/accounts/{accountId}/payments",
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([
'amount' => '150.00',
'currency' => 'GBP',
'reference' => 'Invoice 1024',
'beneficiaryId' => '8c2f1b3e-4d5a-4f6b-9c7d-0e1f2a3b4c5d',
'purpose' => 'PP001',
'chargeBearer' => 'SHA'
]),
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://api.next.orenda.finance/v1/customers/{customerId}/accounts/{accountId}/payments"
payload := strings.NewReader("{\n \"amount\": \"150.00\",\n \"currency\": \"GBP\",\n \"reference\": \"Invoice 1024\",\n \"beneficiaryId\": \"8c2f1b3e-4d5a-4f6b-9c7d-0e1f2a3b4c5d\",\n \"purpose\": \"PP001\",\n \"chargeBearer\": \"SHA\"\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://api.next.orenda.finance/v1/customers/{customerId}/accounts/{accountId}/payments")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": \"150.00\",\n \"currency\": \"GBP\",\n \"reference\": \"Invoice 1024\",\n \"beneficiaryId\": \"8c2f1b3e-4d5a-4f6b-9c7d-0e1f2a3b4c5d\",\n \"purpose\": \"PP001\",\n \"chargeBearer\": \"SHA\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.next.orenda.finance/v1/customers/{customerId}/accounts/{accountId}/payments")
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 \"amount\": \"150.00\",\n \"currency\": \"GBP\",\n \"reference\": \"Invoice 1024\",\n \"beneficiaryId\": \"8c2f1b3e-4d5a-4f6b-9c7d-0e1f2a3b4c5d\",\n \"purpose\": \"PP001\",\n \"chargeBearer\": \"SHA\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"bankTransfer": {
"status": "success",
"requestId": "3f1c9b7e-1f4a-4d2b-9c11-2f8a6b0e4d31"
}
}
}Authorizations
The user's access_token from authentication. The program and environment come from the token.
Headers
Optional. Makes the request retry-safe: a retry with the same key resolves to the same resource instead of creating a duplicate. Must be a UUID, and is scoped to the authenticated customer. Preferred over any idempotencyKey body field (a header value wins if both are sent). Optional today, but will be required in a future release: send one on every create now so a retry can never produce a duplicate.
Path Parameters
Customer identifier.
Account identifier. The account determines which optional features and limits apply.
Body
Decimal string, max 2 dp.
^\d+(\.\d{1,2})?$"150.00"
Purpose code.
1"PP001"
ISO 4217. Defaults to the account currency if omitted.
3Statement reference. The field allows up to 140 characters, but some programs accept fewer (as low as 35). Stay within your program's limit.
140Saved beneficiary. Required unless cryptoQuote is supplied.
SHA, OUR, BEN Specific source virtual IBAN. For domestic GBP must start with GB.
Schedule instead of paying now. Only the calendar day (UTC) counts: the time you send is ignored and the payment runs at about 02:00 UTC on that day. It must be a later day than today. A date that is today or in the past is not rejected; the payment is sent immediately.
Repeat interval for a recurring scheduled payment. Omit (or send NEVER) for a one-off. MONTHLY uses the day from scheduledDate.
NEVER, DAILY, WEEKLY, FORTNIGHTLY, MONTHLY Sends the payment with the fee waived. Not restricted to any caller.
Provide instead of beneficiaryId for crypto-funded payments.
Optional. Idempotency key for retry-safety (parity with batch payments). The Idempotency-Key header is preferred and overrides this field. Reusing a key with different amount/accountId/beneficiaryId returns 400; a key whose payment is still being claimed returns 409.