NAV Navbar
shell

TransferWise API

Base URL Sandbox

https://api.sandbox.transferwise.tech

Base URL LIVE

https://api.transferwise.com

Welcome to the TransferWise API documentation. You can explore the different ways to use our API and choose the right one for you below.

TransferWise Payouts and Account Automation

This lets you to automate how you use your TransferWise account. You can automate payments, connect your business tools, and create ways to manage your finances.

You can:

Our Payouts Guide will help you get started with the technical integration.

Banks

Our bank integration lets banks build TransferWise payments seamlessly into their own desktop and mobile apps. Banks can also build their own native user experience directly onto our API, co-branded with TransferWise.

What are the benefits for my bank?

How does it work?

See what some of our bank partners have to say


Example: the N26 native user experience using TransferWise API

alt text

Please contact bizdev@transferwise.com to get started.

Take a look at our technical integration here – Bank Integration Guide.

Affiliates

When you apply to the TransferWise affiliates program you can get access to our API to help you build your own valuable content for your customers or readers.

The TransferWise API lets you to:

The Affiliates Integration Guide helps you get started with the technical integration.

Connected Applications

With Connected Applications, you can let your customers connect their TransferWise accounts to your product. Say you’re an accounting software – doing this could let your customers automate reconciliation. If you’re a payroll company, you could push customer payments right into TransferWise. Or you could push TransferWise notifications through your app. Whatever you want to build, you likely could!

Unfortunately this functionality isn’t available to everyone yet, but we’re working hard to open it to everyone. To discuss your use case please contact (bizdev@transferwise.com)[mailto:bizdev@transferwise.com].

Third-Party Payouts

Third-Party Payouts allows marketplaces and financial institutions (banks and payment service providers) to use TransferWise as a payout option for their customers. It’s different from Payouts because it doesn’t require you to be the originator of payments. Instead, TransferWise will act as a third-party to your customers when they initiate a payment through your site.

We’re working on making this feature available soon. Please contact bizdev@transferwise.com for more info.

Receive Money

You can receive money to the local bank details that come with your TransferWise account (AUD, EUR, GBP and USD) and reconcile these incoming payments via the API.

We currently don’t offer the option to build TransferWise into your checkout flow as a payment option to receive money. Note though that TransferWise can be added as a payout option on your site for beneficiaries to choose to receive their payout through (to an email or straight to bank account).

TransferWise Payouts Guide

Welcome to the TransferWise payouts API documentation. Before you start coding, please take few moments to review some important information about TransferWise and our API.

Getting started

1. Learn about TransferWise.

TransferWise and its borderless account features and pricing are best explained below.

https://transferwise.com/gb/borderless/pricing

2. Sign up for your TransferWise account, activate your borderless account, and complete verification.

Using the product before integrating with our API will help you understand how our payment flow works. Just follow these four steps.

3. Choose the best tool for you

You don’t necessarily need to integrate with the API to make a large number of payouts. We have two ways you can do it:

API access

curl -X GET https://api.sandbox.transferwise.tech/v1/profiles \
     -H "Authorization: Bearer xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx"

Authentication

Sign up for a developer account and get your personal API token for our sandbox. https://sandbox.transferwise.tech/register

NB! Two factor authentication (2FA) code for sandbox login is 111111.

Your developer account will have some test money that you can use to start making payments in same way as you would in a live environment. You can get your API tokens in the Settings tab of your account page.

Add your API token as header parameter to every request like this:

Authorization: Bearer xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx

Acquiring your API token

Your API tokens section can be found at the bottom of the Settings page inside your TransferWise account. By default, you have no active tokens. You can issue new tokens after enabling 2-step login.

We support tokens of two permission levels:

Issue a Read only token unless you specifically need the capabilities of Full access. Token permission level can be changed after issuance. The lifetime of the token is 10 years.

Keeping your API token safe

Your API tokens should be guarded closely. They represent your identity and authorization and can be used to interact with your TransferWise account on your behalf. Whoever has access to your token can access your account details and history. In the case of a Full access token, they can also send transfers. Once you obtain an API token from us, it is on you to keep it safe.

Below is technical advise and guidance on how to protect your tokens. Not everything may apply to the application you are building and the goal is not to provide a long checklist of things to do. Rather, we attempt to provide generic guidance and best-practices, to send you in the right direction. You will have to do additional research and consider the specific technology and purpose of your application.

Source code

Don't store API tokens as plaintext files in Git

$ git clone https://github.com/mycompany/myapp.git
$ cat myapp.git/apiconfig.json
{
  "token": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",
  "url": "api.transferwise.com"
}

A common mistake made by engineers is storing access tokens in source code, in plaintext - which is then shared in a version control system, sometimes publicly.

When an API token is stored like this, it can be accessed and used by anyone who has access to the source code. Avoid storing secrets in code.

Instead:

Limit permissions of a sensitive configuration file

$ cp .env.sample .env
$ echo .env >> .gitignore
$ chown myapp:root .env && chmod 600 .env

Token lifecycle

If you suspect that your token has leaked, revoke and rotate it. If you accidentally push a token to a remote public repository, rotate it. Quickly deleting an access token from VCS might not be enough - remember that VCS stores historical changes, is distributed and might have automation assigned to new pushes.

Revoke old tokens that you no longer need or use.

During the lifetime of an active token, limit the amount of people and systems who can access it. E-mail inboxes and chat logs are archived and not a secure place to hold tokens. Ideally, your access token would live only in TransferWise systems and your production system(s) that actually need it. You do not need to hold a backup copy of the token, as you can reveal an existing token from your profile settings page.

Encryption

TransferWise API is using HTTPS with >=TLS 1.2. Non-encrypted HTTP connections are not accepted. Do not connect to our API with unencrypted HTTP, as this will transmit your access token in plaintext over the network.

Verifying certificates in client code

<?php
// Secure - this will fail when an invalid HTTPS certificate is returned.
// Such failure is not normal and most likely means there is something
// in-between you and TransferWise, intercepting communications.
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_URL, 'https://api.transferwise.com');


// Insecure - do not do this. This will not validate certificates and
// might leak your access token to an attacker.
// See https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_URL, 'https://api.transferwise.com');

Validate certificates. You should not proceed with a connection when you receive a certificate validation error from TransferWise. Make sure all parts of your application are using encryption and HTTPS and failing when certificate validation fails.

Application design

Secure your application against common security flaws (OWASP Top 10). Think how an attacker could leverage Unrestricted File Upload or Insecure Direct Object Reference to read the contents of your server's environment or config files.

If your application is larger, consider extracting TransferWise-specific functionality into a separate middleware or service layer. This would enable you to move API tokens there, separate from the main application.

Do not store the token in user-accessible code such as browser-side JavaScript or Android apps that can be decompiled. The token should always live server-side, exposing domain-logic via API-s.

If you need to pass the token around via HTTP requests, use HTTP headers or POST body - do not store the token in URI or query parameters. Webservers usually log the URL and browsers pass it between websites via the Referer header.

Limiting token access by IP

You can enhance your integration security by only allowing certain IP addresses to use your API token.

Typically, you would integrate with our API from a set number of fixed IP addresses. Restricting access from all other IPs will make it harder to misuse your API token, should it ever leak. IP whitelisting does not protect against cases where several clients egress from the same whitelisted IP (shared external IP for the office network, an egress proxy in front of all of your servers).

Each token can be limited to single IP addresses, a set of IP addresses or entire IP ranges. You can do this in the API token edit view.

Please note:

If a request is being made using an IP address that is not in the whitelisted IP addresses, the server will respond with a 401 Unauthorized HTTP status code.

TEST and LIVE environments

Please note Sandbox environment is limited. We do not send any emails from it as well as transfer processing is not simulated. Please consider Simulation endpoints to change transfer state after funding.

Get your profile id

Example Request:

curl -X GET https://api.sandbox.transferwise.tech/v1/profiles \
     -H "Authorization: Bearer <your api token>"

Example Response:

[
  {
    "id": 217896,
    "type": "personal",
    "details": {
      "firstName": "Oliver",
      "lastName": "Wilson",
      "dateOfBirth": "1977-07-01",
      "phoneNumber": "+3725064992",
      "avatar": "https://lh6.googleusercontent.com/-XzeFZ2PJE1A/AAAAAAAI/AAAAAAAAAAA/RvuvhXFsqs0/photo.jpg",
      "occupation": null,
      "primaryAddress": 236532
    }
  },
  {
    "id": 220192,
    "type": "business",
    "details": {
      "name": "ABC Logistics Ltd",
      "registrationNumber": "12144939",
      "acn": null,
      "abn": null,
      "arbn": null,
      "companyType": "LIMITED",
      "companyRole": "OWNER",
      "descriptionOfBusiness": "Information and communication",
      "primaryAddress": 240402,
      "webpage": "https://abc-logistics.com"
    }
  }
]

You only need to call this endpoint once to obtain your user profile id. Your personal and business profiles have different IDs. Profile id values are required when making payouts.

It’s recommended to always provide profileId when you’re creating new resources later (Create Quote, Create Recipient Account, Create Transfer). If you omit profileId then resource will by default belong to your personal profile. This might not be your intention, as you most probably want to execute transfers under your business profile.

Request

GET https://api.sandbox.transferwise.tech/v1/profiles

Response

Personal Profile Fields

Field Description Format
id Personal profile id Integer
type Profile type Text
details.firstName Person first name Text
details.lastName Person last name Text
details.dateOfBirth Date of birth "yyyy-mm-dd"
details.phoneNumber Phone number Text
details.avatar Link to avatar image Text
details.occupation Occupation Text
details.primaryAddress Address object id Integer

Business Profile Fields

Field Description Format
id Business profile id Integer
type Profile type Text
details.name Business name Text
details.registrationNumber Business registration number Text
details.acn ACN (only applicable for Australian business) Text
details.abn ABN (only applicable for Australian business) Text
details.arbn ARBN (only applicable for Australian business) Text
details.companyType Company legal type Text
details.companyRole Person's role in the company Text
details.descriptionOfBusiness Business description Text
details.primaryAddress Address object id Integer
details.webpage Webpage URL Text

Create quote

Example Request:

curl -X POST https://api.sandbox.transferwise.tech/v1/quotes \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "source": "EUR",
          "target": "GBP",
          "rateType": "FIXED",
          "targetAmount": 600,
          "type": "BALANCE_PAYOUT"
        }'

Example Response:

{
    "id": 10451930,
    "source": "EUR",
    "target": "GBP",
    "sourceAmount": 663.84,
    "targetAmount": 600.00,
    "type": "BALANCE_PAYOUT",
    "rate": 0.9073,
    "createdTime": "2018-08-27T14:35:44.553Z",
    "createdByUserId": <your user id>,
    "profile": <your profile id>,
    "rateType": "FIXED",
    "deliveryEstimate": "2018-08-27T14:35:44.496Z",
    "fee": 2.34,
    "allowedProfileTypes": [
        "PERSONAL",
        "BUSINESS"
    ],
    "guaranteedTargetAmount": false,
    "ofSourceAmount": true
}

There are four steps to execute payouts:

Step 1: Create a quote

Step 2: Create a recipient account

Step 3: Create a transfer

Step 4: Fund a transfer


Quote fetches current mid-market exchange rate that will be used for your transfer. Quote also calculates our fee and estimated delivery time.

Request

POST https://api.sandbox.transferwise.tech/v1/quotes

Field Description Format
profile Personal or business profile id Text
source Source(send) currency code Text
target Target(receive) currency code Text
rateType Always use constant 'FIXED' Text
targetAmount Amount in target currency Decimal
sourceAmount Amount in source currency.
Either sourceAmount or targetAmount is required, never both.
Decimal
type 'BALANCE_PAYOUT' for payments
'BALANCE_CONVERSION' for conversion between balances
Text

Response

Quote id is needed for creating transfers in step 3.

Field Description Format
id Quote id Integer
source Source(send) currency code Text
target Target(receive) currency code Text
sourceAmount Amount in source currency Decimal
targetAmount Amount in target currency Decimal
type Quote type Text
rate Exchange rate value Decimal
createdTime Quote created timestamp Timestamp
createdByUserId Your used id Integer
profile Personal or business profile id Integer
rateType Always 'FIXED' Text
deliveryEstimate Estimated timestamp when recipient would receive funds, assuming transfer will be created now. Timestamp
fee TransferWise fee in source currency for this payment (deducted from source amount). Decimal
allowedProfileTypes PERSONAL, BUSINESS or both. Specifies which legal entities can use this quote. There are a few currency routes that we don’t support for business customers yet. Text
guaranteedTargetAmount Not relevant for fixed rate quotes. Please ignore. Boolean
ofSourceAmount Not relevant for fixed rate quotes. Please ignore. Boolean

Create recipient account

Example Request (Create GBP recipient):

curl -X POST https://api.sandbox.transferwise.tech/v1/accounts \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "currency": "GBP", 
          "type": "sort_code", 
          "profile": <your profile id>, 
          "accountHolderName": "Ann Johnson",
          "legalType": "PRIVATE",
           "details": { 
              "sortCode": "231470", 
              "accountNumber": "28821822" 
           } 
         }'

Example Response (Create GBP recipient): json { "id": 31273058, "profile": <your profile id>, "accountHolderName": "Ann Johnson", "type": "sort_code", "country": "GB", "currency": "GBP", "details": { "accountNumber": "28821822", "sortCode": "231470" } }

There are four steps to execute payouts:

Step 1: Create a quote

Step 2: Create a recipient account

Step 3: Create a transfer

Step 4: Fund a transfer


Recipient is a person or institution who is the ultimate beneficiary of your payment.

Recipient bank account details are different for different currencies. For example, you only need to know the IBAN number to send payments to most European and Nordic countries. But in order to send money to Canada, you’d need to fill out four fields: You recipient’s institution number, transit number, account number, and account type.

A UK GBP example is provided here. You can find other currency examples in Recipient Accounts section below.

Request

POST https://api.sandbox.transferwise.tech/v1/accounts

Field Description Format
currency 3 character currency code Text
type Recipient type Text
profile Personal or business profile id Integer
accountHolderName Recipient full name Text
legalType Recipient legal type: PRIVATE or BUSINESS Text
details Currency specific fields Group
details.sortCode Recipient bank sort code (GBP example) Text
details.accountNumber Recipient bank account no (GBP example) Text

Response

Recipient id is needed for creating transfers in step 3.

Field Description Format
id recipientAccountId Integer
profile Personal or business profile id Integer
acccountHolderName Recipient full name Text
currency 2 character country code Text
country 3 character currency code Text
type Recipient type Text
details Currency specific fields Group
details.sortCode Recipient bank sort code (GBP example) Text
details.accountNumber Recipient bank account no (GBP example) Text

Send money to email recipient

If you don't know your recipient’s bank account details, you can still send money using their email address. You need to set up email recipient and then TransferWise will collect bank details directly from your recipient.

When you set up the transfer, we’ll email your recipient a secure link to collect their bank account details. Once your recipient provides their bank account details to us, we’re able to complete your transfer.

See below under Recipient Accounts.Create Email Recipients for more details.

Create transfer

Example Request:

curl -X POST https://api.sandbox.transferwise.tech/v1/transfers \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "targetAccount": <recipient account id>,   
          "quote": <quote id>,
          "customerTransactionId": "<the UUID you generated for the transfer attempt>",
          "details" : {
              "reference" : "to my friend",
              "transferPurpose": "verification.transfers.purpose.pay.bills",
              "sourceOfFunds": "verification.source.of.funds.other"
            } 
         }'

Example Response:

{
    "id": 468956,
    "user": <your user id>,
    "targetAccount": <recipient account id>,
    "sourceAccount": null,
    "quote": <quote id>,
    "status": "incoming_payment_waiting",
    "reference": "to my friend",
    "rate": 0.9065,
    "created": "2018-08-28 07:43:55",
    "business": <your business profile id>,
    "transferRequest": null,
    "details": {
        "reference": "to my friend"
    },
    "hasActiveIssues": false,
    "sourceCurrency": "EUR",
    "sourceValue": 661.89,
    "targetCurrency": "GBP",
    "targetValue": 600,
    "customerTransactionId": "bd244a95-dcf8-4c31-aac8-bf5e2f3e54c0"
}

There are four steps to execute payouts:

Step 1: Create a quote

Step 2: Create a recipient account

Step 3: Create a transfer

Step 4: Fund a transfer


A transfer is a payout order you make to a recipient account based on a quote. Once created, a transfer will need to be funded within the next 5 working days, or it’ll automatically get cancelled.

Request

POST https://api.sandbox.transferwise.tech/v1/transfers

Field Description Format
targetAccount Recipient account id. You can create multiple transfers to same recipient account. Integer
quote Quote id. You can only create one transfer per one quote.
You cannot use same quote ID to create multiple transfers.
Integer
customerTransactionId This is required to perform idempotency check to avoid duplicate transfers in case of network failures or timeouts. UUID
details.reference (optional) Recipient will see this reference text in their bank statement. Maximum allowed characters depends on the currency route. Read the Business Payments Tips article for more information. Text
details.transferPurpose (conditionally required) For example when target currency is THB. See more about conditions at Transfers.Requirements Text
details.sourceOfFunds (conditionally required) For example when target currency is USD and transfer amount exceeds 10k. See more about conditions at Transfers.Requirements Text

There are two options to deal with conditionally required fields:

Response

You need to save the transfer id for tracking its status later.

Field Description Format
id Transfer id Integer
user Your user id Integer
targetAccount Recipient account id Integer
sourceAccount Not used Integer
quote Quote id Integer
status Transfer current status Text
reference Deprecated, use details.reference instead Text
rate Exchange rate value Decimal
created Timestamp when transfer was created Timestamp
business Your business profile id Integer
transferRequest Not used Integer
details.reference Payment reference text Text
hasActiveIssues Are there any pending issues which stop executing the transfer? Boolean
sourceCurrency Source currency code Text
sourceValue Transfer amount in source currency Decimal
targetCurrency Target currency code Text
targetValue Transfer amount in target currency Decimal
customerTransactionId UUID format unique identifier assigned by customer. Used for idempotency check purposes. UUID

Avoiding duplicate transfers

We use customerTransactionId field to avoid duplicate transfer requests. When your first call fails (error or timeout) then you should use the same value in customerTransactionId field that you used in the original call when you are submitting a retry message. This way we can treat subsequent retry messages as repeat messages and will not create duplicate transfers to your account.

Fund transfer

Example Request:

curl -X POST https://api.sandbox.transferwise.tech/v1/transfers/{transferId}/payments \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "type": "BALANCE"   
         }'

Example Response:

{
  "type": "BALANCE",
  "status": "COMPLETED",
  "errorCode": null
}

There are four steps to execute payouts:

Step 1: Create a quote

Step 2: Create a recipient account

Step 3: Create a transfer

Step 4: Fund a transfer


This API call is the final step for executing payouts. TransferWise will now debit funds from your borderless account balance and start processing your transfer. If your borderless balance is short of funds then this call will fail with "insufficient funds" error.

Initial developer account has by default plentiful funds available for EUR, USD, GBP, and AUD.
You can add new currencies to your account via the user interface: https://sandbox.transferwise.tech

You can then top up your new currencies by converting funds from other currencies.

Request

POST https://api.sandbox.transferwise.tech/v1/transfers/{transferId}/payments

Use transfer id that you obtained in previous step.

Field Description Format
type "BALANCE".
This indicates that your transfer will be funded from your borderless account balance.
Text

Response

You need to save transfer id for tracking its status later.

Field Description Format
type "BALANCE" Text
status "COMPLETED" or "REJECTED" Text
errorCode Failure reason. For example "balance.payment-option-unavailable" Text

Get transfer delivery time

Example Request:

curl -X GET https://api.sandbox.transferwise.tech/v1/delivery-estimates/{transferId} \
     -H "Authorization: Bearer <your api token>" 

Example Response:

{
   "estimatedDeliveryDate" : "2018-01-10T12:15:00.000+0000"
}

Get the live delivery estimate for a transfer by the transfer ID. The delivery estimate is the time at which we currently expect the transfer to arrive in the beneficiary's bank account. This is not a guaranteed time, but we’re working hard to make these estimates as accurate as possible.

