Skip to main content
POST
Rolla Transfer
Send funds to another Rolla business instantly and fee-free. You can identify the recipient by their registered email address, Rolla tag, or a saved beneficiaryId with withdrawal_method: rolla_transfer. The request amount is always in the smallest currency unit for currency (USD = cents — 100 = $1.00 USD; NGN = kobo).
Transferring from a specific merchant (tenant keys): if your API key is a white-label tenant key managing multiple merchants, add the X-Account-Id header set to the account ID you want to send from — the transfer is then debited from that account’s wallet. Without it, it runs against your own (parent) account. This is how you move funds between your institutional account and merchant wallets.

Example Request (by email)

Example Request (by saved beneficiary)

Example Request (cross-currency)

Cross-currency transfers require a rateToken from the GET /wallet/rates endpoint first.

Example Response

The amount you send uses the smallest unit of currency (USD = cents below). Ledger fields such as source_amount mirror that unit.
Both legs share one transfer_reference; each transaction’s own external_reference is that reference suffixed with -DEBIT on the sender side and -CREDIT on the recipient side. On a cross-currency transfer the sender leg’s transaction_type is fx_withdrawal rather than withdrawal, and its destination_amount / destination_currency are the converted amount in the recipient’s currency.

Key Behaviours

Free transfers — Rolla-to-Rolla transfers have zero fees.
Payer on the receiving side — recipient_transaction, and every webhook for it, carries payer with the sending account’s name and bank_name: "Rolla", so the recipient can see who the funds came from. The sender’s email is never included.
pending_claim — If the recipient email matches multiple Rolla businesses, funds are held in escrow and a pending_claim object is returned. The recipient must log in and claim the funds.
IP whitelisting — This endpoint requires your API key to have IP whitelisting configured, or the request must originate from a whitelisted IP.

Parameters

Attaching your own metadata

Pass a metadata object to carry your own identifiers on the transfer — an order id, an invoice number, or, when you forward funds received from a customer, who originally paid. Rolla stores it verbatim, never interprets it, and returns it unchanged on the transaction and every webhook for it.
Which side carries it. metadata is always returned on the sending side (sender_transaction). It is also returned on the receiving side (recipient_transaction) when both accounts belong to the same owner — for example a merchant account forwarding funds to your institutional account. A transfer to another company’s account never shows them your metadata. Limits are the same as for payouts: at most 20 keys, keys up to 64 characters, values that are a string (up to 500 characters), number, boolean or null — no nested objects or arrays. Exceeding any of them returns 400 and the transfer is not made.
Metadata is returned to anyone who can read the transaction and is sent to your webhook endpoints. Don’t put secrets or personal data in it that you wouldn’t want echoed back.

Authorizations

X-API-Key
string
header
required

Your Rolla API key

Body

application/json

Either recipient or beneficiaryId is required.

amount
number
required

Amount in the smallest currency unit for the given currency (e.g. kobo for NGN, cents for USD — 100 cents = $1.00 USD). Must be a whole number and at least 1.

Required range: x >= 1
Example:

100

currency
string
required

Source currency code

Required string length: 3 - 4
Example:

"USD"

destinationCurrency
string
required

Recipient currency code. Differ it from currency for a cross-currency transfer.

Required string length: 3 - 4
Example:

"USD"

recipient
string

Recipient email or Rolla tag. Required if beneficiaryId not provided.

Example:

"partner@example.com"

beneficiaryId
string<uuid>

Saved beneficiary ID with withdrawal_method rolla_transfer. Required if recipient not provided.

description
string

Transfer description. Defaults to "In-network transfer" when omitted or blank.

Maximum string length: 500
Example:

"Invoice payment"

saveBeneficiary
boolean

Auto-save the recipient as a beneficiary for future transfers

rateToken
string

Required when destinationCurrency differs from currency. Obtain from GET /wallet/rates.

metadata
object

Your own key/value data, stored on the transfer and returned on the transaction and its webhooks. Always returned on the sending side; returned on the receiving side only when both accounts belong to the same owner. At most 20 keys (up to 64 characters each); values are a string (up to 500 characters), number, boolean or null — no nested objects or arrays.

Example:

Response

Transfer initiated successfully

status
integer
Example:

200

message
string
Example:

"Transfer initiated successfully"

success
boolean
Example:

true

data
object