curl --request POST \
--url https://api.next.orenda.finance/v1/batch-payments \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"action": "verify",
"payments": [
{
"payer": {
"account": {
"type": "uk",
"sortCode": "010203",
"accountNumber": "12345678"
}
},
"payee": {
"name": "Ada Lovelace",
"account": {
"type": "uk",
"sortCode": "040506",
"accountNumber": "87654321"
},
"accountType": "CONSUMER"
},
"reference": "Invoice 1024",
"amount": "150.00"
},
{
"payer": {
"account": {
"type": "iban",
"iban": "DE89370400440532013000"
}
},
"payee": {
"name": "Grace Hopper",
"account": {
"type": "iban",
"iban": "FR7630006000011234567890189",
"bic": "AGRIFRPP"
}
},
"reference": "Invoice 1025",
"amount": "200.00"
}
]
}
'import requests
url = "https://api.next.orenda.finance/v1/batch-payments"
payload = {
"action": "verify",
"payments": [
{
"payer": { "account": {
"type": "uk",
"sortCode": "010203",
"accountNumber": "12345678"
} },
"payee": {
"name": "Ada Lovelace",
"account": {
"type": "uk",
"sortCode": "040506",
"accountNumber": "87654321"
},
"accountType": "CONSUMER"
},
"reference": "Invoice 1024",
"amount": "150.00"
},
{
"payer": { "account": {
"type": "iban",
"iban": "DE89370400440532013000"
} },
"payee": {
"name": "Grace Hopper",
"account": {
"type": "iban",
"iban": "FR7630006000011234567890189",
"bic": "AGRIFRPP"
}
},
"reference": "Invoice 1025",
"amount": "200.00"
}
]
}
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({
action: 'verify',
payments: [
{
payer: {account: {type: 'uk', sortCode: '010203', accountNumber: '12345678'}},
payee: {
name: 'Ada Lovelace',
account: {type: 'uk', sortCode: '040506', accountNumber: '87654321'},
accountType: 'CONSUMER'
},
reference: 'Invoice 1024',
amount: '150.00'
},
{
payer: {account: {type: 'iban', iban: 'DE89370400440532013000'}},
payee: {
name: 'Grace Hopper',
account: {type: 'iban', iban: 'FR7630006000011234567890189', bic: 'AGRIFRPP'}
},
reference: 'Invoice 1025',
amount: '200.00'
}
]
})
};
fetch('https://api.next.orenda.finance/v1/batch-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/batch-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([
'action' => 'verify',
'payments' => [
[
'payer' => [
'account' => [
'type' => 'uk',
'sortCode' => '010203',
'accountNumber' => '12345678'
]
],
'payee' => [
'name' => 'Ada Lovelace',
'account' => [
'type' => 'uk',
'sortCode' => '040506',
'accountNumber' => '87654321'
],
'accountType' => 'CONSUMER'
],
'reference' => 'Invoice 1024',
'amount' => '150.00'
],
[
'payer' => [
'account' => [
'type' => 'iban',
'iban' => 'DE89370400440532013000'
]
],
'payee' => [
'name' => 'Grace Hopper',
'account' => [
'type' => 'iban',
'iban' => 'FR7630006000011234567890189',
'bic' => 'AGRIFRPP'
]
],
'reference' => 'Invoice 1025',
'amount' => '200.00'
]
]
]),
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/batch-payments"
payload := strings.NewReader("{\n \"action\": \"verify\",\n \"payments\": [\n {\n \"payer\": {\n \"account\": {\n \"type\": \"uk\",\n \"sortCode\": \"010203\",\n \"accountNumber\": \"12345678\"\n }\n },\n \"payee\": {\n \"name\": \"Ada Lovelace\",\n \"account\": {\n \"type\": \"uk\",\n \"sortCode\": \"040506\",\n \"accountNumber\": \"87654321\"\n },\n \"accountType\": \"CONSUMER\"\n },\n \"reference\": \"Invoice 1024\",\n \"amount\": \"150.00\"\n },\n {\n \"payer\": {\n \"account\": {\n \"type\": \"iban\",\n \"iban\": \"DE89370400440532013000\"\n }\n },\n \"payee\": {\n \"name\": \"Grace Hopper\",\n \"account\": {\n \"type\": \"iban\",\n \"iban\": \"FR7630006000011234567890189\",\n \"bic\": \"AGRIFRPP\"\n }\n },\n \"reference\": \"Invoice 1025\",\n \"amount\": \"200.00\"\n }\n ]\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/batch-payments")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"action\": \"verify\",\n \"payments\": [\n {\n \"payer\": {\n \"account\": {\n \"type\": \"uk\",\n \"sortCode\": \"010203\",\n \"accountNumber\": \"12345678\"\n }\n },\n \"payee\": {\n \"name\": \"Ada Lovelace\",\n \"account\": {\n \"type\": \"uk\",\n \"sortCode\": \"040506\",\n \"accountNumber\": \"87654321\"\n },\n \"accountType\": \"CONSUMER\"\n },\n \"reference\": \"Invoice 1024\",\n \"amount\": \"150.00\"\n },\n {\n \"payer\": {\n \"account\": {\n \"type\": \"iban\",\n \"iban\": \"DE89370400440532013000\"\n }\n },\n \"payee\": {\n \"name\": \"Grace Hopper\",\n \"account\": {\n \"type\": \"iban\",\n \"iban\": \"FR7630006000011234567890189\",\n \"bic\": \"AGRIFRPP\"\n }\n },\n \"reference\": \"Invoice 1025\",\n \"amount\": \"200.00\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.next.orenda.finance/v1/batch-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 \"action\": \"verify\",\n \"payments\": [\n {\n \"payer\": {\n \"account\": {\n \"type\": \"uk\",\n \"sortCode\": \"010203\",\n \"accountNumber\": \"12345678\"\n }\n },\n \"payee\": {\n \"name\": \"Ada Lovelace\",\n \"account\": {\n \"type\": \"uk\",\n \"sortCode\": \"040506\",\n \"accountNumber\": \"87654321\"\n },\n \"accountType\": \"CONSUMER\"\n },\n \"reference\": \"Invoice 1024\",\n \"amount\": \"150.00\"\n },\n {\n \"payer\": {\n \"account\": {\n \"type\": \"iban\",\n \"iban\": \"DE89370400440532013000\"\n }\n },\n \"payee\": {\n \"name\": \"Grace Hopper\",\n \"account\": {\n \"type\": \"iban\",\n \"iban\": \"FR7630006000011234567890189\",\n \"bic\": \"AGRIFRPP\"\n }\n },\n \"reference\": \"Invoice 1025\",\n \"amount\": \"200.00\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"requestId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": "PENDING"
}Custodian batch payments
Back-office batch action with no customerId in the path — a custodian can pay from the accounts of any of the customers it is responsible for in a single batch.
Back-office only. The caller must have a back-office role with a resolvable custodian context (verified custodian membership); a back-office role without one is rejected with 401. Each item’s payer account is resolved globally and authorized per item against the caller’s custodian: an account not owned by that custodian — including an account with no custodian — is rejected with 401. A non-back-office caller cannot use this route.
The action field selects the step (verify, initiate, passkey-challenge, submit), exactly as on the single-customer POST /v1/customers/{customerId}/batch-payments route.
curl --request POST \
--url https://api.next.orenda.finance/v1/batch-payments \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"action": "verify",
"payments": [
{
"payer": {
"account": {
"type": "uk",
"sortCode": "010203",
"accountNumber": "12345678"
}
},
"payee": {
"name": "Ada Lovelace",
"account": {
"type": "uk",
"sortCode": "040506",
"accountNumber": "87654321"
},
"accountType": "CONSUMER"
},
"reference": "Invoice 1024",
"amount": "150.00"
},
{
"payer": {
"account": {
"type": "iban",
"iban": "DE89370400440532013000"
}
},
"payee": {
"name": "Grace Hopper",
"account": {
"type": "iban",
"iban": "FR7630006000011234567890189",
"bic": "AGRIFRPP"
}
},
"reference": "Invoice 1025",
"amount": "200.00"
}
]
}
'import requests
url = "https://api.next.orenda.finance/v1/batch-payments"
payload = {
"action": "verify",
"payments": [
{
"payer": { "account": {
"type": "uk",
"sortCode": "010203",
"accountNumber": "12345678"
} },
"payee": {
"name": "Ada Lovelace",
"account": {
"type": "uk",
"sortCode": "040506",
"accountNumber": "87654321"
},
"accountType": "CONSUMER"
},
"reference": "Invoice 1024",
"amount": "150.00"
},
{
"payer": { "account": {
"type": "iban",
"iban": "DE89370400440532013000"
} },
"payee": {
"name": "Grace Hopper",
"account": {
"type": "iban",
"iban": "FR7630006000011234567890189",
"bic": "AGRIFRPP"
}
},
"reference": "Invoice 1025",
"amount": "200.00"
}
]
}
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({
action: 'verify',
payments: [
{
payer: {account: {type: 'uk', sortCode: '010203', accountNumber: '12345678'}},
payee: {
name: 'Ada Lovelace',
account: {type: 'uk', sortCode: '040506', accountNumber: '87654321'},
accountType: 'CONSUMER'
},
reference: 'Invoice 1024',
amount: '150.00'
},
{
payer: {account: {type: 'iban', iban: 'DE89370400440532013000'}},
payee: {
name: 'Grace Hopper',
account: {type: 'iban', iban: 'FR7630006000011234567890189', bic: 'AGRIFRPP'}
},
reference: 'Invoice 1025',
amount: '200.00'
}
]
})
};
fetch('https://api.next.orenda.finance/v1/batch-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/batch-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([
'action' => 'verify',
'payments' => [
[
'payer' => [
'account' => [
'type' => 'uk',
'sortCode' => '010203',
'accountNumber' => '12345678'
]
],
'payee' => [
'name' => 'Ada Lovelace',
'account' => [
'type' => 'uk',
'sortCode' => '040506',
'accountNumber' => '87654321'
],
'accountType' => 'CONSUMER'
],
'reference' => 'Invoice 1024',
'amount' => '150.00'
],
[
'payer' => [
'account' => [
'type' => 'iban',
'iban' => 'DE89370400440532013000'
]
],
'payee' => [
'name' => 'Grace Hopper',
'account' => [
'type' => 'iban',
'iban' => 'FR7630006000011234567890189',
'bic' => 'AGRIFRPP'
]
],
'reference' => 'Invoice 1025',
'amount' => '200.00'
]
]
]),
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/batch-payments"
payload := strings.NewReader("{\n \"action\": \"verify\",\n \"payments\": [\n {\n \"payer\": {\n \"account\": {\n \"type\": \"uk\",\n \"sortCode\": \"010203\",\n \"accountNumber\": \"12345678\"\n }\n },\n \"payee\": {\n \"name\": \"Ada Lovelace\",\n \"account\": {\n \"type\": \"uk\",\n \"sortCode\": \"040506\",\n \"accountNumber\": \"87654321\"\n },\n \"accountType\": \"CONSUMER\"\n },\n \"reference\": \"Invoice 1024\",\n \"amount\": \"150.00\"\n },\n {\n \"payer\": {\n \"account\": {\n \"type\": \"iban\",\n \"iban\": \"DE89370400440532013000\"\n }\n },\n \"payee\": {\n \"name\": \"Grace Hopper\",\n \"account\": {\n \"type\": \"iban\",\n \"iban\": \"FR7630006000011234567890189\",\n \"bic\": \"AGRIFRPP\"\n }\n },\n \"reference\": \"Invoice 1025\",\n \"amount\": \"200.00\"\n }\n ]\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/batch-payments")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"action\": \"verify\",\n \"payments\": [\n {\n \"payer\": {\n \"account\": {\n \"type\": \"uk\",\n \"sortCode\": \"010203\",\n \"accountNumber\": \"12345678\"\n }\n },\n \"payee\": {\n \"name\": \"Ada Lovelace\",\n \"account\": {\n \"type\": \"uk\",\n \"sortCode\": \"040506\",\n \"accountNumber\": \"87654321\"\n },\n \"accountType\": \"CONSUMER\"\n },\n \"reference\": \"Invoice 1024\",\n \"amount\": \"150.00\"\n },\n {\n \"payer\": {\n \"account\": {\n \"type\": \"iban\",\n \"iban\": \"DE89370400440532013000\"\n }\n },\n \"payee\": {\n \"name\": \"Grace Hopper\",\n \"account\": {\n \"type\": \"iban\",\n \"iban\": \"FR7630006000011234567890189\",\n \"bic\": \"AGRIFRPP\"\n }\n },\n \"reference\": \"Invoice 1025\",\n \"amount\": \"200.00\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.next.orenda.finance/v1/batch-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 \"action\": \"verify\",\n \"payments\": [\n {\n \"payer\": {\n \"account\": {\n \"type\": \"uk\",\n \"sortCode\": \"010203\",\n \"accountNumber\": \"12345678\"\n }\n },\n \"payee\": {\n \"name\": \"Ada Lovelace\",\n \"account\": {\n \"type\": \"uk\",\n \"sortCode\": \"040506\",\n \"accountNumber\": \"87654321\"\n },\n \"accountType\": \"CONSUMER\"\n },\n \"reference\": \"Invoice 1024\",\n \"amount\": \"150.00\"\n },\n {\n \"payer\": {\n \"account\": {\n \"type\": \"iban\",\n \"iban\": \"DE89370400440532013000\"\n }\n },\n \"payee\": {\n \"name\": \"Grace Hopper\",\n \"account\": {\n \"type\": \"iban\",\n \"iban\": \"FR7630006000011234567890189\",\n \"bic\": \"AGRIFRPP\"\n }\n },\n \"reference\": \"Invoice 1025\",\n \"amount\": \"200.00\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"requestId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": "PENDING"
}Authorizations
The user's access_token. The program and environment come from the token.
Body
The step to run.
verify, initiate, passkey-challenge, submit The payment items. Required for verify, initiate, and submit. Payers may belong to different customers of the caller's custodian.
Show child attributes
Show child attributes
The strong-customer-authentication challenge from initiate. Pass it back on submit.
Show child attributes
Show child attributes
Step-up confirmation (for submit). Set method to passkey, totp, or pin and include that method's fields. pin is a program capability — see Program capabilities.
- Passkey
- 2FA code
- PIN
Show child attributes
Show child attributes
Optional. Reuse the same key to make submit safe to retry.
Response
Action result. The body shape matches the action and is identical to the single-customer route (verify → requestId/status; initiate → totalAmount/currency/scaChallenge; submit → batchId/status/counts).
The response is of type object.