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

    Introduction

    Welcome to the Revolut 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.

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

    Usage and limits

    You can use the Open API to:

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

    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

    The Developer Portal

    What is the Developer Portal?

    If you are building a great app or a new product/feature based on Revolut Business, then the Developer Portal is for you.
    The Developer Portal allows you to easily create, manage and distribute apps.
    Apps allow you to ask Revolut users to give you permission to use their account on their behalf. Once you will feel confident enough in your integration, the Developer Portal will allow you to submit and publish your apps and integrations on Revolut Connect.

    Getting started

    You don't need to have a Revolut for Business account in order to start using our API. Simple steps to follow are:

    How do apps work?

    If you have used any public API in the past two years, chances are this will be very familiar to you.

    An app, at it's core, is composed of:

    In order to access a Revolut user account, you'll need to provide your App client_id, App client_secret and a user access token. In this way, we know who you are and that you have users' authorisation to do access their data. (See Authorisation flows below)

    In order to receive authorisation for your app, you will need to redirect users to a specific page on the Revolut website, so that we can safely collect their response. After this step, we will redirect the user back to your app, to a url of your choice. This is what the OAuth redirect link is for.

    Permission scopes define what data on the user account your app needs to access. This is important so that users can make an informed choice about whether to authorise your app or not.

    Publishing an app on Revolut Connect

    In order to ensure a healthy developer ecosystem and to safeguard our customers, we defined a staged release process:

    When you feel ready to go to the next step, contact us at business-partners@revolut.com.

    Authentication

    OAuth 2.0 vs API Key

    As it's often the case, you will need to authenticate in order to access the API, so we know you are allowed to access the account you are targeting.
    We currently support two ways of using the API: the API-key (to access your own account) and OAuth (for both private and public use). In this guide, we will explain the differences between the two systems and how to set them up.

    One important note though is that no matter what authentication method you choose, the API remains (mostly) the same. In the following sections, whenever you see the mention <your access token>, this means that:

    You can create a Sandbox account here: https://sandbox-business.revolut.com

    API-keys

    Pass your API-key in all API requests as a header

    GET /api/1.0/accounts HTTP/1.1
    Authorization: Bearer <your API-key>
    

    If you are planning to use the API only to access your own account, you can alternatively use the API Keys authentication system. In this case, you don't need to sign up to the Developer Portal and don't need to create an app.

    Although API keys are slightly simpler to start with, they expose you to potential risks. Accidentally sharing or leaking your production account API key means that anyone with the key can access your account and transfer money out of it.

    Once you sign up for your Revolut Business account on business.revolut.com, you will be issued with a production API-key. Account owners can find these keys in the "settings" section of the web interface. When creating a Demo account on sandbox-business.revolut.com, you will be issued with a sandbox API-key.

    For additional security you can add an optional IP address whitelist for the API. The account owner can do this within the settings section of the Revolut Business portal.

    OAuth authorisation flow

    The Open API allows you to programmatically access users business account information.

    For security reasons, we require apps to ask and be granted permission to access any given business account (even if it's your own). This is done using the industry-standard protocol called OAuth 2.0.

    This is how our authorisation flow works: OAuth authorisation flow

    Step 1-2: Redirect user to Connect

    Example of an authorisation url:

    https://sandbox-business.revolut.com/app-confirm?client_id=rmPBoIc-LR3ObABUn-NKHq6WyEoCr6Lh__DFohuMRVM&redirect_uri=https://myapp.com/authresp
    
    https://business.revolut.com/app-confirm?client_id=rmPBoIc-LR3ObABUn-NKHq6WyEoCr6Lh__DFohuMRVM&redirect_uri=https://myapp.com/authresp
    

    In order to get authorization from the user to use your app, you need to redirect them to a special authorisation page on Revolut's website, through a button or link on your app/website. The authorisation url is unique to each app.

    For example, as the user clicks on the "Connect" button on your app page, she is redirected to the url on the right.

    See the next section for more information on authentication endpoints and parameters.

    Step 3-4: User authorisation

    This is what users will see when you app asks for authorisation to access their accounts.

    App authorization popup

    The user will be informed of all the access scopes required by your app and will authorise it (or not).

    Upon completion, we will redirect the user to the redirect_uri you provided. For security, the redirect URI must match one of the redirect URIs you have specified while creating your app. The redirect url will have attached the result of the authorisation and (if successful) an authorisation code.

    Step 5: Request a reusable access token

    Exchanging an authorisation code for an access token

    Once you have received the authorisation code, you can exchange it for a long-term reusable access token. This process is invisible to the user and happens via the API call on the right.

    See more here about token exchange endpoint and its parameters

    Step 6: 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 7*: Refreshing the access token

    You may refresh your access token after it's expiration using your refresh_token obtained on a previous step.

    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_secret=lCnrXpymR5kty4AGcsFA_pTqF9tayfRDLQ-Cbq37Qwg"
    
    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_secret=lCnrXpymR5kty4AGcsFA_pTqF9tayfRDLQ-Cbq37Qwg"
    

    Response:

      {
        "access_token": "oa_sand_rPo9OmbMAuguhQffR6RLR4nvmzpx4NJtpdyvGKkrS3U",
        "token_type": "bearer",
        "expires_in": 604800,
        "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_secret your app secret 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_secret=lCnrXpymR5kty4AGcsFA_pTqF9tayfRDLQ-Cbq37Qwg"
    
    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_secret=lCnrXpymR5kty4AGcsFA_pTqF9tayfRDLQ-Cbq37Qwg"
    

    Response:

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

    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_secret your app secret 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

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

    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
    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": "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": -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 ISO date/time
    to an optional timestamp to query to, 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 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
    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

    Payment Drafts

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

    Create 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"
    }
    

    Limit of exchange operations - 14 per day.

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