curl --request POST \
--url https://api.next.orenda.finance/v1/customers/{customerId}/batch-payments/verify \
--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"
}
]
}
'{
"success": true,
"requestId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": "PENDING",
"batchId": "3f1c8f9e-1d2b-4a3c-9e5f-6a7b8c9d0e1f",
"expiresAt": "2026-08-17T09:00:00.000Z"
}{
"success": false,
"code": "VALIDATION_ERROR",
"message": "payee.sortCode must be 6 digits"
}{
"success": false,
"code": "UNAUTHORIZED",
"message": "Unauthorized"
}{
"success": false,
"code": "FORBIDDEN",
"message": "Forbidden"
}{
"success": false,
"code": "FUNDING_FAILED",
"message": "Insufficient available balance"
}{
"success": false,
"code": "SCA_REQUIRED",
"message": "Strong Customer Authentication required"
}{
"success": false,
"code": "INTERNAL_SERVER_ERROR",
"message": "Internal Server Error"
}Verify a batch (single customer)
Submit the batch items for validation and name-checking (CoP in the UK, VoP in the EU).
This route serves only verify. initiate, passkey-challenge and submit are rejected with 403 — use the /batch-payments/submit route for those.
Returns a requestId; poll GET /v1/batch-payments/verify/{requestId} until the result is no longer PROCESSING. Nothing is charged or reserved by this call.
Access: this route is gated separately from the one that pays a batch, so preparation can be granted without the ability to move money. The unsuffixed batch routes remain available and still accept every action, including submit.
Creates a draft. Verifying persists a draft batch and returns its batchId. Nothing is charged or reserved — the draft records that these items are prepared and awaiting submission, so a second person can pay it later by sending that batchId to the submit route. Send the same batchId back here to re-verify after edits and the draft is updated in place rather than a new one created. A draft expires (expiresAt) after 7 days, or at the end of its earliest scheduledDate, whichever comes first — after that it can no longer be submitted.
curl --request POST \
--url https://api.next.orenda.finance/v1/customers/{customerId}/batch-payments/verify \
--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"
}
]
}
'{
"success": true,
"requestId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": "PENDING",
"batchId": "3f1c8f9e-1d2b-4a3c-9e5f-6a7b8c9d0e1f",
"expiresAt": "2026-08-17T09:00:00.000Z"
}{
"success": false,
"code": "VALIDATION_ERROR",
"message": "payee.sortCode must be 6 digits"
}{
"success": false,
"code": "UNAUTHORIZED",
"message": "Unauthorized"
}{
"success": false,
"code": "FORBIDDEN",
"message": "Forbidden"
}{
"success": false,
"code": "FUNDING_FAILED",
"message": "Insufficient available balance"
}{
"success": false,
"code": "SCA_REQUIRED",
"message": "Strong Customer Authentication required"
}{
"success": false,
"code": "INTERNAL_SERVER_ERROR",
"message": "Internal Server Error"
}Authorizations
The caller's id_token from authentication — the ID token, not the access_token. The program and environment come from the token.
Path Parameters
The customer id.
Body
- Option 1
- Option 2
Send either payments or file — exactly one. A request carrying both is refused rather than resolved by precedence.
The payment items to validate. Required unless a file is sent instead.
Show child attributes
Show child attributes
Optional — this route serves only verify, so a missing value defaults to it. Any other value is rejected with 403.
verify A CSV or pain.001 file to parse into payments instead of sending payments. Exactly one of payments / file is required; sending both is rejected.
Show child attributes
Show child attributes
Optional. The draft being re-verified after edits — the draft is updated in place and keeps its original creation time. Omit to create a new draft.
Response
Accepted for validation. Returns requestId, the draft's batchId and its expiresAt; poll GET /v1/batch-payments/verify/{requestId} for the outcome.
Correlates this verification; poll GET /v1/batch-payments/verify/{requestId} with it.
Always PENDING — validation runs in the background.
PENDING The draft created (or updated). Submit with this id to pay it.
After this instant the draft can no longer be submitted.
Present only when the uploaded file contained something the parser could not carry across — an unrecognised column value, an EndToEndId outside the length or charset the rails accept, a file mixing currencies. Not row rejections: the payments are still queued for verification. Absent when there is nothing to report, and never present for a payments request.