NAV Navbar

Introduction to the Business API

More than 500,000 businessess use Revolut to manage their business finances. Each business is different and Revolut is on a mission to become the financial super-app that meets their unique needs. This is where you come in.

Join the 1000+ developers who have already built applications using the Revolut APIs.

API For Who What can you do
Business API Revolut Business account holders Automate different functions of your business

You might be looking for the Open Banking API or the Merchant API

Quickstart 🚀

The quickest way to automate your business finances with Revolut.

Overview

Welcome to the Revolut Business API. Here you'll find the information you need to get started with our API. We’re building a financial super-app and we’re excited to have you on board.

The Business API is for businesses that want to automate their internal finance systems.

If, instead, you're planning to build an app or integration to publish for others to use, please check out our Open Banking API.

Sandbox environment

The Sandbox environment is a non-production environment setup to make it easier for you to start working with the API. When creating a sandbox account you will be able to use mock data and safely test your application in a simulated environment. Please let us know if you have any issues setting up the sandbox environment.

You can sign up for a sandbox account following a process similar to the one you used to apply for your business account.

Create a Sandbox Business Account

Authenticating with Revolut

Setting up access to your Business account

You will need to authorize the API to access your Revolut Business account. You can do this via the API settings page in the Revolut Business web app.

The authorisation flow follows the JSON Web Token (JWT) for OAuth 2.0 Client Authentication standard, to ensure security while allowing you full access to your own account.

At the end of the authentication flow, you will receive a user access token. This is what you will have to use to perform any API call, whenever you see the mention <your access token>.

The JWT mechanism requires using a private/public key to sign your token request.

We've created a test app to help you get started with JWT. Please note this will only work in the sandbox environment.

Generating a pair of public/private keys

The basic steps to generate a private and public key

$ openssl genrsa -out privatekey.pem 1024
$ openssl req -new -x509 -key privatekey.pem -out publickey.cer -days 1825

For creating your public/private key-pair we recommend the use of OpenSSL. When you're prompted to fill in info for your certificates, you can enter a country code, a province, a city and then “.” to leave the rest blank. For production certificates, please fill in all the fields.

Mac: OpenSSL comes shipped with Mac OS X version 10.6.2 onwards. You can use Terminal to run OpenSSL commands.

Windows: Download OpenSSL for Windows

To run the commands below, go to the OpenSSL32 directory on your PC, and change to the /bin directory.

Uploading your public key

Go to the directory in which you have generated the public keys and copy the text in the "publickey.cer" certificate file. Head over to your Revolut Business account API settings, click on "Add certificate", then paste your public key in the "X509 public key" input.

In order to complete the setup, you will also need to provide an OAuth redirect URI. The redirect URI is a url to which you will be redirected after the authorisation step. For sandbox you could use our JWT test application as a redirect URI, as it will simplify the next steps for you.

Signing a JWT

In order to perform requests to the API, you will need to provide your client_id and a JSON Web Token. At the end of the previous step, you will be assigned a client_id.

Generating a JWT:

RSASHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  Signature
)

JWT generating example:

const fs = require('fs')
const jwt = require('jsonwebtoken')

const privateKeyName = 'privatekey.pem' // Should be valid path to the private key
const issuer = '127.0.0.1' // Issuer for JWT, should be derived from your redirect URL
const client_id = '<CLIENT_ID>' // Your client ID
const aud = 'https://revolut.com' // Constant
const payload = {
  "iss": issuer,
  "sub": client_id,
  "aud": aud
}
const privateKey = fs.readFileSync(privateKeyName);
const token = jwt.sign(payload, privateKey, { algorithm: 'RS256', expiresIn: 60 * 60});

Header - base64 from headers describing the signature algorithm and the token type

Field Description Schema
alg "RS256" Text
typ "JWT" Text

Payload - base64-encoded content