Request

GET https://api.sandbox.transferwise.tech/v1/delivery-estimates/{transferId}

Response

You need to save the transfer id to track its status later.

Field Description Format
estimatedDeliveryDate Estimated time when funds will arrive to recipient's bank account Timestamp

Track transfer status

Example Request:

curl -X GET https://api.sandbox.transferwise.tech/v1/transfers/{transferId} \
     -H "Authorization: Bearer <your api token>" 

Example Response:

{
    "id": 468956,
    "user": <your user id>,
    "targetAccount": <recipient account id>,
    "sourceAccount": null,
    "quote": <quote id>,
    "status": "outgoing_payment_sent",
    "reference": "to my friend",
    "rate": 0.9065,
    "created": "2018-08-28 07:43:55",
    "business": <your business profile id>,
    "transferRequest": null,
    "details": {
        "reference": "to my friend"
    },
    "hasActiveIssues": false,
    "sourceCurrency": "EUR",
    "sourceValue": 661.89,
    "targetCurrency": "GBP",
    "targetValue": 600,
    "customerTransactionId": "bd244a95-dcf8-4c31-aac8-bf5e2f3e54c0"
}

You can check your latest transfer status by polling this endpoint. We’re building webhook notification support us notifying about status changes, but unfortunately this isn’t available yet. Normal state flow of transfers:

Incoming Payment Waiting ⇒ Processing ⇒ Funds Converted ⇒ Outgoing Payment Sent

Outgoing Payment Sent is the final state of the normal flow. If the payment fails, the problematic flow will continue. An example would be if the recipient bank account doesn’t exist or is entered wrong and the payment is returned. Problematic state flow of transfers:

Outgoing Payment Sent ⇒ Bounced Back ⇒ Funds Refunded

Most bounce backs occur within 2-3 business days. However, to be on the safe side, we advise you to check the transfer status for potential bounce backs for 2 weeks.


See below for the full list of transfer statuses and what they mean in the order of occurrence:

Keep in mind the transfer statuses in our API have different names than what you’ll see on our website or app. That’s because we use more consumer friendly language in the front end of our products. For example "Completed" on our website means "outgoing_payment_sent" in the API.



Sandbox limitations

We don't send out email notifications about payment status changes in sandbox.

We don't process payments in sandbox, which means that created payments remain in their first state. You can use Simulation endpoints to change transfer statuses in sandbox.

Check account balance

Example Request:

curl -X GET https://api.sandbox.transferwise.tech/v1/borderless-accounts?profileId={profileId} \
     -H "Authorization: Bearer <your api token>" 

Example Response:

[
    {
        "id": 64,
        "profileId": <your profile id>,
        "recipientId": 13828530,
        "creationTime": "2018-03-14T12:31:15.678Z",
        "modificationTime": "2018-03-19T15:19:42.111Z",
        "active": true,
        "eligible": true,
        "balances": [
            {
                "balanceType": "AVAILABLE",
                "currency": "GBP",
                "amount": {
                    "value": 10999859,
                    "currency": "GBP"
                },
                "reservedAmount": {
                    "value": 0,
                    "currency": "GBP"
                },
                "bankDetails": null
            },
            {
                "balanceType": "AVAILABLE",
                "currency": "EUR",
                "amount": {
                    "value": 9945236.2,
                    "currency": "EUR"
                },
                "reservedAmount": {
                    "value": 0,
                    "currency": "EUR"
                },
                "bankDetails": null
            }
        ]
    }
]

Get available balances for all activated currencies in your account.

Request

GET https://api.sandbox.transferwise.tech/v1/borderless-accounts?profileId={profileId}

Use profile id obtained earlier to make this call.

Response

Field Description Format
id borderlessAccountId Integer
profileId Personal or business profile id Integer
recipientId Recipient id you can use for borderless top up payment order Integer
creationTime Date when balance account was opened Timestamp
modificationTime Date when balance account setup was modified Timestamp
active Is borderless account active or inactive Boolean
eligible Ignore Boolean
balances[n].balanceType AVAILABLE Text
balances[n].currency Currency code Text
balances[n].amount.value Available balance in specified currency Decimal
balances[n].amount.currency Currency code Text
balances[n].reservedAmount.value Reserved amount from your balance Decimal
balances[n].reservedAmount.currency Reserved amount currency code Text
balances[n].bankDetails Your borderless account bank details Group

Get account statement

Example Request:

curl -X GET https://api.sandbox.transferwise.tech/v1/borderless-accounts/{borderlessAccountId}/statement.json?
currency=EUR&intervalStart=2018-03-01T00:00:00.000Z&intervalEnd=2018-03-15T23:59:59.999Z \
     -H "Authorization: Bearer <your api token>" 

Example Response:

{
  "accountHolder": {
    "type": "PERSONAL",
    "address": {
      "addressFirstLine": "Veerenni 24",
      "city": "Tallinn",
      "postCode": "12112",
      "stateCode": "",
      "countryName": "Estonia"
    },
    "firstName": "Oliver",
    "lastName": "Wilson"
  },
  "issuer": {
    "name": "TransferWise Ltd.",
    "firstLine": "56 Shoreditch High Street",
    "city": "London",
    "postCode": "E1 6JJ",
    "stateCode": "",
    "country": "United Kingdom"
  },
  "bankDetails": null,
  "transactions": [
    {
      "type": "DEBIT",
      "date": "2018-04-30T08:47:05.832Z",
      "amount": {
        "value": -7.76,
        "currency": "EUR"
      },
      "totalFees": {
        "value": 0.04,
        "currency": "EUR"
      },
      "details": {
        "type": "CARD",
        "description": "Card transaction of 6.80 GBP issued by Tfl.gov.uk/cp TFL TRAVEL CH",
        "amount": {
          "value": 6.8,
          "currency": "GBP"
        },
        "category": "Transportation Suburban and Loca",
        "merchant": {
          "name": "Tfl.gov.uk/cp",
          "firstLine": null,
          "postCode": "SW1H 0TL  ",
          "city": "TFL TRAVEL CH",
          "state": "   ",
          "country": "GB",
          "category": "Transportation Suburban and Loca"
        }
      },
      "exchangeDetails": {
        "forAmount": {
          "value": 6.8,
          "currency": "GBP"
        },
        "rate": null
      },
      "runningBalance": {
        "value": 16.01,
        "currency": "EUR"
      },
      "referenceNumber": "CARD-249281"
    },
    {
      "type": "CREDIT",
      "date": "2018-04-17T07:47:00.227Z",
      "amount": {
        "value": 200,
        "currency": "EUR"
      },
      "totalFees": {
        "value": 0,
        "currency": "EUR"
      },
      "details": {
        "type": "DEPOSIT",
        "description": "Received money from HEIN LAURI with reference SVWZ+topup card",
        "senderName": "HEIN LAURI",
        "senderAccount": "EE76 1700 0170 0049 6704 ",
        "paymentReference": "SVWZ+topup card"
      },
      "exchangeDetails": null,
      "runningBalance": {
        "value": 207.69,
        "currency": "EUR"
      },
      "referenceNumber": "TRANSFER-34188888"
    },
    {
      "type": "CREDIT",
      "date": "2018-04-10T05:58:34.681Z",
      "amount": {
        "value": 9.94,
        "currency": "EUR"
      },
      "totalFees": {
        "value": 0,
        "currency": "EUR"
      },
      "details": {
        "type": "CONVERSION",
        "description": "Converted 8.69 GBP to 9.94 EUR",
        "sourceAmount": {
          "value": 8.69,
          "currency": "GBP"
        },
        "targetAmount": {
          "value": 9.94,
          "currency": "EUR"
        },
        "fee": {
          "value": 0.03,
          "currency": "GBP"
        },
        "rate": 1.147806
      },
      "exchangeDetails": null,
      "runningBalance": {
        "value": 9.94,
        "currency": "EUR"
      },
      "referenceNumber": "CONVERSION-1511237"
    }
  ],
  "endOfStatementBalance": {
    "value": 9.94,
    "currency": "EUR"
  },
  "query": {
    "intervalStart": "2018-03-01T00:00:00Z",
    "intervalEnd": "2018-04-30T23:59:59.999Z",
    "currency": "EUR",
    "accountId": 64
  }
}

Get borderless account statement for one currency and for specified time range. The period between intervalStart and intervalEnd cannot exceed 3 months.

Request

GET https://api.sandbox.transferwise.tech/v1/borderless-accounts/{borderlessAccountId}/statement.json?

currency=EUR&intervalStart=2018-03-01T00:00:00.000Z&intervalEnd=2018-03-15T23:59:59.999Z

All query parameters are mandatory.

Field Description Format
borderlessAccountId Your borderlessAccountId is included in "Check account balance" response as field "id". Integer
currency Currency code Text
intervalStart Statement start time in UTC time Zulu time. Don't forget the 'Z' at the end.
intervalEnd Statement start time in UTC time Zulu time. Don't forget the 'Z' at the end.

Note that you can also download statements in PDF and CSV formats if you replace statement.json with statement.csv or statement.pdf respectively in the above URL.

Response

Field Description Format
accountHolder.type Account holder type: PERSONAL or BUSINESS Text
accountHolder.address.addressFirstLine Account holder address street Text
accountHolder.address.city Account holder address city Text
accountHolder.address.postCode Account holder address zip code Text
accountHolder.address.stateCode Account holder address state Text
accountHolder.address.countryName Account holder address country Text
accountHolder.firstName Account holder first name Text
accountHolder.lastName Account holder last name Text
issuer.name Account issuer name Text
issuer.firstLine Account issuer address street Text
issuer.city Account issuer address city Text
issuer.postCode Account issuer address zip code Text
issuer.stateCode Account issuer address state Text
issuer.country Account issuer address country Text
bankDetails Your borderless account bank details Group
transactions[n].type DEBIT or CREDIT Text
transactions[n].date Time of transaction Zulu time
transactions[n].amount.value Transaction amount Decimal
transactions[n].amount.currency Transaction currency code Text
transactions[n].totalFees.value Transaction fee amount Decimal
transactions[n].totalFees.currency Transaction fee currency code Text
transactions[n].details.type CARD, CONVERSION, DEPOSIT, TRANSFER, MONEY_ADDED Text
transactions[n].details.description Human readable explanation about the transaction Text
transactions[n].details.amount.value Amount in original currency (card transactions abroad) Decimal
transactions[n].details.amount.currency Original currency code Text
transactions[n].details.sourceAmount.value Amount in source currency (conversions) Decimal
transactions[n].details.sourceAmount.currency Source currency code Text
transactions[n].details.targetAmount.value Amount in target currency (conversions) Decimal
transactions[n].details.targetAmount.currency Target currency code Text
transactions[n].details.fee.value Conversion fee amount Decimal
transactions[n].details.fee.currency Conversion fee currency code Text
transactions[n].details.rate Conversion exchange rate Decimal
transactions[n].details.senderName Deposit sender name Text
transactions[n].details.senderAccount Deposit sender bank account details Text
transactions[n].details.paymentReference Deposit payment reference text Text
transactions[n].details.category Card transaction category Text
transactions[n].details.merchant.name Card transaction merchant name Text
transactions[n].details.merchant.firstLine Merchant address street Text
transactions[n].details.merchant.postCode Merchant address zip code Text
transactions[n].details.merchant.city Merchant address city Text
transactions[n].details.merchant.state Merchant address state Text
transactions[n].details.merchant.country Merchant address country Text
transactions[n].details.merchant.category Merchant category Text
transactions[n].exchangeDetails.forAmount.value Currency exchange amount Decimal
transactions[n].exchangeDetails.forAmount.currency Currency code Text
transactions[n].exchangeDetails.rate Exchange rate Decimal
transactions[n].runningBalance.value Running balance after the transaction Decimal
transactions[n].runningBalance.currency Running balance currency code Text
transactions[n].referenceNumber TransferWise assigned unique transaction reference number Text
endOfStatementBalance.value Closing balance for specified time period Decimal
endOfStatementBalance.currency Closing balance currency code Text
query.intervalStart Query parameter repeated Zulu time
query.intervalEnd Query parameter repeated Zulu time
query.currency Query parameter repeated Text
query.accountId Query parameter repeated Integer

Going live checklist

1. Make your integration bulletproof

2. Open LIVE account

3. Set up security for LIVE environment

4. Do penny testing in LIVE

Bank Integrations Guide

API access

TransferWise uses standard OAuth 2.0 protocol for authentication and authorization.

Once our partnership begins, we’ll send you API access credentials for the sandbox environment consisting of a Client ID and a Client Secret. The credentials are needed to complete the authorisation_code grant type of OAuth 2.0 through which the customer will allow your application to be able to act on their behalf. We also need redirect_url from your technical team so that we can limit our callbacks to only that URL, this is URL that we will forward users to after sucessfully granting your application access to their TransferWise account. Specifying this explicityly makes the integration more secure. OAuth 2.0: The Complete Guide is a great way to refresh your knowledge about the protocol itself.

TEST and LIVE environments

Customized user interface

You will build your TransferWise user experience directly into your mobile and desktop applications.

There are different ways to build the frontend experience, especially when it comes to the sequence of steps in the payment flow. This guide is more like a list of building blocks and ideas for what you can do, rather than a strict step-by-step guide.

For example, you can put sign up/log in step as a first step, then show the currency calculator, and then collect recipient details. Alternatively, you can build it so a user starts from the calculator, then you collect recipient details, and as a last step ask user to sign up/log in.

We have plenty of examples to show you how this has been done by our current parterns and can help you to build a great expereince for your customers.

Building your backend

You should expose an API interanlly for your web and mobile clients to call to provide the required TransferWise features. Your backend system will manage both communication to the TransferWise API and internal operations such as checking a user has sufficient balance to make the requested transfer and triggering the funds to be sent to TransferWise when they confirm a transfer.

You should also store a copy of certain data relating to TransferWise to decrease latency and increase resiliency when users review previous transfers they made or recipients they sent funds to. The extent of what you store will depend on your integration.

You should also build a polling mechansim to periodically update the status of a transfer and its delivery estimate, keeping your user up to date of where their transfer is in the process.

We have a dedicated team focusing on bank partnerships who will help you along the way, sharing knowledge and experience from previous integrations to help you build a robust and highly available system.

Your TransferWise user experience

User onboarding flow

The user onboarding flow consists of these building blocks.
You need to go through this flow only once for each customer before they can set up their first transfer.

Transfer flow

To create transfers on behalf of users you need these building blocks:

Transfer update polling

To keep your users informed of the stateus and edtimated time of arrival of their transfer:

Get user authorization for existing accounts

At a high level there are three steps to gaining access to an existing TransferWise account.

  1. Your app redirects the user to TransferWise authorization webpage, which prompts them to login if necessary.

    https://api.sandbox.transferwise.tech/oauth/authorize?response_type=code&client_id=<your api client id>&redirect_uri=https://www.yourbank.com

  2. The user logs in to TransferWise
  3. The user agrees to provide access, the TransferWise authorization page then redirects user back to your preconfigured url, including a code you can use to geneate user tokens.

    https://www.yourbank.com/?code=[CODE]

These steps are explained in more detail below.

1. Your banking app redirects user to TransferWise authorization webpage

Your webiste or app opens the folowing url in the user's browser.

https://sandbox.transferwise.tech/oauth/authorize?response_type=code&client_id=<your-api-client-id>&redirect_uri=<redirect-uri>

Replace your-api-client-id and redirect-uri with your specific values. The redirect URL should be the address you want the user to return to after the authorization flow, which will have been preconfigured when you requested your API access tokens. This can be different accross the sandbox and production environements and we can update it for you upon reuqest.

You should not use WebView components to show the authorization page to the users because they are not secure and will not allow users to log in to TransferWise with Google, which is an option used by some of our users. Your app should instead open the device's full browser app.

Please note that the URL for the authorization page in sandbox is different than URL for API calls.
In the live environment the api.transferwise.com URL works for the authorization page as well as API calls.

2. The user logs in to TransferWise

Our usual log in screens are presented to the user if they are not already logged in on the browser being used. If enabled for a user they will also be prompted to go through our two-factor authentication procedure.

3. The user agrees to grant access and we forward them to your redirect_url

Once a user gives your banking app authorization to connect to TransferWise and access their data, the user is redirected back to your redirect_url with a generated code query string value. For example

https://www.yourbank.com/?code=[CODE]

Your website or service can then use this code to obtain the access token to act on behalf of the user account.

If you are building your TransferWise integraion as a native mobile phone app then the redirect URL should be able to handle returning the user to the correct place in the app.

Sign up new users via API

If the user doesn't already have a TransferWise account then you can create one for them. The signup with registration code feature lets you create new users directly via an API call, without the need to redirect new users to the TransferWise authorization page. This way new users can complete everything without ever leaving your banking app, making a very streamlined flow.

We can provide this option to banks where we cann create a trusted reliance model on your KYC processes. Please discuss this option with the team supporting your integration.

Existing TransferWise users will always need to be redirected to authorization page flow, you can detect this at the point you attempt to create the user based ont he API response.

Note that these new users have to accept TransferWise Terms and Conditions as part of their sign up process nevertheless. See endpoint Terms and conditions.

Get user tokens

If you are using the first option (get user authorization for existing accounts ) then the next step is to generate tokens so you can call API endpoints on behalf of the user who authorized your banking app. You do this using the access code that was returned to you as a query string parameter in the redirect_uri you provided us.

Example Request:

curl \
-u '[your-api-client-id]:[your-api-client-secret]' \
-d 'grant_type=authorization_code' \
-d 'client_id=[your-api-client-id]' \
-d 'code=[code-from-redirect-uri]' \
-d 'redirect_uri=https://www.yourbank.com' \
'https://api.sandbox.transferwise.tech/oauth/token' 

You will be returned an access token and a refresh token.

Example Response:

  {
    "access_token":"ba8k9935-62f2-475a-60d8-6g45377b4062",
    "token_type":"bearer",
    "refresh_token":"a235uu9c-9azu-4o28-a1kn-e15500o151cx",
    "expires_in": 43199,
    "scope":"transfers"
  }

For calling API endpoints you need to provide the user's access_token in the request's HTTP header in the format Authorization: Bearer <access_token>. Access tokens are short lived for security reasons, they are only valid for 12 hours by default. When they expire you need to use the refresh_token to generate a new access_token.

This means you have to securely store the user's refresh_token in order to geneate a new access_token each time they use your TransferWise integration, or you poll for updated data,

Request

POST https://api.sandbox.transferwise.tech/v1/oauth/token

Use Basic Authentication with your api-client-id/api-client-secret as username/pwd.

Field Description Format
grant_type "authorization_code" Text
client_id your api_client_id Text
code Code provided to you upon redirect back from authorization flow. See step Get user authorization. Text
redirect_uri Redirect page associated with your api client credentials Text

Response

Field Description Format
access_token Access token to be used when calling API endpoints on behalf of user. Valid for 12 hours. uuid
token_type "bearer" Text
refresh_token Refresh token which you need to use in order to request new access_token. The lifetime of refresh tokens is 10 years. uuid
expires_in Expiry time in seconds Integer
scope "transfers" Text

Refresh user access token

Example Request:

      curl \
      'https://api.sandbox.transferwise.tech/oauth/token' \
      -u '[your-api-client-id]:[your-api-client-secret]' \
      -d 'grant_type=refresh_token' \
      -d 'refresh_token=[user's refresh token]'

Example Response:

  {
    "access_token":"be69d566-971e-4e15-9648-85a486195863",
    "token_type":"bearer",
    "refresh_token":"1d0ec7b9-b569-426d-a18d-8dead5b6a3cc",
    "expires_in":43199,
    "scope":"transfers"
  }

Access tokens are valid for 12 hours, so upon expiry you need to use refresh_token to generate new access_token.

In order to maintain an uninterrupted connection, you can request a new access token whenever it’s close to expiring. There is no need to wait for the actual expiration to happen first.

Request

POST https://api.sandbox.transferwise.tech/v1/oauth/token

Use Basic Authentication with your api-client-id/api-client-secret as username/pwd.

Field Description Format
grant_type "refresh_token" Text
refresh_token User's refresh_token obtained in Get user tokens step. uuid

