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[](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