curl --request GET \
--url https://api.next.orenda.finance/v1/batch-payments \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.next.orenda.finance/v1/batch-payments"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
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 => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.next.orenda.finance/v1/batch-payments"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.next.orenda.finance/v1/batch-payments")
.header("Authorization", "Bearer <token>")
.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::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"paymentsBatches": [
{
"id": "batch-123",
"customerId": "customer-123",
"programId": "program-123",
"sandbox": false,
"paymentsCount": 3,
"createdDateTime": "2026-06-16T10:00:00.000Z",
"customerName": "Jane Doe",
"itemsStatus": {
"completed": 1,
"pending": 1,
"processing": 1,
"failed": 0
},
"totalAmount": "1250.50"
}
],
"nextToken": "eyJpZCI6ImJhdGNoLTEyMyJ9"
}
}{
"success": false,
"code": "VALIDATION_ERROR",
"message": "payee.sortCode must be 6 digits"
}{
"success": false,
"code": "UNAUTHORIZED",
"message": "Unauthorized"
}Find a draft
List batches awaiting submission and open one to review it.
curl --request GET \
--url https://api.next.orenda.finance/v1/batch-payments \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.next.orenda.finance/v1/batch-payments"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
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 => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.next.orenda.finance/v1/batch-payments"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.next.orenda.finance/v1/batch-payments")
.header("Authorization", "Bearer <token>")
.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::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"paymentsBatches": [
{
"id": "batch-123",
"customerId": "customer-123",
"programId": "program-123",
"sandbox": false,
"paymentsCount": 3,
"createdDateTime": "2026-06-16T10:00:00.000Z",
"customerName": "Jane Doe",
"itemsStatus": {
"completed": 1,
"pending": 1,
"processing": 1,
"failed": 0
},
"totalAmount": "1250.50"
}
],
"nextToken": "eyJpZCI6ImJhdGNoLTEyMyJ9"
}
}{
"success": false,
"code": "VALIDATION_ERROR",
"message": "payee.sortCode must be 6 digits"
}{
"success": false,
"code": "UNAUTHORIZED",
"message": "Unauthorized"
}List them
GET /v1/batch-payments?drafts=true
drafts and you get submitted batches exactly as
before — a draft never appears in the default list.
A draft appears in this list as soon as verification is requested, not when it finishes,
so a freshly prepared one may still be verifying. Opening it before the check completes
returns the draft with payloadStatus: "PENDING" and no payments.
Each entry carries:
| Field | Meaning |
|---|---|
id | the batchId to submit with |
status | DRAFT, or EXPIRED once it can no longer be paid |
paymentsCount | how many rows were prepared |
expiresAt | when it stops being submittable |
createdDateTime | when it was first verified |
itemsStatus and totalAmount are absent
on a draft — not zero, and they stay absent even if you ask for includeItemSummary=true.
paymentsCount is what a draft has instead.Open one
GET /v1/batch-payments/{batchId}
draft object instead of items — with the verified
payments split into validPayments and invalidPayments, so you can see exactly what was
checked before deciding to pay.
For a batch that has already been paid, the same call returns its item rows as it always has.
Withdraw one
DELETE /v1/batch-payments/{batchId}
409. An expired draft can still be deleted, which is how you clear one out of
the list.
Deleting is final for that draft, and it is not idempotent: once it is gone there is nothing
left to recognise, so calling again returns 404 rather than succeeding twice. To prepare the
same payments once more, verify them — that creates a new draft.
Expiry
A draft expires 7 days after it was first verified, or at the end of its earliestscheduledDate, whichever comes first.
An expired draft still appears in the list, marked EXPIRED — the record that a batch was
prepared and never sent is worth keeping. But it can no longer be submitted, and opening it
returns the draft without its payload, because the verified items are held on their own
retention clock.
batchId and expiry.Who can see what
You only ever see your own drafts — including one a back-office operator prepared for you. Drafts prepared through the back-office route belong to the team that prepared them, and opening a draft you don’t own is refused as if it did not exist.Authorizations
The caller's id_token from authentication — the ID token, not the access_token. The program and environment come from the token.
Query Parameters
Maximum number of batches to return. Values above 1000 are clamped to 1000. Invalid values include 0, negative numbers, non-integer strings, and mixed strings such as 10abc.
x >= 1Pagination token returned by a previous response.
Lookback window for program-admin searches. Invalid values include 0, negative numbers, non-integer strings, and mixed strings such as 10abc.
x >= 1Set to true to list batches awaiting submission instead of submitted ones. Omit it and the response is unchanged. Drafts are held in separate indexes, so this selects a different query rather than filtering the normal one — a draft never appears in the default listing. Only the exact string true enables it.
true Set to true to include the per-batch item summary — itemsStatus (counts by item status) and totalAmount (the sum of item amounts). Omit it and both fields are absent. Available to every role, including customer callers. Only the exact string true enables it. Has no effect with drafts=true, which has no item rows to summarise.
true