Response

Field Description Format
access_token Access token to be used when calling API endpoints on behalf of user. Valid for 12 hours. uuid
token_type "bearer" Text
refresh_token Refresh token which you need to use in order to request new access_token once the existing one expires uuid
expires_in Expiry time in seconds Integer
scope "transfers" Text

Token Expiry

It is possible that a user's refresh token will become invalid. This could happen for a number of reasons, for example:

Due to this possibility your application should handle a failing refresh token scenario - to do this depends on how you originally gained access to the user.

1. An existing user granted your application access to the account

If you were granted access by an existing user then you should send the user through the same flow as you initially did to generate tokens described in get user authorization for existing accounts.

2. Your application created the user

In the case you created the user using the sign up new users via API flow then the mechanism for regenerating tokens is depenedent on whether the user you created has "reclaimed" their TransferWise account and used our website or apps directly.

If the user has not reclaimed their account then the original registrationCode you generated should still be able to generate new tokens for the user. Because of this you should store this code when alongside the created user ID in your database.

If the previosuly stored token fails with an error code 400 and error:

{
    "error": "invalid_grant",
    "error_description": "Invalid user credentials."
}

In this case you can assume the user has reclaimed the account and push them through the get user authorization for existing accounts flow.

Create personal user profile

When you first get access to a user's TransferWise user account you will cannot predict if they already have submitted thier profile data or not.

User Profiles.List endpoint will give you data for both personal and business profiles, if it exists. This makes it easy to figure out if a user has already set up this data with TransferWise or not. If the user already has a personal profile set up, then you can skip this creation step.

If you are using the sign up new users via API feature then you absolutely need to create personal profile for the user, however it is possible you will also need to do it when getting access to an existing user account.

There are three steps to creating a new personal user profile:

1) Create personal user profile – general data. This includes customer name, date of birth, and phone number.

2) Create personal user profile – address data. Once the general profile information has been saved, you also need to add address information to the personal user profile.

3) Create identification document. Adding identification document (Passport, Drivers License etc ) metadata to user profile. This is an optional step depending on the KYC relationship we have with your bank, please contact the team at TransferWise to discuss further.

Create business user profile

A personal profile has to be created first. You can’t create a business user profile without a personal profile.

Creating a business profile is similar to how you created personal profile. There are two steps:

1) Create business user profile – general data

2) Create business user profile – address data

Currently we do not support a fully automated business onboarding flow over the API - this feature is coming soon, please contact the TransferWise team for more details.

Create quote

Please look at Create quote under Full API Reference.

You need to set quote type as "REGULAR".

Create recipient account

Please look at Create recipient account under Full API Reference.

Create transfer

Please look at Create transfer under Full API Reference.

Fund transfer

Once you have successfully created a transfer via the TransferWise API you should debit the exact source amount from your customer's bank account and send the funds to TransferWise’s local bank account via domestic payment. The details of this bank account will be shared with you by the TransferWise team helping your integration.

In order for us to link this incoming domestic payment with a corresponding transfer order, we need you to use specific text in the "payment reference" field. Calling endpoint Get pay-in methods with quoteId returns you the correct reference text. e.g. quote-1456477 P5472304. We currently drive this behaviour using the second part of this string, starting with P, you should use a regular expression to extract this string to send as the reference, e.g. .*(P\d+), taking the second group.

Track transfer status

Please look at Track transfer status under TransferWise Payouts Guide.

Get updated transfer delivery time estimate

Please look at Get transfer delivery time under TransferWise Payouts Guide.

Going live checklist

1. Make your integration bulletproof

2. Set up security for LIVE environment

3. Do some testing in LIVE

Affiliates Integration Guide

API access

Once you become our affiliate we will send you TransferWise API access credentials: api_client_id & api_client_secret. You can then use these as username and password with Basic Authentication method.

There are two endpoints Exchange Rates.List and Get Temporary Quote which you can call with this authentication method.

TEST and LIVE environments

Get current exchange rates

Example Request (Basic authentication):

curl -X GET "https://api.sandbox.transferwise.tech/v1/rates?source=EUR&target=USD" \
     --user <your api client_id>:<your api client_secret> 

Example Response:

[
    {
        "rate": 1.166,
        "source": "EUR",
        "target": "USD",
        "time": "2018-08-31T10:43:31+0000"
    }
]

GET https://api.sandbox.transferwise.tech/v1/rates?source=EUR&target=USD

TransferWise updates exchange rates in nearly real-time – at least once per minute. This allows you to track and see the current mid-market exchange rate for any currency route.

See more at Exchange Rates.List

Get exchange rate history

Example Request (Basic authentication):

curl -X GET "https://api.sandbox.transferwise.tech/v1/rates?source=EUR&target=USD&from=2018-08-15T00:00:00&to=2018-08-30T23:59:59&group=day" \
     --user <your api client_id>:<your api client_secret> 

Example Response:

[
    {
        "rate": 1.166,
        "source": "EUR",
        "target": "USD",
        "time": "2018-08-15T00:00:00+0000"
    },
    {
        "rate": 1.168,
        "source": "EUR",
        "target": "USD",
        "time": "2018-06-30T00:00:00+0000"
    }
    ...
]

GET https://api.sandbox.transferwise.tech/v1/rates?source=EUR&target=USD&from=2018-08-15T00:00:00&to=2018-08-30T23:59:59&group=day

We expose up to 30 days exchange rate history via our API. This helps you to build an analysis page to show trends and implement an alerting system for your users.

See more at Exchange Rates.List

Get pricing and speed

Example Request (Basic authentication):

curl -X GET https://api.sandbox.transferwise.tech/v1/quotes?source=EUR&target=GBP&rateType=FIXED&targetAmount=600 \
     --user <your api client_id>:<your api client_secret> 

Example Response:

{
    "source": "EUR",
    "target": "GBP",
    "sourceAmount": 663.84,
    "targetAmount": 600.00,
    "type": "REGULAR",
    "rate": 0.9073,
    "createdTime": "2018-08-27T14:35:44.553Z",
    "createdByUserId": 0,
    "rateType": "FIXED",
    "deliveryEstimate": "2018-08-27T14:35:44.496Z",
    "fee": 2.34,
    "allowedProfileTypes": [
        "PERSONAL",
        "BUSINESS"
    ],
    "guaranteedTargetAmount": false,
    "ofSourceAmount": true
}

GET https://api.sandbox.transferwise.tech/v1/quotes?source=EUR&target=GBP&rateType=FIXED&targetAmount=600

Is currency route supported?

If we don't support a route then this endpoint will respond with an error code "error.route.not.supported".

How much does a transfer cost?

The TransferWise fee is included in the response.

How long does my transfer take?

Estimated delivery time is included in the response. This can vary quite a lot for different currency routes. For example transfers often only take a few hours from EUR to GBP, while sending money from USD can take 1-2 business days. This endpoint allows you to find out the estimated delivery time for each currency route.

See more at Get Temporary Quote

Contact Us

Have a technical question about API?
Send email to api@transferwise.com

Making lots of payments?
We have a dedicated team to talk to you. https://transferwise.com/contact-sales

Have a question about how TransferWise works?
Search Transferwise Help Centre. https://transferwise.com/help

Want more information about your payments?
Lookup TransferWise Support Centre details. https://transferwise.com/contact

Full API Reference

Addresses

Create

Example Request:

curl -X POST https://api.sandbox.transferwise.tech/v1/addresses \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "details": {
            "country": "EE",
            "firstLine": "Narva mnt 5-1",
            "postCode": "10113",
            "city": "Tallinn"
          }
        }'

Example Response:

{
  "id": 236532,
  "profile": <your profile id>,
  "details": {
    "country": "EE",
    "firstLine": "Narva mnt 5-1",
    "postCode": "10113",
    "city": "Tallinn",
    "state": "",
    "occupation": null
  }
}

Adds address info to user profile. List of required fields are slightly different for different countries.
For example state field is required for US, CA, BR and AU addresses but not for other countries. Please look at Addresses.Requirements to figure out which fields are required to create addresses in specific country.

Request

POST https://api.sandbox.transferwise.tech/v1/addresses

Field Description Format
profile User profile id. Integer
details.country 2 digit ISO country code. Text
details.firstLine Address line: street, house, apartment. Text
details.postCode Zip code Text
details.city City name Text
details.state State code. Required if country is US, CA, AU, BR Text
details.occupation User occupation. Required for US, CA, JP Text

Response

Field Description Format
id Address id Integer
profile User profile id. Integer
details.country 2 digit ISO country code. Text
details.firstLine Address line: street, house, apartment. Text
details.postCode Zip code Text
details.city City name Text
details.state State code. Required if country is US, CA, AU, BR Text
details.occupation User occupation. Required for US, CA, JP Text

Get By Id

Example Request:

curl -X GET https://api.sandbox.transferwise.tech/v1/addresses/{addressId} \
     -H "Authorization: Bearer <your api token>" 

Example Response:

{
  "id": 236532,
  "profile": <your profile id>,
  "details": {
    "country": "EE",
    "firstLine": "Narva mnt 5-1",
    "postCode": "10113",
    "city": "Tallinn",
    "state": "",
    "occupation": null
  }
}

Get address info by id.

Request

GET https://api.sandbox.transferwise.tech/v1/addresses/{addressId}

List

Example Request:

curl -X GET https://api.sandbox.transferwise.tech/v1/addresses?profile={profileId} \
     -H "Authorization: Bearer <your api token>" 

Example Response:

[
    {
        "id": 7099091,
        "profile": <your profile id>,
        "details": {
            "country": "EE",
            "firstLine": "Veerenni 29",
            "postCode": "12991",
            "city": "Tallinn",
            "state": null,
            "occupation": null
        }
    }
]

List of addresses belonging to user profile.

Request

GET https://api.sandbox.transferwise.tech/v1/addresses?profile={profileId}

Requirements

Example Request:

curl -X GET https://api.sandbox.transferwise.tech/v1/address-requirements \
     -H "Authorization: Bearer <your api token>" 

Example Response:

[
  {
    "type": "address",
    "fields": [
      {
        "name": "Country",
        "group": [
          {
            "key": "country",
            "type": "select",
            "refreshRequirementsOnChange": true,
            "required": true,
            "displayFormat": null,
            "example": "Germany",
            "minLength": null,
            "maxLength": null,
            "validationRegexp": null,
            "validationAsync": null,
            "valuesAllowed": [
              {
                "key": "AX",
                "name": "Åland Islands"
              },
              ...
              {
                "key": "ZM",
                "name": "Zambia"
              }
            ]
          }
        ]
      },
      {
        "name": "City",
        "group": [
          {
            "key": "city",
            "type": "text",
            "refreshRequirementsOnChange": false,
            "required": true,
            "displayFormat": null,
            "example": "London",
            "minLength": null,
            "maxLength": null,
            "validationRegexp": null,
            "validationAsync": null,
            "valuesAllowed": null
          }
        ]
      },
      {
        "name": "Postal code",
        "group": [
          {
            "key": "postCode",
            "type": "text",
            "refreshRequirementsOnChange": false,
            "required": true,
            "displayFormat": null,
            "example": "10025",
            "minLength": null,
            "maxLength": null,
            "validationRegexp": null,
            "validationAsync": null,
            "valuesAllowed": null
          }
        ]
      }
      ...
    ]
  }
]

Request

GET https://api.sandbox.transferwise.tech/v1/address-requirements
POST https://api.sandbox.transferwise.tech/v1/address-requirements

GET and POST address-requirements endpoints help you to figure out which fields are required to create a valid address for different countries. You could even build a dynamic user interface on top of these endpoints. This is a step-by-step guide on how these endpoints work.

  1. Call GET /v1/address-requirements to get list of fields you need to fill with values in "details" section for creating a valid address. Response contains 4 required top level fields:

    • country (select field with list of values)
    • city (text field)
    • postCode (text field)
    • firstLine (text field)
  2. Analyze the list of fields. Because refreshRequirementsOnChange=true for field 'country' then this indicates that there are additional fields required depending on the selected value.

  3. Call POST /v1/address-requirements with selected country value to expose sub fields.
    For example posting {"details": {"country" : "US"}} will also add "state" to list of fields.
    But posting {"details": {"country" : "GB"}} will not.

  4. If you choose "US" as country you will notice that "state" field also has refreshRequirementsOnChange=true. This means you would need to make another POST call to /v1/address-requirements with a specific state value.
    For example posting {"details": { "country" : "US", "state": "AZ" }} will also add "occupation" to list of fields.
    But posting {"details": { "country" : "US", "state": "AL" }} will not.

  5. So once you get to the point where you have provided values for all fields which have refreshRequirementsOnChange=true then you have complete set of fields to compose a valid request to create an address object. For example this is a valid request to create address in US Arizona:
    POST /v1/addresses:
    { "profile" : your-profile-id,
    "details": {
    "country" : "US",
    "state": "AZ",
    "city": "Phoenix",
    "postCode": "10025",
    "firstLine": "50 Sunflower Ave.",
    "occupation": "software engineer"
    } }

Response

Field Description Format
type "address" Text
fields[n].name Field description Text
fields[n].group[n].key Key is name of the field you should include in the JSON Text
fields[n].group[n].type Display type of field (e.g. text, select, etc) Text
fields[n].group[n].refreshRequirementsOnChange Tells you whether you should call POST address-requirements once the field value is set to discover required lower level fields. Boolean
fields[n].group[n].required Indicates if the field is mandatory or not Boolean
fields[n].group[n].displayFormat Display format pattern. Text
fields[n].group[n].example Example value. Text
fields[n].group[n].minLength Min valid length of field value. Integer
fields[n].group[n].maxLength Max valid length of field value. Integer
fields[n].group[n].validationRegexp Regexp validation pattern. Text
fields[n].group[n].validationAsync Validator URL and parameter name you should use when submitting the value for validation Text
fields[n].group[n].valuesAllowed[n].key List of allowed values. Value key Text
fields[n].group[n].valuesAllowed[n].name List of allowed values. Value name. Text

Borderless Accounts

Get Account Balance

Example Request:

curl -X GET https://api.sandbox.transferwise.tech/v1/borderless-accounts?profileId={profileId} \
     -H "Authorization: Bearer <your api token>" 

Example Response:

[
    {
        "id": 64,
        "profileId": <your profile id>,
        "recipientId": 13828530,
        "creationTime": "2018-03-14T12:31:15.678Z",
        "modificationTime": "2018-03-19T15:19:42.111Z",
        "active": true,
        "eligible": true,
        "balances": [
            {
                "balanceType": "AVAILABLE",
                "currency": "GBP",
                "amount": {
                    "value": 10999859,
                    "currency": "GBP"
                },
                "reservedAmount": {
                    "value": 0,
                    "currency": "GBP"
                },
                "bankDetails": null
            },
            {
                "balanceType": "AVAILABLE",
                "currency": "EUR",
                "amount": {
                    "value": 9945236.2,
                    "currency": "EUR"
                },
                "reservedAmount": {
                    "value": 0,
                    "currency": "EUR"
                },
                "bankDetails": {
                    "id": 90,
                    "currency": "EUR",
                    "bankCode": "DEKTDE7GXXX",
                    "accountNumber": "DE51 7001 1110 6050 1008 91",
                    "swift": "DEKTDE7GXXX",
                    "iban": "DE51 7001 1110 6050 0008 91",
                    "bankName": "Handelsbank",
                    "accountHolderName": "Oliver Wilson",
                    "bankAddress": {
                        "addressFirstLine": "Elsenheimer Str. 41",
                        "postCode": "80687",
                        "city": "München",
                        "country": "Germany",
                        "stateCode": null
                    }
                }
            }
        ]
    }
]

Get available balances for all activated currencies in your borderless account.

Request

GET https://api.sandbox.transferwise.tech/v1/borderless-accounts?profileId={profileId}

Use profile id obtained earlier to make this call.

Response

Field Description Format
id Borderless account id Integer
profileId Personal or business profile id Integer
recipientId Recipient id you can use for borderless topup payment order Integer
creationTime Date when balance account was opened Timestamp
modificationTime Date when balance account setup was modified. Timestamp
active Is borderless account active or inactive Boolean
eligible Ignore Boolean
balances[n].balanceType AVAILABLE Text
balances[n].currency Currency code Text
balances[n].amount.value Available balance in specified currency Decimal
balances[n].amount.currency Currency code Text
balances[n].reservedAmount.value Reserved amount from your balance Decimal
balances[n].reservedAmount.currency Reserved amount currency code Text
balances[n].bankDetails Bank account details assigned to your borderless account. Available for EUR, GBP, USD, AUD. Group
balances[n].bankDetails.id Bank account details id Integer
balances[n].bankDetails.currency Bank account currency Text
balances[n].bankDetails.bankCode Bank account code Text
balances[n].bankDetails.accountNumber Bank account number Text
balances[n].bankDetails.swift Bank account swift code Text
balances[n].bankDetails.iban Bank account iban Text
balances[n].bankDetails.bankName Bank name
balances[n].bankDetails.accountHolderName Bank account holder name Text
balances[n].bankDetails.bankAddress.addressFirstLine Bank address street and house Text
balances[n].bankDetails.bankAddress.postCode Bank address zip code Text
balances[n].bankDetails.bankAddress.city Bank address city Text
balances[n].bankDetails.bankAddress.country Bank address country Text
balances[n].bankDetails.bankAddress.stateCode Bank address state code Text

Get Account Statement

Example Request:

curl -X GET https://api.sandbox.transferwise.tech/v1/borderless-accounts/{borderlessAccountId}/statement.json?
currency=EUR&intervalStart=2018-03-01T00:00:00.000Z&intervalEnd=2018-03-15T23:59:59.999Z \
     -H "Authorization: Bearer <your api token>" 

Example Response:

{
  "accountHolder": {
    "type": "PERSONAL",
    "address": {
      "addressFirstLine": "Veerenni 24",
      "city": "Tallinn",
      "postCode": "12112",
      "stateCode": "",
      "countryName": "Estonia"
    },
    "firstName": "Oliver",
    "lastName": "Wilson"
  },
  "issuer": {
    "name": "TransferWise Ltd.",
    "firstLine": "56 Shoreditch High Street",
    "city": "London",
    "postCode": "E1 6JJ",
    "stateCode": "",
    "country": "United Kingdom"
  },
  "bankDetails": null,
  "transactions": [
    {
      "type": "DEBIT",
      "date": "2018-04-30T08:47:05.832Z",
      "amount": {
        "value": -7.76,
        "currency": "EUR"
      },
      "totalFees": {
        "value": 0.04,
        "currency": "EUR"
      },
      "details": {
        "type": "CARD",
        "description": "Card transaction of 6.80 GBP issued by Tfl.gov.uk/cp TFL TRAVEL CH",
        "amount": {
          "value": 6.8,
          "currency": "GBP"
        },
        "category": "Transportation Suburban and Loca",
        "merchant": {
          "name": "Tfl.gov.uk/cp",
          "firstLine": null,
          "postCode": "SW1H 0TL  ",
          "city": "TFL TRAVEL CH",
          "state": "   ",
          "country": "GB",
          "category": "Transportation Suburban and Loca"
        }
      },
      "exchangeDetails": {
        "forAmount": {
          "value": 6.8,
          "currency": "GBP"
        },
        "rate": null
      },
      "runningBalance": {
        "value": 16.01,
        "currency": "EUR"
      },
      "referenceNumber": "CARD-249281"
    },
    {
      "type": "CREDIT",
      "date": "2018-04-17T07:47:00.227Z",
      "amount": {
        "value": 200,
        "currency": "EUR"
      },
      "totalFees": {
        "value": 0,
        "currency": "EUR"
      },
      "details": {
        "type": "DEPOSIT",
        "description": "Received money from HEIN LAURI with reference SVWZ+topup card",
        "senderName": "HEIN LAURI",
        "senderAccount": "EE76 1700 0170 0049 6704 ",
        "paymentReference": "SVWZ+topup card"
      },
      "exchangeDetails": null,
      "runningBalance": {
        "value": 207.69,
        "currency": "EUR"
      },
      "referenceNumber": "TRANSFER-34188888"
    },
    {
      "type": "CREDIT",
      "date": "2018-04-10T05:58:34.681Z",
      "amount": {
        "value": 9.94,
        "currency": "EUR"
      },
      "totalFees": {
        "value": 0,
        "currency": "EUR"
      },
      "details": {
        "type": "CONVERSION",
        "description": "Converted 8.69 GBP to 9.94 EUR",
        "sourceAmount": {
          "value": 8.69,
          "currency": "GBP"
        },
        "targetAmount": {
          "value": 9.94,
          "currency": "EUR"
        },
        "fee": {
          "value": 0.03,
          "currency": "GBP"
        },
        "rate": 1.147806
      },
      "exchangeDetails": null,
      "runningBalance": {
        "value": 9.94,
        "currency": "EUR"
      },
      "referenceNumber": "CONVERSION-1511237"
    }
  ],
  "endOfStatementBalance": {
    "value": 9.94,
    "currency": "EUR"
  },
  "query": {
    "intervalStart": "2018-03-01T00:00:00Z",
    "intervalEnd": "2018-04-30T23:59:59.999Z",
    "currency": "EUR",
    "accountId": 64
  }
}

