/v1 endpoints, authenticated
with the operator’s bearer token.
Every call needs the programId query parameter — ?programId=abc. Your operator
role bounds which programs you may act on; the program itself is chosen by the request.
Add &sandbox=true for the test environment.
These are the
/v1 routes. The older, unprefixed paths
(/customers/{customerId}/…) still answer but are being retired — build against /v1.Accounts
-
GET /v1/accounts?programId=…&customerId=…— accounts with balances and bank details. Filter and paginate withcustomerId,accountId,currency,status,page,limit,sortBy,sortOrder(the list filters accept comma-separated values), andresultType=filereturns a CSV export instead of JSON. In sandbox, most providers return mock data. -
POST /v1/customers/{customerId}/accounts— open an additional account; bodycurrency. This one is path-scoped.
Payments
-
POST /v1/customers/{customerId}/accounts/{accountId}/payments— send a payment for the customer. Required:amount(decimal string, max 2 dp) andpurpose(purpose code). Also accepted:beneficiaryId(a saved payee — required unless you send acryptoQuote),currency(defaults to the account currency),reference(statement reference; the field allows 140 characters but some programs accept as few as 35),chargeBearer(SHA/OUR/BEN),debtorViban, andscheduledDate+frequencyfor scheduled/recurring. P2P transfers are detected automatically from the destination identifiers. Send anIdempotency-Keyheader so a retry can’t double-send. -
GET /v1/customers/{customerId}/accounts/{accountId}/payments/fee?amount=150.00— preview the fee; returnsfeeAmount. OptionalwaiveFeequery parameter (trueor1) returns the fee as waived — note this is not restricted to a subset of operators; any caller who can reach the endpoint may pass it. Programs and providers without fee preview respond503 SERVICE_UNAVAILABLE(only ClearBank, Banking Circle and EasyPayment support it) — branch on503, and don’t treat it as a transient outage to retry. -
GET /v1/customers/{customerId}/accounts/{accountId}/scheduled-payments— the account’s scheduled and recurring payments.GET /v1/customers/{customerId}/scheduled-paymentsgives the same across all the customer’s accounts. -
DELETE /v1/customers/{customerId}/accounts/{accountId}/scheduled-payments/{scheduleId}— cancel one. -
POST /v1/customers/{customerId}/accounts/{accountId}/payments/international— an international (SWIFT / cross-currency) transfer.
Beneficiaries
-
POST /v1/customers/{customerId}/beneficiaries— create a payee. Body:accountId(which of the customer’s accounts the payee is linked to),name, and anaccountobject matching the program’s rails (UK{ type: "uk", sortCode, accountNumber }, EU{ type: "iban", iban, bic }). OptionalisCorporate,address. Customer sessions must also send aconfirmationobject (step-up). Back-office and SSO calls skip the step-up and can omit it. Accepts anIdempotency-Keyheader. -
GET /v1/customers/{customerId}/beneficiaries— list payees; paginate withlimitandnextToken. -
GET /v1/customers/{customerId}/beneficiaries/{beneficiaryId}— one payee. -
DELETE /v1/customers/{customerId}/beneficiaries/{beneficiaryId}— remove a payee. Blocked while pending, scheduled, or batch payments still reference it.
Name check (CoP / VoP)
POST /v1/beneficiaries/verify — check a payee’s name against the account before you
save or pay them. UK uses Confirmation of Payee, EU
uses Verification of Payee; the endpoint picks the scheme from the account you send.
match, name, reasonCode, reasonCodeDescription. For EU send
{ "type": "iban", "iban": "…" } instead.
Batch payments
The same single-endpoint, action-driven flow as the customer API —POST /v1/customers/{customerId}/batch-payments:
Every action requires the full payments array — including initiate and submit.
Omitting it is a 400; the challenge alone is not enough.
action: "verify"— validates items and runs the name check (CoP for UK, VoP for EU). Large batches verify asynchronously: pollGET /v1/batch-payments/verify/{requestId}until it completes.action: "initiate"— returns thescaChallenge(hash,nonce,timestamp).action: "submit"— sends the batch with the challenge andconfirmation. Reuse the sameidempotencyKeybody field across retries of this step; batch payments take the key in the body rather than the header.
passkey-challenge, used to obtain a passkey step-up for
submit.
Back-office callers acting across several of their customers use POST /v1/batch-payments
with the same body.
Track batches with GET /v1/batch-payments (query limit, nextToken, lookbackDays)
and GET /v1/batch-payments/{batchId} — back-office roles see all items; customer
sessions only their own.
Idempotency
Four endpoints on this page take an idempotency key — create payment, international payment, create beneficiary, and batch submit. (Opening an account does not.) The key must be a UUID in all cases, but there are two different mechanisms behind it.Payments, international payments, beneficiaries
Send anIdempotency-Key header (preferred; an idempotencyKey body field is
accepted as a fallback). The resource’s id is derived from the key and scoped to the
customer, so two customers reusing the same key never collide.
Two limits worth knowing before you rely on this:
- The mismatch check hashes a subset of the request, not all of it. Payments hash
amount,accountId,beneficiaryId,currency,paymentRefandpurpose(plusscheduledDate/frequencyfor scheduled payments); beneficiaries hashname,accountNumber,iban,sortCode,bicandaccountId. Changing a field outside that set —chargeBearerordebtorViban, say — and reusing the key silently replays the original instead of returning400. Use a fresh key when you change the request. - Only payments reserve the key up front. Beneficiary create is an exists-then-compare with no reservation, so two concurrent creates with the same key both proceed. The replay check also runs after the step-up, so a keyed retry on a customer session still needs a fresh confirmation.
FAILED is re-run on retry rather than replayed.
Batch submit
Batch payments takeidempotencyKey as a body field, and the mechanism is different:
the key deterministically derives the batchId and every batchItemId, so a retry
overwrites the same records rather than creating new ones, and the queue de-duplicates
identical items within a 5-minute window. You do not get a replayed response or a
409 — retry promptly and within that window for the guarantee to hold. Without a key
the ids are random and the call is at-most-once with no retry safety.
Card issuing takes a key too; see Card operations, which
also covers the one endpoint where a key does not make a retry safe.
For oversight across customers — searches and exports — see
Search. The batch endpoints have
interactive Try it pages under Batch payments
in the API Reference.