Field Description Required Schema
iss Domain from redirect_url (without http://) Yes Text
sub Your cliend_id Yes Text
aud https://revolut.com Yes Text
exp timestamp - JWT expiration date Yes UNIX timestamp in seconds

Signature - base64-encoded private key

Once you have the JWT header and payload, you can start stitching them together to make the JWT signature.

The JWT signature is created by encrypting the Base64Url encoded JWT header and payload and concatenating with a (.) period.

Then, Concatenating (using period '.' characters) base64url encoded header, payload and signature will get you the complete JWT.

To confirm that you infact have a valid JWT, you can use this handy JWT tool by entering the JWT you just created and confirming the values match the JWT header and payload you created for the JWT. At the bottom right you should be able to add your key to verify the signature. If everything is correct, the debugger should tell you that the JWT is valid.

Authorising your app

The next step is to authorise the API to access your account. In order to do so, in the web interface, click on the "Authorise API access" button. You will see an authorisation pop-up with a summary of the resources the API will be able to access.

Once you click on authorise, you will be redirected to your specified OAuth redirect link. The redirect url will have attached an authorisation code.

Requesting a reusable access token

Once you have received the authorisation code, you can exchange it for an access token.

Read more about token exchange endpoint and its parameters

Accessing an endpoint with an access token

Once you have the access token, you can use any of the API endpoints described below (according to the permissions granted to your app), applying the access token everywhere you see the mention <your access token>. Please make sure you store access tokens somewhere secure.

Refreshing your access token

After the last step, you will receive two tokens: an access token and a refresh token.

Every access token is valid for 40 minutes, after which you can use the refresh_token to request a new one.

Check the corresponding endpoint documentation

Making your first API request

Get list of accounts

curl https://sandbox-b2b.revolut.com/api/1.0/accounts \
  -H "Authorization: Bearer <your access token>"
curl https://b2b.revolut.com/api/1.0/accounts \
  -H "Authorization: Bearer <your access token>"

Response

[
  {
    "id": "2a0d4d03-e26c-4159-9de1-c6bf3adfd8a1",
    "name": "Current GBP account",
    "balance": 100.0,
    "currency": "GBP",
    "state": "active",
    "public": false,
    "updated_at": "2017-06-01T11:11:11.1Z",
    "created_at": "2017-06-01T11:11:11.1Z"
  },
  {
    "id": "df8d6b20-0725-482e-a29e-fb09631480cf",
    "name": "EUR expenses account",
    "balance": 1234.0,
    "currency": "EUR",
    "state": "active",
    "public": false,
    "created_at": "2017-06-01T11:11:11.1Z",
    "updated_at": "2017-06-01T11:11:11.1Z"
  }
]

Now that you have your access token, you're ready to make requests to the Business API! To verify that everything is running, make a request to the accounts endpoint and see the accounts the user has.

Next steps

This quickstart is just the tip of the iceberg. There's more functionality you can unlock by exploring this documentation. We recommend you take some time to check out the various endpoints to see what's possible with the Business API.

As we continue to grow our developer community and refine our developer experience, we encourage you to get involved.

Usage and limits

In order to ensure safe and fair resource sharing, we define the following usage limits:

Please note that for businesses on a Freelancer plan we are also required to ask users for explicit authorisation to access their account via the API every 90 days. This means that access tokens will expire every 90 days and you (or your users) will need to authorise access to the app once more. This is due to the recent PSD2 SCA regulations.

Guides

Working with Web-hooks

OpenAPI Specification

Web-hook is a mechanism that allows you to receive updates about your account to an HTTPS endpoint provided by you. When a supported event occurs, a notification will be posted, via HTTP POST method, to the specified endpoint. If the receiver returns an HTTP error response, there will be two more consequent attempts for delivery.

Currently the following events are supported:

Setting up a web-hook

Set up a webhook

curl -X POST https://sandbox-b2b.revolut.com/api/1.0/webhook \
  -H "Authorization: Bearer <your access token>" \
  --data @- << EOF

{
  "url": "https://example.com/example/path"
}

EOF
curl -X POST https://b2b.revolut.com/api/1.0/webhook \
  -H "Authorization: Bearer <your access token>" \
  --data @- << EOF

{
  "url": "https://example.com/example/path"
}

EOF
Request

Use this API to create your web-hook endpoint. Only HTTPS web-hooks are supported.

Field Description Schema
url call back endpoint of the client system, https is the supported protocol URL

Deleting a web-hook

Delete a web-hook

curl -X DELETE https://sandbox-b2b.revolut.com/api/1.0/webhook \
  -H "Authorization: Bearer <your access token>"
curl -X DELETE https://b2b.revolut.com/api/1.0/webhook \
  -H "Authorization: Bearer <your access token>"

Use this API request to delete a web-hook

Transaction Created event

Payload example

{
  "event": "TransactionCreated",
  "timestamp": "2017-12-06T12:21:49.865Z",
  "data": {
    "id": "20ed4029-1af8-405d-b515-0ee5e020a850",
    "type": "transfer",
    "request_id": "e0cbf84637264ee082a848b",
    "state": "completed",
    "created_at": "2017-12-06T12:21:48.865Z",
    "updated_at": "2017-12-06T12:21:48.865Z",
    "completed_at": "2017-12-06T12:21:48.865Z",
    "reference": "Payment for Blows & Wistles Co.",
    "legs": [
      {
        "leg_id": "e2fdd0e2-3881-4804-8a8c-6573a97488fa",
        "account_id": "87b51b40-a6bc-4f87-a3e6-c05ea203a762",
        "counterparty": {
          "type": "revolut",
          "account_id": "54c0150f-64de-4653-93e5-af89d21385a0"
        },
        "amount": -120.0,
        "currency": "GBP",
        "balance": 102
      }
    ]
  }
}
Response
Field Description Schema
event the event name Text
timestamp the event time ISO date/time
data.id the ID of transaction UUID
data.request_id the client provided request ID Text
data.state the transaction state: pending, completed, declined or failed Text
data.reason_code an optional reason code for declined or failed transaction state Text
data.created_at the instant when the transaction was created ISO date/time
data.updated_at the instant when the transaction was last updated ISO date/time
data.completed_at the instant when the transaction was completed, mandatory for completed state only ISO date/time
data.scheduled_for an optional date when the transaction was scheduled for ISO date
data.reference a user provided payment reference Text
data.legs the legs of a transaction, there'll be 2 legs between your Revolut accounts and 1 leg in other cases Array
data.legs[n].leg_id the ID of the leg UUID
data.legs[n].amount the transaction amount Decimal
data.legs[n].fee an optional transaction fee amount Decimal
data.legs[n].currency the transaction currency 3-letter ISO currency code
data.legs[n].bill_amount the billing amount for cross-currency payments Decimal
data.legs[n].bill_currency the billing currency for cross-currency payments 3-letter ISO currency code
data.legs[n].account_id the ID of the account the transaction is associated with UUID
data.legs[n].counterparty.id the counterparty ID UUID
data.legs[n].counterparty.account_id the counterparty account ID UUID
data.legs[n].counterparty.account_type the type of counterparty account: self, revolut, external Text
data.legs[n].description the transaction leg purpose Text
data.legs[n].balance a total balance of the account the transaction is associated with (optional) Decimal

Transaction State Changed event

Payload example

{
  "event": "TransactionStateChanged",
  "timestamp": "2017-12-06T12:21:49.865Z",
  "data": {
    "id": "9a6434d8-3581-4faa-988b-48875e785be7",
    "old_state": "pending",
    "new_state": "reverted"
  }
}
Field Description Schema
event the event name Text
timestamp the event time ISO date/time
data.id the ID of the transaction UUID
data.old_state previous state of the transaction Text
data.new_state new state of the transaction Text

API Reference

Authentication and Authorization

Get authorisation code

Example URL

https://sandbox-business.revolut.com/app-confirm?client_id=<yourclientID>&redirect_uri=<https://yourapp.com/authresp>
https://business.revolut.com/app-confirm?client_id=<yourclientID>&redirect_uri=<https://yourapp.com/authresp>

Navigate the user to this address to request an authorisation code

Request

GET https://business.revolut.com/app-confirm

GET parameters
Field Description Required Schema
client_id your app ID Yes Text
response_type "code" indicates we expect to receive a request token in the response Yes Text
redirect_uri the url to redirect to after the user has provided authorisation. For security reasons, this has to match one of the redirect urls specified while creating the app Yes Text
scope one or more of READ and WRITE. For security reasons, these must be among those requested during app creation. Yes Text
Response
Field Description Schema
id the account ID UUID
code the user authorisation code (if granted) Text

Exchange Authorisation Code

Exchange auth code to an access token

curl https://sandbox-b2b.revolut.com/api/1.0/auth/token \
  -H "Content-Type: application/x-www-form-urlencoded"\
  --data "grant_type=authorization_code"\
  --data "code=oa_sand_gg-_wDV66wYfKKpnF4RIrpOZs2oPTwNp4TXOra5pS0g"\
  --data "client_id=rmPBoIc-LR3ObABUn-NKHq6WyEoCr6Lh__DFohuMRVM"\
  --data "client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer"\
  --data "client_assertion=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
curl https://b2b.revolut.com/api/1.0/auth/token \
  -H "Content-Type: application/x-www-form-urlencoded"\
  --data "grant_type=authorization_code"\
  --data "code=oa_prod_gg-_wDV66wYfKKpnF4RIrpOZs2oPTwNp4TXOra5pS0g"\
  --data "client_id=rmPBoIc-LR3ObABUn-NKHq6WyEoCr6Lh__DFohuMRVM"\
  --data "client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer"\
  --data "client_assertion=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"

Response

{
  "access_token": "oa_sand_rPo9OmbMAuguhQffR6RLR4nvmzpx4NJtpdyvGKkrS3U",
  "token_type": "bearer",
  "expires_in": 2399,
  "refresh_token": "oa_prod_hQacSGnwx-luIfj3dlVByrytVV9rWAnyHkpJTwG_Tr8"
}

This endpoint is used to exchange an authorisation code with an access token.

Request

POST https://b2b.revolut.com/api/1.0/auth/token

Request fields (URL-encoded)
Field Description Required Schema
grant_type "authorization_code" Yes Text
code an authorisation code Yes Text
client_id your app ID Yes Text
client_assertion_type "urn:ietf:params:oauth:client-assertion-type:jwt-bearer" Yes Text
client_assertion Your generated JWT token Yes Text
Response
Field Description Schema
access_token the access token Text
token_type "bearer" means that this token is valid to access the API Text
expires_in token expiration time in seconds Integer
refresh_token A token to be used to request a new access token Text

Refresh Access Token

Refresh access token

curl https://sandbox-b2b.revolut.com/api/1.0/auth/token \
  -H "Content-Type: application/x-www-form-urlencoded"\
  --data "grant_type=refresh_token"\
  --data "refresh_token=oa_sand_gg-_wDV66wYfKKpnF4RIrpOZs2oPTwNp4TXOra5pS0g"\
  --data "client_id=rmPBoIc-LR3ObABUn-NKHq6WyEoCr6Lh__DFohuMRVM"\
  --data "client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer"\
  --data "client_assertion=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
curl https://b2b.revolut.com/api/1.0/auth/token \
  -H "Content-Type: application/x-www-form-urlencoded"\
  --data "grant_type=refresh_token"\
  --data "refresh_token=oa_prod_gg-_wDV66wYfKKpnF4RIrpOZs2oPTwNp4TXOra5pS0g"\
  --data "client_id=rmPBoIc-LR3ObABUn-NKHq6WyEoCr6Lh__DFohuMRVM"\
  --data "client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer"\
  --data "client_assertion=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"

Response

{
  "access_token": "oa_prod_rPo9OmbMAuguhQffR6RLR4nvmzpx4NJtpdyvGKkrS3U",
  "token_type": "bearer",
  "expires_in": 2399
}

This endpoint is used to request a new user access token after the expiration date.

Request

POST https://b2b.revolut.com/api/1.0/auth/token

Request fields (URL-encoded)
Field Description Required Schema
grant_type "refresh_token" Yes Text
refresh_token a refresh token Yes Text
client_id your app ID Yes Text
client_assertion_type "urn:ietf:params:oauth:client-assertion-type:jwt-bearer" Yes Text
client_assertion Your generated JWT token Yes Text
Response
Field Description Schema
access_token the access token UUID
token_type "bearer" means that this token is valid to access the API Text
expires_in token expiration time in seconds Integer

Accounts

OpenAPI Specification

Get Accounts

Get accounts list

curl https://sandbox-b2b.revolut.com/api/1.0/accounts \
  -H "Authorization: Bearer <your access token>"
curl https://b2b.revolut.com/api/1.0/accounts \
  -H "Authorization: Bearer <your access token>"

Response

[
  {
    "id": "2a0d4d03-e26c-4159-9de1-c6bf3adfd8a1",
    "name": "Current GBP account",
    "balance": 100.0,
    "currency": "GBP",
    "state": "active",
    "public": false,
    "updated_at": "2017-06-01T11:11:11.1Z",
    "created_at": "2017-06-01T11:11:11.1Z"
  },
  {
    "id": "df8d6b20-0725-482e-a29e-fb09631480cf",
    "name": "EUR expenses account",
    "balance": 1234.0,
    "currency": "EUR",
    "state": "active",
    "public": false,
    "created_at": "2017-06-01T11:11:11.1Z",
    "updated_at": "2017-06-01T11:11:11.1Z"
  }
]

This endpoint retrieves your accounts.

Request

GET https://b2b.revolut.com/api/1.0/accounts

Response
Field Description Schema
id the account ID UUID
name the account name Text
balance the available balance Decimal
currency the account currency 3-letter ISO currency code
state the account state, one of active or inactive Text
public determines if the account is visible to other businesses on Revolut Boolean
created_at the instant when the account was created ISO date/time
updated_at the instant when the account was last updated ISO date/time

Get Account

Get account by ID

curl https://sandbox-b2b.revolut.com/api/1.0/accounts/df8d6b20-0725-482e-a29e-fb09631480cf \
  -H "Authorization: Bearer <your access token>"
curl https://b2b.revolut.com/api/1.0/accounts/df8d6b20-0725-482e-a29e-fb09631480cf \
  -H "Authorization: Bearer <your access token>"

Response

{
  "id": "df8d6b20-0725-482e-a29e-fb09631480cf",
  "name": "EUR expenses account",
  "balance": 1234.0,
  "currency": "EUR",
  "state": "active",
  "public": false,
  "created_at": "2017-06-01T11:11:11.1Z",
  "updated_at": "2017-06-01T11:11:11.1Z"
}

This endpoint retrieves one of your accounts by ID.

Request

GET https://b2b.revolut.com/api/1.0/accounts/<id>

URL Parameters
Parameter Description Format
id the ID of the account to retrieve UUID
Response
Field Description Schema
id the account ID UUID
name the account name Text
balance the available balance Decimal
currency the account currency 3-letter ISO currency code
state the account state, one of active or inactive Text
public determines if the account is visible to other Businesses on Revolut Boolean
created_at the instant when the account was created ISO date/time
updated_at the instant when the account was last updated ISO date/time

Get Account Details

Get account details

curl "https://sandbox-b2b.revolut.com/api/1.0/accounts/df8d6b20-0725-482e-a29e-fb09631480cf/bank-details" \
  -H "Authorization: Bearer <your access token>"
curl "https://b2b.revolut.com/api/1.0/accounts/df8d6b20-0725-482e-a29e-fb09631480cf/bank-details" \
  -H "Authorization: Bearer <your access token>"

Response

[
  {
    "account_no": "74931241",
    "sort_code": "344950",
    "beneficiary": "Good Co.",
    "beneficiary_address": {
      "street_line1": "Sesame Street",
      "street_line2": "1 Canada Square",
      "city": "London",
      "country": "GB",
      "postcode": "E14 5AB"
    },
    "bank_country": "GB",
    "schemes": ["chaps", "bacs", "faster_payments"],
    "pooled": false,
    "estimated_time": {
      "unit": "hours",
      "min": 2,
      "max": 24
    }
  },
  {
    "iban": "GB73 BARC 2036 4759 2458 33",
    "bic": "BARCGB22",
    "beneficiary": "Revolut LTD",
    "beneficiary_address": {
      "street_line1": "Revolut LTD, Level39",
      "street_line2": "1 Canada Square",
      "city": "London",
      "country": "GB",
      "postcode": "E14 5AB"
    },
    "bank_country": "GB",
    "pooled": true,
    "unique_reference": "28960536",
    "schemes": ["sepa", "swift"],
    "estimated_time": {
      "unit": "days",
      "min": 1,
      "max": 3
    }
  }
]

This endpoint retrieves individual account details.

Request

GET https://b2b.revolut.com/api/1.0/accounts/<id>/bank-details

Response
Field Description Schema
iban IBAN Text
bic BIC Text
account_no the account number Text
sort_code the sort code Text
routing_number the routing number Text
beneficiary the beneficiary name Text
beneficiary_address.street_line1 line 1 of the beneficiary’s address Text
beneficiary_address.street_line2 line 2 of the beneficiary’s address Text
beneficiary_address.region the region of the beneficiary Text
beneficiary_address.city the city of the beneficiary Text
beneficiary_address.country the country of the beneficiary 2-letter ISO code
beneficiary_address.postcode the postal code of the beneficiary Text
bank_country the country of the bank Text
pooled determines if this account address is pooled or unique Boolean
unique_reference the reference of the pooled account Text
schemes the list of supported schemes, possible values: chaps, bacs, faster_payments, sepa, swift, ach Text
estimated_time.unit the unit of the inbound transfer time estimate, possible values: days, hours Text
estimated_time.max the maximum estimate Decimal
estimated_time.min the minimum estimate Decimal

Counterparties

OpenAPI Specification

Before a transfer or payment can be made, you need to add the counterparties with which you intend to transact. Please note that revolut accounts are shown only for for business counterparties.

Add Revolut Counterparty

Add an individual Revolut user as counterparty

curl -X POST https://sandbox-b2b.revolut.com/api/1.0/counterparty \
  -H "Authorization: Bearer <your access token>" \
  --data @- << EOF

{
  "profile_type": "personal",
  "name": "John Smith",
  "phone": "+44723456789"
}

EOF
curl -X POST https://b2b.revolut.com/api/1.0/counterparty \
  -H "Authorization: Bearer <your access token>" \
  --data @- << EOF

{
  "profile_type": "personal",
  "name": "John Smith",
  "phone": "+44723456789"
}

EOF

Response

{
  "id": "830e79d9-7b0a-45d3-a2a3-c0b291be3bf7",
  "name": "John Smith",
  "phone": "+44723456789",
  "profile_type": "personal",
  "country": "GB",
  "state": "created",
  "created_at": "2017-12-19T15:58:34.485Z",
  "updated_at": "2017-12-19T15:58:34.485Z"
}

Add a business Revolut user as counterparty

curl -X POST https://sandbox-b2b.revolut.com/api/1.0/counterparty \
  -H "Authorization: Bearer <your access token>" \
  --data @- << EOF

{
  "profile_type": "business",
  "email": "john@smith.co"
}

EOF
curl -X POST https://b2b.revolut.com/api/1.0/counterparty \
  -H "Authorization: Bearer <your access token>" \
  --data @- << EOF

{
  "profile_type": "business",
  "email": "john@smith.co"
}

EOF

Response

{
  "id": "830e79d9-7b0a-45d3-a2a3-c0b291be3bf7",
  "name": "Smith Limited",
  "profile_type": "business",
  "country": "GB",
  "state": "created",
  "created_at": "2017-12-19T15:58:34.485Z",
  "updated_at": "2017-12-19T15:58:34.485Z",
  "accounts": [
    {
      "id": "7a39e16d-41a6-460f-a7d7-341575037c9d",
      "currency": "GBP",
      "type": "revolut"
    },
    {
      "id": "50de976a-6704-4424-8998-9efc4ef0abf5",
      "currency": "EUR",
      "type": "revolut"
    }
  ]
}

You can create a counterparty for an existing Revolut user.

POST https://b2b.revolut.com/api/1.0/counterparty

Request fields
Field Description Required Format
profile_type the type of the Revolut profile, business or personal Yes Text
name an optional name. Provide only with personal profile_type Yes Text
phone an optional phone number of the counterparty. Provide only with personal profile_type. Yes International phone number, starting with +
email an optional email address of an admin of a public Revolut Business account. Provide only with business profile_type. Yes Email
Response
Field Description Schema
id the ID of the counterparty UUID
name the name of the counterparty Text
phone the phone number of the counterparty Text
profile_type the type of the Revolut profile, business or personal Text
bank_country the country of the bank 2-letter ISO code
state the state of the counterparty, one of created or deleted Text
created_at the instant when the counterparty was created ISO date/time
updated_at the instant when the counterparty was last updated ISO date/time
accounts the list of public accounts of this counterparty JSON array
accounts[n].id the ID of a counterparty's account UUID
accounts[n].currency the currency of a counterparty's account 3-letter ISO currency code
accounts[n].type the type of account, revolut or external Text

Add non-Revolut Counterparty

Add a non-Revolut bank account as counterparty

curl -X POST https://sandbox-b2b.revolut.com/api/1.0/counterparty \
  -H "Authorization: Bearer <your access token>" \
  --data @- << EOF

{
  "company_name": "John Smith Co.",
  "bank_country": "GB",
  "currency": "GBP",
  "account_no": "12345678",
  "sort_code": "223344",
  "email": "john@smith.co",
  "phone": "+447771234455",
  "address": {
    "street_line1": "1 Canada Square",
    "street_line2": "Canary Wharf",
    "region": "East End",
    "postcode": "E115AB",
    "city": "London",
    "country": "GB"
  }
}

EOF
curl -X POST https://b2b.revolut.com/api/1.0/counterparty \
  -H "Authorization: Bearer <your access token>" \
  --data @- << EOF

{
  "company_name": "John Smith Co.",
  "bank_country": "GB",
  "currency": "GBP",
  "account_no": "12345678",
  "sort_code": "223344",
  "email": "john@smith.co",
  "phone": "+447771234455",
  "address": {
    "street_line1": "1 Canada Square",
    "street_line2": "Canary Wharf",
    "region": "East End",
    "postcode": "E115AB",
    "city": "London",
    "country": "GB"
  }
}

EOF

Response

{
  "id": "97380d65-0478-4673-9e79-21918b4ae93a",
  "company_name": "Acme Corp.",
  "state": "created",
  "created_at": "2017-12-19T16:17:05.141Z",
  "updated_at": "2017-12-19T16:17:05.141Z",
  "accounts": [
    {
      "id": "4e32d331-68aa-4e4b-a295-3e3d7625819b",
      "currency": "GBP",
      "type": "external",
      "account_no": "12345678",
      "sort_code": "223344",
      "email": "acm@me.ccq",
      "name": "Acme Corp.",
      "bank_country": "GB",
      "recipient_charges": "free"
    }
  ]
}

You can create a counterparty for an non-Revolut bank account.

POST https://b2b.revolut.com/api/1.0/counterparty

Common request fields
Field Description Required Schema
company_name name of the external company counterparty, this field must exist when individual_name does not No Text
individual_name.first_name first name of the external individual counterparty, this field must exist when company_name does not No Text
individual_name.last_name last name of the external individual counterparty, this field must exist when company_name does not No Text
bank_country the country of the bank Yes 2-letter ISO code
currency the currency of a counterparty's account Yes 3-letter ISO currency code
email email address of the beneficiary No Email
phone phone number of the beneficiary No An international phone number, starting with +
address.street_line1 line 1 of the counterparty’s address No Text
address.street_line2 line 2 of the counterparty’s address No Text
address.region region of the counterparty No Text
address.city city of the counterparty No Text
address.country bankCountry of the counterparty No 2-letter ISO code
address.postcode postal code of the counterparty No Text
fields for UK GBP accounts:
Field Description Required Schema
account_no bank account number Yes Text
sort_code sort code Text
fields for US USD accounts:
Field Description Required Schema
account_no bank account number Yes Text
routing_number routing transit number Yes Text
fields for IBAN countries:
Field Description Required Schema
iban IBAN Yes Text
bic BIC Yes Text
fields for SWIFT:
Field Description Required Schema
account_no bank account number Yes Text
bic bank BIC Yes Text
fields for SWIFT MX:
Field Description Required Schema
clabe CLABE Yes Text
bic bank BIC Yes Text
Required fields for IN INR accounts:
Field Description Format
account_no bank account number Text
ifsc IFSC Text
Required fields for AU AUD accounts:
Field Description Format
account_no bank account number Text
bsb_code BSB Text
Response
Field Description Format
id the ID of the counterparty UUID
name the name of the counterparty Text
state the state of the counterparty, one of created or deleted Text
created_at the instant when the counterparty was created ISO date/time
updated_at the instant when the counterparty was last updated ISO date/time
accounts the list of public accounts of this counterparty JSON array
accounts[n].id the ID of a counterparty's account UUID
accounts[n].currency the currency of a counterparty's account 3-letter ISO currency code
accounts[n].type the type of account, revolut or external Text
accounts[n].account_no bank account number Text
accounts[n].iban IBAN Text
accounts[n].sort_code sort code Text
accounts[n].routing_number routing transit number Text
accounts[n].bic BIC Text
accounts[n].clabe CLABE Text
accounts[n].ifsc IFSC Text
accounts[n].bsb BSB Text
accounts[n].recipient_charges indicates the possibility of the recipient charges: no or expected Text

Delete Counterparty

Delete counterparty

curl -X DELETE https://sandbox-b2b.revolut.com/api/1.0/counterparty/6b3c696e-7c3d-464a-8dbe-fc70e183d42e \
  -H "Authorization: Bearer <your access token>"
curl -X DELETE https://b2b.revolut.com/api/1.0/counterparty/6b3c696e-7c3d-464a-8dbe-fc70e183d42e \
  -H "Authorization: Bearer <your access token>"

Response

204 No Content

This endpoint deletes a counterparty with the given ID. Once a counterparty is deleted no payments can be made to it.

Request

DELETE https://b2b.revolut.com/api/1.0/counterparty/<id>

URL Parameters
Parameter Description Required Schema
id the ID of the counterparty to delete Yes UUID

Get Counterparty

Get counterparty

curl https://sandbox-b2b.revolut.com/api/1.0/counterparty/6b3c696e-7c3d-464a-8dbe-fc70e183d42e \
  -H "Authorization: Bearer <your access token>"
curl https://b2b.revolut.com/api/1.0/counterparty/6b3c696e-7c3d-464a-8dbe-fc70e183d42e \
  -H "Authorization: Bearer <your access token>"

Response

{
  "id": "ffff1ec3-e018-47e8-894d-089fe8c6b6c8",
  "name": "Anderson Co.",
  "profile_type": "business",
  "country": "GB",
  "state": "created",
  "created_at": "2017-12-19T18:34:47.348Z",
  "updated_at": "2017-12-19T18:34:47.348Z",
  "accounts": [
    {
      "id": "3342e60b-70c5-4170-b00f-73fee46c93c9",
      "currency": "GBP",
      "type": "revolut"
    },
    {
      "id": "aa70d9be-c851-44ac-abb8-f80ac06bbe37",
      "currency": "USD",
      "type": "revolut"
    },
    {
      "id": "4e32d331-68aa-4e4b-a295-3e3d7625819b",
      "currency": "GBP",
      "type": "external",
      "account_no": "12345678",
      "sort_code": "223344",
      "email": "acm@me.ccq",
      "name": "Acme Corp.",
      "bank_country": "GB",
      "recipient_charges": "no"
    }
  ]
}

This endpoint retrieves a counterparty by ID.

Request

GET https://b2b.revolut.com/api/1.0/counterparty/<id>

URL Parameters
Parameter Description Format
id the ID of the counterparty to retrieve UUID
Response
Field Description Schema
id the ID of the counterparty UUID
name the name of the counterparty Text
phone the phone number of the counterparty Text
profile_type the type of the Revolut profile, business or personal Text
country the bankCountry where the counterparty resides/is registered 2-letter ISO code
state the state of the counterparty, one of created or deleted Text
created_at the instant when the counterparty was created ISO date/time
updated_at the instant when the counterparty was last updated ISO date/time
accounts the list of public accounts of this counterparty JSON array
accounts[n].id the ID of a counterparty's account UUID
accounts[n].currency the currency of a counterparty's account 3-letter ISO currency code
accounts[n].type the type of account, revolut or external Text
accounts[n].account_no bank account number Text
accounts[n].iban IBAN Text
accounts[n].sort_code sort code Text
accounts[n].routing_number routing transit number Text
accounts[n].bic BIC Text
accounts[n].recipient_charges indicates the possibility of the recipient charges: no or expected Text

Get Counterparties

Get a list of counterparties

curl https://sandbox-b2b.revolut.com/api/1.0/counterparties \
  -H "Authorization: Bearer <your access token>"
curl https://b2b.revolut.com/api/1.0/counterparties \
  -H "Authorization: Bearer <your access token>"

Response

[
  {
    "id": "ce851ec3-e018-47e8-894d-089fe8c6b6c8",
    "name": "John Smith",
    "phone": "+441234958298",
    "profile_type": "personal",
    "country": "GB",
    "state": "created",
    "created_at": "2017-12-19T18:34:47.348Z",
    "updated_at": "2017-12-19T18:34:47.348Z"
  },
  {
    "id": "ffff1ec3-e018-47e8-894d-089fe8c6b6c8",
    "name": "Anderson Co.",
    "profile_type": "business",
    "country": "GB",
    "state": "created",
    "created_at": "2017-11-29T18:34:47.348Z",
    "updated_at": "2017-11-29T18:34:47.348Z",
    "accounts": [
      {
        "id": "3342e60b-70c5-4170-b00f-73fee46c93c9",
        "currency": "GBP",
        "type": "revolut"
      },
      {
        "id": "aa70d9be-c851-44ac-abb8-f80ac06bbe37",
        "currency": "USD",
        "type": "revolut"
      },
      {
        "id": "4e32d331-68aa-4e4b-a295-3e3d7625819b",
        "currency": "GBP",
        "type": "external",
        "account_no": "12345678",
        "sort_code": "223344",
        "email": "acm@me.ccq",
        "name": "Acme Corp.",
        "bank_country": "GB",
        "recipient_charges": "no"
      }
    ]
  }
]

This endpoint retrieves all your counterparties.

Request

GET https://b2b.revolut.com/api/1.0/counterparties

Response
Field Description Format
id the ID of the counterparty UUID
name the name of the counterparty Text
phone the phone number of the counterparty Text
profile_type the type of the Revolut profile, business or personal Text
country the bankCountry where the counterparty resides 2-letter ISO code
state the state of the counterparty, one of created or deleted Text
created_at the instant when the counterparty was created ISO date/time
updated_at the instant when the counterparty was last updated ISO date/time
accounts the list of public accounts of this counterparty JSON array
accounts[n].id the ID of a counterparty's account UUID
accounts[n].currency the currency of a counterparty's account 3-letter ISO currency code
accounts[n].type the type of account, revolut or external Text
accounts[n].account_no bank account number Text
accounts[n].iban IBAN Text
accounts[n].sort_code sort code Text
accounts[n].routing_number routing transit number Text
accounts[n].bic BIC Text
accounts[n].recipient_charges indicates the possibility of the recipient charges: no or expected Text

Transfers

OpenAPI Specification

Create transfer

Create transfer

curl -X POST https://sandbox-b2b.revolut.com/api/1.0/transfer \
  -H "Authorization: Bearer <your access token>" \
  --data @- << EOF

{
  "request_id": "e0cbf84637264ee082a848b",
  "source_account_id": "bdab1c20-8d8c-430d-b967-87ac01af060c",
  "target_account_id": "5138z40d1-05bb-49c0-b130-75e8cf2f7693",
  "amount": 123.11,
  "currency": "EUR",
  "description": "Expenses funding"
}

EOF
curl -X POST https://b2b.revolut.com/api/1.0/transfer \
  -H "Authorization: Bearer <your access token>" \
  --data @- << EOF

{
  "request_id": "e0cbf84637264ee082a848b",
  "source_account_id": "bdab1c20-8d8c-430d-b967-87ac01af060c",
  "target_account_id": "5138z40d1-05bb-49c0-b130-75e8cf2f7693",
  "amount": 123.11,
  "currency": "EUR",
  "description": "Expenses funding"
}

EOF

Response

{
  "id": "62b61a4f-fb09-4e87-b0ab-b66c85f5485c",
  "state": "completed",
  "created_at": "2017-06-21T11:22:11.1Z",
  "completed_at": "2017-06-21T11:22:11.1Z"
}

This endpoint processes transfers between accounts of the business with the same currency.

The resulting transaction has type "transfer".

Request

POST https://b2b.revolut.com/api/1.0/transfer

Request fields
Field Description Request Schema
request_id a unique value used to handle duplicates submitted as a result of lost connection or another client error (40 characters max) Yes Text
source_account_id the ID of a source account Yes UUID
target_account_id the ID of a target account Yes UUID
amount the transaction amount Yes Decimal
currency the transaction currency, both source and target accounts should be in this currency Yes 3-letter ISO currency code
reference a textual reference shown on the transaction No Text
Response
Field Description Schema
id the ID of the created transaction UUID
state the transaction state: pending, completed, declined or failed Text
created_at the instant when the transaction was created ISO date/time
completed_at the instant when the transaction was completed ISO date/time

Payments

OpenAPI Specification

All incoming and outgoing payments are represented as transactions and are processed in two stages from the user's perspective:

  1. a new transaction is created,
  2. the created transaction is processed, i.e.

A new transaction has pending state, and a processed transaction's state can be one of completed, failed, reverted or declined.

This however does not apply to Revolut-to-Revolut payments (payments to/from other Revolut accounts), which are executed instantly.

Create Payment

Pay a counterparty

curl -X POST https://sandbox-b2b.revolut.com/api/1.0/pay \
  -H "Authorization: Bearer <your access token>" \
  --data @- << EOF

{
  "request_id": "e0cbf84637264ee082a848b",
  "account_id": "bdab1c20-8d8c-430d-b967-87ac01af060c",
  "receiver": {
    "counterparty_id": "5138z40d1-05bb-49c0-b130-75e8cf2f7693",
    "account_id": "db7c73d3-b0df-4e0e-8a9a-f42aa99f52ab"
  },
  "amount": 123.11,
  "currency": "EUR",
  "reference": "Invoice payment #123"
}

EOF
curl -X POST https://b2b.revolut.com/api/1.0/pay \
  -H "Authorization: Bearer <your access token>" \
  --data @- << EOF

{
  "request_id": "e0cbf84637264ee082a848b",
  "account_id": "bdab1c20-8d8c-430d-b967-87ac01af060c",
  "receiver": {
    "counterparty_id": "5138z40d1-05bb-49c0-b130-75e8cf2f7693",
    "account_id": "db7c73d3-b0df-4e0e-8a9a-f42aa99f52ab"
  },
  "amount": 123.11,
  "currency": "EUR",
  "reference": "Invoice payment #123"
}

EOF

Response for an instantly processed payment:

{
  "id": "d56dd396-523b-4613-8cc7-54974c17bcac",
  "state": "completed",
  "created_at": "2017-10-01T10:10:10.0Z",
  "completed_at": "2017-10-01T10:10:10.0Z"
}

Response for a payment that is processed asynchronously or is scheduled for processing in the future:

{
  "id": "d56dd396-523b-4613-8cc7-54974c17bcac",
  "state": "created",
  "created_at": "2017-10-01T10:10:10.0Z"
}

This endpoint creates a new payment. If the payment is for another Revolut account, business or personal, the transaction may be processed synchronously. Please note that receiver account_id is required only for payments to business counterparties.

Request

POST https://b2b.revolut.com/api/1.0/pay

Request fields
Field Description Format
request_id the client provided ID of the transaction (40 characters max) Text
account_id the ID of the account to pay from UUID
receiver.counterparty_id the ID of the receiving counterparty UUID
receiver.account_id the ID of the receiving counterparty's account, required only for payments to business counterparties, can be own account (only for internal counterparties) UUID
amount the transaction amount Decimal
currency the transaction currency 3-letter ISO currency code
reference an optional textual reference shown on the transaction Text
Response
Field Description Format
id the ID of the created transaction UUID
state the transaction state: pending, completed, declined or failed Text
reason_code reason code for declined or failed transaction state Text
created_at the instant when the transaction was created ISO date/time
completed_at the instant when the transaction was completed ISO date/time

Schedule Payment

Schedule an internal payment

curl -X POST https://sandbox-b2b.revolut.com/api/1.0/pay \
  -H "Authorization: Bearer <your access token>" \
  --data @- << EOF

{
  "request_id": "e0cbf84637264ee082a848b",
  "account_id": "bdab1c20-8d8c-430d-b967-87ac01af060c",
  "receiver": {
    "counterparty_id": "5138z40d1-05bb-49c0-b130-75e8cf2f7693",
    "account_id": "db7c73d3-b0df-4e0e-8a9a-f42aa99f52ab"
  },
  "amount": 123.11,
  "currency": "EUR",
  "reference": "Invoice payment #123",
  "schedule_for": "2017-10-10"
}

EOF
curl -X POST https://b2b.revolut.com/api/1.0/pay \
  -H "Authorization: Bearer <your access token>" \
  --data @- << EOF

{
  "request_id": "e0cbf84637264ee082a848b",
  "account_id": "bdab1c20-8d8c-430d-b967-87ac01af060c",
  "receiver": {
    "counterparty_id": "5138z40d1-05bb-49c0-b130-75e8cf2f7693",
    "account_id": "db7c73d3-b0df-4e0e-8a9a-f42aa99f52ab"
  },
  "amount": 123.11,
  "currency": "EUR",
  "reference": "Invoice payment #123",
  "schedule_for": "2017-10-10"
}

EOF

It is possible to schedule internal payments for up to 30 days ahead. Scheduling external payments is not supported at the moment. Scheduled payments must be in the currency of the account from which you pay. To schedule a future payment, as opposed to immediate execution, just pass an additional field in the POST /pay request:

Field Description Format
schedule_for a future date/time ISO date/time

Get Transaction

Get transaction details

curl https://sandbox-b2b.revolut.com/api/1.0/transaction/e0cbf84637264ee082a848b?id_type=request_id \
  -H "Authorization: Bearer <your access token>"
curl https://b2b.revolut.com/api/1.0/transaction/e0cbf84637264ee082a848b?id_type=request_id \
  -H "Authorization: Bearer <your access token>"

Example response for internal transfer between your accounts:

{
  "id": "62b61a4f-fb09-4e87-b0ab-b66c85f5485c",
  "type": "transfer",
  "request_id": "e0cbf84637264ee082a848b",
  "state": "completed",
  "created_at": "2017-10-10T12:00:00Z",
  "updated_at": "2017-10-10T12:00:10Z",
  "completed_at": "2017-10-10T12:00:10Z",
  "reference": "Expenses funding",
  "legs": [
    {
      "leg_id": "8bf591b9-e802-4e37-a5bb-f870603d8207",
      "account_id": "bdab1c20-8d8c-430d-b967-87ac01af060c",
      "counterparty": {
        "type": "self",
        "account_id": "5138z40d1-05bb-49c0-b130-75e8cf2f7693"
      },
      "amount": -123.11,
      "currency": "EUR",
      "description": "From EUR source",
      "balance": 0
    },
    {
      "leg_id": "516b9146-9264-4bb5-936f-497469b5c44e",
      "account_id": "5138z40d1-05bb-49c0-b130-75e8cf2f7693",
      "counterparty": {
        "type": "self",
        "account_id": "bdab1c20-8d8c-430d-b967-87ac01af060c"
      },
      "amount": 123.11,
      "currency": "EUR",
      "description": "To EUR target",
      "balance": 123.11
    }
  ]
}

Example response for a payment to another Revolut business/user:

{
  "id": "62b61a4f-fb09-4e87-b0ab-b66c85f5485c",
  "type": "transfer",
  "request_id": "e0cbf84637264ee082a848b",
  "state": "completed",
  "created_at": "2017-10-10T12:00:00Z",
  "updated_at": "2017-10-10T12:00:10Z",
  "completed_at": "2017-10-10T12:00:10Z",
  "reference": "Payment for Blows & Wistles Co.",
  "legs": [
    {
      "leg_id": "0485605a-6062-4820-981d-1736f4be0b2c",
      "account_id": "bdab1c20-8d8c-430d-b967-87ac01af060c",
      "counterparty": {
        "id": "5138z40d1-05bb-49c0-b130-75e8cf2f7693",
        "type": "revolut",
        "account_id": "bdab1c20-8d8c-430d-b967-87ac01af060c"
      },
      "amount": -123.11,
      "currency": "EUR",
      "balance": 100
    }
  ]
}

Example response for a cross-currency payment to another Revolut business/user:

{
  "id": "62b61a4f-fb09-4e87-b0ab-b66c85f5485c",
  "type": "transfer",
  "request_id": "e0cbf84637264ee082a848b",
  "state": "completed",
  "created_at": "2017-10-10T12:00:00Z",
  "updated_at": "2017-10-10T12:00:10Z",
  "completed_at": "2017-10-10T12:00:10Z",
  "reference": "Payment for Blows & Wistles Co.",
  "legs": [
    {
      "leg_id": "0485605a-6062-4820-981d-1736f4be0b2c",
      "account_id": "30f892f3-8817-4916-9366-9f835bd456e2",
      "counterparty": {
        "id": "5138z40d1-05bb-49c0-b130-75e8cf2f7693",
        "type": "revolut",
        "account_id": "8057d02f-cd46-49b6-be8c-4ee045c24591"
      },
      "amount": -123.11,
      "currency": "EUR",
      "bill_amount": -108.51,
      "bill_currency": "GBP",
      "balance": 22.5
    }
  ]
}

Example response for a payment to external counterparty:

{
  "id": "62b61a4f-fb09-4e87-b0ab-b66c85f5485c",
  "type": "transfer",
  "request_id": "e0cbf84637264ee082a848b",
  "state": "pending",
  "created_at": "2017-10-10T12:00:00Z",
  "updated_at": "2017-10-10T12:00:10Z",
  "reference": "Payment for Blows & Wistles Co.",
  "legs": [
    {
      "leg_id": "0485605a-6062-4820-981d-1736f4be0b2c",
      "account_id": "bdab1c20-8d8c-430d-b967-87ac01af060c",
      "counterparty": {
        "id": "a1dd617f-45b5-400b-8dd9-8970429d0a3c",
        "type": "external",
        "account_id": "8057d02f-cd46-49b6-be8c-4ee045c24591"
      },
      "amount": -123.11,
      "currency": "EUR",
      "description": "To Blows & Wistles Co.",
      "balance": 10
    }
  ]
}

Example response for a failed transfer:

{
  "id": "62b61a4f-fb09-4e87-b0ab-b66c85f5485c",
  "type": "transfer",
  "request_id": "e0cbf84637264ee082a848b",
  "state": "failed",
  "reason_code": "Account does not exist",
  "created_at": "2017-10-10T12:00:00Z",
  "updated_at": "2017-10-10T12:00:10Z",
  "reference": "Payment for Blows & Wistles Co.",
  "legs": [
    {
      "leg_id": "0485605a-6062-4820-981d-1736f4be0b2c",
      "account_id": "bdab1c20-8d8c-430d-b967-87ac01af060c",
      "counterparty": {
        "id": "5138z40d1-05bb-49c0-b130-75e8cf2f7693",
        "type": "revolut",
        "account_id": "bdab1c20-8d8c-430d-b967-87ac01af060c"
      },
      "amount": -123.11,
      "currency": "EUR",
      "description": "To Blows & Wistles Co."
    }
  ]
}

Example response for card payment:

{
  "id": "3a6b4f0a-1150-4a2c-be71-467811ef93c8",
  "type": "card_payment",
  "state": "completed",
  "created_at": "2017-12-07T15:52:43.245Z",
  "updated_at": "2017-12-07T15:52:43.245Z",
  "completed_at": "2017-12-07T15:52:43.424Z",
  "merchant": {
    "name": "TFL Travel Authorisation",
    "city": "London",
    "category_code": "000",
    "country": "GBR"
  },
  "legs": [
    {
      "leg_id": "cea14fa4-4256-4873-ac2f-c916bf4acce1",
      "account_id": "60879a43-5ad9-497f-a6bc-eb604365c463",
      "amount": -1,
      "currency": "GBP"
    }
  ],
  "card": {
    "card_number": "**** **** **** 8861",
    "first_name": "Jan",
    "last_name": "Smith",
    "phone": "+441234216857"
  }
}

Example response for refund

{
  "id": "6402a0db-1a7a-4523-9625-eb5f7a6cb96f",
  "type": "refund",
  "state": "completed",
  "created_at": "2019-06-06T11:43:45.040769Z",
  "updated_at": "2019-06-06T11:43:45.040769Z",
  "completed_at": "2019-06-06T11:43:45.048483Z",
  "related_transaction_id": "2b9062e2-7209-468a-b93d-f2a3a2965309",
  "legs": [
    {
      "leg_id": "a9e28a1a-216d-43d3-a7e5-b136ee89d28a",
      "account_id": "fb661529-44eb-4da5-8ebf-bdad9e1f2fc0",
      "amount": -15,
      "currency": "GBP",
      "description": "Refund for Fee",
      "balance": 0
    }
  ]
}

This endpoint retrieves transaction details by transaction ID or by request ID. It also allows you to find out more about the transaction, such as cardholder details for card payments.

Request

To retrieve a transaction by ID:

GET https://b2b.revolut.com/api/1.0/transaction/<id>

To retrieve a transaction by request ID:

GET https://b2b.revolut.com/api/1.0/transaction/<request_id>?id_type=request_id

Response
Field Description Schema
id the ID of transaction UUID
type the transaction type, one of atm, card_payment, card_refund, card_chargeback, card_credit, exchange, transfer, loan, fee, refund, topup, topup_return, tax, tax_refund Text
request_id the client provided request ID Text
state the transaction state: pending, completed, declined or failed Text
reason_code reason code for declined or failed transaction state Text
created_at the instant when the transaction was created ISO date/time
updated_at the instant when the transaction was last updated ISO date/time
completed_at the instant when the transaction was completed, mandatory for completed state only ISO date/time
scheduled_for an optional date when the transaction was scheduled for ISO date
related_transaction_id the ID of the original transaction which has been refunded (only for refunds) UUID
merchant the merchant info (only for card payments) Object
merchant.name the merchant name Text
merchant.city the merchant city Text
merchant.category_code the merchant category code Text
merchant.country 3-letter ISO bankCountry code Text
reference a user provided payment reference Text
legs the legs of a transaction, there'll be 2 legs between your Revolut accounts and 1 leg in other cases Array
legs[n].leg_id the ID of the leg UUID
legs[n].amount the transaction amount Decimal
legs[n].currency the transaction currency 3-letter ISO currency code
legs[n].bill_amount the billing amount for cross-currency payments Decimal
legs[n].bill_currency the billing currency for cross-currency payments 3-letter ISO currency code
legs[n].account_id the ID of the account the transaction is associated with UUID
legs[n].counterparty.id the counterparty ID UUID
legs[n].counterparty.account_id the counterparty account ID UUID
legs[n].counterparty.type the type of account: self, revolut, external Text
legs[n].description the transaction leg purpose Text
legs[n].balance a total balance of the account the transaction is associated with (optional) Decimal
card the card information (only for card payments) Object
card.card_number the masked card number Text
card.first_name the cardholder's first name Text
card.last_name the cardholder's last name Text
card.phone the cardholder's phone number Text

Cancel Payment

Cancel a scheduled transaction

curl -X DELETE https://sandbox-b2b.revolut.com/api/1.0/transaction/62b61a4f-fb09-4e87-b0ab-b66c85f5485c \
  -H "Authorization: Bearer <your access token>"
curl -X DELETE https://b2b.revolut.com/api/1.0/transaction/62b61a4f-fb09-4e87-b0ab-b66c85f5485c \
  -H "Authorization: Bearer <your access token>>"

Response

204 No Content

This endpoint allows you to cancel a scheduled transaction that was initiated by you, via API.

Request

DELETE https://b2b.revolut.com/api/1.0/transaction/<id>

URL Parameters
Parameter Description Schema
id the ID of the payment/transaction to cancel UUID

Get Transactions

Get historical transactions list

curl https://sandbox-b2b.revolut.com/api/1.0/transactions? \
  counterparty=5138z40d1-05bb-49c0-b130-75e8cf2f7693 \
  &from=2017-06-01 \
  &to=2017-06-10 \
  &count=10 \
  -H "Authorization: Bearer <your access token>"
curl https://b2b.revolut.com/api/1.0/transactions? \
  counterparty=5138z40d1-05bb-49c0-b130-75e8cf2f7693 \
  &from=2017-06-01 \
  &to=2017-06-10 \
  &count=10 \
  -H "Authorization: Bearer <your access token>"

Response

[
  {
    "id": "62b61a4f-fb09-4e87-b0ab-b66c85f5485c",
    "type": "transfer",
    "request_id": "e0cbf84637264ee082a848b",
    "state": "completed",
    "created_at": "2017-10-10T12:00:00Z",
    "updated_at": "2017-10-10T12:00:10Z",
    "completed_at": "2017-10-10T12:00:10Z",
    "reference": "Payment for Blows & Wistles Co.",
    "legs": [
      {
        "leg_id": "0485605a-6062-4820-981d-1736f4be0b2c",
        "account_id": "bdab1c20-8d8c-430d-b967-87ac01af060c",
        "counterparty": {
          "id": "5138z40d1-05bb-49c0-b130-75e8cf2f7693",
          "type": "revolut",
          "account_id": "bdab1c20-8d8c-430d-b967-87ac01af060c"
        },
        "amount": -123.11,
        "currency": "EUR",
        "description": "To Blows & Wistles Co.",
        "balance": 10
      }
    ]
  },
  {
    "id": "1a23b9e6-17b5-4c40-b346-a7d39e9aafb6",
    "type": "transfer",
    "request_id": "e0cbf84637264ee082a848b",
    "state": "completed",
    "created_at": "2017-10-10T12:00:00Z",
    "updated_at": "2017-10-10T12:00:10Z",
    "completed_at": "2017-10-10T12:00:10Z",
    "reference": "Payment for Blows & Wistles Co.",
    "legs": [
      {
        "leg_id": "0485605a-6062-4820-981d-1736f4be0b2c",
        "account_id": "bdab1c20-8d8c-430d-b967-87ac01af060c",
        "counterparty": {
          "id": "5138z40d1-05bb-49c0-b130-75e8cf2f7693",
          "type": "revolut",
          "account_id": "bdab1c20-8d8c-430d-b967-87ac01af060c"
        },
        "amount": -500.0,
        "currency": "EUR",
        "description": "To Blows & Wistles Co.",
        "balance": 50.5
      }
    ]
  },
  {
    "id": "45e8730a-cb70-47fe-8944-0fed870d9586",
    "type": "transfer",
    "request_id": "e0cbf84637264ee082a848b",
    "state": "pending",
    "created_at": "2017-10-10T12:00:00Z",
    "updated_at": "2017-10-10T12:00:00Z",
    "scheduled_for": "2017-10-15",
    "reference": "Payment for Blows & Wistles Co.",
    "legs": [
      {
        "leg_id": "704ef03d-4cb3-4027-a7c5-d42f3b60395f",
        "account_id": "bdab1c20-8d8c-430d-b967-87ac01af060c",
        "counterparty": {
          "id": "5138z40d1-05bb-49c0-b130-75e8cf2f7693",
          "type": "revolut",
          "account_id": "bdab1c20-8d8c-430d-b967-87ac01af060c"
        },
        "amount": -43.12,
        "currency": "EUR",
        "description": "To Blows & Wistles Co.",
        "balance": 10.34
      }
    ]
  }
]

This endpoint retrieves historical transactions based on the provided query criteria.

Request

GET https://b2b.revolut.com/api/1.0/transactions

URL Parameters
Parameter Description Required Schema
from timestamp to query from, filtering on the created_at field No ISO date/time
to timestamp to query to, filtering on the created_at field. Default is now No ISO date/time
counterparty counterparty id No UUID
count number of records to return (1000 max, default is 100) No Number
type the transaction type, one of atm, card_payment, card_refund, card_chargeback, card_credit, exchange, transfer, loan, fee, refund, topup, topup_return, tax, tax_refund Yes Text

All filters are optional.

Response
Field Description Schema
id the ID of transaction UUID
type the type of transaction Text
request_id the client provided request ID Text
state the transaction state: pending, completed, declined, failed or reverted Text
reason_code reason code for declined or failed transaction state Text
created_at the instant when the transaction was created ISO date/time
updated_at the instant when the transaction was last updated ISO date/time
completed_at the instant when the transaction was completed, mandatory for completed state only ISO date/time
scheduled_for an optional date when the transaction was scheduled for ISO date
related_transaction_id the ID of the original transaction which has been refunded (only for refunds) UUID
reference a user provided payment reference Text
legs the legs of a transaction, there'll be 2 legs between your Revolut accounts and 1 leg in other cases Array
legs[n].leg_id the ID of the leg UUID
legs[n].amount the transaction amount Decimal
legs[n].currency the transaction currency 3-letter ISO currency code
legs[n].bill_amount the billing amount for cross-currency payments Decimal
legs[n].bill_currency the billing currency for cross-currency payments 3-letter ISO currency code
legs[n].account_id the ID of the account the transaction is associated with UUID
legs[n].counterparty.id the counterparty ID UUID
legs[n].counterparty.account_id the counterparty account ID UUID
legs[n].counterparty.account_type the type of counterparty account: self, revolut, external Text
legs[n].description the transaction leg purpose Text
legs[n].balance a total balance of the account the transaction is associated with (optional) Decimal
card the card information (only for card payments) Object
card.card_number the masked card number Text
card.first_name the cardholder's first name Text
card.last_name the cardholder's last name Text
card.phone the cardholder's phone number Text
Pagination

The endpoint supports time-based pagination. It returns transactions in reverse chronological order (from <= created_at < to) limited to most recent count entities. Thus, to get the next page of results, you should set parameter to with the value of created_at last item of the previous page.

Payment Drafts

OpenAPI Specification

Payment drafts are payments that are not executed immediately, but need to be approved by a business owner/admin first.

Create a Payment Draft

Create a Payment Draft

curl -X POST https://sandbox-b2b.revolut.com/api/1.0/payment-drafts \
  -H "Authorization: Bearer <your access token>" \
  --data @ << EOF

{
  "title": "Title of payment",
  "schedule_for": "2017-10-10",
  "payments": [
    {
      "currency": "EUR",
      "amount": 123,
      "account_id": "db7c73d3-b0df-4e0e-8a9a-f42aa99f52ab",
      "receiver": {
        "counterparty_id": "5138z40d1-05bb-49c0-b130-75e8cf2f7693",
        "account_id": "bdab1c20-8d8c-430d-b967-87ac01af060c"
      },
      "reference": "External transfer"
    },
    {
      "currency": "USD",
      "amount": 321,
      "account_id": "db7c73d3-b0df-4e0e-8a9a-f42aa99f52ab",
      "receiver": {
        "counterparty_id": "4e32d331-68aa-4e4b-a295-3e3d7625819b",
        "account_id": "aa70d9be-c851-44ac-abb8-f80ac06bbe37"
      },
      "reference": "Internal business transfer"
    },
    {
      "currency": "GBP",
      "amount": 111,
      "account_id": "db7c73d3-b0df-4e0e-8a9a-f42aa99f52ab",
      "receiver": {
        "counterparty_id": "3342e60b-70c5-4170-b00f-73fee46c93c9"
      },
      "reference": "Internal user transfer"
    }
  ]
}

EOF
curl -X POST https://b2b.revolut.com/api/1.0/payment-drafts \
  -H "Authorization: Bearer <your access token>" \
  --data @ << EOF

{
  "title": "Title of payment",
  "schedule_for": "2017-10-10",
  "payments": [
    {
      "currency": "EUR",
      "amount": 123,
      "account_id": "db7c73d3-b0df-4e0e-8a9a-f42aa99f52ab",
      "receiver": {
        "counterparty_id": "5138z40d1-05bb-49c0-b130-75e8cf2f7693",
        "account_id": "bdab1c20-8d8c-430d-b967-87ac01af060c"
      },
      "reference": "External transfer"
    },
    {
      "currency": "USD",
      "amount": 321,
      "account_id": "db7c73d3-b0df-4e0e-8a9a-f42aa99f52ab",
      "receiver": {
        "counterparty_id": "4e32d331-68aa-4e4b-a295-3e3d7625819b",
        "account_id": "aa70d9be-c851-44ac-abb8-f80ac06bbe37"
      },
      "reference": "Internal business transfer"
    },
    {
      "currency": "GBP",
      "amount": 111,
      "account_id": "db7c73d3-b0df-4e0e-8a9a-f42aa99f52ab",
      "receiver": {
        "counterparty_id": "3342e60b-70c5-4170-b00f-73fee46c93c9"
      },
      "reference": "Internal user transfer"
    }
  ]
}

EOF

Response

{
  "id": "d56dd396-523b-4613-8cc7-54974c17bcac"
}
Request

POST https://b2b.revolut.com/api/1.0/payment-drafts

Request fields
Field Description Schema
title an optional title of payment Text
schedule_for an optional future date/time ISO date/time
payments a list of planned transactions array of json
payments[n].account_id the ID of the account to pay from (must be the same for all payments json) UUID
payments[n].receiver.counterparty_id the ID of the receiving counterparty UUID
payments[n].receiver.account_id an optional ID of the receiving counterparty's account, can be own account (only for internal counterparties) UUID
payments[n].amount the transaction amount Decimal
payments[n].currency the transaction currency 3-letter ISO currency code
payments[n].reference a mandatory textual reference shown on the transaction Text
Response
Field Description Schema
id the ID of the created draft payment UUID

Get Payment Drafts

Get a list of non-processed payment drafts

curl https://sandbox-b2b.revolut.com/api/1.0/payment-drafts \
  -H "Authorization: Bearer <your access token>"
curl https://b2b.revolut.com/api/1.0/payment-drafts \
  -H "Authorization: Bearer <your access token>"

Response

{
  "payment_orders": [
    {
      "id": "d56dd396-523b-4613-8cc7-54974c17bcac",
      "scheduled_for": "2017-10-10",
      "title": "Title of payment",
      "payments_count": 3
    }
  ]
}

This endpoint returns all created payment drafts, which were not processed.

Request

GET https://b2b.revolut.com/api/1.0/payment-drafts

Response
Field Description Schema
payment_orders a list of payments array of json
payment_orders[n].id the ID of the draft payment UUID
payment_orders[n].scheduled_for an optional future date/time ISO date/time
payment_orders[n].title an optional title of payment Text
payment_orders[n].payments_count count of payments in current draft Integer
Get Payment Draft by ID

Get Payment Draft details

curl https://sandbox-b2b.revolut.com/api/1.0/payment-drafts/<id> \
  -H "Authorization: Bearer <your access token>"
curl -X GET https://b2b.revolut.com/api/1.0/payment-drafts/<id> \
  -H "Authorization: Bearer <your access token>"

Response

{
  "scheduled_for": "2017-10-10",
  "title": "Title of payment",
  "payments": [
    {
      "id": "62b61a4f-fb09-4e87-b0ab-b66c85f5485c",
      "amount": {
        "amount": 123,
        "currency": "GBP"
      },
      "account_id": "db7c73d3-b0df-4e0e-8a9a-f42aa99f52ab",
      "reference": "External transfer",
      "receiver": {
        "counterparty_id": "5138z40d1-05bb-49c0-b130-75e8cf2f7693",
        "account_id": "bdab1c20-8d8c-430d-b967-87ac01af060c"
      },
      "state": "CREATED",
      "reason": "Suspicious activity",
      "error_message": "Unable to create transaction",
      "current_charge_options": {
        "from": {
          "amount": 123,
          "currency": "GBP"
        },
        "to": {
          "amount": 123,
          "currency": "GBP"
        },
        "rate": "1.0000",
        "fee": {
          "amount": 0,
          "currency": "GBP"
        }
      }
    }
  ]
}
Request

GET https://b2b.revolut.com/api/1.0/payment-drafts/<id>

URL Parameters

Parameter Description Required Schema
id the ID of the payment draft Yes UUID
Response
Field Description Schema
scheduled_for an optional future date/time ISO date/time
title an optional title of payment Textid
payments a list of payments array of json
payments[n].amount.amount the transaction amount Decimal
payments[n].amount.currency the transaction currency 3-letter ISO currency code
payments[n].account_id the ID of the account to pay from UUID
payments[n].reference an optional textual reference shown on the transaction Text
payments[n].receiver.counterparty_id the ID of the receiving counterparty UUID
payments[n].receiver.account_id an optional ID of the receiving counterparty's account, can be own account (only for internal counterparties) UUID
payments[n].state the state of the transaction, one of CREATED, PENDING, COMPLETED, REVERTED, DECLINED, CANCELLED, FAILED, DELETED Text
payments[n].reason an optional textual description of state reason Text
payments[n].error_message an optional textual description of error Text
payments[n].current_charge_options explanation of conversation process json
Delete Payment Draft

Delete payment draft

curl -X DELETE https://sandbox-b2b.revolut.com/api/1.0/payment-drafts/<id> \
  -H "Authorization: Bearer <your access token>"
curl -X DELETE https://b2b.revolut.com/api/1.0/payment-drafts/<id> \
  -H "Authorization: Bearer <your access token>"

Response

204 No Content

This endpoint deletes a payment draft with the given ID. Payment draft may be deleted only if it was not processed.

Request

DELETE https://b2b.revolut.com/api/1.0/payment-drafts/<id>

URL Parameters

Parameter Description Required Schema
id the ID of the payment draft to delete Yes UUID

Exchanges

OpenAPI Specification

Get exchange rates

Get exchange rates

curl https://sandbox-b2b.revolut.com/api/1.0/rate?from=USD&to=EUR&amount=100 \
  -H "Authorization: Bearer <your access token>"
curl https://b2b.revolut.com/api/1.0/rate?from=USD&to=EUR&amount=100 \
  -H "Authorization: Bearer <your access token>"

Response

{
  "from": {
    "amount": 100,
    "currency": "USD"
  },
  "to": {
    "amount": 78.9,
    "currency": "EUR"
  },
  "rate": 0.789,
  "fee": {
    "amount": 0.85,
    "currency": "EUR"
  },
  "rate_date": "2019-01-16T13:01:47.229Z"
}
Request

GET https://b2b.revolut.com/api/1.0/rate?from=<currency>&to=<currency>&amount=<amount>

GET parameters
Field Description Required Schema
from the currency you would like to exchange from Yes 3-letter ISO currency code
to the currency you would like to exchange to Yes 3-letter ISO currency code
amount exchange amount, default is 1.00 Yes Decimal
Response
Field Description Schema
from information about the currency to exchange from Object
from.amount amount of "sold "currency Decimal
from.currency the currency to exchange from 3-letter ISO currency code
to information about the currency to exchange to Object
to.amount amount of "bought" currency Decimal
to.currency the currency to exchange to 3-letter ISO currency code
rate exchange rate Decimal
fee fee for the operation Object
fee.amount amount of fee Decimal
fee.currency fee currency 3-letter ISO currency code
rate_date date of proposed exchange rate ISO date/time

Exchange currency

Make an exchange

curl -X POST https://sandbox-b2b.revolut.com/api/1.0/exchange \
  -H "Authorization: Bearer <your access token>" \
  --data @- << EOF

{
  "from": {
    "account_id": "d56dd396-523b-4613-8cc7-54974c17bcac",
    "currency": "USD",
    "amount": 135.5
  },
  "to": {
    "account_id": "a44dd365-523b-4613-8457-54974c8cc7ac",
    "currency": "EUR"
  },
  "reference": "Time to sell",
  "request_id": "e0cbf84637264ee082a848b"
}

EOF
curl -X POST https://b2b.revolut.com/api/1.0/exchange \
  -H "Authorization: Bearer <your access token>" \
  --data @- << EOF

{
  "from": {
    "account_id": "d56dd396-523b-4613-8cc7-54974c17bcac",
    "currency": "USD",
    "amount": 135.5
  },
  "to": {
    "account_id": "a44dd365-523b-4613-8457-54974c8cc7ac",
    "currency": "EUR"
  },
  "reference": "Time to sell",
  "request_id": "e0cbf84637264ee082a848b"
}

EOF

Response

{
  "id": "d56d5596-523b-4613-2cc7-54974a37bcac",
  "state": "completed",
  "created_at": "2018-10-01T10:10:10.0Z",
  "completed_at": "2018-10-01T10:10:10.0Z"
}

There are two ways of using this endpoint:

  1. If you know the amount of currency you want to sell (e.g: exchange 135.5 USD to some EUR), then you should specify the amount in the from object (see example on the right).

  2. If, on the other hand, you want to specify the amount of currency to buy (e.g: exchange some USD to receive 200 EUR), then you should specify the amount in the to object.

To check the exchange rate and fees for the operation, please use the /rate endpoint.

Request

POST https://b2b.revolut.com/api/1.0/exchange

Request fields
Field Description Required Schema
from information about the account you want to exchange from Yes Object
from.account_id the account ID Yes UUID
from.currency currency to exchange from Yes 3-letter ISO currency code
from.amount amount to sell No Decimal
to information about the account you want to exchange to Yes Object
to.account_id the account ID Yes UUID
to.currency currency to exchange to Yes 3-letter ISO currency code
to.amount amount to buy No Decimal
reference a user-provided exchange reference Yes Text
request_id a unique value used to handle duplicates submitted as a result of lost connection or another client error (40 characters max) Yes Text
Response
Field Description Schema
id the ID of transaction UUID
type is always exchange Text
reason_code reason code for declined or failed transaction state Text
created_at the instant when the transaction was created ISO date/time
completed_at the instant when the transaction was completed ISO date/time

Errors

The API uses the following error codes:

CODE MEANING
400 Bad Request -- Your request is invalid.
401 Unauthorized -- Your access token is wrong.
403 Forbidden -- Access to the requested resource or action is forbidden.
404 Not Found -- The requested resource could not be found.
405 Method Not Allowed -- You tried to access an endpoint with an invalid method.
406 Not Acceptable -- You requested a format that isn't JSON.
429 Too Many Requests -- You're sending too many requests.
500 Internal Server Error -- We had a problem with our server. Try again later.
503 Service Unavailable -- We're temporarily offline for maintenance. Please try again later.