Get borderless account statement for one currency and for specified time range. The period between intervalStart and intervalEnd cannot exceed 3 months.

Request

GET https://api.sandbox.transferwise.tech/v1/borderless-accounts/{borderlessAccountId}/statement.json?

currency=EUR&intervalStart=2018-03-01T00:00:00.000Z&intervalEnd=2018-03-15T23:59:59.999Z

All query parameters are mandatory.

Field Description Format
borderlessAccountId Your borderlessAccountId is included in Get Account Balance response as field "id". Integer
currency Currency code Text
intervalStart Statement start time in UTC time Zulu time. Don't forget the 'Z' at the end.
intervalEnd Statement start time in UTC time Zulu time. Don't forget the 'Z' at the end.

Note that you can also download statements in PDF and CSV formats if you replace statement.json with statement.csv or statement.pdf respectively in the above URL.

Response

Field Description Format
accountHolder.type Account holder type: PERSONAL or BUSINESS Text
accountHolder.address.addressFirstLine Account holder address street Text
accountHolder.address.city Account holder address city Text
accountHolder.address.postCode Account holder address zipc ode Text
accountHolder.address.stateCode Account holder address state Text
accountHolder.address.countryName Account holder address country Text
accountHolder.firstName Account holder first name Text
accountHolder.lastName Account holder last name Text
issuer.name Account issuer name Text
issuer.firstLine Account issuer address street Text
issuer.city Account issuer address city Text
issuer.postCode Account issuer address zip code Text
issuer.stateCode Account issuer address state Text
issuer.country Account issuer address country Text
bankDetails Your borderless account bank details Group
transactions[n].type DEBIT or CREDIT Text
transactions[n].date Time of transaction Zulu time
transactions[n].amount.value Transaction amount Decimal
transactions[n].amount.currency Transaction currency code Text
transactions[n].totalFees.value Transaction fee amount Decimal
transactions[n].totalFees.currency Transaction fee currency code Text
transactions[n].details.type CARD, CONVERSION, DEPOSIT, TRANSFER, MONEY_ADDED Text
transactions[n].details.description Human readable explanation about the transaction Text
transactions[n].details.amount.value Amount in original currency (card transactions abroad) Decimal
transactions[n].details.amount.currency Original currency code Text
transactions[n].details.sourceAmount.value Amount in source currency (conversions) Decimal
transactions[n].details.sourceAmount.currency Source currency code Text
transactions[n].details.targetAmount.value Amount in target currency (conversions) Decimal
transactions[n].details.targetAmount.currency Target currency code Text
transactions[n].details.fee.value Conversion fee amount Decimal
transactions[n].details.fee.currency Conversion fee currency code Text
transactions[n].details.rate Conversion exchange rate Decimal
transactions[n].details.senderName Deposit sender name Text
transactions[n].details.senderAccount Deposit sender bank account details Text
transactions[n].details.paymentReference Deposit payment reference text Text
transactions[n].details.category Card transaction category Text
transactions[n].details.merchant.name Card transaction merchant name Text
transactions[n].details.merchant.firstLine Merchant address street Text
transactions[n].details.merchant.postCode Merchant address zipcode Text
transactions[n].details.merchant.city Merchant address city Text
transactions[n].details.merchant.state Merchant address state Text
transactions[n].details.merchant.country Merchant address country Text
transactions[n].details.merchant.category Merchant category Text
transactions[n].exchangeDetails.forAmount.value Currency exchange amount Decimal
transactions[n].exchangeDetails.forAmount.currency Currency code Text
transactions[n].exchangeDetails.rate Exchange rate Decimal
transactions[n].runningBalance.value Running balance after the transaction Decimal
transactions[n].runningBalance.currency Running balance currency code Text
transactions[n].referenceNumber TransferWise assigned unique transaction reference number Text
endOfStatementBalance.value Closing balance for specified time period Decimal
endOfStatementBalance.currency Closing balance currency code Text
query.intervalStart Query parameter repeated Zulu time
query.intervalEnd Query parameter repeated Zulu time
query.currency Query parameter repeated Text
query.accountId Query parameter repeated Integer

Convert Currencies

Example Request:

curl -X POST https://api.sandbox.transferwise.tech/v1/borderless-accounts/{borderlessAccountId}/conversions \
     -H "Authorization: Bearer <your api token>"  \
     -H "Content-Type: application/json" \
     -H "X-idempotence-uuid: <your generated uuid> \
     -d '{ 
            "quoteId": <conversion quote id>
         }'

Example Response:

{
  "id": <conversion transaction id>,
  "type": "CONVERSION",
  "state": "COMPLETED",
  "balancesAfter": [
    {
      "value": 10000594.71,
      "currency": "GBP"
    },
    {
      "value": 9998887.01,
      "currency": "EUR"
    }
  ],
  "creationTime": "2017-11-21T09:55:49.275Z",
  "steps": [
    {
      "id": 369588,
      "type": "CONVERSION",
      "creationTime": "2017-11-21T09:55:49.276Z",
      "balancesAfter": [
        {
          "value": 9998887.01,
          "currency": "EUR"
        },
        {
          "value": 10000594.71,
          "currency": "GBP"
        }
      ],
      "channelName": null,
      "channelReferenceId": null,
      "tracingReferenceCode": null,
      "sourceAmount": {
        "value": 113.48,
        "currency": "EUR"
      },
      "targetAmount": {
        "value": 100,
        "currency": "GBP"
      },
      "fee": {
        "value": 0.56,
        "currency": "EUR"
      },
      "rate": 0.88558
    }
  ],
  "sourceAmount": {
    "value": 113.48,
    "currency": "EUR"
  },
  "targetAmount": {
    "value": 100,
    "currency": "GBP"
  },
  "rate": 0.88558,
  "feeAmounts": [
    {
      "value": 0.56,
      "currency": "EUR"
    }
  ]
}

Convert funds between your borderless account currencies. Quote which is used in this call must have type "BALANCE_CONVERSION".

Note that this call needs an extra field in header called "X-idempotence-uuid".

Request

POST https://api.sandbox.transferwise.tech/v1/borderless-accounts/{borderlessAccountId}/conversions

Field Description Format
borderlessAccountId Your borderlessAccountId is included in Get Account Balance response as field "id". Integer
X-idempotence-uuid Unique identifier assinged by you. Used for idempotency check purposes. Should your call fail for technical reasons then you can use the same value again for making retry call. UUID

Get Available Currencies

Example Request:

curl -X GET https://api.sandbox.transferwise.tech/v1/borderless-accounts/balance-currencies \
     -H "Authorization: Bearer <your api token>" 

Example Response:

[
    {
        "code": "EUR",
        "hasBankDetails": true,
        "payInAllowed": true,
        "sampleBankDetails": null
    },
    {
        "code": "GBP",
        "hasBankDetails": true,
        "payInAllowed": true,
        "sampleBankDetails": null
    },
    {
        "code": "USD",
        "hasBankDetails": false,
        "payInAllowed": true,
        "sampleBankDetails": null
    },
...
    {
        "code": "UAH",
        "hasBankDetails": false,
        "payInAllowed": false,
        "sampleBankDetails": null
    },
    {
        "code": "ARS",
        "hasBankDetails": false,
        "payInAllowed": false,
        "sampleBankDetails": null
    },
    {
        "code": "NPR",
        "hasBankDetails": false,
        "payInAllowed": false,
        "sampleBankDetails": null
    }
]

Get list of currencies that your can hold in your borderless account. Also shows which currencies have the option to get bank account details.

Request

GET https://api.sandbox.transferwise.tech/v1/borderless-accounts/balance-currencies

Response

Field Description Format
code Currency code Text
hasBankDetails Does currency have bank details opening option Boolean
payInAllowed Can you send this currency to your borderless account Boolean
sampleBankDetails






















Exchange Rates

List

Example Request (Bearer token):

curl -X GET "https://api.sandbox.transferwise.tech/v1/rates?source=EUR&target=USD" \
     -H "Authorization: Bearer <your api token>"

Example Request (Basic authentication):

curl -X GET "https://api.sandbox.transferwise.tech/v1/rates?source=EUR&target=USD" \
     --user <your api client_id>:<your api client_secret> 

Example Response:

[
    {
        "rate": 1.166,
        "source": "EUR",
        "target": "USD",
        "time": "2018-08-31T10:43:31+0000"
    }
]

GET https://api.sandbox.transferwise.tech/v1/rates

Fetch latest exchange rates of all currencies.

GET https://api.sandbox.transferwise.tech/v1/rates?source=EUR&target=USD

Fetch latest exchange rate of one currency pair.

GET https://api.sandbox.transferwise.tech/v1/rates?source=EUR&target=USD&time=2017-02-13T14:53:01

Fetch exchange rate of specific historical timestamp.

GET https://api.sandbox.transferwise.tech/v1/rates?source=EUR&target=USD&from=2017-02-13T14:53:01&to=2017-03-13T14:53:01&group=day

Fetch exchange rate history over period of time with daily interval.

GET https://api.sandbox.transferwise.tech/v1/rates?source=EUR&target=USD&from=2017-02-13T14:53:01&to=2017-03-13T14:53:01&group=hour

Fetch exchange rate history over period of time with hourly interval.

GET https://api.sandbox.transferwise.tech/v1/rates?source=EUR&target=USD&from=2017-02-13T14:53:01&to=2017-03-13T14:53:01&group=minute

Fetch exchange rate history over period of time with 10 minute interval.

Request

Note that this endpoint supports two types of authentication: Bearer token and Basic authentication (client_id/client_secret).

Field Description Format
source Source(send) currency code. Text
target Target(receive) currency code. Text
time Timestamp to get historic exchange rate for specific time/date. Timestamp
from Period start date to get exchange rate history. Timestamp
to Period end date to get exchange rate history. Timestamp
group Interval: day;hour;minute Text

Response

List of exchange rate values which meet your query criteria.

Field Description Format
rate Exchange rate value. Decimal
source Source(send) currency code Text
target Target(receive) currency code Text
time Timestamp for exchange rate. Timestamp

Quotes

Create

Example Request:

curl -X POST https://api.sandbox.transferwise.tech/v1/quotes \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "source": "EUR",
          "target": "GBP",
          "rateType": "FIXED",
          "targetAmount": 600,
          "type": "BALANCE_PAYOUT"
        }'

Example Response:

{
    "id": <quoteId>,
    "source": "EUR",
    "target": "GBP",
    "sourceAmount": 663.84,
    "targetAmount": 600.00,
    "type": "BALANCE_PAYOUT",
    "rate": 0.9073,
    "createdTime": "2018-08-27T14:35:44.553Z",
    "createdByUserId": <your user id>,
    "profile": <your profile id>,
    "rateType": "FIXED",
    "deliveryEstimate": "2018-08-27T14:35:44.496Z",
    "fee": 2.34,
    "allowedProfileTypes": [
        "PERSONAL",
        "BUSINESS"
    ],
    "guaranteedTargetAmount": false,
    "ofSourceAmount": true
}


Quote can be used to create a transfer within 30 minutes. You need quoteId as an input to create a transfer. Quote locks current mid-market exchange rate that will be used for your transfer. Quote also calculates transfer fee and estimates delivery time.

Request

POST https://api.sandbox.transferwise.tech/v1/quotes

Field Description Format
profile Personal or business profile id Text
source Source(send) currency code Text
target Target(receive) currency code Text
rateType Always use constant 'FIXED' Text
targetAmount Amount in target currency Decimal
sourceAmount Amount in source currency.
Either sourceAmount or targetAmount is required, never both.
Decimal
type 'BALANCE_PAYOUT' for payments funded from borderless account
'BALANCE_CONVERSION' for conversion between balances
'REGULAR' for payments funded via bank transfers
Text

Response

Field Description Format
id quoteId Integer
source Source(send) currency code Text
target Target(receive) currency code Text
sourceAmount Amount in source currency Decimal
targetAmount Amount in target currency Decimal
type Quote type Text
rate Exchange rate value Decimal
createdTime Quote created timestamp Timestamp
createdByUserId Your used id Integer
profile Personal or business profile id Integer
rateType Always 'FIXED' Text
deliveryEstimate Estimated timestamp when recipient would receive funds, assuming transfer will be created now. Timestamp
fee TransferWise fee in source currency for this payment (deducted from source amount). Decimal
allowedProfileTypes PERSONAL, BUSINESS or both. Specifies which legal entities can use this quote. There are few currency routes are where we dont support business customers yet. Text
guaranteedTargetAmount Not relevant for fixed rate quotes. Please ignore. Boolean
ofSourceAmount Not relevant for fixed rate quotes. Please ignore. Boolean

Get By Id

Example Request:

curl -X GET https://api.sandbox.transferwise.tech/v1/quotes/{quoteId} \
     -H "Authorization: Bearer <your api token>" 

Example Response:

{
    "id": <quoteId>,
    "source": "EUR",
    "target": "GBP",
    "sourceAmount": 663.84,
    "targetAmount": 600.00,
    "type": "BALANCE_PAYOUT",
    "rate": 0.9073,
    "createdTime": "2018-08-27T14:35:44.553Z",
    "createdByUserId": <your user id>,
    "profile": <your profile id>,
    "rateType": "FIXED",
    "deliveryEstimate": "2018-08-27T14:35:44.496Z",
    "fee": 2.34,
    "allowedProfileTypes": [
        "PERSONAL",
        "BUSINESS"
    ],
    "guaranteedTargetAmount": false,
    "ofSourceAmount": true
}

Get quote info by id.

Request

GET https://api.sandbox.transferwise.tech/v1/quotes/{quoteId}

Get Pay-in Methods

Example Request:

curl -X GET https://api.sandbox.transferwise.tech/v1/quotes/{quoteId}/pay-in-methods \
     -H "Authorization: Bearer <your api token>" 

Example Response:

[
  {
    "type": "transfer",
    "details": {
      "payInReference": "quote-113300 P304205"
    }
  }
]

Get text that you should use in the "payment reference" field when sending funds via local bank transfer to TransferWise to fund your payment request. Reference text includes "P-REF" number of user which we need in order to automatically link funds.

Request

GET https://api.sandbox.transferwise.tech/v1/quotes/{quoteId}/pay-in-methods

Response

Field Description Format
type Currently always 'transfer' meaning only pay-in option is via bank transfer. Text
details.payInReference Reference text to be used when sending your bank transfer to TransferWise. Text

Get Temporary Quote

Example Request (Bearer token):

curl -X GET https://api.sandbox.transferwise.tech/v1/quotes?source=EUR&target=GBP&rateType=FIXED&targetAmount=600 \
     -H "Authorization: Bearer <your api token>" 

Example Request (Basic authentication):

curl -X GET https://api.sandbox.transferwise.tech/v1/quotes?source=EUR&target=GBP&rateType=FIXED&targetAmount=600 \
     --user <your api client_id>:<your api client_secret> 

Example Response:

{
    "source": "EUR",
    "target": "GBP",
    "sourceAmount": 663.84,
    "targetAmount": 600.00,
    "type": "REGULAR",
    "rate": 0.9073,
    "createdTime": "2018-08-27T14:35:44.553Z",
    "createdByUserId": 0,
    "rateType": "FIXED",
    "deliveryEstimate": "2018-08-27T14:35:44.496Z",
    "fee": 2.34,
    "allowedProfileTypes": [
        "PERSONAL",
        "BUSINESS"
    ],
    "guaranteedTargetAmount": false,
    "ofSourceAmount": true
}

GET https://api.sandbox.transferwise.tech/v1/quotes?source=SEK&target=USD&sourceAmount=1000&rateType=FIXED

Get temporary quote for sending 1000 SEK to USD

GET https://api.sandbox.transferwise.tech/v1/quotes?source=SEK&target=USD&targetAmount=1000&rateType=FIXED

Get temporary quote for sending SEK to 1000 USD

Request

Note that this endpoint supports two types of authentication: Bearer token and Basic authentication (client_id/client_secret).

GET https://api.sandbox.transferwise.tech/v1/quotes

Field Description Format
source Source(send) currency code Text
target Target(receive) currency code Text
rateType Always use constant 'FIXED' Text
targetAmount Amount in target currency Decimal
sourceAmount Amount in source currency.
Either sourceAmount or targetAmount is required, never both.
Decimal

Response

Same as Create, but without "id" field since temporary quote is not stored and cannot be used for creating transfer. Temporary quote is not associated with any user, it is anonymous.

Recipient Accounts

Create

Example Request (Create GBP recipient):

curl -X POST https://api.sandbox.transferwise.tech/v1/accounts \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "currency": "GBP", 
          "type": "sort_code", 
          "profile": <your profile id>, 
          "accountHolderName": "Ann Johnson",
           "details": { 
              "legalType": "PRIVATE",
              "sortCode": "231470", 
              "accountNumber": "28821822" 
           } 
         }'

Example Response (Create GBP recipient):

{
    "id": 13967081,
    "business": null,
    "profile": <your profile id>,
    "accountHolderName": "Ann Johnson",
    "currency": "GBP",
    "country": "GB",
    "type": "sort_code",
    "details": {
        "address": {
            "country": null,
            "countryCode": null,
            "firstLine": null,
            "postCode": null,
            "city": null,
            "state": null
        },
        "email": null,
        "legalType": "PRIVATE",
        "accountNumber": "28821822",
        "sortCode": "231470",
        "abartn": null,
        "accountType": null,
        "bankgiroNumber": null,
        "ifscCode": null,
        "bsbCode": null,
        "institutionNumber": null,
        "transitNumber": null,
        "phoneNumber": null,
        "bankCode": null,
        "russiaRegion": null,
        "routingNumber": null,
        "branchCode": null,
        "cpf": null,
        "cardNumber": null,
        "idType": null,
        "idNumber": null,
        "idCountryIso3": null,
        "idValidFrom": null,
        "idValidTo": null,
        "clabe": null,
        "swiftCode": null,
        "dateOfBirth": null,
        "clearingNumber": null,
        "bankName": null,
        "branchName": null,
        "businessNumber": null,
        "province": null,
        "city": null,
        "rut": null,
        "token": null,
        "cnpj": null,
        "payinReference": null,
        "pspReference": null,
        "orderId": null,
        "idDocumentType": null,
        "idDocumentNumber": null,
        "targetProfile": null,
        "taxId": null,
        "iban": null,
        "bic": null,
        "IBAN": null,
        "BIC": null
    },
    "user": <your user ID>,
    "active": true
}

Recipient is a person or institution who is the ultimate beneficiary of your payment.

Recipient data includes three data blocks.

1) General Data

2) Bank account data

There are many different variations of bank account details needed depending on recipient target currency. For example:

3) Address data Recipient address data is required only if target currency is USD, PHP, THB or TRY, or if the source currency is USD or AUD.

GBP example is provided here. You can find other currency examples below.
Please also look at Recipients.Requirements to figure out which fields are required to create recipients in specific countries.

Request

POST https://api.sandbox.transferwise.tech/v1/accounts

Field Description Format
currency 3 character currency code Text
type Recipient type Text
profile Personal or business profile id Integer
accountHolderName Recipient full name Text
details Currency specific fields Group
details.legalType Recipient legal type: PRIVATE or BUSINESS Text
details.sortCode Recipient bank sort code (GBP example) Text
details.accountNumber Recipient bank account no (GBP example) Text

