Approve Payment Requests and Pay

Approves payment requests and raises their payments into a batch.

It answers with the payments it created. The decision is recorded, the batch is settled and
one payment per payee is raised before the response is written, so a payment named in results
is a payment that exists.

One payment per payee, not per request. Several requests approved for one payee are one
deposit and come back sharing a paymentId, which is why createdCount counts requests and
createdPaymentCount counts payments. Reading the first and calling it a number of payments
overstates what happened.

A 200 does not mean every request was paid. Two paths finish outside the call — a failure
worth retrying, and an approval that outran its budget — and those rows answer with
reservedPaymentId and no paymentId. For them the payment is genuinely only coming.

Approving twice converges. An already-approved request is accepted here, including one whose
payment is in flight or was refused: the reserved id makes the second call land on the same
payment rather than raise another. A repeated call does not pay twice.

The batch is all-or-nothing. A 4xx for the batch means no payment was raised for any request
in the call.

Errors

  • 400 INVALID_REQUEST_IDS: requestIds is missing, empty, over 50, or holds duplicates
  • 400 INVALID_LEDGER_ACCOUNT: ledgerAccount is missing or blank
  • 400 INVALID_BATCH: batch names both an existing batch and a new one, or neither
  • 400 INVALID_AMOUNT_OVERRIDE: amountOverride is not money, or arrived without fundingCurrencyCode
  • 400 INVALID_SEND_IMMEDIATELY: sendImmediately is not a boolean
  • 400 BATCH_CREATION_FAILED: the batch could not be created
  • 404: the batch named does not exist
  • 423 NOT_EDITABLE: the batch is archived, or a request named is in a state no payment can be raised from
Recent Requests
Log in to see full request history
TimeStatusUser Agent
Retrieving recent requests…
LoadingLoading…
Body Params
requestIds
array of strings
required

The requests to approve. 1–50, no duplicates.

A collection rather than one call per request: one decision covers the rows the payor ticked,
and approving one request is this call with one id.

Ids are opaque strings. Do not parse them. A request created since 2026-09-30 is PR-
followed by a ULID; older requests are a bare ULID and were deliberately not migrated, because
the id is half the table's key. Treat both as strings you were given, and never require the
prefix, strip it, or read a timestamp back out of either shape.

requestIds*
object
required

The batch the payments go into. Send batchId for a batch you already have, or the fields to
create one — never both, and never neither.

string
required

The payor ledger account the money leaves from.

The same account you name as ledgerAccount when creating payments on a batch directly.

boolean
Defaults to false

Send the payments as they are created, instead of leaving them in the batch to submit later.

number

One amount for the whole approval, in fundingCurrencyCode, as a decimal in the major unit —
95.4 is ninety-five point four, not ninety-five cents.

For the case where the request is stated in a currency the chosen ledger account does not hold
and you are saying what leaves the account. It travels with fundingCurrencyCode or not at
all: a figure with no currency named is refused.

string

The currency amountOverride is in, ISO 4217, and the currency the payments are raised in.

It is not a guard. The payments service compares it against the ledger account's own currency
and REFUSES a mismatch rather than converting, so it must be read off the account you named.

string

Your own note on the payment. Omit it rather than sending an empty string

string

The note the payee reads beside the payment.

Omit it rather than sending an empty string: with none, a memo is derived from the request's
own memo, its title, or the batch name for a payment settling several. An empty string
replaces that with nothing.

Responses

Language
Credentials
Bearer
JWT
URL
LoadingLoading…
Response
Click Try It! to start a request and see the response here! Or choose an example:
application/json