Business API (1.0)
As a Revolut Business customer, you can use the Business API to automate your own business processes. Save time, reduce your costs, and avoid errors by using the Business API.
You can view accounts, manage counterparties, make payments or currency exchanges without manual effort in the Web UI.
To get started using the Business API, check the user guide.
You can test the Business API in Postman:
AccessToken
Each Business API request must contain an authorization header in the following format to make a call: Bearer <yourAccessToken>
.
The access token will be obtained the first time you set up your application and has an expiration of 40 minutes.
During setup, a refresh_token
will also be obtained which allows to obtain a new access_token
.
Access tokens can be issued with three security scopes and require a JWT (JSON Web Token) signature to be obtained:
READ
: Permissions forGET
operations.WRITE
: Permissions to update counterparties, webhooks, and issue payment drafts.PAY
: Permissions to initiate or cancel transactions and currency exchanges.
In order to configure your JWT, and obtain the refresh and first access tokens, complete the following steps:
bearer
Response samples
- 200
- default
[- {
- "id": "b7ec67d3-5af1-42c8-bece-3d28nlmo894d",
- "name": "International account",
- "balance": 3171.89,
- "currency": "GBP",
- "state": "active",
- "public": false,
- "created_at": "2022-08-05T14:29:22.215785Z",
- "updated_at": "2022-08-05T14:29:22.215785Z"
}, - {
- "id": "bssc67d3-5afd-42c2-bece-3d28nlmo894d",
- "name": "International account 2",
- "balance": 411561.89,
- "currency": "EUR",
- "state": "active",
- "public": true,
- "created_at": "2022-08-25T14:29:22.215785Z",
- "updated_at": "2022-08-30T14:29:22.215785Z"
}
]
Retrieve an account
Get the information about a specific account by ID.
Authorizations:
path Parameters
account_id required | string <uuid> The ID of the account to retrieve. |
Responses
Response samples
- 200
- default
{- "id": "b7ec67d3-5af1-42c8-bece-3d28nlmo894d",
- "name": "International account",
- "balance": 3171.89,
- "currency": "GBP",
- "state": "active",
- "public": false,
- "created_at": "2022-08-05T14:29:22.215785Z",
- "updated_at": "2022-08-05T14:29:22.215785Z"
}
Retrieve all account's bank details
Get all the bank details of a specific account.
Authorizations:
path Parameters
account_id required | string <uuid> The ID of the account to retrieve all bank details. |
Responses
Response samples
- 200
- default
[- {
- "iban": "GB66REVO00996995908888",
- "bic": "REVOGB21",
- "beneficiary": "International account",
- "beneficiary_address": {
- "street_line1": "Revolut LTD",
- "street_line2": "1 Canada Square",
- "city": "London",
- "country": "GB",
- "postcode": "E14 5AB"
}, - "bank_country": "GB",
- "pooled": false,
- "schemes": [
- "swift"
], - "estimated_time": {
- "unit": "days",
- "min": 1,
- "max": 3
}
}
]
To make a fund transfer or payment, add the counterparty that you intend to transact with. You can then retrieve one or all counterparties, or delete a counterparty.
Request and response examples can vary based on the account provider's location and type of the counterparty. For more information, see: Tutorials: 1. Create a counterparty.
Note: In the Sandbox environment, you cannot add "real" people and businesses as Revolut counterparties. Therefore, to help you simulate Create a counterparty requests, we have created some test accounts:
- Personal counterparty (use the
mobile
field): +4412345678900, +4412345678901, +4412345678902, ... , +4412345678909
If you are on a freelancer account, to be compliant with PSD2 Strong Customer Authentication regulations, you must manually approve the counterparty with 2-factor authentication (2FA) on the Revolut Business Portal before you can make a payment. This can ensure maximum security in case of access token leakages and other fraudulent activities.
Retrieve all counterparties
Get a list of all your counterparties.
Authorizations:
Responses
Response samples
- 200
- default
[- {
- "id": "8e0e9886-0af1-4b0c-acf4-111180d2892b",
- "name": "John Smith",
- "phone": "+4412345678900",
- "profile_type": "personal",
- "country": "GB",
- "state": "created",
- "created_at": "2022-09-14T14:41:39.312017Z",
- "updated_at": "2022-09-14T14:41:39.312017Z"
}, - {
- "id": "b53fdd78-8d67-4f63-a103-eeeeef53cac8",
- "name": "John Smith Co.",
- "state": "created",
- "created_at": "2022-09-14T14:34:11.168340Z",
- "updated_at": "2022-09-14T14:34:11.168340Z",
- "accounts": [
- {
- "account_no": "12345678",
- "sort_code": "540105",
- "id": "5c9e171c-7e23-4d6a-b768-aaaaaba535f3",
- "type": "external",
- "name": "John Smith Co.",
- "bank_country": "GB",
- "currency": "GBP",
- "recipient_charges": "no"
}
]
}, - {
- "id": "239d6f1f-2222-4ae6-1111-5cc603341b4e",
- "name": "John Smith Co.",
- "state": "created",
- "created_at": "2022-09-14T14:47:12.273718Z",
- "updated_at": "2022-09-14T14:47:12.273718Z",
- "accounts": [
- {
- "iban": "GB66REVO00996995908786",
- "bic": "REVOGB21",
- "id": "b209281b-aakk-9911-8d83-ac72469cef8f",
- "type": "external",
- "name": "John Smith Co.",
- "bank_country": "GB",
- "currency": "EUR",
- "recipient_charges": "no"
}
]
}
]
Retrieve a counterparty
Get the information about a specific counterparty by ID.
Authorizations:
path Parameters
counterparty_id required | string <uuid> The ID of the counterparty to retrieve. |
Responses
Response samples
- 200
- default
{- "id": "8e0e9886-0af1-4b0c-acf4-111180d2892b",
- "name": "John Smith",
- "phone": "+4412345678900",
- "profile_type": "personal",
- "country": "GB",
- "state": "created",
- "created_at": "2022-09-14T14:41:39.312017Z",
- "updated_at": "2022-09-14T14:41:39.312017Z"
}
Delete a counterparty
Deletes a counterparty with the given ID. When a counterparty is deleted, you cannot make any payments to the counterparty.
Authorizations:
path Parameters
counterparty_id required | string <uuid> The ID of the counterparty to delete. |
Responses
Response samples
- 204
- default
{ }
Create a counterparty
Create a counterparty for an existing Revolut account or non-Revolut bank account. For more information, see: Tutorials: 1. Create a counterparty
A counterparty can be either a business
or a personal
counterparty, which you specify with profile_type
.
Authorizations:
Request Body schema: application/json
Counterparty to add
company_name | string The name of the company counterparty. Use when |
profile_type | string (ProfileType) Enum: "personal" "business" The type of the Revolut profile. Use when adding an existing Revolut user using a phone number. |
name | string The name of the counterparty that you create for an existing Revolut user using a phone number. Provide the value only when you specify |
object (IndividualName) The name of the individual counterparty. Use when | |
bank_country | string (BankCountryCode) ^[A-Z]{2,3}$ The country of the bank in 2-letter ISO code. |
currency | string (Currency) ^[A-Z]{3}$ ISO 4217 currency code in upper case. |
phone | string The phone number of the counterparty in E.164 format. Provide the value only when you specify |
account_no | string The bank account number of the counterparty. |
iban | string The IBAN number of the counterparty's account. This field is displayed for IBAN countries. |
sort_code | string The sort code of the counterparty's account. This field is required for GBP accounts. |
routing_number | string The routing number of the counterparty's account. This field is required for USD accounts. |
bic | string The BIC number of the counterparty's account. This field is required for SWIFT and SEPA. |
clabe | string The CLABE number of the counterparty's account. This field is required for SWIFT MX. |
ifsc | string The IFSC number of the counterparty's account. This field is required for INR accounts. |
bsb_code | string The BSB number of the counterparty's account. This field is required for AUD accounts. |
object (BeneficiaryAddress) The address of the counterparty. |
Responses
Request samples
- Payload
{- "profile_type": "personal",
- "name": "John Smith",
- "phone": "+4412345678900"
}
Response samples
- 200
- default
{- "id": "8e0e9886-0af1-4b0c-acf4-111180d2892b",
- "name": "John Smith",
- "phone": "+4412345678900",
- "profile_type": "personal",
- "country": "GB",
- "state": "created",
- "created_at": "2022-09-14T14:41:39.312017Z",
- "updated_at": "2022-09-14T14:41:39.312017Z"
}
Create a transfer
Process the funds transfer between accounts of the business in the same currency.
The resulting transaction has the transfer
type.
Authorizations:
Request Body schema: application/json
Create a transfer
request_id required | string <= 40 characters Provide the unique ID, which is used to handle duplicate transfer requests in case of a lost connection or client error. |
source_account_id required | string <uuid> The ID of the source account that you transfer the funds from. |
target_account_id required | string <uuid> The ID of the target account that you transfer the funds to. |
amount required | number <double> The amount of the funds to be transferred. |
currency required | string (Currency) ^[A-Z]{3}$ ISO 4217 currency code in upper case. |
reference | string The reference for the funds transfer. |
Responses
Request samples
- Payload
{- "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"
}
Response samples
- 200
- default
{- "id": "630f95f7-a3f9-abf2-b4e4-3f65281234dc",
- "state": "completed",
- "created_at": "2020-11-23T08:39:35.811005Z",
- "completed_at": "2020-11-23T08:39:35.811005Z"
}
An incoming or outgoing payment is represented as a transaction. For more information about processing transactions, and payments, see: Tutorials: 2. Create a payment.
Retrieve all transactions
Retrieve the historical transactions based on the provided query criteria.
The API returns a maximum of 1,000 transactions per request.
To be compliant with PSD2 SCA regulations, we only allow access to the last 90 days' transactions. However, you can access older transactions within the first 5 minutes of an account access token being authorized. This means that within the first 5 minutes of a Revolut user authenticating your request, you can request data older than 90 days. After the 5 minute mark, the access to the transaction data is automatically restricted only to the last 90 days.
Authorizations:
query Parameters
from | string The date and time you retrieve the historical transactions from. |
to | string The date and time you retrieve the historical transactions to. The default value is now. |
counterparty | string <uuid> The ID of the counterparty. |
account | string <uuid> The ID of the account |
count | integer The number of the historical transactions to retrieve. The maximum number is 1,000. The default number is 100. |
type | string (TransactionType) Enum: "atm" "card_payment" "card_refund" … 11 more The type of the historical transactions to retrieve. |
Responses
Response samples
- 200
- default
[- {
- "id": "630f9890-95e3-add1-be4a-95f126988221",
- "type": "transfer",
- "state": "pending",
- "request_id": "invoice00912345",
- "created_at": "2022-08-31T17:21:20.364171Z",
- "updated_at": "2022-08-31T17:21:20.364171Z",
- "reference": "invoice00912345",
- "legs": [
- {
- "leg_id": "630f9890-95e3-add1-0000-95f1269f0000",
- "account_id": "812fff9a-3b0c-4ad1-b41a-cc60899d9900",
- "counterparty": {
- "account_type": "revolut",
- "account_id": "e0af9f24-504c-4c5d-bd1d-07edf9f49876"
}, - "amount": -1.16,
- "currency": "EUR",
- "bill_amount": -1,
- "bill_currency": "GBP",
- "description": "To John Doe"
}
]
}
]
Retrieve a transaction
Retrieve the details of a specific transaction by transaction ID or by request ID, which can include, for example, cardholder details for card payments.
Request
To retrieve a transaction by ID:
GET https://b2b.revolut.com/api/1.0/transaction/{transaction_id}
To retrieve a transaction by request ID:
GET https://b2b.revolut.com/api/1.0/transaction/{request_id}?id_type=request_id
Authorizations:
path Parameters
transaction_id required | string The ID of the transaction or request if |
query Parameters
id_type | string Value: "request_id" The type of the transaction ID. |
Responses
Response samples
- 200
- default
{- "id": "640dc0b7-1234-aaaa-1234-92ac4de1dacd",
- "type": "exchange",
- "state": "completed",
- "request_id": "d8f041ab-1234-aaaa-1234-78b6a0b2801f",
- "created_at": "2023-03-12T12:08:07.833414Z",
- "updated_at": "2023-03-12T12:08:07.833414Z",
- "completed_at": "2023-03-12T12:08:07.833705Z",
- "legs": [
- {
- "leg_id": "640dc0a7-aaaa-a5b5-aaaa-92ac4de1dacd",
- "account_id": "0d1848dc-aaaa-4a9a-aaaa-cae53cbd4baf",
- "amount": -1,
- "currency": "GBP",
- "bill_amount": -8.39,
- "bill_currency": "DKK",
- "description": "Exchanged to DKK",
- "balance": 8.74
}, - {
- "leg_id": "640dc0a7-aaaa-a5b5-aaaa-92ac4de1dacd",
- "account_id": "246bc9de-aaaa-4f86-aaaa-4d291a5d0390",
- "amount": 8.39,
- "fee": 0.08,
- "currency": "DKK",
- "description": "Exchanged from GBP Main",
- "balance": 19.33
}
]
}
Create a payment
If you make the payment to another Revolut account, either business or personal, the transaction is executed instantly.
Notes: When you make the payment to a
business
counterparty, you must specify theaccount_id
underreceiver
.
To avoid submitting duplicate payments because of an error in your code, ensure that request_id
is unique for each payment and has persisted on your side previously.
Caution: Due to PSD2 Strong Customer Authentication regulations, from the 1st April 2021, the Payments (
/pay
) endpoint is only available for customers on Revolut Business Company plans. We suggest that Freelancers wishing to use the Payments (/pay
) endpoint, instead leverage our Payment Drafts (/payment-drafts
) endpoint to minimise disruption.
Schedule Payment
Currently, it is no longer possible to schedule an internal payment. Please reach out to us at api-requests@revolut.com if you want to get access to this functionality.
You can schedule payments between Revolut accounts for up to 30 days ahead. Scheduling payments to an external payment network is not supported at the moment.
Scheduled payments must be in the currency of the account that you pay from. To schedule a future payment, as opposed to immediate execution, add the schedule_for
field in the POST /pay
request.
Note: Payments scheduled for the same time might not be executed all at the same time. As the scheduled processor runs every several hours, the payments are processed in batches; if you schedule too many payments, more time is required to process all the payments.
Authorizations:
Request Body schema: application/json
Create a payment
request_id required | string <= 40 characters The ID of the transaction that you provide. |
account_id required | string <uuid> The ID of the account that you pay from. |
required | object (PaymentReceiver) The details of the payment receiver. |
amount required | number <double> The amount of the transaction. |
currency | string (Currency) ^[A-Z]{3}$ ISO 4217 currency code in upper case. |
reference | string The reference for the transaction. |
schedule_for | string <date> The future date and time that you schedule the payment. |
charge_bearer | string Enum: "shared" "debtor" The party to which any transaction fees will be charged if the resulting transaction route has associated fees. Leave empty for route default. Some transactions with fees might not be possible with the specified option, in which case error |
transfer_reason_code | string The reason code for the transaction. Transactions to certain countries and currencies might require to provide a transfer reason. You can check available reason codes with the This field will be ignored if it is not required for the given currency and country. |
Responses
Request samples
- Payload
{- "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"
}
Response samples
- 200
- 400
- default
{- "id": "630f9a62-e488-a9ce-a2d3-a30kkkke03f0",
- "state": "pending",
- "created_at": "2022-08-31T17:29:06.625613Z"
}
Get transfer reasons
In order to initiate a transfer in certain currencies and countries, you must provide a transfer reason. With this endpoint you can retrieve all transfer reasons available to your business account per country and currency.
Authorizations:
Responses
Response samples
- 200
- default
[- {
- "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"
}
]
To request an approval for a payment from a business owner or admin before the payment is executed, create a payment draft. The business owner or admin must manually approve it in the Revolut Business User Interface.
Then, you can also retrieve one or all payment drafts, and delete a payment draft.
Retrieve all payment drafts
Get a list of all the payment drafts that aren't processed.
Authorizations:
Responses
Response samples
- 200
- default
{- "payment_orders": [
- {
- "id": "e7e54cb2-861a-aaaa-80e9-3e6600f3db10",
- "title": "Draft Payment through API",
- "payments_count": 1
}
]
}
Create a payment draft
Create a payment draft.
Authorizations:
Request Body schema: application/json
The payment draft information.
required | Array of objects (PaymentRequest) The details of the payment. |
title | string The title of the payment draft. |
schedule_for | string <date> The future date that you schedule the payment draft. |
Responses
Request samples
- Payload
{- "title": "Payment Draft Title",
- "schedule_for": "2022-09-24",
- "payments": [
- {
- "account_id": "2e6de1bf-97ad-478d-aad1-9d7a3cdf70cb",
- "receiver": {
- "counterparty_id": "a15bcac4-dd42-45ed-a828-6806ccc8bb7e",
- "account_id": "2bf609f4-9825-4401-b6f7-960c61f8bee0"
}, - "amount": 10,
- "currency": "GBP",
- "reference": "payment-draft-1"
}
]
}
Response samples
- 201
- default
{- "id": "e7e54cb2-861a-aaaa-80e9-3e6600f3db10"
}
Retrieve a payment draft
Get the information about a specific payment draft by ID.
Authorizations:
path Parameters
payment_draft_id required | string <uuid> The ID of the payment draft to retrieve. |
Responses
Response samples
- 200
- default
{- "title": "Draft Payment through API",
- "payments": [
- {
- "id": "67b38771-3db0-4cf0-bdc0-aaaa1284ab81",
- "amount": {
- "amount": 123,
- "currency": "GBP"
}, - "reference": "Draft Payment through API",
- "account_id": "05018b0d-e67c-4fec-aaaa-415e9da9432c",
- "receiver": {
- "counterparty_id": "c71af44d-aaaa-4e1a-84bb-17589c81f022"
}, - "state": "CREATED",
- "current_charge_options": {
- "from": {
- "amount": 123,
- "currency": "GBP"
}, - "to": {
- "amount": 123,
- "currency": "GBP"
}, - "rate": "1.0000",
- "fee": {
- "amount": 0,
- "currency": "GBP"
}
}
}
]
}
Delete a payment draft
Delete a payment draft with the given ID. You can delete a payment draft only if it isn't processed.
Authorizations:
path Parameters
payment_draft_id required | string <uuid> The ID of the payment draft to delete. |
Responses
Response samples
- 204
- default
{ }
Get exchange rate
Get the exchange rate between two currencies.
Authorizations:
query Parameters
from required | string (Currency) ^[A-Z]{3}$ The currency that you exchange from. |
to required | string (Currency) ^[A-Z]{3}$ The currency that you exchange to. |
amount | number <double> The amount of the currency. The default value is |
Responses
Response samples
- 200
- default
{- "from": {
- "amount": 1,
- "currency": "EUR"
}, - "to": {
- "amount": 1,
- "currency": "USD"
}, - "rate": 1.0044090351,
- "fee": {
- "amount": 0,
- "currency": "EUR"
}, - "rate_date": "2022-08-31T17:30:34Z"
}
Exchange money
Exchange the money in either of the following cases:
- You know the amount of currency to sell, for example, exchange 135.5 USD to some EUR. Then, specify the amount in the
from
object. - You know the amount of currency to buy, for example, exchange some USD to 200 EUR. Then, specify the amount in the
to
object.
Note: You can specify the amount
field only once either in the from
object or in the to
object.
Authorizations:
Request Body schema: application/json
Specify the exchange information
required | object (ExchangePart) |
required | object (ExchangePart) |
request_id required | string <= 40 characters Provide the unique ID, which is used to handle duplicate exchange requests in case of a lost connection or client error. |
reference | string Provide the exchange reference. |
Responses
Request samples
- Payload
{- "from": {
- "account_id": "af98333c-ea53-482b-93c2-1fa5e4eae671",
- "currency": "USD",
- "amount": 135.5
}, - "to": {
- "account_id": "b7ec67d3-5af1-42c8-bece-3d285774894d",
- "currency": "EUR"
}, - "reference": "exchange",
- "request_id": "A1pH4num3ric2"
}
Response samples
- 200
- default
{- "id": "630f9c2e-2e74-a06d-ab61-deb7ggkkd6cb",
- "state": "completed",
- "created_at": "2022-08-31T17:36:46.656876Z",
- "completed_at": "2022-08-31T17:36:46.657239Z"
}
A webhook (also called a web callback) allows your system to receive updates about your account to an HTTPS endpoint that you provide. When a supported event occurs, a notification is posted, via HTTP POST
method, to the specified endpoint.
If the receiver returns an HTTP error response, there are two more consequent attempts for delivery.
Currently, the following events are supported:
- Transaction Creation (
TransactionCreated
) - Transaction State Change (
TransactionStateChanged
)
For more information, see: Tutorials: Work with webhooks.
Response samples
- 200
- default
{
}
Set a webhook
Set up a webhook URL so that event notifications are pushed to the specified URL. Only HTTPS URLs are supported.
Authorizations:
Request Body schema: application/json
URL to set up as a webhook
url required | string <uri> The valid webhook URL that event notifications are sent to. The supported protocol is |
Responses
Request samples
- Payload
{
}
Response samples
- default
{- "code": 0,
- "message": "string"
}