Response

Recipient account id is needed for creating transfers in step 3.

Field Description Format
id accountId Integer
profile Personal or business profile id Integer
acccountHolderName Recipient full name Text
currency 2 character country code Text
country 3 character currency code Text
type Recipient type Text
details Currency specific fields Group
details.legalType Recipient legal type Text
details.sortCode Recipient bank sort code (GBP example) Text
details.accountNumber Recipient bank account no (GBP example) Text

Create Email Recipient

Example Request (Create email recipient):

curl -X POST https://api.sandbox.transferwise.tech/v1/accounts \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>, 
          "accountHolderName": "Ann Johnson",
          "currency": "EUR", 
          "type": "email", 
           "details": { 
              "email": "ann.johnson@gmail.com"
           } 
         }'

Example Response (Lookup email recipient):

{
    "id": 13967196,
    "business": null,
    "profile": <your profile id>,
    "accountHolderName": "Ann Johnson",
    "currency": "EUR",
    "country": null,
    "type": "email",
    "details": {
        "address": {
            "country": null,
            "countryCode": null,
            "firstLine": null,
            "postCode": null,
            "city": null,
            "state": null
        },
        "email": "ann.johnson@gmail.com",
        "legalType": "PRIVATE",
        "accountNumber": null,
        "sortCode": null,
        "abartn": null,
        "accountType": null,
        "bankgiroNumber": null,
        "ifscCode": null,
        "bsbCode": null,
        "institutionNumber": null,
        "transitNumber": null,
        "phoneNumber": null,
        "bankCode": null,
        "russiaRegion": null,
        "routingNumber": null,
        "branchCode": null,
        "cpf": null,
        "cardNumber": null,
        "idType": null,
        "idNumber": null,
        "idCountryIso3": null,
        "idValidFrom": null,
        "idValidTo": null,
        "clabe": null,
        "swiftCode": null,
        "dateOfBirth": null,
        "clearingNumber": null,
        "bankName": null,
        "branchName": null,
        "businessNumber": null,
        "province": null,
        "city": null,
        "rut": null,
        "token": null,
        "cnpj": null,
        "payinReference": null,
        "pspReference": null,
        "orderId": null,
        "idDocumentType": null,
        "idDocumentNumber": null,
        "targetProfile": null,
        "taxId": null,
        "iban": null,
        "bic": null,
        "IBAN": null,
        "BIC": null
    },
    "user": <your user id>,
    "active": true
}

If you don't know recipient bank account details you can set up email recipient so that TransferWise will collect bank details directly from the recipient.

TransferWise will then email your recipient with a link to collect their bank account details. Once recipient provides bank account details securely to Transferwise we are able to complete your transfer.

https://transferwise.com/help/article/1740912/creating-a-transfer/transfers-to-an-email-address-transferwise-users

Get By Id

Example Request:

curl -X GET https://api.sandbox.transferwise.tech/v1/accounts/{accountId} \
     -H "Authorization: Bearer <your api token>" 

Example Response:

{
    "id": 13967081,
    "profile": <your profile id>, 
    "accountHolderName": "Ann Johnson",
    "type": "sort_code", 
    "country": "GB", 
    "currency": "GBP",
    "details": {
        "address": {
            "country": null,
            "countryCode": null,
            "firstLine": null,
            "postCode": null,
            "city": null,
            "state": null
        },
        "email": null,
        "legalType": "PRIVATE",
        "accountNumber": "28821822",
        "sortCode": "231470",
        "abartn": null,
        "accountType": null,
        "bankgiroNumber": null,
        "ifscCode": null,
        "bsbCode": null,
        "institutionNumber": null,
        "transitNumber": null,
        "phoneNumber": null,
        "bankCode": null,
        "russiaRegion": null,
        "routingNumber": null,
        "branchCode": null,
        "cpf": null,
        "cardNumber": null,
        "idType": null,
        "idNumber": null,
        "idCountryIso3": null,
        "idValidFrom": null,
        "idValidTo": null,
        "clabe": null,
        "swiftCode": null,
        "dateOfBirth": null,
        "clearingNumber": null,
        "bankName": null,
        "branchName": null,
        "businessNumber": null,
        "province": null,
        "city": null,
        "rut": null,
        "token": null,
        "cnpj": null,
        "payinReference": null,
        "pspReference": null,
        "orderId": null,
        "idDocumentType": null,
        "idDocumentNumber": null,
        "targetProfile": null,
        "taxId": null,
        "iban": null,
        "bic": null,
        "IBAN": null,
        "BIC": null
    },
    "user": <your user ID>,
    "active": true
}

Get recipient account info by id.

Request

GET https://api.sandbox.transferwise.tech/v1/accounts/{accountId}

List

Example Request:

curl -X GET https://api.sandbox.transferwise.tech/v1/accounts?profile=<profileId>&currency=GBP \
     -H "Authorization: Bearer <your api token>" 

Example Response:

[
  {
      "id": 13967081,
      "profile": <your profile id>, 
      "accountHolderName": "Ann Johnson",
      "type": "sort_code", 
      "country": "GB", 
      "currency": "GBP",
      "details": {
          "address": {
              "country": null,
              "countryCode": null,
              "firstLine": null,
              "postCode": null,
              "city": null,
              "state": null
          },
          "email": null,
          "legalType": "PRIVATE",
          "accountNumber": "28821822",
          "sortCode": "231470",
          "abartn": null,
          "accountType": null,
          "bankgiroNumber": null,
          "ifscCode": null,
          "bsbCode": null,
          "institutionNumber": null,
          "transitNumber": null,
          "phoneNumber": null,
          "bankCode": null,
          "russiaRegion": null,
          "routingNumber": null,
          "branchCode": null,
          "cpf": null,
          "cardNumber": null,
          "idType": null,
          "idNumber": null,
          "idCountryIso3": null,
          "idValidFrom": null,
          "idValidTo": null,
          "clabe": null,
          "swiftCode": null,
          "dateOfBirth": null,
          "clearingNumber": null,
          "bankName": null,
          "branchName": null,
          "businessNumber": null,
          "province": null,
          "city": null,
          "rut": null,
          "token": null,
          "cnpj": null,
          "payinReference": null,
          "pspReference": null,
          "orderId": null,
          "idDocumentType": null,
          "idDocumentNumber": null,
          "targetProfile": null,
          "taxId": null,
          "iban": null,
          "bic": null,
          "IBAN": null,
          "BIC": null
      },
      "user": <your user ID>,
      "active": true
  },
  {
      "id": 31273090,
      "profile": <your profile id>, 
      "accountHolderName": "George Johnson",
      "type": "sort_code", 
      "country": "GB", 
      "currency": "GBP",
      "details": {
          "address": {
              "country": null,
              "countryCode": null,
              "firstLine": null,
              "postCode": null,
              "city": null,
              "state": null
          },
          "email": null,
          "legalType": "PRIVATE",
          "accountNumber": "29912211",
          "sortCode": "231470",
          "abartn": null,
          "accountType": null,
          "bankgiroNumber": null,
          "ifscCode": null,
          "bsbCode": null,
          "institutionNumber": null,
          "transitNumber": null,
          "phoneNumber": null,
          "bankCode": null,
          "russiaRegion": null,
          "routingNumber": null,
          "branchCode": null,
          "cpf": null,
          "cardNumber": null,
          "idType": null,
          "idNumber": null,
          "idCountryIso3": null,
          "idValidFrom": null,
          "idValidTo": null,
          "clabe": null,
          "swiftCode": null,
          "dateOfBirth": null,
          "clearingNumber": null,
          "bankName": null,
          "branchName": null,
          "businessNumber": null,
          "province": null,
          "city": null,
          "rut": null,
          "token": null,
          "cnpj": null,
          "payinReference": null,
          "pspReference": null,
          "orderId": null,
          "idDocumentType": null,
          "idDocumentNumber": null,
          "targetProfile": null,
          "taxId": null,
          "iban": null,
          "bic": null,
          "IBAN": null,
          "BIC": null
      },
      "user": <your user ID>,
      "active": true
  }
]

Fetch list of your recipient accounts. Filter by currency and/or user profile Id. This list does not currently support pagination. Therefore if you have very many recipient accounts defined in your business profile then please filter by currency to ensure a reasonable response time.

Request

GET https://api.sandbox.transferwise.tech/v1/accounts?profile=<profileId>&currency=<currencyCode>

Both query parameters are optional.

Field Description Format
profileId Personal or business profile id Integer
currency Currency code Text

Delete

Example Request:

curl -X DELETE https://api.sandbox.transferwise.tech/v1/accounts/{accountId} \
     -H "Authorization: Bearer <your api token>"

Deletes a recipient by changing its status to inactive. Only active recipients can be deleted and a recipient cannot be reactivated, however you can create a new recipient with the same details instead.

Response is empty if delete succeeds.

Requesting to delete recipient that is already inactive will return an http status 403 (forbidden).

Request

DELETE https://api.sandbox.transferwise.tech/v1/accounts/{accountId}

Requirements

Example Request:

curl -X GET https://api.sandbox.transferwise.tech/v1/quotes/{quoteId}/account-requirements \
     -H "Authorization: Bearer <your api token>" 

Example Response:

[
  {
    "type": "aba",
     "fields": [
          {
            "name": "Legal type",
            "group": [
              {
                "key": "legalType",
                "type": "select",
                "refreshRequirementsOnChange": false,
                "required": true,
                "displayFormat": null,
                "example": "",
                "minLength": null,
                "maxLength": null,
                "validationRegexp": null,
                "validationAsync": null,
                "valuesAllowed": [
                  {
                    "key": "PRIVATE",
                    "name": "Private"
                  },
                  {
                    "key": "BUSINESS",
                    "name": "Business"
                  }
                ]
              }
            ]
          },
          {
            "name": "Routing Number",
            "group": [
              {
                "key": "abartn",
                "type": "text",
                "refreshRequirementsOnChange": false,
                "required": true,
                "displayFormat": null,
                "example": "111000025",
                "minLength": 9,
                "maxLength": 9,
                "validationRegexp": "\\d{9}",
                "validationAsync": {
                  "url": "https://test-restgw.transferwise.com/v1/validators/abartn",
                  "params": [
                    {
                      "key": "abartn",
                      "parameterName": "abartn",
                      "required": true
                    }
                  ]
                },
                "valuesAllowed": null
              }
            ]
          },
          {
            "name": "Account number",
            "group": [
              {
                "key": "accountNumber",
                "type": "text",
                "refreshRequirementsOnChange": false,
                "required": true,
                "displayFormat": null,
                "example": "12345678",
                "minLength": 4,
                "maxLength": null,
                "validationRegexp": "\\d{4,17}",
                "validationAsync": {
                  "url": "https://test-restgw.transferwise.com/v1/validators/aba-account-number",
                  "params": [
                    {
                      "key": "accountNumber",
                      "parameterName": "accountNumber",
                      "required": true
                    }
                  ]
                },
                "valuesAllowed": null
              }
            ]
          },
          {
            "name": "Account type",
            "group": [
              {
                "key": "accountType",
                "type": "radio",
                "refreshRequirementsOnChange": false,
                "required": true,
                "displayFormat": null,
                "example": "",
                "minLength": null,
                "maxLength": null,
                "validationRegexp": null,
                "validationAsync": null,
                "valuesAllowed": [
                  {
                    "key": "CHECKING",
                    "name": "Checking"
                  },
                  {
                    "key": "SAVINGS",
                    "name": "Savings"
                  }
                ]
              }
            ]
          },
          {
            "name": "Country",
            "group": [
              {
                "key": "address.country",
                "type": "select",
                "refreshRequirementsOnChange": true,
                "required": true,
                "displayFormat": null,
                "example": "Germany",
                "minLength": null,
                "maxLength": null,
                "validationRegexp": null,
                "validationAsync": null,
                "valuesAllowed": [
                  {
                    "key": "AX",
                    "name": "Åland Islands"
                  },
                  {
                    "key": "AL",
                    "name": "Albania"
                  },
                  {
                  ...
                  }
                ]
              }
            ]
          },
          {
            "name": "City",
            "group": [
              {
                "key": "address.city",
                "type": "text",
                "refreshRequirementsOnChange": false,
                "required": true,
                "displayFormat": null,
                "example": "London",
                "minLength": null,
                "maxLength": null,
                "validationRegexp": null,
                "validationAsync": null,
                "valuesAllowed": null
              }
            ]
          },
          {
            "name": "Postal code",
            "group": [
              {
                "key": "address.postCode",
                "type": "text",
                "refreshRequirementsOnChange": false,
                "required": true,
                "displayFormat": null,
                "example": "10025",
                "minLength": null,
                "maxLength": null,
                "validationRegexp": null,
                "validationAsync": null,
                "valuesAllowed": null
              }
            ]
          },
          {
            "name": "Address",
            "group": [
              {
                "key": "address.firstLine",
                "type": "text",
                "refreshRequirementsOnChange": false,
                "required": true,
                "displayFormat": null,
                "example": "50 Branson Ave",
                "minLength": null,
                "maxLength": null,
                "validationRegexp": null,
                "validationAsync": null,
                "valuesAllowed": null
              }
            ]
          }
        ]
    }
]

Request

GET https://api.sandbox.transferwise.tech/v1/quotes/{quoteId}/account-requirements
POST https://api.sandbox.transferwise.tech/v1/quotes/{quoteId}/account-requirements

GET and POST account-requirements endpoints help you to figure out which fields are required to create a valid recipient for different currencies. You could even build a dynamic user interface on top of these endpoints. This is a step-by-step guide on how these endpoints work.

1.Create quote first to specify currencies and transfer amounts. See Create.Quote.

2.Call GET /v1/quotes/{quoteId}/account-requirements to get list of fields you need to fill with values in "details" section for creating a valid recipient account.

In order to create "aba" recipient type you need these top level fields:

Analyze the list of fields. Because refreshRequirementsOnChange=true for field 'address.country' then this indicates that there are additional fields required depending on the selected value.

3.Construct a recipient object with top level fields and call POST /v1/quotes/{quoteId}/account-requirements with these value to expose sub fields.
For example posting US as country will also add "state" to list of fields.
{ "type": "aba", "details": { "legalType": "PRIVATE", "abartn": "111000025", "accountNumber": "12345678", "accountType": "CHECKING", "address": { "country": "US" } } }

But posting GB as country will not add new fields anything.

{ "type": "aba", "details": { "legalType": "PRIVATE", "abartn": "111000025", "accountNumber": "12345678", "accountType": "CHECKING", "address": { "country": "US" } } }

4.So once you get to the point where you have provided values for all fields which have refreshRequirementsOnChange=true then you have complete set of fields to compose a valid request to create an recipient object. For example this is a valid request to create a recipient with address in US Arizona:
POST /v1/accounts:
{ "profile": your-profile-id, "accountHolderName": "John Smith", "currency": "USD", "type": "aba", "details": { "legalType": "PRIVATE", "abartn": "111000025", "accountNumber": "12345678", "accountType": "CHECKING", "address": { "country": "US", "state": "AZ" "city": "New York", "postCode": "10025", "firstLine": "45 Sunflower Ave" } } }

Response

Field Description Format
type "address" Text
fields[n].name Field description Text
fields[n].group[n].key Key is name of the field you should include in the JSON Text
fields[n].group[n].type Display type of field (e.g. text, select, etc) Text
fields[n].group[n].refreshRequirementsOnChange Tells you whether you should call POST account-requirements once the field value is set to discover required lower level fields. Boolean
fields[n].group[n].required Indicates if the field is mandatory or not Boolean
fields[n].group[n].displayFormat Display format pattern. Text
fields[n].group[n].example Example value. Text
fields[n].group[n].minLength Min valid length of field value. Integer
fields[n].group[n].maxLength Max valid length of field value. Integer
fields[n].group[n].validationRegexp Regexp validation pattern. Text
fields[n].group[n].validationAsync Validator URL and parameter name you should use when submitting the value for validation Text
fields[n].group[n].valuesAllowed[n].key List of allowed values. Value key Text
fields[n].group[n].valuesAllowed[n].name List of allowed values. Value name. Text

Validate Recipient Fields

Example Request (Validate sort code (GBP):

curl -X GET https://api.sandbox.transferwise.tech/v1/validators/sort-code?sortCode=231470

Example Response (Validate sort code (GBP):

{
    "validation": "success"
}

or  

{
    "errors": [
        {
            "code": "VALIDATION_NOT_SUCCESSFUL",
            "message": "sortCode has not passed validation.",
            "path": "sortCode",
            "arguments": [
                "2314701"
            ]
        }
    ]
}

There are several validation URLs that make creating correct recipient accounts easier. These URLs are also included in fields provided by Recipient Accounts.Requirements endpoint.

GBP

Validate UK bank sort code

https://api.transferwise.com/v1/validators/sort-code?sortCode=231470

Validate UK bank account number

https://api.transferwise.com/v1/validators/sort-code-account-number?accountNumber=10000246

BGN CHF, DKK, EUR, GEL, GBP, NOK, PKR, PLN, RON, SEK

Validate IBAN

https://api.transferwise.com/v1/validators/iban?iban=EE867700771000187087

Validate BIC and IBAN

https://api.transferwise.com/v1/validators/bic?bic=LHVBEE22&iban=EE867700771000187087

USD

Validate ABA routing number

https://api.transferwise.com/v1/validators/abartn?abartn=011103093

Validate ABA bank account number

https://api.transferwise.com/v1/validators/aba-account-number?accountNumber=111000025

INR

Validate IFSC code

https://api.transferwise.com/v1/validators/ifsc-code?ifscCode=YESB0236041

Validate Indian bank account number

https://api.transferwise.com/v1/validators/indian-account-number?accountNumber=678911234567891

AUD

Validate BSB code

https://api.transferwise.com/v1/validators/bsb-code?bsbCode=112879

Validate Australian bank account number

https://api.transferwise.com/v1/validators/australian-account-number?accountNumber=123456789

CAD

Validate Canadian institution number

https://api.transferwise.com/v1/validators/canadian-institution-number?institutionNumber=006

Validate Canadian bank transit number

https://api.transferwise.com/v1/validators/canadian-transit-number?institutionNumber=006&transitNumber=04841

Validate Canadian bank account number

https://api.transferwise.com/v1/validators/canadian-account-number?institutionNumber=006&transitNumber=04841&accountNumber=3456712

SEK Validate Bank Giro number

https://api.transferwise.com/v1/validators/bankgiro-number?bankgiroNumber=12345674

HUF

Validate Hungarian bank account number

https://api.transferwise.com/v1/validators/hungarian-account-number?accountNumber=12000000-12345678-00000000

PLN

Validate Polish bank account number

https://api.transferwise.com/v1/validators/polish-account-number?accountNumber=12345678901234567890123456

UAH

Validate Ukrainian bank account number

https://api.transferwise.com/v1/validators/privatbank-account-number?accountNumber=1234

Validate Ukrainian phone number

https://api.transferwise.com/v1/validators/privatbank-phone-number?phoneNumber=123456789

NZD

Validate New Zealand bank account number

https://api.transferwise.com/v1/validators/new-zealand-account-number?accountNumber=03-1587-0050000-00

AED

Validate United Arab Emirates BIC code

https://api.transferwise.com/v1/validators/emirates-bic?bic=AZIZAEAD&iban=AE070331234567890123456

CNY

Validate Chinese Union Pay card number

https://api.transferwise.com/v1/validators/chinese-card-number?cardNumber=6240008631401148

THB

Validate Thailand bank account number

https://api.transferwise.com/v1/validators/thailand-account-number?accountNumber=9517384260

Create AED Recipient

Example Request (AED):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "AED",
          "type": "emirates",
          "legalType": "PRIVATE",
          "details": {
           "IBAN": "AE070331234567890123456"
         }
      }'

Send payments to United Arab Emirates.

Private and business recipients are supported.

Recipient type = 'emirates'

Required details: IBAN

Create ARS Recipient

Example Request (ARS):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "ARS",
          "type": "argentina",
          "details": {
           "legalType": "PRIVATE",
           "taxId": "20-34149938-1",
           "accountNumber": "0110482420048200036238"
         }
      }'

