The Business API lets you use the /pay endpoint to make transfers to bank accounts or similar accounts.
You can use it, for example, to make payments to counterparties or to send money to your external accounts.
This tutorial walks you through the steps of making a payment to a counterparty.
- To send money to a credit or debit card, see Card transfers.
- To send money without knowing the banking details of the recipient, see Payout links.
- To prepare payments for approval, schedule them for later, or send them in bulk, see Payment drafts.
Bank transfer flow
An incoming or outgoing payment is represented as a transaction. A transaction is processed in two stages:
-
A transaction is created.
-
The transaction is processed in either of the following ways:
-
Credit/debit on both sides of the transaction made between Revolut accounts.
Transfers between Revolut accounts (either business or personal) execute instantly.
-
Posted to an external payment network, for example, Faster Payments, SEPA, SWIFT, etc.
If the transfer is made to an external payment network, when the transaction is created, the payment is in the
pendingstate. The state changes when the transaction is processed. -
Processed transaction states
When the transaction is processed, it has one of the following states:
completedfailedreverteddeclined
For more information about the transaction states, see the state response parameter in Business API: Create a transfer to another account or card.
See also how to validate an account name (CoP) when making a payment to a counterparty (UK only).
Check transfer field requirements
This feature is not available in Sandbox.
When to check field requirements
Depending on the source account, destination corridor, and business profile, certain fields in the /pay request — such as transfer_reason_code, charge_bearer, or exchange_reason_code — become required or applicable.
Use the /pay/fields endpoint to dynamically discover these contextual fields before making a transfer.
This is especially useful for high-volume or multi-corridor payout systems where the required fields vary across destinations.
A destination corridor is a specific combination of bank country and currency representing a supported payment destination (e.g. GBP to GB, USD to US).
Check field requirements
Send a POST request to the /pay/fields endpoint providing the following details:
- Account ID: The ID of the account from which the transfer will be made.
- Counterparty ID: The ID of the counterparty.
- If the counterparty has multiple accounts, you must also specify the ID of the account to which you want to transfer the money.
The response contains a fields array where each item describes a conditionally required or applicable field:
- Name: The field name, matching the
/payendpoint request body (e.g.reference,transfer_reason_code). - Required: Whether the field must be provided for this transfer.
- Validation: Validation rules such as
min_length,max_length, andregexconstraints. - Options: Allowed values for the field, if applicable. Each option has a
valueand an optionaldefaultflag.
Fields with options must use one of the listed values when provided to the /pay endpoint. Fields with validation must satisfy the specified constraints (e.g. character length, regex pattern).
Response examples
SWIFT payment — charge_bearer is applicable with options shared and debtor (default: shared), and reference has a maximum length of 100 characters:
{
"fields": [
{
"name": "reference",
"required": false,
"validation": {
"max_length": 100,
"regex": {
"pattern": "^.{1,100}$",
"description": "Up to 100 characters"
}
}
},
{
"name": "charge_bearer",
"required": false,
"options": [
{ "value": "shared", "default": true },
{ "value": "debtor" }
]
}
]
}INR payment — transfer_reason_code is required and provides a list of allowed values (expenses, salary, services):
{
"fields": [
{
"name": "reference",
"required": false,
"validation": {
"max_length": 100,
"regex": {
"pattern": "^.{1,100}$",
"description": "Up to 100 characters"
}
}
},
{
"name": "transfer_reason_code",
"required": true,
"options": [
{ "value": "expenses" },
{ "value": "salary" },
{ "value": "services" }
]
}
]
}Universally required fields (amount, account_id, receiver, and request_id) are always required when calling the /pay endpoint and are intentionally excluded from the response.
See the API reference: Check transfer field requirements
Check costs and delivery time before paying
Before executing a transfer, you can optionally request an indicative quote to see the expected fees, exchange rate, and processing time without committing to the transfer.
This is especially useful for international transfers or high-volume payment operations where understanding costs upfront helps you make informed decisions.
To get an indicative quote, use the POST /pay/indicative-quote endpoint with the same details you would provide for a transfer (account ID, recipient, amount, currency), but without creating a transaction.
In Sandbox, this feature is only available for testing.
While incomplete or invalid requests will return production-like error responses, complete and valid requests in Sandbox do not return real values and estimated_arrival will always return instant.
See the API reference: Get an indicative quote
Make a payment
To pay a counterparty, make a transfer using the /pay endpoint providing the following details:
-
Request ID: An ID for the transaction, used for idempotency to prevent duplicate requests from being processed. UUID is recommended.
Always provide a unique request ID for each individual payment. This allows you to safely retry the payment in the event of any network issues; if the payment was successful, a second attempt with the same request ID won't be processed.
-
Account ID: The ID of your own account from which you want to make the transfer.
-
Recipient's counterparty ID: The ID of the counterparty that you previously created.
If the counterparty has multiple payment methods available, for example, 2 accounts, or 1 account and 1 card, you must also specify the ID of the account to which you want to transfer the money.
You can look up your counterparty's ID and account ID by retrieving a list of your counterparties filtered by the counterparty's name.
-
Amount: The amount of money that you want to send.
-
Currency: The currency in which you want to make the transfer.
-
Reference: A short message which helps both you and the recipient to identify the payment. You can use it to include an invoice number, account or transaction ID, or any other reference meaningful to you.
-
Charge bearer: With this parameter, you can indicate whether transactions fees, if applicable, should be split between the sender and recipient (
shared) or charged to you as the sender in full (debtor). Some transactions might not be possible with the selected option.
In some cases, you might also need to provide the reason for the transfer and/or the reason for the exchange of funds, if such is involved in the transaction.
If the payment is processed instantly, the response includes its completed_at date.
If it is processed asynchronously, this date is not returned in the response.
To see example requests and responses:
See the API reference: Create a transfer to another account or card
Transfer reason code
Depending on the recipient's country and currency, for certain transactions, it might be required to provide the reason for sending the payment (transfer_reason_code).
To get all transfer reasons available to your business account per country and currency, use the /transfer-reasons endpoint.
See the API reference: Get transfer reasons
Exchange reason code
Depending on the country and amount, for certain transactions which involve foreign exchange, you might also be required to provide the reason for the exchange (exchange_reason_code).
To get the list of exchange reasons available for your business, use the /exchange-reasons endpoint.
See the API reference: Get exchange reasons
What's next
Now that you've made your transaction, learn how to:
- Retrieve your transaction data and check its details
- Map transaction data to a related transaction or card
- Prepare and validate a transfer: full workflow