Revolut Transfers API

Move funds in the same currency between accounts of your business, or make payments to your counterparties. For more details, see the guides: [Send money](https://developer.revolut.com/docs/guides/manage-accounts/transfers/send-money).

OpenAPI Specification

revolut-transfers-api-openapi.yml Raw ↑
openapi: 3.0.1
info:
  version: '1.0'
  title: Business Accounting Transfers API
  description: "As a Revolut Business customer with a Business Account, you can use the Business API to automate your own business processes.\nSave time, reduce your costs, and avoid errors by using the Business API. \n\n:::tip[Before you get started]\nTo learn more about the Business API and its features, check the [**user guides**](https://developer.revolut.com/docs/guides/manage-accounts/introduction).\n\nYou can reach them at any time from the main navigation bar **→ Guides → Business**.\n:::\n\nYou can view accounts, manage counterparties, make payments or currency exchanges without manual effort in the Web UI:\n\n- Accounting: [Account management](https://developer.revolut.com/docs/api/business#get-account), [Accounting settings](https://developer.revolut.com/docs/api/business#tag-accounting), [Expense management](https://developer.revolut.com/docs/api/business#get-expense), [Transactions](https://developer.revolut.com/docs/api/business#get-transactions) \n- Payments: \n  - [Counterparty management](https://developer.revolut.com/docs/api/business#get-counterparties)\n  - Payment management: [Payment drafts](https://developer.revolut.com/docs/api/business#delete-payment-draft), [Payout links](https://developer.revolut.com/docs/api/business#get-payout-link), [Transfers](https://developer.revolut.com/docs/api/business#tag-transfers)\n  - [Foreign exchange](https://developer.revolut.com/docs/api/business#tag-foreign-exchange)\n- Business team: [Card management](https://developer.revolut.com/docs/api/business#delete-card), [Card invitation management](https://developer.revolut.com/docs/api/business#update-card-invitation), [Team member management](https://developer.revolut.com/docs/api/business#delete-team-member)\n- Developer tools: [Sandbox simulations](https://developer.revolut.com/docs/api/business#tag-simulations), [Webhook management](https://developer.revolut.com/docs/api/business#tag-webhooks-v2)\n\nTo see the reference for the specific endpoints and operations of this API, browse the menu on the left.\n\n### Test the Business API\n\nYou can test the Business API in Postman by forking this collection:\n\n[![View in Postman](https://run.pstmn.io/button.svg)](https://www.postman.com/revolut-api/workspace/revolut-developers/overview)"
  contact: {}
servers:
- url: https://b2b.revolut.com/api/1.0
  description: Production server (uses live data)
- url: https://sandbox-b2b.revolut.com/api/1.0
  description: Sandbox server (uses test data)
tags:
- name: Transfers
  description: 'Move funds in the same currency between accounts of your business, or make payments to your counterparties.


    For more details, see the guides: [Send money](https://developer.revolut.com/docs/guides/manage-accounts/transfers/send-money).'
paths:
  /exchange-reasons:
    get:
      summary: Get exchange reasons
      description: "Depending on the country and the amount of funds to be exchanged, you might be required to provide an exchange reason. \nWith this endpoint, you can retrieve all exchange reasons available to your business account.\n\nAfter you retrieve the results, use the appropriate reason code in the `exchange_reason_code` field when [exchanging money](https://developer.revolut.com/docs/api/business#exchange-money) or [making a payment](https://developer.revolut.com/docs/api/business#create-payment) that involves foreign currency exchange."
      operationId: getExchangeReasons
      security:
      - AccessToken:
        - READ
      tags:
      - Transfers
      responses:
        '200':
          description: List of exchange reasons
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExchangeReasons'
              example:
              - code: business_expense_and_claims
                name: Business expense and claims
              - code: fees_and_charges
                name: Fees and charges
              - code: fund_transfer_and_intracompany_payment
                name: Fund transfer and intracompany payment
              - code: gifts_and_donations
                name: Gifts and donations
              - code: government_services_and_tax
                name: Government services and tax
              - code: insurance
                name: Insurance
              - code: inventory
                name: Inventory
              - code: investment_dividend_and_interest
                name: Investment, dividend and interest
              - code: loan_and_loan_repayment
                name: Loan and loan repayment
              - code: marketing
                name: Marketing
              - code: payment_for_goods_and_services
                name: Payment for goods and services
              - code: payroll
                name: Payroll
              - code: refund
                name: Refund
              - code: rental_and_property
                name: Rental and property
              - code: sales
                name: Sales
              - code: service_provider_and_software
                name: Service provider and software
              - code: travel_and_transportation
                name: Travel and transportation
              - code: utilities
                name: Utilities
        default:
          description: Unexpected error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /pay:
    post:
      summary: Create a transfer to another account or card
      operationId: createPayment
      description: 'Make a payment to a counterparty. You can choose either a bank transfer or a card transfer. The resulting transaction has the type `transfer`.


        If you make the payment to another Revolut account, either business or personal, the transaction is executed instantly.


        If the counterparty has multiple payment methods available, for example, 2 accounts, or 1 account and 1 card, you **must specify the account or card** to which you want to transfer the money (`receiver.account_id` or `receiver.card_id` respectively).


        For more details, see the guides: [Send money via bank transfer](https://developer.revolut.com/docs/guides/manage-accounts/transfers/bank-transfers) and [Card transfers](https://developer.revolut.com/docs/guides/manage-accounts/transfers/card-transfers).'
      security:
      - AccessToken:
        - READ
        - PAY
      requestBody:
        description: Create a transfer
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TransactionPaymentRequest'
            examples:
              generic_transfer:
                summary: Bank transfer
                value:
                  request_id: A1pH4num3ric
                  account_id: af98333c-ea53-482b-93c2-1fa5e4eae671
                  receiver:
                    counterparty_id: 49c6a48b-6b58-40a0-b974-0b8c4888c8a7
                    account_id: 9116f03a-c074-4585-b261-18a706b3768b
                  amount: 10
                  charge_bearer: shared
                  currency: EUR
                  reference: To John Doe
              transfer_to_card_p2c:
                summary: Card transfer
                value:
                  request_id: A1pH4num3ric
                  account_id: af98333c-ea53-482b-93c2-1fa5e4eae671
                  receiver:
                    counterparty_id: 1099791d-8980-401f-8417-b9d66eeb6d93
                  amount: 15
                  currency: EUR
                  reference: To John Doe
              transfer_with_reason_code:
                summary: Transfer with reason code
                value:
                  request_id: A1pH4num3ric
                  account_id: f2efd687-1084-45a6-ace6-8abc1352f0d3
                  receiver:
                    counterparty_id: 03153735-d49c-4f8b-ac42-1fe40aeb4167
                    account_id: 8b9eff51-2bd1-4ce2-9974-b87385092e3e
                  amount: 2500
                  currency: INR
                  charge_bearer: shared
                  reference: To John Doe
                  transfer_reason_code: advertising
      responses:
        '200':
          description: The information about the created transfer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransferResponse'
              examples:
                pending:
                  summary: Pending transfer
                  value:
                    id: 630f9a62-e488-a9ce-a2d3-a30kkkke03f0
                    state: pending
                    created_at: '2022-08-31T17:29:06.625613Z'
                completed:
                  summary: Completed transfer
                  value:
                    id: 630f9a62-e488-a9ce-a2d3-a30kkkke03f0
                    state: completed
                    created_at: '2022-08-31T17:29:06.625613Z'
                    completed_at: '2022-09-01T17:29:06.625613Z'
        '400':
          description: 'Bad request


            For example:

            - a duplicate `request_id` is being used

            - the specified `charge_bearer` is not supported

            - the exchange reason is required and `exchange_reason_code` is missing

            - the transfer reason is required and `transfer_reason_code` is missing'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                duplicate_request:
                  summary: Duplicate request_id
                  value:
                    code: 3020
                    message: 'Duplicate request: 1f0f3850-9627-42de-8ad4-a2c497c37d0b'
                unsupported_charge_bearer:
                  summary: Unsupported charge_bearer
                  value:
                    code: 3287
                    message: Specified 'charge_bearer' is not supported for this transaction.
                missing_exchange_reason_code:
                  summary: Missing exchange_reason_code
                  value:
                    code: 3448
                    message: Exchange reason is required
                missing_transfer_reason_code:
                  summary: Missing transfer_reason_code
                  value:
                    code: 4100
                    message: Please provide a reason for the transaction.
        default:
          description: Unexpected error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      tags:
      - Transfers
  /pay/indicative-quote:
    post:
      summary: Get an indicative quote for a transfer
      operationId: getIndicativeQuote
      description: 'Get a non-binding estimate of fees, the exchange rate, and the expected delivery time for a potential [transfer](https://developer.revolut.com/docs/api/business#create-payment).

        No money is moved and no resource is created.


        The request mirrors the [`/pay` endpoint](https://developer.revolut.com/docs/api/business#create-payment) that is used to initiate a transfer, but it excludes irrelevant fields that do not affect pricing or delivery time, such as the request ID or reference.


        If the counterparty has multiple payment methods available, for example, 2 accounts, or 1 account and 1 card, you **must specify the account or card** to which you want to transfer the money (`receiver.account_id` or `receiver.card_id` respectively).

        Note that in a single request, you can specify either an account or a card, but not both.


        :::note[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`.

        :::


        For more details, see the guides: **Check costs and delivery time before paying** section in [Bank transfers](https://developer.revolut.com/docs/guides/manage-accounts/transfers/bank-transfers#check-costs-and-delivery-time-before-paying) or [Card transfers](https://developer.revolut.com/docs/guides/manage-accounts/transfers/card-transfers#check-costs-and-delivery-time-before-paying).'
      security:
      - AccessToken:
        - READ
        - PAY
      requestBody:
        description: Request an indicative quote
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/IndicativeQuoteRequest'
            examples:
              cross_currency_swift:
                summary: Cross-currency SWIFT payment
                value:
                  account_id: a1b2c3d4-e5f6-7890-abcd-ef1234567890
                  receiver:
                    counterparty_id: f7e6d5c4-b3a2-1098-7654-321fedcba098
                    account_id: 12345678-90ab-cdef-1234-567890abcdef
                  amount: 100.5
                  currency: EUR
                  charge_bearer: shared
              same_currency_internal:
                summary: Same-currency internal transfer
                value:
                  account_id: a1b2c3d4-e5f6-7890-abcd-ef1234567890
                  receiver:
                    counterparty_id: f7e6d5c4-b3a2-1098-7654-321fedcba098
                    account_id: 87654321-abcd-ef01-2345-678901234567
                  amount: 25
                  currency: GBP
      responses:
        '200':
          description: The expected processing attributes for the potential transfer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IndicativeQuoteResponse'
              examples:
                cross_currency_swift:
                  summary: Cross-currency SWIFT payment with fees and exchange rate
                  value:
                    amount:
                      amount: 100.5
                      currency: EUR
                    fee:
                      amount: 20
                      currency: GBP
                      breakdown:
                        transfer_fee:
                          amount: 20
                          currency: GBP
                    estimated_total:
                      amount: 106.3
                      currency: GBP
                    estimated_exchange_rate: '1.16458'
                    estimated_amount_after_exchange:
                      amount: 86.3
                      currency: GBP
                    estimated_arrival:
                      date: '2026-05-14'
                      speed: instant
                same_currency_internal:
                  summary: Same-currency internal transfer - instant with no fees
                  value:
                    amount:
                      amount: 25
                      currency: GBP
                    fee:
                      amount: 0
                      currency: GBP
                    estimated_total:
                      amount: 25
                      currency: GBP
                    estimated_arrival:
                      date: '2026-05-14'
                      speed: instant
                fx_transfer_fees:
                  summary: FX transfer with transfer and exchange fee
                  value:
                    amount:
                      amount: 100.5
                      currency: EUR
                    fee:
                      amount: 5.75
                      currency: GBP
                      breakdown:
                        transfer_fee:
                          amount: 3
                          currency: GBP
                        exchange_fee:
                          amount: 2.75
                          currency: GBP
                    estimated_total:
                      amount: 92.05
                      currency: GBP
                    estimated_exchange_rate: '1.16458'
                    estimated_amount_after_exchange:
                      amount: 86.3
                      currency: GBP
                    estimated_arrival:
                      date: '2026-05-14'
                      speed: instant
                volatile_fx_rate:
                  summary: Volatile FX rate warning
                  value:
                    amount:
                      amount: 100.5
                      currency: EUR
                    fee:
                      amount: 5.75
                      currency: GBP
                      breakdown:
                        transfer_fee:
                          amount: 3
                          currency: GBP
                        exchange_fee:
                          amount: 2.75
                          currency: GBP
                    estimated_total:
                      amount: 92.05
                      currency: GBP
                    estimated_exchange_rate: '1.16458'
                    estimated_amount_after_exchange:
                      amount: 86.3
                      currency: GBP
                    estimated_arrival:
                      date: '2026-05-14'
                      speed: instant
                    warnings:
                    - volatile_fx_rate
        '400':
          description: 'Bad request


            For example:

            - the request is invalid (e.g. malformed body, validation failure)

            - both `account_id` and `card_id` are provided in `receiver` (only one of these values can be provided in a single request)

            - the specified `charge_bearer` is not supported

            - `exchange_reason_code` is required for such a transfer but was not provided in the request

            - the specified counterparty, account, or card was not found'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorWithId'
              examples:
                invalid_request:
                  summary: Invalid request (malformed body, validation failure)
                  value:
                    error_id: 3bfe9326-87eb-a849-9e35-150de29664dd
                    code: 2101
                    message: Request body is not valid JSON
                missing_counterparty:
                  summary: Missing receiver.counterparty_id
                  value:
                    error_id: 6fa7dcdd-bdd3-43d6-bffa-423452083501
                    code: 2101
                    message: '''receiver.counterparty_id'' is required'
                missing_account_or_card:
                  summary: Missing receiver.account_id or receiver.card_id when multiple options available for counterparty
                  value:
                    error_id: 510bea31-df11-4229-84ae-35a9a0dba020
                    code: 2101
                    message: '''receiver.account_id'' or ''receiver.card_id'' is missing'
                invalid_charge_bearer:
                  summary: Invalid charge_bearer
                  value:
                    error_id: f2bb54d3-8e8d-49ae-a3db-178afebc9da3
                    code: 2101
                    message: '''charge_bearer'' must be one of: shared, debtor'
                multiple_receiver_methods:
                  summary: Both account_id and card_id provided
                  value:
                    error_id: c5698032-4ca2-446b-b43a-e278e21ac100
                    code: 2101
                    message: Both 'account_id' and 'card_id' can't be provided
                currency_mismatch:
                  summary: Mismatched currency
                  value:
                    error_id: ea1fc5c9-d0cb-4614-a19c-71c9ce4e2e72
                    code: 3187
                    message: The payment currency does not match the counterparty's account currency
                unsupported_charge_bearer:
                  summary: Unsupported charge_bearer
                  value:
                    error_id: c4e93983-4bcf-4bbc-88de-171be6811d35
                    code: 3287
                    message: Specified 'charge_bearer' is not supported for this transaction.
                missing_exchange_reason_code:
                  summary: Missing exchange_reason_code
                  value:
                    error_id: 6e8365f6-560f-469c-9561-07d024fad9c5
                    code: 3448
                    message: exchange_reason_code is required for this transfer
                counterparty_not_found:
                  summary: Invalid recipient - the specified counterparty was not found
                  value:
                    error_id: 7300ed0a-bfed-4b47-b46e-6d55c9aa398c
                    code: 3544
                    message: Counterparty not found f7e6d5c4-b3a2-1098-7654-321fedcba098
                account_not_found:
                  summary: Invalid recipient - the account specified for the counterparty was not found
                  value:
                    error_id: ab3d5761-4b97-42dc-b4a4-8c2b010836e7
                    code: 3544
                    message: Account not found for counterparty f7e6d5c4-b3a2-1098-7654-321fedcba098
                card_not_found:
                  summary: Invalid recipient - the card specified for the counterparty was not found
                  value:
                    error_id: d89d4df4-e461-47e0-90d8-a79fefcf9e18
                    code: 3544
                    message: Card not found for counterparty f7e6d5c4-b3a2-1098-7654-321fedcba098
        default:
          description: Unexpected error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorWithId'
      tags:
      - Transfers
  /pay/fields:
    post:
      summary: Check transfer field requirements
      operationId: getPaymentRequirements
      description: 'Retrieve the list of conditionally required or applicable fields for a specific transfer destination together with their constraints.


        :::note [Note]

        This feature is not available in Sandbox.

        :::


        When creating a payment via the [`/pay` endpoint](https://developer.revolut.com/docs/api/business#create-payment), certain fields (such as `transfer_reason_code`, `charge_bearer`, or `exchange_reason_code`) become required or applicable depending on the source account, destination corridor, and business profile.

        This read-only endpoint allows you to discover these contextual fields dynamically, along with their validation rules and available options.


        :::tip

        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).

        :::


        Only the fields relevant to the specific context are returned.

        Universally required fields (such as `amount`, `account_id`, `receiver`, and `request_id`) are always required and are intentionally excluded from this response.


        For more details, see the guides: **Check transfer field requirements** section in [Bank transfers](https://developer.revolut.com/docs/guides/manage-accounts/transfers/bank-transfers#check-transfer-field-requirements) or [Card transfers](https://developer.revolut.com/docs/guides/manage-accounts/transfers/card-transfers#check-transfer-field-requirements).'
      security:
      - AccessToken:
        - READ
        - PAY
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PaymentRequirementsRequest'
            examples:
              standard_request:
                summary: Standard requirements request
                value:
                  account_id: a1b2c3d4-e5f6-7890-abcd-ef1234567890
                  receiver:
                    counterparty_id: f7e6d5c4-b3a2-1098-7654-321fedcba098
                    account_id: 12345678-90ab-cdef-1234-567890abcdef
      responses:
        '200':
          description: The applicable and conditionally required fields for the specified transfer destination
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaymentRequirementsResponse'
              examples:
                swift_payment:
                  summary: SWIFT payment - charge bearer applicable, reference required
                  value:
                    fields:
                    - name: reference
                      required: true
                      validation:
                        max_length: 140
                    - name: charge_bearer
                      required: false
                      options:
                      - value: shared
                        default: true
                      - value: debtor
                inr_payment:
                  summary: INR payment - transfer reason required, reference capped at 30 characters
                  value:
                    fields:
                    - name: reference
                      required: true
                      validation:
                        max_length: 30
                    - name: transfer_reason_code
                      required: true
                      options:
                      - value: advertising
                      - value: advisor_fees
                      - value: construction
                      - value: exports
                      - value: goods
                      - value: insurance_claims
                      - value: other_fees
                      - value: personal_transfer
                      - value: property_rental
                      - value: royalties
                      - value: services
                      - value: travel
                swiss_qr_payment:
                  summary: Swiss QR payment - strict reference validation with regex
                  value:
                    fields:
                    - name: reference
                      required: true
                      validation:
                        min_length: 27
                        max_length: 27
                        regex:
                          pattern: \d{27}
                          description: Value should be numbers only
                    - name: charge_bearer
                      required: false
                      options:
                      - value: shared
                      - value: debtor
                        default: true
        '400':
          description: 'Bad request


            For example:

            - the request is invalid (e.g. malformed body, validation failure)

            - both `account_id` and `card_id` are provided in `receiver` (only one of these values can be provided in a single request)'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                invalid_request:
                  summary: Invalid request
                  value:
                    code: 2101
                    message: Invalid request (malformed body, validation failure)
                multiple_receiver_methods:
                  summary: Both account_id and card_id provided
                  value:
                    code: 3000
                    message: Both account_id and card_id provided in receiver
        '404':
          description: 'Not found


            Returned when the specified counterparty, account, or card was not found.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                counterparty_not_found:
                  summary: Counterparty, account, or card not found
                  value:
                    code: 3006
                    message: The specified counterparty, account, or card was not found
        default:
          description: Unexpected error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      tags:
      - Transfers
  /transfer:
    post:
      summary: Move money between your accounts
      operationId: createTransfer
      description: 'Move money between the Revolut accounts of the business in the same currency.


        The resulting transaction has the type `transfer`.


        For more information, see the guides: [Send money](https://developer.revolut.com/docs/guides/manage-accounts/transfers/send-money).'
      security:
      - AccessToken:
        - READ
        - PAY
      requestBody:
        description: Create a transfer
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TransferRequest'
            example:
              request_id: '129999'
              source_account_id: 2e6de1bf-97ad-478d-aad1-9d7a3cdf1234
              target_account_id: ae2e1241-81dd-498d-868e-075484785678
              amount: 10
              currency: GBP
              reference: John's transfer
      responses:
        '200':
          description: The information about the transfer created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransferResponse'
              example:
                id: 630f95f7-a3f9-abf2-b4e4-3f65281234dc
                state: completed
                created_at: '2020-11-23T08:39:35.811005Z'
                completed_at: '2020-11-23T08:39:35.811005Z'
        default:
          description: Unexpected error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      tags:
      - Transfers
  /transfer-reasons:
    get:
      summary: Get transfer reasons
      description: "In order to initiate a transfer in certain currencies and countries, you must provide a transfer reason. \nWith this endpoint you can retrieve all transfer reasons available to your business account per country and currency.\n\nAfter you retrieve the results, use the appropriate reason code in the `transfer_reason_code` field when [making a transfer to a counterparty](https://developer.revolut.com/docs/api/business#create-payment) or [creating a payout link](https://developer.revolut.com/docs/api/business#create-payout-link)."
      operationId: getTransferReasons
      security:
      - AccessToken:
        - READ
      tags:
      - Transfers
      responses:
        '200':
          description: List of transfer reasons
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransferReasons'
              example:
              - country: IN
                currency: INR
                code: advertising
                description: Advertising
              - country: IN
                currency: INR
                code: advisor_fees
                description: Advisor fees
              - country: IN
                currency: INR
                code: construction
                description: Construction
              - country: IN
                currency: INR
                code: delivery
                description: Delivery
        default:
          description: Unexpected error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    ErrorWithId:
      required:
      - code
      - message
      - error_id
      type: object
      properties:
        error_id:
          type: string
          description: The ID of the specific error instance. Used for traceability.
        code:
          type: integer
          description: The error code.
        message:
          type: string
          description: The description of the error.
    TransactionState:
      enum:
      - created
      - pending
      - completed
      - declined
      - failed
      - reverted
      description: "Indicates the transaction state. Possible values:\n  - `created`: The transaction has been created and is either processed asynchronously or scheduled for a later time.\n  - `pending`: The transaction is pending until it's being processed. If the transfer is made between Revolut accounts, this state is skipped and the transaction is executed instantly.\n  - `completed`: The transaction was successful.\n  - `declined`: The transaction was unsuccessful. This can happen for a variety of reasons, for example, insufficien

# --- truncated at 32 KB (54 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/revolut/refs/heads/main/openapi/revolut-transfers-api-openapi.yml