Send payments to Argentina.

Private and business recipients are supported.

Recipient type = 'argentina'

Required details:

taxId - Recipient’s CUIT / CUIL (Single Tax Identification/ Single Labor Identification), 11 characters

accountNumber - Recipient’s account CBU, 22 characters (Alias not supported)

Create AUD Recipient

Example Request (AUD):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "AUD",
          "type": "australian",
          "details": {
           "legalType": "PRIVATE",
           "bsbCode": "023604",
           "accountNumber": "123456789"
          }
        }'

Send payments to Australia.

Private and business recipients are supported.

Recipient type = 'australia'

Required details:

bsbCode - 6 digits

accountNumber - 5..9 digits

Create BDT Recipient

Example Request (BDT):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "BDT",
          "type": "bangladesh",
          "details": {
           "legalType": "PRIVATE",
           "bankCode": "015",
           "branchCode": "015270362",
           "accountNumber": "5060011118"
           }
        }'

Send payments to Bangladesh.

Recipient type = 'iban'

Required details: bankCode, branchCode, accountNumber

You can get list of bank and branch codes by using /v1/quotes/{quoteId}/account-requirements endpoint.

Create BGN Recipient

Example Request (BGN):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "BGN",
          "type": "iban",
          "details": {
           "legalType": "PRIVATE",
           "IBAN": "BG89370400440532013000"
           }
        }'

Send payments to Bulgaria.

Private and business recipients are supported.

Recipient type = 'iban'

Required details: IBAN

Create BRL Recipient

Example Request (BRL):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "BRL",
          "type": "brazil",
          "details": {
           "legalType": "PRIVATE",
           "bankCode": "218",
           "branchCode": "1234",
           "accountNumber": "12345678-9",
           "accountType": "CHECKING",
           "cpf": "123.456.789-12",
           "phoneNumber": "+55 21 5555 5555"
           }
        }'

Send payments to Brazil.

Recipient type = 'brazil'

Required details: bankCode, branchCode, accountNumber, accountType (CHECKING or SAVINGS), cpf (tax reg no), recipient phone number

You can get list of bank and branch codes by using /v1/quotes/{quoteId}/account-requirements endpoint.

Create CAD Recipient

Example Request (CAD):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "CAD",
          "type": "canadian",
          "details": {
           "legalType": "PRIVATE",
           "institutionNumber": "006",
           "transitNumber": "04841",
           "accountNumber": "1234567",
           "accountType": "Checking",
     }
  }'

Send payments to Canada.

Private and business recipients are supported.

Recipient type = 'canadian'

Required details: institutionNumber, transitNumber, accountNumber, accountType (Checking or Saving)

You can get list of bank and branch codes by using /v1/quotes/{quoteId}/account-requirements endpoint.

Create CHF Recipient

Example Request (CHF):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "CHF",
          "type": "iban",
          "details": {
           "legalType": "PRIVATE",
           "IBAN": "CH89370400440532013000"
           }
        }'

Send payments to Switzerland.

Private and business recipients are supported.

Recipient type = 'iban'

Required details: IBAN

Create CLP Recipient

Example Request (CLP):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "CLP",
          "type": "chile",
          "details": {
           "legalType": "PRIVATE",
           "bankCode": "504",
           "accountNumber": "12345678901234567890",
           "rut": "760864285",
           "accountType": "CHECKING",
           "phoneNumber": "+56 33 555 5555"
           }
        }'

Send payments to Chile.

Private and business recipients are supported.

Recipient type = 'chile'

Required details: bankCode, accountNumber, rut (Rol Único Tributario), accountType (CHECKING, SAVINGS, CUENTA_VISTA), recipient phone number

Create CNY Recipient

Example Request (CNY):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "CNY",
          "type": "chinese_card",
          "details": {
           "legalType": "PRIVATE",
           "cardNumber": "6240008631401148"
           }
        }'

Send payments to China Unionpay cardholder.

Recipient type = 'chinese_card'

Required details: cardNumber

Create CZK Recipient

Example Request (CZK Local):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "CZK",
          "type": "czech",
          "details": {
           "legalType": "PRIVATE",
           "prefix": "000000",
           "accountNumber": "5060011118",
           "bankCode": "5500"
           }
        }'

Example Request (CZK IBAN):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "CZK",
          "type": "iban",
          "details": {
           "legalType": "PRIVATE",
           "IBAN": "CZ89370400440532013000"
           }
        }'

Send payments to Czech Republic.

Private and business recipients are supported.


Recipient type = 'czech'

Required details: prefix, accountNumber, bankCode


OR


Recipient type = 'iban'

Required details: IBAN

Create DKK Recipient

Example Request (DKK):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "DKK",
          "type": "iban",
          "details": {
           "legalType": "PRIVATE",
           "IBAN": "DK89370400440532013000"
           }
        }'

Send payments to Denmark.

Private and business recipients are supported.

Recipient type = 'iban'

Required details: IBAN

Create EGP Recipient

Example Request (EGP):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "EGP",
          "type": "egypt_local",
          "details": {
           "legalType": "PRIVATE",
           "bankCode": "ECBAEGCA",
           "accountNumber": "123456789"
           }
        }'

Send payments to Egypt.

Private and business recipients are supported.

Recipient type = 'egypt_local'

Required details: bankCode, accountNumber (Swift code)

You can get list of bank codes by using /v1/quotes/{quoteId}/account-requirements endpoint.

Create EUR Recipient

Example Request (EUR):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "EUR",
          "type": "iban",
          "details": {
           "legalType": "PRIVATE",
           "IBAN": "DE89370400440532013000"
           }
        }'

Send payments to Eurozone countries: Austria, Belgium, Cyprus, Estonia, Finland, France, Germany, Greece, Ireland, Italy, Latvia, Lithuania, Luxembourg, Malta, Netherlands, Portugal, Slovakia, Slovenia, Spain.

Private and business recipients are supported.

Recipient type = 'iban'

Required details: IBAN

Create GBP Recipient

Example Request (GBP Sort Code):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "GBP",
          "type": "sort_code",
          "details": {
           "legalType": "PRIVATE",
           "sortCode": "40-30-20",
           "accountNumber": "12345678"
           }
        }'

Example Request (GBP IBAN):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "GBP",
          "type": "iban",
          "details": {
            "legalType": "PRIVATE",
            "IBAN": "GB89370400440532013000"
           }
        }'

Send payments to United Kingdom.

Private and business recipients are supported.


Recipient type = 'sort_code'

Required details: sortCode, accountNumber


OR


Recipient type = 'iban'

Required details: IBAN

Create GEL Recipient

Example Request (GEL):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "GEL",
          "type": "iban",
          "details": {
           "legalType": "PRIVATE",
           "IBAN": "GE89370400440532013000"
           }
        }'

Send payments to Georgia.

Private and business recipients are supported.

Recipient type = 'iban'

Required details: IBAN

Create GHS Recipient

Example Request (GHS):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "GHS",
          "type": "ghana",
          "details": {
           "legalType": "PRIVATE",
           "bankCode": "030100",
           "accountNumber": "0011XXXXXXXXXX"
           }
        }'

Send payments to Ghana.

Private and business recipients are supported.

Recipient type = 'ghana'

Required details: bankCode, accountNumber

You can get list of bank codes by using /v1/quotes/{quoteId}/account-requirements endpoint.

Create HKD Recipient

Example Request (HKD):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "accountHolderName": "<recipient name>",
          "currency": "HKD",
          "type": "hongkong",
          "details": {
           "legalType": "PRIVATE",
           "bankCode": "307",
           "accountNumber": "005-231289-112"
           }
        }'

Send payments to Hong Kong.

Private and business recipients are supported.

Recipient type = 'hongkong'

Required details: bankCode, accountNumber

You can get list of bank codes by using /v1/quotes/{quoteId}/account-requirements endpoint.

Create HRK Recipient

Example Request:

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "HRK",
          "type": "iban",
          "details": {
           "legalType": "PRIVATE",
           "IBAN": "HR89370400440532013000"
           }
        }'

Send payments to Croatia.

Private and business recipients are supported.

Recipient type = 'iban'

Required details: IBAN

Create HUF Recipient

Example Request (HUF Local):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "HUF",
          "type": "hungarian",
          "details": {
           "legalType": "PRIVATE",
           "accountNumber": "12000000-12345678-00000000"
           }
        }'

Example Request (HUF IBAN):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "HUF",
          "type": "iban",
          "details": {
           "legalType": "PRIVATE",
           "IBAN": "HU89370400440532013000"
           }
        }'

Send payments to Hungary.

Private and business recipients are supported.


Recipient type = 'hungarian'

Required details: accountNumber


OR


Recipient type = 'iban'

Required details: IBAN

Create IDR Recipient

Example Request (IDR):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "IDR",
          "type": "indonesian",
          "details": {
           "legalType": "PRIVATE",
           "bankCode": "610306",
           "accountNumber": "6789112345678"
           }
        }'

Send payments to Indonesia.

Private and business recipients are supported.

Recipient type = 'indonesian'

Required details: bankCode, accountNumber

You can get list of bank codes by using /v1/quotes/{quoteId}/account-requirements endpoint.

Create ILS Recipient

Example Request (ILS IBAN):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
        "profile": <your profile id>,
        "accountHolderName": "<recipient name>",
        "currency": "ILS",
        "type": "israeli_local",
        "details": {
         "legalType": "PRIVATE",
         "IBAN": "IL620108000000099999999"
         }
      }'

Example Request (ILS Local Bank Code):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "ILS",
          "type": "israeli_bank_code",
          "details": {
           "legalType": "PRIVATE",
           "bankCode": "054",
           "branchCode": "001",
           "accountNumber": "123456789"
           }
        }'

Send payments to Israel.

Private and business recipients are supported.


Recipient type = 'israeli_local'

Required details: IBAN


OR


Recipient type = 'israeli_bank_code'

Required details: bankCode, branchCode, accountNumber

You can get list of bank and branch codes by using /v1/quotes/{quoteId}/account-requirements endpoint.

Create INR Recipient

Example Request (INR):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "INR",
          "type": "indian",
          "details": {
           "legalType": "PRIVATE",
           "ifscCode": "YESB0236041",
           "accountNumber": "678911234567891",
           }
        }'

Send payments to India.

Private and business recipients are supported.

Recipient type = 'indian'

Required details: ifscCode, accountNumber

Create JPY Recipient

Example Request (JPY):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "JPY",
          "type": "japanese",
          "details": {
           "legalType": "PRIVATE",
           "bankCode": "6470",
           "branchCode": "100",
           "accountType": "CURRENT",
           "accountNumber": "1234567"
           }
        }'

Send payments to Japan.

Private and business recipients are supported.

Recipient type = 'japanese'

Required details: bankCode, branchCode accountNumber, accountType (CURRENT, SAVINGS, CHECKING),

You can get list of bank and branch codes by using /v1/quotes/{quoteId}/account-requirements endpoint.

Create KES Recipient

Example Request (KES Bank Account):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "KES",
          "type": "kenya_local",
          "details": {
           "legalType": "PRIVATE",
           "bankCode": "35",
           "accountNumber": "0023183991919"
           }
        }'

Example Request (KES Mobile MPESA):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "KES",
          "type": "kenya_mobile",
          "details": {
           "legalType": "PRIVATE",
           "accountNumber": "2547XXXXXXXX"
           }
        }'

Send payments to Kenya.

Private and business recipients are supported. However please note that only individuals can hold MPESA accounts.


Recipient type = 'kenya_local'

Required details: bankCode, accountNumber

You can get list of bank codes by using /v1/quotes/{quoteId}/account-requirements endpoint.


OR


Recipient type = 'kenya_mobile'

Required details: accountNumber - mobile number

Create LKR Recipient

Example Request (LKR):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "LKR",
          "type": "srilanka",
          "details": {
           "legalType": "PRIVATE",
           "bankCode": "7214",
           "branchCode": "100",
           "accountNumber": "5060011118"
           }
        }'

Send payments to Sri Lanka.

Private and business recipients are supported.

Recipient type = 'srilanka'

Required details: bankCode, branchCode, accountNumber

You can get list of bank and branch codes by using /v1/quotes/{quoteId}/account-requirements endpoint.

Create MAD Recipient

Example Request (MAD):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "MAD",
          "type": "morocco",
          "details": {
           "legalType": "PRIVATE",
           "bankCode": "BCMAMAMC",
           "accountNumber": "123456789012345678901234"
           }
        }'

Send payments to Morocco.

Private and business recipients are supported. 260,000 MAD per transaction

Recipient type = 'morocco'

Required details: bankCode, accountNumber

You can get list of bank codes by using /v1/quotes/{quoteId}/account-requirements endpoint.

Create MXN Recipient

Example Request (MXN):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "MXN",
          "type": "mexican",
          "details": {
           "legalType": "PRIVATE",
           "clabe": "032180000118359719"
           }
        }'

Send payments to Mexico.

Private and business recipients are supported.

Recipient type = 'mexican'

Required details: clabe

Create MYR Recipient

Example Request (MYR):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "MYR",
          "type": "malaysian",
          "details": {
           "legalType": "PRIVATE",
           "swiftCode": "ABNAMYKL",
           "accountNumber": "159012938613"
           }
        }'

Send payments to Malaysia.

Private and business recipients are supported. Maximum amount is 10,000,000 MYR per payment.

Recipient type = 'malaysian'

Required details: swiftCode, accountNumber

You can get list of bank codes by using /v1/quotes/{quoteId}/account-requirements endpoint.

Create NGN Recipient

Example Request (NGN):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "NGN",
          "type": "nigeria",
          "details": {
           "legalType": "PRIVATE",
           "bankCode": "044",
           "accountNumber": "0584412903"
           }
        }'

Send payments to Nigeria.

Private and business recipients are supported. Maximum amount is 2,000,000 NGN per payment.

Recipient type = 'nigeria'

Required details: bankCode, accountNumber

You can get list of bank codes by using /v1/quotes/{quoteId}/account-requirements endpoint.

Create NOK Recipient

Example Request (NOK):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "NOK",
          "type": "iban",
          "details": {
           "legalType": "PRIVATE",
           "IBAN": "DE89370400440532013000"
           }
        }'

Send payments to Norway.

Private and business recipients are supported.

Recipient type = 'iban'

Required details: IBAN

Create NPR Recipient

Example Request (NPR):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "NPR",
          "type": "nepal",
          "legalType": "PRIVATE",
          "details": {
           "bankCode": "977056",
           "accountNumber": "1234567890"
           }
        }'

Send payments to Nepal.

Private recipients are supported.

Recipient type = 'nepal'

Required details: bankCode, accountNumber

You can get list of bank codes by using /v1/quotes/{quoteId}/account-requirements endpoint.

Create NZD Recipient

Example Request (NZD):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "NZD",
          "type": "newzealand",
          "details": {
           "legalType": "PRIVATE",
           "accountNumber": "03-1587-0050000-00"
           }
        }'

Send payments to New Zealand.

1mln NPR per transaction / per month for individual account.

Recipient type = 'newzealand'

Required details: accountNumber

Create PEN Recipient

Example Request (PEN):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "PEN",
          "type": "peru",
          "details": {
           "legalType": "PRIVATE",
           "bankCode": "BCON",
           "accountNumber": "12345678901234567890",
           "accountType": "CHECKING",
           "idDocumentType": "DNI",
           "idDocumentNumber": "09740475",
           "phoneNumber": "+51 987654321"
           }
        }'

Send payments to Peru.

Private and business recipients are supported. 1,900 USD per transfer / 9,900 USD per 30 days.

Recipient type = 'peru'

Required details: bankCode, accountNumber, accountType (CHECKING, SAVINGS), ID document type (DNI, RUC, C_EXT, PASSP), ID document number, recipient phone number

You can get list of bank codes by using /v1/quotes/{quoteId}/account-requirements endpoint.

Create PHP Recipient

Example Request (PHP):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "PHP",
          "type": "philippines",
          "details": {
           "legalType": "PRIVATE",
           "bankCode": "AMA",
           "accountNumber": "0044XXXXXXXX",
           "address" : {
              "country": "GB",
              "city": "London",
              "postCode": "10025",
              "firstLine": "50 Branson Ave"
             }
          }
        }'

Send payments to Philippines.

Private and business recipients are supported. 480,000 PHP per payment.

Recipient type = 'philippines'

Required details: bankCode, accountNumber, recipient address

You can get list of bank and country codes by using /v1/quotes/{quoteId}/account-requirements endpoint.

Create PKR Recipient

Example Request (PKR):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "PKR",
          "type": "iban",
          "details": {
           "legalType": "PRIVATE",
           "IBAN": "PK89370400440532013000"
           }
        }'

Send payments to Pakistan. Max 1 million PKR per payment.

Recipient type = 'iban'

Required details: IBAN

Create PLN Recipient

Example Request (PLN IBAN):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "PLN",
          "type": "iban",
          "details": {
           "legalType": "PRIVATE",
           "IBAN": "PL89370400440532013000"
           }
        }'

Example Request (PLN Local):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "PLN",
          "type": "polish",
          "details": {
           "legalType": "PRIVATE",
           "accountNumber": "109010140000071219812874"
           }
        }'

Send payments to Poland.

Private and business recipients are supported.


Recipient type = 'iban'

Required details: IBAN


OR


Recipient type = 'polish'

Required details: accountNumber

Create RON Recipient

Example Request (RON):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "RON",
          "type": "iban",
          "details": {
           "legalType": "PRIVATE",
           "IBAN": "RO89370400440532013000"
           }
        }'

Send payments to Romania.

Private and business recipients are supported.

Recipient type = 'iban'

Required details: IBAN

Create RUB Recipient

Example Request (RUB):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "RUB",
          "type": "russiarapida",
          "details": {
           "legalType": "PRIVATE",
           "bankCode": "041234567",
           "accountNumber": "40820810999999999999",
           "russiaRegion": "ALTAIKRAI",
           "address" : {
              "country": "GB",
              "city": "London",
              "postCode": "10025",
              "firstLine": "50 Branson Ave"
             }
           }
        }'

Send payments to Russia.

Recipient type = 'russiarapida'

Required details: bankCode, accountNumber, region, recipient address

You can get list of bank, region and country codes by using /v1/quotes/{quoteId}/account-requirements endpoint.

Create SEK Recipient

Example Request (SEK IBAN):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "SEK",
          "type": "iban",
          "details": {
           "legalType": "PRIVATE",
           "IBAN": "SE89370400440532013000"
           }
        }'

Example Request (SEK Local):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "SEK",
          "type": "sweden_local",
          "details": {
           "legalType": "PRIVATE",
           "clearingNumber": "1234",
           "accountNumber": "1234567"
           }
        }'

Example Request (SEK BankGiro):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "SEK",
          "type": "bankgiro",
          "details": {
           "legalType": "PRIVATE",
           "bankgiroNumber": "1234-5678"
           }
        }'

Send payments to Sweden.

Private and business recipients are supported.


Recipient type = 'iban'

Required details: IBAN


OR


Recipient type = 'sweden_local'

Required details: clearingNumber, accountNumber


OR


Recipient type = 'bankgiro'

Required details: bankgiroNumber

Create SGD Recipient

Example Request (SGD):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "SGD",
          "type": "singapore",
          "details": {
           "legalType": "PRIVATE",
           "bankCode": "7418",
           "accountNumber": "1238827822"
           }
        }'

Send payments to Singapore.

Private and business recipients are supported.

Recipient type = 'singapore'

Required details: bankCode, accountNumber

You can get list of bank codes by using /v1/quotes/{quoteId}/account-requirements endpoint.

Create THB Recipient

Example Request (THB):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "THB",
          "type": "thailand",
          "details": {
           "legalType": "PRIVATE",
           "bankCode": "002",
           "accountNumber": "9517384260"
           "address" : {
              "country": "GB",
              "city": "London",
              "postCode": "10025",
              "firstLine": "50 Branson Ave"
             }
           }
        }'

Send payments to Thailand. Max 2 mln THB per payment.

Private and business recipients are supported.

Recipient type = 'thailand'

Required details: bankCode, accountNumber

