Send money
Sending money with Wise Platform is a process with four stages. You start by getting a quote which tells you the cost of the transaction, and the exchange rate.
When you create a transfer, you do so from your own Wise profile, and must include your profileId
in the path of the API request.
To send money on behalf of a third party:
- Create an authenticated quote Use
POST /profiles
to create an authenticated quote. Whether or not you share the information in the quote with your customer, a quote is required to create the transfer itself. - Add a recipient's account details using
POST /accounts
- the recipient is the party receiving the money being transferred. You receive arecipientId
in the response to this request. - Create the transfer using
POST /transfers
. In this request, as well as details of the transaction, you must include:quoteUuid
- the ID of the quote you have created for this transaction.targetAccount
- therecipientId
of the recipient of this transfer.
- Fund the transfer using
POST /profiles/{{profileId}}/transfers/{{transferId}}/payments
once this step is complete the money is sent.
Before you can create a transfer to send money, you must always create an authenticated quote using the quote creation API.
To create the quote, you must be able to provide:
- Source Currency - The currency that will be used to pay for the transfer
- Target Currency - The currency the recipient will receive.
- One of:
- Source Amount - The fixed amount of money that will be paid into the transfer.For example, you want to send the fixed $1000 I have to a family member.
- Target Amount - The fixed amount of money that the recipient needs to receive. For example, your company needs to pay a fixed £1000 contractor invoice.
POST /v3/profiles/{{profileId}}/quotes
Personal or business profile ID of the sender - required.
Source (sending) currency code.
Target (receiving) currency code.
Amount in target currency.
Amount in source currency.
Either sourceAmount or targetAmount is required, never both.
Optional. This is the ID of transfer recipient, found in response from POST v1/accounts (recipient creation). If provided can be used as an alternative to updating the quote.
Optional. Preferred payout method. Default value is BANK_TRANSFER
. Other possible values are BALANCE
, SWIFT
, SWIFT_OUR
and INTERAC
.
Optional. Preferred payin method. Use BANK_TRANSFER
to return this method at the top of the response's results.
Optional. Used to pass additional metadata about the intended transfer.
Optional. Used to pass transfer nature for calculating proper tax amounts (IOF) for transfers to and from BRL. Accepted values are shown dynamically in transfer requirements.
Required when configured for your client ID. includes a pricingConfiguration
to be used for pricing calculations with the quote.
Identifies the type of fee that will be configured. Options include only OVERRIDE
The selected variable percentage (in decimal format) that should be used in the pricingConfiguration
The selected fixed fee that should be used in the pricingConfiguration. Always considered in source currency.
If you are funding the transfer from a Multi Currency Balance, you must set the payIn
as BALANCE
to get the correct pricing in the quote. Not doing so will default to BANK_TRANSFER
and the fees will be inconsistent between quote and transfer.
Response
The following describes the fields of the quote response that may be useful when building your integration.
The payOut
field is used to select the correct entry in the paymentOptions
array in order to know which fees to display to your customer. Find the paymentOption that matches the payOut
field shown at the top level of the quote resource and payIn
based on the settlement model the bank is using. By default, this is BANK_TRANSFER
, unless you are using a prefunded or bulk settlement model. The payOut
field will change based on the type of recipient you add to the quote in the PATCH /quote
call, for example to-USD swift_code
or to-CAD interac
have different fees.
For example sending USD to a country other than the United States is supported but with different fees to domestic USD transfers. Please see the later section on Global Currencies to learn more about how to offer this useful feature.
For each paymentOption there is a price field. It gives a full breakdown of all the taxes, fees and discounts. It is preferable to refer to this structure to show breakdowns and totals, rather than the fee structure, found as well in each paymentOption element, that only gives a summary and is not able to surface important specifics such as taxes.
When showing the price of a transfer always show the 'price.total.value.amount' of a payment option.
Disabled Payment Options
Each payment option is either enabled or disabled based on the disabled
value. Disabled payment options should be shown to the user in a disabled state in most cases. This ensures users are given the options that they are familiar with regardless of their availability, as well as with options that can be beneficial to their accounts.
The option.disabledReason
contains both the code
and message
, with the message being the user-friendly text to surface to the user if necessary.
Transfer Nature for BRL
When creating or updating a quote, the transfer nature can be set. This is a requirement for transfers to or from BRL and impacts the fees we charge on the quote, specifically the IOF.
Note that IOF is determined based on the transfer nature, sender information, and recipient information. The default IOF will be included in a quote until all relevant information has been included.
Pricing Configuration
When creating or updating a quote, partners that have flexible partner pricing enabled are able to override the pricing configuration dynamically.
To learn more on how to use this feature, please see the Flexible Partner Pricing Guide
curl -X POST https://api.sandbox.transferwise.tech/v3/profiles/{{profileId}}/quotes \-H 'Authorization: Bearer <your api token>' \-H 'Content-Type: application/json' \-d '{"sourceCurrency": "GBP","targetCurrency": "USD","sourceAmount": 100,"targetAmount": null,"payOut": null,"preferredPayIn": null,"targetAccount": 12345,"paymentMetadata": {"transferNature": "MOVING_MONEY_BETWEEN_OWN_ACCOUNTS"},"pricingConfiguration": {"fee": {"type": "OVERRIDE","variable": 0.011,"fixed": 15.42}}}'
A recipient is a person or institution who is the ultimate beneficiary of your payment.
Recipient data includes three data blocks:
- General data - the personal details of an individual and basic information about a business.
- Bank details - account numbers, routing numbers, and other region-specific bank details.
- Address details - country and street address of an individual or business.
General Data
- Recipient full name
- Legal type (private/business)
- Currency
- Date of Birth
- Owned by customer
Date of Birth is optional. Its usually not required, but consult with the /account-requirements APIs to confirm if it is needed, or contact Wise Support.
Owned by customer is an optional boolean to flag to record whether this recipient is the same entity (person or business) as the one sending the funds. i.e. A user sending money to their own bank account in another country/currency. This field can be used to separate these recipients in your UI, however we do not recommend this as it adds unnecessary complexity to the solution. It is safe to ignore this field and display recipients with both true
and false
values.
Bank account data
There are many different variations of bank account details needed depending on recipient target currency. For example:
- GBP — sort code and account number
- BGN, CHF, DKK, EUR, GEL, GBP, NOK, PKR, PLN, RON, SEK — IBAN
- USD — routing number, account number, account type
- INR — IFSC code, account number
- etc.
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.
- Country
- State (US, Canada, Brazil)
- City
- Address line
- Zip code
When creating recipient, the following general rules should be applied to the accountHolderName
field:
- Full names for personal recipients. They must include more than one name, and both first and last name must have more than one character. Numbers are not allowed in personal recipient names.
- Business names must be in full, but can be just a single name. The full name cannot be just a single character but can be made up of a set of single characters. e.g. "A" is not permitted but "A 1" or "A1" is permitted.
- Special characters
_()'*,.
are allowed for personal and business names. - In general the following regex describes our permitted characters for a name:
[0-9A-Za-zÀ-ÖØ-öø-ÿ-_()'*,.\s]
.
Recipient requirements will vary depending on recipient type. A GBP example is provided here.
As you can see many of the fields are null
, in order to know which fields are required for which currency we expose the Recipients Requirements endpoint.
Request
POST /v1/accounts
3 character currency code
Recipient type
Personal or business profile ID. It is highly advised to pass the business profile ID in this field if your business account is managed by multiple users, so that the recipient can be accessed by all users authorized on the business account.
Recipient full name
Whether this account is owned by the sending user
Currency specific fields
Recipient legal type: PRIVATE or BUSINESS
Recipient bank sort code (GBP example)
Recipient bank account no (GBP example)
Optional. Recipient Date of Birth in ISO 8601 date format.
Response
A complete Recipient object is returned when created.
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": 30000000,"ownedByCustomer": true,"accountHolderName": "John Doe","details": {"legalType": "PRIVATE","sortCode": "040075","accountNumber": "37778842","dateOfBirth": "1961-01-01"}}'
POST /v3/profiles/{{profileId}}/transfers/{{transferId}}/payments
This API call is the final step for executing payouts when using a balance with Wise. Upon calling the endpoint, Wise will begin the processing of the transfer, depending on the status of funds.
When using the transfer by transfer settlement model, the following funding type(s) must be used:
- BALANCE - Funds are pulled from a multi-currency account held with Wise.
- BANK_TRANSFER - Manually send funds from your business bank account to pay for any transfers. Only applicable when using the Batch Group API.
When funding through the Bulk Settlement model, the following funding type(s) must be used:
- TRUSTED_PRE_FUND_BULK - Funds for the transfer will be settled through a bulk payment at a later date. This method is not applicable to first party Payouts.
If funding from BALANCE
, and your multi-currency account does not have the required funds to complete the action, then this call will fail with an "insufficient funds" error. Once funds are added and available, you must call this endpoint again.
{{profileId}} refers to the profile that created the transfer. It can be either your personal profile ID, or your business profile ID.
"BALANCE"
This indicates the type of funding you would like to apply to the transfer.
The transaction/payment identifier in your system, uniquely identifies the transfer in your platform. This is required for the Cross Currency Bulk Settlement
model.
"BALANCE"
This indicates the type of funding you would like to apply to the transfer.
"COMPLETED" or "REJECTED"
Failure reason. For example "balance.payment-option-unavailable".
curl -X POST https://api.sandbox.transferwise.tech/v3/profiles/{{profileId}}/transfers/{{transferId}}/payments \-H 'Authorization: Bearer <your api token>' \-H 'Content-Type: application/json' \-d '{"type": "BALANCE"}'
{"type": "BALANCE","status": "COMPLETED","errorCode": null}
{"type": "BALANCE","status": "REJECTED","errorCode": "transfer.insufficient_funds"}
Webhooks provide real-time updates on status changes for your Payment Instruments and Payins. You can subscribe to these events to avoid constantly polling the API.
- Payment Instrument Status Change: The
payment-instruments#status-change
webhook notifies you when an instrument’s status changes (e.g., fromPENDING
toCONNECTED
orDISCONNECTED
). - Payin Status Change: The
payment-instruments-payins#status-change
webhook informs you of every status change for a Payin, includingPROCESSING
,CONFIRMED
,SETTLED
, orFAILED
. - Payment Reversals: A
Payment Reversal
webhook is available to notify you of any chargebacks. This happens after the original payment and requires you to contact the customer to resolve the dispute.