NAV Navbar

Business API

Getting started

Overview

Welcome to the Revolut Business Open API! Here you will find all the information 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 business that want to automate their own business accounts as much as possible.

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

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.

Sandbox environment

The sandbox environment is a 1-to-1 mirror of production to make it easier for you to start working with the API. A sandbox account replicates the same functionalities as a real business account, but with mock data in a simulated environment. This means you don't need to open a business account to start using the API to experience the same functionality.

You can sign up for a sandbox account following a similar process as for a regular business account.

Guides

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

In brief, a JWT is an encrypted JSON object made up of the following components:

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 Format
alg "RS256" Text
typ "JWT" Text

Payload - base64-encoded content

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

Signature - base64-encoded private key

To test the validity of your JWT, you can use an online tool such as jwt.io.

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 popup 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 step 5, 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

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 Format
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 Format
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 Format
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 Format
client_id your app ID Text
response_type "code" indicates we expect to receive a request token in the response 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 Text
scope one or more of READ and WRITE. For security reasons, these must be among those requested during app creation. Text
Response
Field Description Format
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 Format
grant_type "authorization_code" Text
code an authorisation code Text
client_id your app ID Text
client_assertion_type "urn:ietf:params:oauth:client-assertion-type:jwt-bearer" Text
client_assertion Your generated JWT token Text
Response
Field Description Format
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 Format
grant_type "refresh_token" Text
refresh_token a refresh token Text
client_id your app ID Text
client_assertion_type "urn:ietf:params:oauth:client-assertion-type:jwt-bearer" Text
client_assertion Your generated JWT token Text
Response
Field Description Format
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 Format
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 Format
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 Format
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 Format
profile_type the type of the Revolut profile, business or personal Text
name an optional name. Provide only with personal profile_type Text
phone an optional phone number of the counterparty. Provide only with personal profile_type. 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. Email
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
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 Format
company_name an optional name of the external company counterparty, this field must exist when individual_name does not Text
individual_name.first_name an optional first name of the external individual counterparty, this field must exist when company_name does not Text
individual_name.last_name an optional last name of the external individual counterparty, this field must exist when company_name does not Text
bank_country the country of the bank 2-letter ISO code
currency the currency of a counterparty's account 3-letter ISO currency code
email an optional email address of the beneficiary Email
phone an optional phone number of the beneficiary An international phone number, starting with +
address.street_line1 an optional line 1 of the counterparty’s address Text
address.street_line2 an optional line 2 of the counterparty’s address Text
address.region an optional region of the counterparty Text
address.city an optional city of the counterparty Text
address.country an optional bankCountry of the counterparty 2-letter ISO code
address.postcode an optional postal code of the counterparty Text
Required fields for UK GBP accounts:
Field Description Format
account_no bank account number Text
sort_code sort code Text
Required fields for US USD accounts:
Field Description Format
account_no bank account number Text
routing_number routing transit number Text
Required fields for IBAN countries:
Field Description Format
iban IBAN Text
bic BIC Text
Required fields for SWIFT:
Field Description Format
account_no bank account number Text
bic bank BIC Text
Required fields for SWIFT MX:
Field Description Format
clabe CLABE Text
bic bank BIC 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 Format
id the ID of the counterparty to delete 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 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/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 Format
request_id a unique value used to handle duplicates submitted as a result of lost connection or another client error (40 characters max) Text
source_account_id the ID of a source account UUID
target_account_id the ID of a target account UUID
amount the transaction amount Decimal
currency the transaction currency, both source and target accounts should be in this 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
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 Format
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 Format
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 Format
from an optional timestamp to query from, filtering on the created_at field ISO date/time
to an optional timestamp to query to, filtering on the created_at field. Default is now ISO date/time
counterparty an optional counterparty id UUID
count an optional number of records to return (1000 max, default is 100) 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 Text

All filters are optional.

Response
Field Description Format
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 Format
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 Format
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 Format
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 Format
id the ID of the payment draft UUID
Response
Field Description Format
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 Format
id the ID of the payment draft to delete 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 Format
from the currency you would like to exchange from 3-letter ISO currency code
to the currency you would like to exchange to 3-letter ISO currency code
amount exchange amount, default is 1.00 Decimal
Response
Field Description Format
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 Format
from information about the account you want to exchange from Object
from.account_id the account ID UUID
from.currency currency to exchange from 3-letter ISO currency code
from.amount amount to sell (optional) Decimal
to information about the account you want to exchange to Object
to.account_id the account ID UUID
to.currency currency to exchange to 3-letter ISO currency code
to.amount amount to buy (optional) Decimal
reference a user-provided exchange reference Text
request_id a unique value used to handle duplicates submitted as a result of lost connection or another client error (40 characters max) Text
Response
Field Description Format
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.