You can get list of bank and country codes by using /v1/quotes/{quoteId}/account-requirements endpoint.

Create TRY Recipient

Example Request (TRY):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "TRY",
          "type": "turkish_earthport",
          "details": {
           "legalType": "PRIVATE",
           "IBAN": "TR330006100519786457841326"
           }
        }'

Send payments to Turkey.

Private and business recipients are supported. 1 000 000 TRY per payment.

Recipient type = 'turkish_earthport'

Required details: IBAN

Create UAH Recipient

Example Request (UAH):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "UAH",
          "type": "privatbank",
          "details": {
           "legalType": "PRIVATE",
           "phoneNumber": "777210012",
           "accountNumber": "2662"
           }
        }'

Send payments to Ukraine. Maximum 1,2m UAH per payment.

Recipient type = 'privatbank'

Required details:

Create USD Recipient

Example Request (USD):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "USD",
          "type": "aba",
          "details": {
           "legalType": "PRIVATE",
           "abartn": "111000025",
           "accountNumber": "12345678",
           "accountType": "CHECKING",
           "address" : {
              "country": "GB",
              "city": "London",
              "postCode": "10025",
              "firstLine": "50 Branson Ave"
             }
           }
        }'

Send payments to USA.

Private and business recipients are supported. Max 1 Million USD per payment.

Recipient type = 'aba'

Required details:

Create VND Recipient

Example Request (VND):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "VND",
          "type": "vietname_earthport",
          "details": {
           "legalType": "PRIVATE",
           "swiftCode": "ABBKVNVX",
           "branchCode": "001",
           "accountNumber": "1234567890"
           }
        }'

Send payments to Vietnam.

Private and business recipients are supported.

Recipient type = 'vietname_earthport'

Required details: swiftCode, branchCode, accountNumber

You can get list of bank and branc codes by using /v1/quotes/{quoteId}/account-requirements endpoint.

Create ZAR Recipient

Example Request (ZAR):

curl -X POST "https://api.sandbox.transferwise.tech/v1/accounts" \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "profile": <your profile id>,
          "accountHolderName": "<recipient name>",
          "currency": "ZAR",
          "type": "southafrica",
          "details": {
           "legalType": "PRIVATE",
           "swiftCode": "ALBRZAJJ",
           "accountNumber": "0000000052312891"
           }
        }'

Send payments to South African Republic.

Private and business recipients are supported.

Recipient type = 'southafrica'

Required details: swiftCode, accountNumber

You can get list of bank codes by using /v1/quotes/{quoteId}/account-requirements endpoint.

Simulation

Simulate Transfer Processing

Example Request:

curl -X GET "https://api.sandbox.transferwise.tech/v1/simulation/transfers/{transferId}/processing" \
     -H "Authorization: Bearer <your api token>"

Example Response:

{
  "id": 15574445,
  "user": 294205,
  "targetAccount": 7993919,
  "sourceAccount": null,
  "quote": 113379,
  "status": "processing",
  "reference": "good times",
  "rate": 1.2151,
  "created": "2017-03-14 15:25:51",
  "business": null,
  "transferRequest": null,
  "details": {
    "reference": "good times"
  },
  "hasActiveIssues": false,
  "sourceValue": 1000,
  "sourceCurrency": "EUR",
  "targetValue": 895.32,
  "targetCurrency": "GPB"
}

You can simulate payment processing by changing transfer statuses using these endpoints.

This feature is limited to sandbox only.

Request

GET https://api.sandbox.transferwise.tech/v1/simulation/transfers/{transferId}/processing

Changes transfer status from incoming_payment_waiting to processing.

GET https://api.sandbox.transferwise.tech/v1/simulation/transfers/{transferId}/funds_converted

Changes transfer status from processing to funds_converted.

GET https://api.sandbox.transferwise.tech/v1/simulation/transfers/{transferId}/outgoing_payment_sent

Changes transfer status from funds_converted to outgoing_payment_sent.

GET https://api.sandbox.transferwise.tech/v1/simulation/transfers/{transferId}/bounced_back

Changes transfer status from outgoing_payment_sent to bounced_back.

GET https://api.sandbox.transferwise.tech/v1/simulation/transfers/{transferId}/funds_refunded

Changes transfer status from bounced_back to funds_refunded.

Response

Transfer entity with changed status.

Terms and Conditions

Get Terms and Conditions

Example Request:

curl -X GET "https://api.sandbox.transferwise.tech/v1/terms/default"

Example Response:

<h2><strong>1. How to read this Agreement</strong></h2>
<p>This Agreement contains 30 sections. You may go directly to any section by selecting the appropriate link provided. The headings are for reference only. Some capitalised terms have specific definitions in section [3]. Underlined words in this Agreement contain hyperlinks to further information.</p>
<h2><strong>2. Why you should read this Agreement</strong></h2>
<p>2.1 What this Agreement cover. These are the term and conditions on which we provide our Services to you.</p>
<p>2.2 Why you should read them. Please read this Agreement carefully before you start to use our Services. This Agreement (always together with the documents referred to in it) tell you who we are, how we will provide the Services to you, how this Agreement may be changed or ended, what to do if there is a problem and other important information. If you think that there is a mistake in this Agreement or require any changes, please <u>contact us</u> to discuss.</p>
<p>2.3 Other additional documents which applies to you. This Agreement refers to the following additional documents, which also apply to your use of our Services:</p>
<ul><li>(a) <u>Our Privacy Policy</u>, which sets out the terms on which we process any personal data we collect about you, or that you provide to us. By using our Services, you consent to such processing and you promise that all data provided by you is accurate.</li>
<li>(b) <u>Our Cookie Policy</u>, which sets out information about the “cookies” on our Website.</li>
...

Get TransferWise terms and conditions in HTML format to show to your customers who are signing up for their TransferWise account. This endpoint is applicable for bank integrations and third party application integrators only.

Request

GET https://api.sandbox.transferwise.tech/v1/terms/{clientId}

Use "default" as clientId to fetch Transferwise general terms and conditions.

No authentication is required for this endpoint.

Response

Terms and conditions in HTML format.

Transfers

Create

Example Request:

curl -X POST https://api.sandbox.transferwise.tech/v1/transfers \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "targetAccount": <recipient account id>,   
          "quote": <quote id>,
          "customerTransactionId": "<the UUID you generated for the transfer attempt>",
          "details" : {
              "reference" : "to my friend",
              "transferPurpose": "verification.transfers.purpose.pay.bills",
              "sourceOfFunds": "verification.source.of.funds.other"
            } 
         }'

Example Response:

{
    "id": 468956,
    "user": <your user id>,
    "targetAccount": <recipient account id>,
    "sourceAccount": null,
    "quote": <quote id>,
    "status": "incoming_payment_waiting",
    "reference": "to my friend",
    "rate": 0.9065,
    "created": "2018-08-28 07:43:55",
    "business": <your business profile id>,
    "transferRequest": null,
    "details": {
        "reference": "to my friend"
    },
    "hasActiveIssues": false,
    "sourceCurrency": "EUR",
    "sourceValue": 661.89,
    "targetCurrency": "GBP",
    "targetValue": 600,
    "customerTransactionId": "bd244a95-dcf8-4c31-aac8-bf5e2f3e54c0"
}

Transfer is a payout order to recipient account based on a quote. Once created then a transfer needs to be funded during next 5 working days. In case not it will get automatically cancelled.

Request

POST https://api.sandbox.transferwise.tech/v1/transfers

Field Description Format
targetAccount Recipient account id. You can create multiple transfers to same recipient account. Integer
quote Quote id. You can only create one transfer per one quote.
You cannot use same quote ID to create multiple transfers.
Integer
customerTransactionId This is required to perform idempotency check to avoid duplicate transfers in case of network failures or timeouts. UUID
details.reference (optional) Recipient will see this reference text in their bank statement. Maximum allowed characters depends on the currency route. Business Payments Tips article has a full list. Text
details.transferPurpose (conditionally required) For example when target currency is THB. See more about conditions at Transfers.Requirements Text
details.sourceOfFunds (conditionally required) For example when target currency is USD and transfer amount exceeds 10k. See more about conditions at Transfers.Requirements Text

There are two options to deal with conditionally required fields:

Response

You need to save transfer id for tracking its status later.

Field Description Format
id Transfer id Integer
user Your user id Integer
targetAccount Recipient account id Integer
sourceAccount Not used Integer
quote Quote id Integer
status Transfer current status Text
reference Deprecated, use details.reference instead Text
rate Exchange rate value Decimal
created Timestamp when transfer was created Timestamp
business Your business profile id
transferRequest Not used Integer
details.reference Payment reference text Text
hasActiveIssues Are there any pending issues which stop executing the transfer? Boolean
sourceCurrency Source currency code Text
sourceValue Transfer amount in source currency Decimal
targetCurrency Target currency code Text
targetValue Transfer amount in target currency Decimal
customerTransactionId UUID format unique identifier assinged by customer. Used for idempotency check purposes. UUID

Avoiding duplicate transfers

We use customerTransactionId field to avoid duplicate transfer requests. When your first call fails (error or timeout) then you should use the same value in customerTransactionId field that you used in the original call when you are submitting a retry message. This way we can treat subsequent retry messages as repeat messages and will not create duplicate transfers to your account.

Fund

Example Request:

curl -X POST https://api.sandbox.transferwise.tech/v1/transfers/{transferId}/payments \
     -H "Authorization: Bearer <your api token>" \
     -H "Content-Type: application/json" \
     -d '{ 
          "type": "BALANCE"   
         }'

Example Response:

{
  "type": "BALANCE",
  "status": "COMPLETED",
  "errorCode": null
}

This API call is the final step for executing payouts. TransferWise will now debit funds from your borderless balance and start processing your transfer. If your borderless balance is short of funds then this call will fail with "insufficient funds" error.

Request

POST https://api.sandbox.transferwise.tech/v1/transfers/{transferId}/payments

Use transfer id that you obtained in previous step.

Field Description Format
type "BALANCE".
This indicates that your transfer will be funded from your borderless account balance.
Text

Response

You need to save transfer id for tracking its status later.

Field Description Format
type "BALANCE" Text
status "COMPLETED" or "REJECTED" Text
errorCode Failure reason. For example "balance.payment-option-unavailable" Text

Cancel

Example Request:

curl -X PUT https://api.sandbox.transferwise.tech/v1/transfers/{transferId}/cancel \
     -H "Authorization: Bearer <your api token>" 

Example Response:

{
  "id": 16521632,
  "user": 4342275,
  "targetAccount": 8692237,
  "sourceAccount": null,
  "quote": 657171,
  "status": "cancelled",
  "reference": "reference text",
  "rate": 0.89,
  "created": "2017-11-24 10:47:49",
  "business": null,
  "transferRequest": null,
  "details": {
    "reference": "vambo 3"
  },
  "hasActiveIssues": false,
  "sourceCurrency": "EUR",
  "sourceValue": 0,
  "targetCurrency": "GBP",
  "targetValue": 150,
  "customerTransactionId": "54a6bc09-cef9-49a8-9041-f1f0c654cd88"
}

Only transfers which are not funded can be cancelled. Cancellation is final it can not be undone.

Request

PUT https://api.sandbox.transferwise.tech/v1/transfers/{transferId}/cancel

Use transfer id that you obtained when creating a transfer.

Get by Id

Example Request:

curl -X GET https://api.sandbox.transferwise.tech/v1/transfers/{transferId} \
     -H "Authorization: Bearer <your api token>" 

Example Response:

{
  "id": 15574445,
  "user": 294205,
  "targetAccount": 7993919,
  "sourceAccount": null,
  "quote": 113379,
  "status": "incoming_payment_waiting",
  "reference": "good times",
  "rate": 1.2151,
  "created": "2017-03-14 15:25:51",
  "business": null,
  "transferRequest": null,
  "details": {
    "reference": "good times"
  },
  "hasActiveIssues": false,
  "sourceValue": 1000,
  "sourceCurrency": "EUR",
  "targetValue": 895.32,
  "targetCurrency": "GPB",
  "customerTransactionId": "6D9188CF-FA59-44C3-87A2-4506CE9C1EA3"
}

Get transfer info by id. Since we don't have push notifications yet, you can poll this endpoint to track your transfer status.

Request

GET https://api.sandbox.transferwise.tech/v1/transfers/{transferId}

Get Issues

Example Request:

curl -X GET https://api.sandbox.transferwise.tech/v1/transfers/{transferId}/issues \
     -H "Authorization: Bearer <your api token>" 

Example Response:

[
  {
    "type": "Payment has bounced back",
    "state": "OPENED",
    "description": "Inorrect recipient account number"
  }
]

Get pending issues that are suspending a transfer from further processing. This is more applicable for Bank Integrations use case when transfers are NOT funded from borderless account but funding is sent via bank transfer. For example "DEPOSIT_AMOUNT_LESS_INVOICE" means that arrived funding does not cover total transfer amount.

Request

GET https://api.sandbox.transferwise.tech/v1/transfers/{transferId}/issues

Response

