Sandbox
Help

Send money via bank transfer

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:

  1. A transaction is created.

  2. 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 pending state. The state changes when the transaction is processed.

Processed transaction states

When the transaction is processed, it has one of the following states:

  • completed
  • failed
  • reverted
  • declined

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 /pay endpoint 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, and regex constraints.
  • Options: Allowed values for the field, if applicable. Each option has a value and an optional default flag.

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 paymentcharge_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 paymenttransfer_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" }
      ]
    }
  ]
}
Always required fields are omitted

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.

Sandbox behaviour

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:

Rate this page