NAV Navbar
sandbox production
  • Getting started
  • Authentication
  • OAuth
  • Accounts
  • Counterparties
  • Transfers
  • Payments
  • Payment Drafts
  • Exchanges
  • Web-hooks
  • Errors
  • Getting started

    Introduction

    Welcome to the Revolut for Business Open API!
    Here you will find all the information to get started with our API. We're building a future beyond banking, we're excited to have you onboard.

    You can use the Open API to automate your own business financial operations. This means you will be able to only access your own Revolut for Business account.

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

    To help you navigate the docs, this page is split into 3 vertical sections:

    Usage and limits

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

    Due to the recent PSD2 SCA regulations, 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.

    Demo account

    In order to make it easier for you to start working with the API, we've created a sandbox: a test account that replicates the same functionalities as a real business account, but with fake data. This means you don't need to open a business account to start using the API and, more importantly, you won't risk accidentally transferring real money to the wrong person.
    Sign up for a demo account here: https://sandbox-business.revolut.com

    Authentication

    Setting up access to your Business account

    You will need to authorize the API to access your Revolut for Business account. You can do this via the API settings page in the Revolut for 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. Find it here. Please note this will only work in the Sandbox environment.

    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
    
    openssl genrsa -out privatekey.pem 1024
    openssl req -new -x509 -key privatekey.pem -out publickey.cer -days 1825
    

    Step 1: Generate a pair of public/private keys

    To get started with creating a public/private key-pair we recommend the use of OpenSSL.

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

    Windows users Download OpenSSL for Windows

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

    Step 2: Upload your public key

    This is simple. Head over to your Revolut for Bussiness account API settings, click on "Setup API Access", 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.

    Step 3: Sign 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.

    Step 3: Authorise 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 wil 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.

    Step 4: Request a reusable access token

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

    See more here about token exchange endpoint and its parameters

    Step 5: You are ready to go!

    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.

    Step 6: Refreshing the access token

    After step 4, 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. You can do this for 90 days, after which you will need to repeat the authorisation process (from Step 3), as required by the PSD2 regulations.

    Check the corresponding endpoint documentation

    OAuth

    Get authorisation code

    # Example URL:
    https://sandbox-business.revolut.com/app-confirm?client_id=rmPBoIc-LR3ObABUn-NKHq6WyEoCr6Lh__DFohuMRVM&redirect_uri=https://myapp.com/authresp
    
    # Example URL:
    https://business.revolut.com/app-confirm?client_id=rmPBoIc-LR3ObABUn-NKHq6WyEoCr6Lh__DFohuMRVM&redirect_uri=https://myapp.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

    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

    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

    Get 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.00,
        "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.00,
        "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, 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

    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.00,
      "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, 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

    curl "https://sandbox-b2b.revolut.com/api/1.0/accounts/df8d6b20-0725-482e-a29e-fb09631480cf/address" \
      -H "Authorization: Bearer <your access token>"
    
    curl "https://b2b.revolut.com/api/1.0/accounts/df8d6b20-0725-482e-a29e-fb09631480cf/address" \
      -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",
            "schemas": [
                "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 the address line 1 of the beneficiary Text
    beneficiary_address.street_line2 the address line 2 of the beneficiary 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

    Before a transfer or payment can be made, you need to add the counterparties with which you intend to transact with.

    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
    
    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",
      "accounts": [
        {
          "id": "7a39e16d-41a6-460f-a7d7-341575037c9d",
          "currency": "GBP",
          "type": "revolut"
        },
        {
          "id": "50de976a-6704-4424-8998-9efc4ef0abf5",
          "currency": "EUR",
          "type": "revolut"
        }
      ]
    }
    

    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
    
    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, 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

    curl -X POST https://sandbox-b2b.revolut.com/api/1.0/counterparty \
      -H "Authorization: Bearer <your access token>" \
      --data @- << 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 address line 1 of the counterparty Text
    address.street_line2 an optional address line 2 of the counterparty Text
    address.region an optional region of the counterparty Text
    address.city an optional city of the counterparty Text
    address.country an optional the 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

    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, 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

    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

    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 for Revolut counterparty:

    {
      "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",
      "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, 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

    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",
        "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"
          }
        ]
      },
      {
        "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": "9988e60b-70c5-4170-b00f-73fee46c93c9",
            "currency": "GBP",
            "type": "revolut"
          }
        ]
      }
    ]
    

    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, 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

    Create transfer

    curl -X POST https://sandbox-b2b.revolut.com/api/1.0/transfer \
      -H "Authorization: Bearer <your access token>" \
      --data @- << 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 transction 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

    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.
      • credit/debit on both sides of transaction if Revolut-to-Revolut,
      • posted to the external payment network (Faster Paymetns, SEPA, SWIFT etc.).

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

    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, provide 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

    curl -X POST https://sandbox-b2b.revolut.com/api/1.0/pay \
      -H "Authorization: Bearer <your access token>" \
      --data @- << 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 an 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

    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 transction 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 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

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

    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.00,
            "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 transction 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 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

    Payment Drafts

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

    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
    
    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
    account_id the ID of the account to pay from (must be the same for all payments json) UUID
    receiver.counterparty_id the ID of the receiving counterparty UUID
    receiver.account_id an optional ID of the receiving counterparty's account, can be own account (only for internal counterparties) UUID
    amount the transaction amount Decimalcurrency
    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

    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
    id the ID of the draft payment UUID
    scheduled_for an optional future date/time ISO date/time
    title an optional title of payment Text
    payments_count count of payments in current draft Integer

    Get Payment Draft by ID

    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 to delete UUID

    Response

    Field Description Format
    scheduled_for an optional future date/time ISO date/time
    title an optional title of payment Textid
    amount.amount the transaction amount Decimal
    amount.currency the transaction currency 3-letter ISO currency code
    account_id the ID of the account to pay from UUID
    reference an optional textual reference shown on the transaction Text
    receiver.counterparty_id the ID of the receiving counterparty UUID
    receiver.account_id an optional ID of the receiving counterparty's account, can be own account (only for internal counterparties) UUID
    state the state of the transaction, one of CREATED, PENDING, COMPLETED, REVERTED, DECLINED, CANCELLED, FAILED, DELETED Text
    reason an optional textual description of state reason Text
    error_message an optional textual description of error Text
    current_charge_options explanation of conversation process json

    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

    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

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

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

    If, on the other hand, you want to specify the amount of currency you want to buy (e.g: I want to exchange 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

    Web-hooks

    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

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

    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

    The example of payload

    {
      "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 transction 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 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

    The example of payload

    {
      "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

    Errors

    The API uses the following error codes:

    Code Meaning
    400 Bad Request -- Your request is invalid.
    401 Unauthorized -- Your API key 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.