Field Description Format
type Issue type:
  • DEPOSIT_AMOUNT_LESS_INVOICE
  • DEPOSIT_AMOUNT_MORE_INVOICE
  • PROVE_ACCOUNT_OWNERSHIP_WITH_REFERENCE_CODE
  • PROVE_ACCOUNT_OWNERSHIP_WITH_MICRO_DEPOSIT
  • JOINT_ACCOUNT_PROOF_NEEDED
  • BUSINESS_ORDER_PERSONAL_DEPO
  • INCORRECT_NAME_DEPOSIT
  • DEPOSIT_PROOF_NEEDED
  • PERSONAL_ORDER_BUSINESS_DEPO
  • INCORRECT_DEPOSIT_RECIPIENT_DETAILS
  • INCORRECT_SOURCE_ACCOUNT_NUMBER
    Text
    status Issue state: OPENED, IN_PROGRESS, CLOSED Text
    description Additional details about issue. For example 'Incorrect recipient account number' Text

    Get Delivery Time

    Example Request:

    curl -X GET https://api.sandbox.transferwise.tech/v1/delivery-estimates/{transferId} \
         -H "Authorization: Bearer <your api token>" 
    

    Example Response:

    {
       "estimatedDeliveryDate" : "2018-01-10T12:15:00.000+0000"
    }
    

    Get the live delivery estimate for a transfer by the transfer ID.
    The delivery estimate is the time at which we currently expect the transfer to arrive in the benificiary's bank account.
    This is not a guaranteed time but we are working hard to make these estimates as accurate as possible.

    Request

    GET https://api.sandbox.transferwise.tech/v1/delivery-estimates/{transferId}

    Response

    You need to save transfer id for tracking its status later.

    Field Description Format
    estimatedDeliveryDate Estimated time when funds will arrive to recipient's bank account Timestamp

    List

    Example Request:

    curl -X GET https://api.sandbox.transferwise.tech/v1/transfers?offset=0&limit=100&profile=<your profile id>&status=funds_refunded&createdDateStart=2018-12-15&createdDateEnd=2018-12-30  \
         -H "Authorization: Bearer <your api token>" 
    

    Example Response:

    [
      {
        "id": 15574445,
        "user": 294205,
        "targetAccount": 7993919,
        "sourceAccount": null,
        "quote": 113379,
        "status": "funds_refunded",
        "reference": "good times",
        "rate": 1.1179,
        "created": "2018-12-16 15:25:51",
        "business": null,
        "transferRequest": null,
        "details": {
          "reference": "good times"
        },
        "hasActiveIssues": false,
        "sourceValue": 1000,
        "sourceCurrency": "EUR",
        "targetValue": 895.32,
        "targetCurrency": "GPB",
        "customerTransactionId": "6D9188CF-FA59-44C3-87A2-4506CE9C1EA3"
      },
      {
        "id": 14759252,
        "user": 294205,
        "targetAccount": 5570192,
        "sourceAccount": null,
        "quote": 113371,
        "status": "funds_refunded",
        "reference": "",
        "rate": 1.1179,
        "created": "2018-12-26 15:25:51",
        "business": null,
        "transferRequest": null,
        "details": {
          "reference": ""
        },
        "hasActiveIssues": false,
        "sourceValue": 1000,
        "sourceCurrency": "EUR",
        "targetValue": 895.32,
        "targetCurrency": "GPB",
        "customerTransactionId": "785C67AD-7E29-4DBC-9D4A-4C45D4D5333A"
      }
    ]
    

    Get the list of transfers for given user's profile (defaults to user's personal profile).

    You can add query parameters to specify user's profile (personal or business), time period and/or payment status.

    For example you can query:

    Request

    GET https://api.sandbox.transferwise.tech/v1/transfers/?offset=0&limit=100&profile=<your profile id>&status=funds_refunded&createdDateStart=2018-12-15&createdDateEnd=2018-12-30

    Field Description Format
    profile User profile id. If parameter is omitted, defaults to user's personal profile Integer
    status Status code or codes list (as comma separated value list) to filter returned transfers with. See Track transfer status for complete list of statuses. Text
    createdDateStart Starting date to filter transfers, inclusive of the provided date. yyyy-MM-dd
    createdDateEnd Ending date to filter transfers, inclusive of the provided date. yyyy-MM-dd
    limit Maximum number of records to be returned in response Integer
    offset Starting record number Integer

    Requirements

    Example Request:

    curl -X POST https://api.sandbox.transferwise.tech/v1/transfer-requirements \
         -H "Authorization: Bearer <your api token>" \
         -H "Content-Type: application/json" \
         -d '{ 
                "targetAccount": <recipient account id>,
                "quote": <quote id>,
                "details": {
                  "reference": "good times",
                  "sourceOfFunds": "verification.source.of.funds.other",
                  "sourceOfFundsOther": "Trust funds"
                },
                "customerTransactionId": "6D9188CF-FA59-44C3-87A2-4506CE9C1EA3"
             }'
    

    Example Response:

    [
      {
        "type": "transfer",
        "fields": [
          {
            "name": "Transfer reference",
            "group": [
              {
                "key": "reference",
                "type": "text",
                "refreshRequirementsOnChange": false,
                "required": false,
                "displayFormat": null,
                "example": null,
                "minLength": null,
                "maxLength": 10,
                "validationRegexp": null,
                "validationAsync": null,
                "valuesAllowed": null
              }
            ]
          },
          {
            "name": "Transfer purpose",
            "group": [
              {
                "key": "transferPurpose",
                "type": "select",
                "refreshRequirementsOnChange": true,
                "required": true,
                "displayFormat": null,
                "example": null,
                "minLength": null,
                "maxLength": null,
                "validationRegexp": null,
                "validationAsync": null,
                "valuesAllowed": [
                  {
                    "key": "verification.transfers.purpose.purchase.property",
                    "name": "Buying property abroad"
                  },
                  {
                    "key": "verification.transfers.purpose.pay.bills",
                    "name": "Rent or other property expenses"
                  },
                  {
                    "key": "verification.transfers.purpose.mortgage",
                    "name": "Mortgage payment"
                  },
                  {
                    "key": "verification.transfers.purpose.pay.tuition",
                    "name": "Tuition fees or studying expenses"
                  },
                  {
                    "key": "verification.transfers.purpose.send.to.family",
                    "name": "Sending money home to family"
                  },
                  {
                    "key": "verification.transfers.purpose.living.expenses",
                    "name": "General monthly living expenses"
                  },
                  {
                    "key": "verification.transfers.purpose.other",
                    "name": "Other"
                  }
                ]
              }
            ]
          },
          {
            "name": "Source of funds",
            "group": [
              {
                "key": "sourceOfFunds",
                "type": "select",
                "refreshRequirementsOnChange": true,
                "required": true,
                "displayFormat": null,
                "example": null,
                "minLength": null,
                "maxLength": null,
                "validationRegexp": null,
                "validationAsync": null,
                "valuesAllowed": [
                  {
                    "key": "verification.source.of.funds.salary",
                    "name": "Salary"
                  },
                  {
                    "key": "verification.source.of.funds.investment",
                    "name": "Investments (stocks, properties, etc.)"
                  },
                  {
                    "key": "verification.source.of.funds.inheritance",
                    "name": "Inheritance"
                  },
                  {
                    "key": "verification.source.of.funds.loan",
                    "name": "Loan"
                  },
                  {
                    "key": "verification.source.of.funds.other",
                    "name": "Other"
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
    

    Almost every country has their own specific originality when it comes to the nitty gritty details of domestic payment systems and money transfer regulations. Maximum allowed length of reference text is a good example. The US payment system, ACH, supports 10 characters only, but transfers within Mexico allow up to 100 characters and so on.

    Same is true for requirements arising from Anti-Money Laundering regulations adopted in different countries. Transfers from and to USD almost always require more details about source of funds and transfer purpose, compared to transfers to EUR or GBP.

    Endpoint /transfer-requirements exposes all these specific requirements based on specific quote and target recipient account.

    To make sure that processing of your transfers does not get delayed because of missing details, we highly recommend to verify the transfer requirements before before submitting any transfer.

    Request

    POST https://api.sandbox.transferwise.tech/v1/transfer-requirements

    1.Prepare request body to create transfer object first. Now post this request body to transfer-requirements endpoint to figure out if there are any other required fields.

    2.Analyze the returned list of fields. Our example includes reference, sourceOfFunds and transferPurpose fields. Field 'reference' is optional. Fields 'sourceOfFunds' and 'transferPurpose' are required and both have refreshRequirementsOnChange=true which indicates that there could be additional fields required depending on the selected value.

    In our example you will have to POST request to/v1/transfer-requirements` second time as well with values set for 'transferPurpose' and 'sourceOfFunds'. So in case you set sourceOfFunds = 'verification.source.of.funds.other' then another text field called "sourceOfFundsOther" is also required where you need to specify the details in free format.

    3.Once you get to the point where you have provided values for all fields which have refreshRequirementsOnChange=true then you have complete set of fields to compose a valid request to create a transfer object. For example this is a valid request to create a transfer.
    POST /v1/transfers:

    { "targetAccount": , "quote": , "details": { "reference": "good times", "sourceOfFunds": "verification.source.of.funds.other", "sourceOfFundsOther": "Trust funds" }, "customerTransactionId": "6D9188CF-FA59-44C3-87A2-4506CE9C1EA3" }

    Response

    Field Description Format
    type "transfer" Text
    fields[n].name Field description Text
    fields[n].group[n].key Key is name of the field you should include in the JSON Text
    fields[n].group[n].type Display type of field (e.g. text, select, etc) Text
    fields[n].group[n].refreshRequirementsOnChange Tells you whether you should call POST transfer-requirements once the field value is set to discover required lower level fields. Boolean
    fields[n].group[n].required Indicates if the field is mandatory or not Boolean
    fields[n].group[n].displayFormat Display format pattern. Text
    fields[n].group[n].example Example value. Text
    fields[n].group[n].minLength Min valid length of field value. Integer
    fields[n].group[n].maxLength Max valid length of field value. Integer
    fields[n].group[n].validationRegexp Regexp validation pattern. Text
    fields[n].group[n].validationAsync Validator URL and parameter name you should use when submitting the value for validation Text
    fields[n].group[n].valuesAllowed[n].key List of allowed values. Value key Text
    fields[n].group[n].valuesAllowed[n].name List of allowed values. Value name. Text




































    Users

    Get By Id

    Example Request:

    curl -X GET https://api.sandbox.transferwise.tech/v1/users/{userId} \
         -H "Authorization: Bearer <your api token>" 
    

    Example Response:

    {
      "id": 294205,
      "name": "Oliver Wilson",
      "email": "oliver@gmail.com",
      "active": true,
      "details": {
        "firstName": "Oliver",
        "lastName": "Wilson",
        "phoneNumber": "+3725064992",
        "occupation": "",
        "address": {
          "city": "Tallinn",
          "countryCode": "EE",
          "postCode": "12112",
          "state": "",
          "firstLine": "Salu tee 134"
        },
        "dateOfBirth": "1977-07-01",
        "avatar": "https://lh6.googleusercontent.com/-XzeFZ2PJE1A/AAAAAAAAAAI/AAAAAAAAAAA/RvuvhXFsqs0/photo.jpg",
        "primaryAddress": 236532
      }
    }
    

    Get authenticated user details by user id. Response includes also personal user profile info.

    Request

    GET https://api.sandbox.transferwise.tech/v1/users/{userId}

    Response

    Field Description Format
    id userId Integer
    name User full name Text
    email User email Text
    active If user is active or not Boolean
    details.firstName User first name Text
    details.lastName User lastname Text
    details.phoneNumber Phone number Text
    details.dateOfBirth Date of birth YYYY-MM-DD
    details.occupation Person occupation Text
    details.avatar Link to person avatar image Text
    details.primaryAddress Address object id Integer
    details.address.country Address country code in 2 digits. "US" for example Text
    details.address.firstLine Address first line Text
    details.address.postCode Address post code Text
    details.address.city Address city name Text
    details.address.state Address state code State code. Required if country is US, CA, AU, BR. Text
    details.address.occupation User occupation. Required for US, CA, JP Text

    Sign Up with Registration Code

    1) Example Request: Get Client Credentials Token

    curl \
    -u '[your-api-client-id]:[your-api-client-secret]' \
    -d 'grant_type=client_credentials' \
    'https://api.sandbox.transferwise.tech/oauth/token' 
    

    1) Example Response: Get Client Credentials Token

      {
        "access_token":"ba8k1234-00f2-475a-60d8-6g45377b4062",
        "token_type":"bearer",
        "expires_in": 43199,
        "scope":"transfers"
      }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    2) Example Request: Create User

    curl -X POST https://api.sandbox.transferwise.tech/v1/user/signup/registration_code \
         -H "Authorization: Bearer <your client credentials token>" \
         -H "Content-Type: application/json" \
         -d '{ 
              "email": <user email>,
              "registrationCode": <registration code>
            }'
    

    2) Example Response: Create User (Success (200) user created successfully)

          {
            "id": 12345,
            "name": null,
            "email": "new.user@domain.com",
            "active": true,
            "details": null
          }
    

    2) Example Response: Create User (Failure (409): User already exists)

          {
            "errors": [
              {
                "code": "NOT_UNIQUE",
                "message": "You’re already a member. Please login",
                "path": "email",
                "arguments": [
                  "email",
                  "class com.transferwise.fx.api.ApiRegisterCommand",
                  "existing.user@domain.com"
                ]
              }
            ]
          }
    
    
    
    
    
    
    
    
    

    3) Example Request: Get User Tokens

    curl \
    -u '[your-api-client-id]:[your-api-client-secret]' \
    -d 'grant_type=registration_code' \
    -d 'email=<user email>' \
    -d 'client_id=[your-api-client-id]' \
    -d 'registration_code=<registration code used to create user>' \
    'https://api.sandbox.transferwise.tech/oauth/token' 
    

    3) Example Response: Get User Tokens (Success: 200)

        {
          "access_token": "01234567-89ab-cdef-0123-456789abcdef",
          "token_type": "bearer",
          "refresh_token": "01234567-89ab-cdef-0123-456789abcdef",
          "expires_in": 43199,
          "scope": "transfers"
        }
    

    3) Example Response: Get User Tokens (Failure: 401 - User reclaimed the account or invalid registration code used)

        {
          "error": "invalid_grant",
          "error_description": "Invalid user credentials."
        }
    

    This feature is related to Bank Integrations product. It enables onboarding new users to TransferWise via backend API calls only. To get authorization from Transferwise existing users you still need to redirect them to our authorization webpage.

    There are 3 steps you need to go through:

    1) Get Client Credentials Token

    Obtain access_token based on your API client credentials.

    Request

    POST https://api.sandbox.transferwise.tech/oauth/token

    Use Basic Authentication with your api-client-id/api-client-secret as username/pwd.

    Field Description Format
    grant_type "client_credentials" Text

    Response

    Field Description Format
    access_token Access token to be used when calling "create user" endpoint. Valid for 12 hours. uuid
    token_type "bearer" Text
    expires_in Expiry time in seconds Integer
    scope "transfers" Text

    2) Create User

    TransferWise uses email address as unique identifier for users. If email is new (there is no active user already) then new user will be created.

    When you are submitting an email which already exists amongst our users then you will get a warning that "You’re already a member. Please login". If user already exists then you need to redirect to Get user authorization webpage.

    Request

    POST https://api.sandbox.transferwise.tech/v1/user/signup/registration_code

    Use access_token obtained in first step as authentication header.

    Field Description Format
    email New user's email address Email
    registrationCode Randomly generated registration code that is unique to this user. At least 32 characters long.
    You need to store registration code to obtain access token on behalf of this
    newly created user in next step.
    Please apply the same security standards to handling registration code as if it was a password.
    Text, min length is 32 chars

    Response

    Field Description Format
    id userId Integer
    name User full name. Empty. Text
    email Customer email Text
    active true Boolean
    details User details. Empty. Group

    3) Get User Tokens

    You can now use registration code to obtain user access token and refresh token. This step can be repeated as long as user does not reclaim their TransferWise account. If user has reclaimed the account, then redirect to Get user authorization flow should be used instead.

    Refresh user access token works same way for this flow as well.

    Request

    POST https://api.sandbox.transferwise.tech/oauth/token

    Use Basic Authentication with your api-client-id/api-client-secret as username/pwd.

    Field Description Format
    grant_type "registration_code" Text
    email New user's email address Email
    client_id Your api_client_id Text
    registration_code registrationCode from step 2 Text

    Response

    Field Description Format
    access_token Access token to be used when calling API endpoints on behalf of user. Valid for 12 hours. uuid
    token_type "bearer" Text
    refresh_token Refresh token which you need to use in order to request new access_token. The lifetime of refresh tokens is 10 years. uuid
    expires_in Expiry time in seconds Integer
    scope "transfers" Text

    User Profiles

    Create (Personal)

    Example Request:

    curl -X POST https://api.sandbox.transferwise.tech/v1/profiles \
         -H "Authorization: Bearer <your api token>" \
         -H "Content-Type: application/json" \
         -d '{ 
              "type": "personal",
              "details": {
                "firstName": "Oliver",
                "lastName": "Wilson",
                "dateOfBirth": "1977-07-01",
                "phoneNumber": "+3725064992"
               }
            }'
    

    Example Response (Personal):

    {
      "id": <your personal profile id>,
      "type": "personal",
      "details": {
        "firstName": "Oliver",
        "lastName": "Wilson",
        "dateOfBirth": "1977-07-01",
        "phoneNumber": "+3725064992",
        "avatar": "",
        "occupation": "",
        "primaryAddress": null
      }
    }
    

    Create personal user profile. Same person cannot have multiple active duplicate user profiles. Thus creating multiple profiles with the same details will fail.

    Request

    POST https://api.sandbox.transferwise.tech/v1/profiles

    Field Description Format
    type "personal" Text
    details.firstName First name Text
    details.lastName Last name Text
    details.dateOfBirth Date of birth YYYY-MM-DD
    details.phoneNumber
    (optional)
    Phone number Text

    Response

    Field Description Format
    id profileId Integer
    type "personal" Text
    details.firstName First name Text
    details.lastName Last name Text
    details.dateOfBirth Date of birth YYYY-MM-DD
    details.phoneNumber Phone number Text
    details.avatar Link to person avatar image Text
    details.occupation Person occupation Text
    details.primaryAddress Address object id Integer

    Create (Business)

    Example Request:

    curl -X POST https://api.sandbox.transferwise.tech/v1/profiles \
         -H "Authorization: Bearer <your api token>" \
         -H "Content-Type: application/json" \
         -d '{ 
              "type": "business",
              "details": {
                "name": "ABC Logistics Ltd",
                "registrationNumber": "12144939",
                "acn": null,
                "abn": null,
                "arbn": null,
                "companyType": "LIMITED",
                "companyRole": "OWNER",
                "descriptionOfBusiness": "Information and communication",
                "webpage": "https://abc-logistics.com"
               }
            }'
    

    Example Response (Business):

    {
      "id": <your business profile id>,
      "type": "business",
      "details": {
         "name": "ABC Logistics Ltd",
         "registrationNumber": "12144939",
         "acn": null,
         "abn": null,
         "arbn": null,
         "companyType": "LIMITED",
         "companyRole": "OWNER",
         "descriptionOfBusiness": "Information and communication",
         "webpage": "https://abc-logistics.com",
         "primaryAddress": null
       }
    }
    

    Create business user profile. You would need to create personal profile first always. Business profile cannot be created without personal profile.

    Request (Business)

    POST https://api.sandbox.transferwise.tech/v1/profiles

    Field Description Format
    type "business" Text
    details.name Business name Text
    details.registrationNumber Business registration number Text
    details.acn Australian Company Number (only for AUS businesses) Text
    details.abn Australian Business Nnumber (only for AUS businesses) Text
    details.arbn Australian Registered Body Number (only for AUS businesses) Text
    details.companyType Company legal form. Allowed values:
    • LIMITED
    • PARTNERSHIP
    • SOLE_TRADER
    • LIMITED_BY_GUARANTEE
    • LIMITED_LIABILITY_COMPANY
    • FOR_PROFIT_CORPORATION
    • NON_PROFIT_CORPORATION
    • LIMITED_PARTNERSHIP
    • LIMITED_LIABILITY_PARTNERSHIP
    • GENERAL_PARTNERSHIP
    • SOLE_PROPRIETORSHIP
    • PRIVATE_LIMITED_COMPANY
    • PUBLIC_LIMITED_COMPANY
    • TRUST
    • OTHER
    Text
    details.companyRole Role of person. Allowed Values:
    • OWNER
    • DIRECTOR
    • OTHER
    Text
    details.descriptionOfBusiness Sector / filed of activity Text
    details.webpage Business webpage Text

    Response (Business)

    Field Description Format
    id profileId Integer
    type "business" Text
    details.name Business name Text
    details.registrationNumber Business registration number Text
    details.acn Australian Company Number (only for AUS businesses) Text
    details.abn Australian Business Nnumber (only for AUS businesses) Text
    details.arbn Australian Registered Body Number (only for AUS businesses) Text
    details.companyType Company legal form Text
    details.companyRole Role of person Text
    details.descriptionOfBusiness Sector / filed of activity Text
    details.webpage Business webpage Text
    details.primaryAddress Address object id Integer

    Update

    Example Request:

    curl -X PUT https://api.sandbox.transferwise.tech/v1/profiles \
         -H "Authorization: Bearer <your api token>" \
         -H "Content-Type: application/json" \
         -d '{ 
              "type": "personal",
              "details": {
                "firstName": "Oliver",
                "lastName": "Wilson",
                "dateOfBirth": "1977-07-01",
                "phoneNumber": "+3725064992"
               }
            }'
    

    Example Response:

    {
      "id": <your personal profile id>,
      "type": "personal",
      "details": {
        "firstName": "Oliver",
        "lastName": "Wilson",
        "dateOfBirth": "1977-07-01",
        "phoneNumber": "+3725064992",
        "avatar": "",
        "occupation": "",
        "primaryAddress": null
      }
    }
    

    Update user profile information. If user profile has been verified by TransferWise then there are restrictions on what information is allowed to change.

    Request

    PUT https://api.sandbox.transferwise.tech/v1/profiles

    Request and response is same as described in Create (Personal) and Create (Business)

    Get By Id

    Example Request:

    curl -X GET https://api.sandbox.transferwise.tech/v1/profiles/{profileId} \
         -H "Authorization: Bearer <your api token>" 
    

    Example Response:

    {
      "id": <your personal profile id>,
      "type": "personal",
      "details": {
        "firstName": "Oliver",
        "lastName": "Wilson",
        "dateOfBirth": "1977-07-01",
        "phoneNumber": "+3725064992",
        "avatar": "",
        "occupation": "",
        "primaryAddress": null
      }
    }
    

    Get profile info by id.

    Request

    GET https://api.sandbox.transferwise.tech/v1/profiles/{profileId}

    List

    Example Request:

    curl -X GET https://api.sandbox.transferwise.tech/v1/profiles \
         -H "Authorization: Bearer <your api token>" 
    

    Example Response:

    [
        {
          "id": <your personal profile id>,
          "type": "personal",
          "details": {
            "firstName": "Oliver",
            "lastName": "Wilson",
            "dateOfBirth": "1977-07-01",
            "phoneNumber": "+3725064992",
            "avatar": "",
            "occupation": "",
            "primaryAddress": null
          }
        },
        {
          "id": <your business profile id>,
          "type": "business",
          "details": {
             "name": "ABC Logistics Ltd",
             "registrationNumber": "12144939",
             "acn": null,
             "abn": null,
             "arbn": null,
             "companyType": "LIMITED",
             "companyRole": "OWNER",
             "descriptionOfBusiness": "Information and communication",
             "webpage": "https://abc-logistics.com",
             "primaryAddress": null
           }
        }
    
    ]
    

    List of all profiles belonging to user.

    Request

    GET https://api.sandbox.transferwise.tech/v1/profiles

    Create Identification Document

    Example Request:

    curl -X POST https://api.sandbox.transferwise.tech/v1/profiles/{profileId}/verification-documents \
         -H "Authorization: Bearer <your api token>" \
         -H "Content-Type: application/json" \
         -d '{ 
                "firstName": "Oliver",
                "lastName": "Wilson",
                "type": "IDENTITY_CARD",
                "uniqueIdentifier": "AA299822313",
                "issueDate": "2017-12-31",
                "issuerCountry": "EE",
                "issuerState": "",
                "expiryDate": "2027-12-31"
            }'
    

    Example Response:

    {  
    }
    

    Add identification document details to user profile. Applicable to personal profiles (not business) only.
    Returns empty result if successful.

    Request (Business)

    POST https://api.sandbox.transferwise.tech/v1/profiles/{profileId}/verification-documents

    Field Description Format
    firstName Person first name in document Text
    lastName Person last name in document Text
    type Document type. Allowed Values:
    • DRIVERS_LICENCE
    • IDENTITY_CARD
    • GREEN_CARD
    • MY_NUMBER
    • PASSPORT
    • OTHER
    Text
    uniqueIdentifier Document number Text
    issueDate Document issue date YYYY-MM-DD
    issuerCountry Issued by country code. For example "US" Text
    issuerState Issued by state code. For example "NY" Text
    expiryDate Document expiry date. (optional) YYYY-MM-DD

    Language Support

    Internationalisation support for translation of strings returned by the API is supported for the following endpoints:

    Endpoint
    /v1/quotes
    /v1/quotes/<quoteId>/account-requirements
    /v1/accounts

    When calling these endpoints if you include an Accept-Language header with a supported language code as the value then stings will be returned in the requested language. The languages supported by TransferWise are:

    Language Code
    American English en_US
    British English en
    Dutch nl
    French fr
    German de
    Hungarian hu
    Italian it
    Japanese ja
    Korean ko
    Polish pl
    Portuguese pt
    Romanian ro
    Russian ru
    Spanish es

    If you request an unsupported language then British English will be returned by default.

    Errors

    HTTP Status Codes

    We use common HTTP status codes included in the response header to indicate success or failure.

    Code Description
    200 OK. Successful request.
    201 OK. Resource created.
    400 Bad request. Request message data did not pass validation.
    401 Unauthorised. Not authorised to access requested data.
    403 Forbidden. Access to requested data is forbidden.
    404 Not Found. Requested resource does not exist.
    408 Timeout. Operation timed out.
    422 Unprocessable entity. Request message data did not pass validation.
    500 TransferWise server error.

    Validation Errors

    Example Validation Error:

    {
        "errors": [
            {
                "code": "error.route.not.supported",
                "message": "This route is not supported",
                "arguments": [
                    "CNY-EUR"
                ]
            }
        ]
    }
    

    Data validation or violation of business rules related errors. Response could contain multiple errors.

    Authentication Errors

    Example Authentication Error:

    {
        "error": "unauthorized",
        "error_description": "Full authentication is required to access this resource"
    }
    

    Security related errors.

    System Errors

    Example System Error:

    {
      "timestamp": "2017-02-02T13:07:39.644+0000",
      "status": 500,
      "error": "Internal Server Error",
      "exception": "java.lang.NullPointerException",
      "message": "No message available",
      "path": "/v1/quotes/106031/account-requirements"
    }
    

    Something went wrong in our side.