To manage certain aspects of the 3D Secure (3DS) authentication, you will need to integrate with the following APIs.
Wise Platform API
The Wise Platform API is a REST-based interface that enables programmatic access to Wise's payment infrastructure. All endpoints return JSON-formatted responses and use standard HTTP methods and status codes.
We strongly recommend first reading our Getting Started Guide to help you set up credentials and make your first call.
Before you begin
To use this API reference effectively, you should have:
- Received Valid API credentials from Wise (Client ID and Client Secret)
- Understand OAuth 2.0 authentication
- Be familiar with RESTful API concepts
Core API resources
| Resource | Purpose |
|---|---|
| Quote | Exchange rate and fee calculations |
| Recipient | Beneficiary account management |
| Transfer | Payment creation and execution |
| Balance | Multi-currency account operations |
| Profile | Account ownership details |
| Rate | Current and historical exchange rates |
Not sure which workflow to build?
Start with our Integration Guides for step-by-step implementation examples.
Additional Customer Verification
In certain situations, additional evidence is required to verify customers and ensure we’re compliant with the KYC regulations.
Additional Verification APIs support a list of evidences that can be found in the Supported Evidences guide.
If you use the Customer Account with Partner KYC model and your customers are primarily based in the EU, refer to this Onboarding EU customers guide for instructions on how to use these APIs.
If you use the Customer Account with Partner KYC model and you are onboarding high risk business customers based primarily based in the US, refer to this Onboarding High Risk US Businesses guide for instructions on how to use these APIs.
Balance
Create and manage balance accounts within a multi-currency account.
Each profile can hold multiple balance accounts in different currencies. A STANDARD balance is limited to one per currency, while SAVINGS balances (Jars) allow multiple in the same currency. Creating the first balance for a profile automatically creates the multi-currency account.
Balances include an investmentState field. Only balances with NOT_INVESTED can be operated on via the API. Invested balances should be shown but not actionable.
For a complete guide on multi-currency accounts, see Multi-Currency Accounts.
Balance
Represents a balance account within a profile.
| Enum Value | Description |
|---|---|
| STANDARD | Standard balance account. Only one per currency per profile. |
| SAVINGS | Savings balance (Jar). Multiple allowed per currency. |
Icon for the balance.
Investment state of the balance.
| Enum Value | Description |
|---|---|
| NOT_INVESTED | Balance is not invested. |
| INVESTED | Balance is invested in assets. |
| INVESTING | Balance is being invested into assets. |
| DIVESTING | Balance is being divested from assets. |
| UNKNOWN | Investment state is unknown. |
Available balance that can be used to fund transfers.
Amount reserved for transactions.
Cash amount in the account.
Current total worth.
Date when the balance was last modified.
{ "id": 200001, "currency": "EUR", "type": "STANDARD", "name": null, "icon": null, "investmentState": "NOT_INVESTED", "amount": { "value": 310.86, "currency": "EUR" }, "reservedAmount": { "value": 0, "currency": "EUR" }, "cashAmount": { "value": 310.86, "currency": "EUR" }, "totalWorth": { "value": 310.86, "currency": "EUR" }, "creationTime": "2020-05-20T14:43:16.658Z", "modificationTime": "2020-05-20T14:43:16.658Z", "visible": true }
Request
Opens a balance within the specified profile, in the currency and type specified in the request.
For STANDARD balances, only one can be created per currency. For SAVINGS balances, multiple in the same currency can be opened.
When creating a SAVINGS type balance, a name is required.
| Enum Value | Description |
|---|---|
| STANDARD | Standard balance account. Only one per currency per profile. |
| SAVINGS | Savings balance (Jar). Multiple allowed per currency. |
- Production Environmenthttps://api.wise.com/v4/profiles/{profileId}/balances
- Sandbox Environmenthttps://api.wise-sandbox.com/v4/profiles/{profileId}/balances
curl -i -X POST \
'https://api.wise.com/v4/profiles/{profileId}/balances' \
-H 'Authorization: Bearer <YOUR_JWT_HERE>' \
-H 'Content-Type: application/json' \
-H 'X-idempotence-uuid: 497f6eca-6276-4993-bfeb-53cbbbba6f08' \
-d '{
"currency": "EUR",
"type": "STANDARD"
}'Created - Balance successfully created.
| Enum Value | Description |
|---|---|
| STANDARD | Standard balance account. Only one per currency per profile. |
| SAVINGS | Savings balance (Jar). Multiple allowed per currency. |
Icon for the balance.
Investment state of the balance.
| Enum Value | Description |
|---|---|
| NOT_INVESTED | Balance is not invested. |
| INVESTED | Balance is invested in assets. |
| INVESTING | Balance is being invested into assets. |
| DIVESTING | Balance is being divested from assets. |
| UNKNOWN | Investment state is unknown. |
Available balance that can be used to fund transfers.
Amount reserved for transactions.
Cash amount in the account.
Current total worth.
Date when the balance was last modified.
{ "id": 200001, "currency": "EUR", "type": "STANDARD", "name": null, "icon": null, "investmentState": "NOT_INVESTED", "amount": { "value": 310.86, "currency": "EUR" }, "reservedAmount": { "value": 0, "currency": "EUR" }, "cashAmount": { "value": 310.86, "currency": "EUR" }, "totalWorth": { "value": 310.86, "currency": "EUR" }, "creationTime": "2020-05-20T14:43:16.658Z", "modificationTime": "2020-05-20T14:43:16.658Z", "visible": true }
- Production Environmenthttps://api.wise.com/v4/profiles/{profileId}/balances
- Sandbox Environmenthttps://api.wise-sandbox.com/v4/profiles/{profileId}/balances
curl -i -X GET \
'https://api.wise.com/v4/profiles/{profileId}/balances?types=STANDARD' \
-H 'Authorization: Bearer <YOUR_JWT_HERE>'OK - Successfully retrieved balances.
| Enum Value | Description |
|---|---|
| STANDARD | Standard balance account. Only one per currency per profile. |
| SAVINGS | Savings balance (Jar). Multiple allowed per currency. |
Icon for the balance.
Investment state of the balance.
| Enum Value | Description |
|---|---|
| NOT_INVESTED | Balance is not invested. |
| INVESTED | Balance is invested in assets. |
| INVESTING | Balance is being invested into assets. |
| DIVESTING | Balance is being divested from assets. |
| UNKNOWN | Investment state is unknown. |
Available balance that can be used to fund transfers.
Amount reserved for transactions.
Cash amount in the account.
Current total worth.
Date when the balance was last modified.
[ { "id": 200001, "currency": "EUR", "type": "STANDARD", "name": null, "icon": null, "investmentState": "NOT_INVESTED", "amount": { "value": 310.86, "currency": "EUR" }, "reservedAmount": { "value": 0, "currency": "EUR" }, "cashAmount": { "value": 310.86, "currency": "EUR" }, "totalWorth": { "value": 310.86, "currency": "EUR" }, "creationTime": "2020-05-20T14:43:16.658Z", "modificationTime": "2020-05-20T14:43:16.658Z", "visible": true } ]
- Production Environmenthttps://api.wise.com/v4/profiles/{profileId}/balances/{balanceId}
- Sandbox Environmenthttps://api.wise-sandbox.com/v4/profiles/{profileId}/balances/{balanceId}
curl -i -X GET \
'https://api.wise.com/v4/profiles/{profileId}/balances/{balanceId}' \
-H 'Authorization: Bearer <YOUR_JWT_HERE>'OK - Successfully retrieved the balance.
| Enum Value | Description |
|---|---|
| STANDARD | Standard balance account. Only one per currency per profile. |
| SAVINGS | Savings balance (Jar). Multiple allowed per currency. |
Icon for the balance.
Investment state of the balance.
| Enum Value | Description |
|---|---|
| NOT_INVESTED | Balance is not invested. |
| INVESTED | Balance is invested in assets. |
| INVESTING | Balance is being invested into assets. |
| DIVESTING | Balance is being divested from assets. |
| UNKNOWN | Investment state is unknown. |
Available balance that can be used to fund transfers.
Amount reserved for transactions.
Cash amount in the account.
Current total worth.
Date when the balance was last modified.
{ "id": 200001, "currency": "EUR", "type": "STANDARD", "name": null, "icon": null, "investmentState": "NOT_INVESTED", "amount": { "value": 310.86, "currency": "EUR" }, "reservedAmount": { "value": 0, "currency": "EUR" }, "cashAmount": { "value": 310.86, "currency": "EUR" }, "totalWorth": { "value": 310.86, "currency": "EUR" }, "creationTime": "2020-05-20T14:43:16.658Z", "modificationTime": "2020-05-20T14:43:16.658Z", "visible": true }
- Production Environmenthttps://api.wise.com/v4/profiles/{profileId}/balances/{balanceId}
- Sandbox Environmenthttps://api.wise-sandbox.com/v4/profiles/{profileId}/balances/{balanceId}
curl -i -X DELETE \
'https://api.wise.com/v4/profiles/{profileId}/balances/{balanceId}' \
-H 'Authorization: Bearer <YOUR_JWT_HERE>'Request
This endpoint allows conversion and movement of funds between balance accounts.
Convert across balance accounts: Convert funds between two STANDARD balance accounts in different currencies. Requires a quote created with "payOut": "BALANCE".
Move money between balances:
- Add money to a same-currency jar (move from
STANDARDtoSAVINGSwithout conversion) - Add money to another-currency jar (convert money using a quote)
- Withdraw money from a jar (move from
SAVINGStoSTANDARDwithout conversion)
Either amount or quoteId is required. Use quoteId for cross-currency movements.
Quote ID. Required for cross-currency movements. Quote must be created with payOut: BALANCE.
Source balance ID. Required when moving between balances (with targetBalanceId).
Target balance ID. Required when moving between balances (with sourceBalanceId).
- Production Environmenthttps://api.wise.com/v2/profiles/{profileId}/balance-movements
- Sandbox Environmenthttps://api.wise-sandbox.com/v2/profiles/{profileId}/balance-movements
curl -i -X POST \
'https://api.wise.com/v2/profiles/{profileId}/balance-movements' \
-H 'Authorization: Bearer <YOUR_JWT_HERE>' \
-H 'Content-Type: application/json' \
-H 'X-idempotence-uuid: 497f6eca-6276-4993-bfeb-53cbbbba6f08' \
-d '{
"quoteId": "00000000-0000-0000-0000-000000000000"
}'Created - Movement completed successfully.
State of the movement.
Balance states after the movement.
Source amount of the movement.
Target amount of the movement.
Fee amounts charged for the movement.
Steps involved in the movement.
When the step was created.
{ "id": 30000001, "type": "CONVERSION", "state": "COMPLETED", "balancesAfter": [ { "id": 1, "value": 10000594.71, "currency": "GBP" } ], "creationTime": "2017-11-21T09:55:49.275Z", "sourceAmount": { "value": 113.48, "currency": "EUR" }, "targetAmount": { "value": 100, "currency": "GBP" }, "rate": 0.88558, "feeAmounts": [ { "value": 0.56, "currency": "EUR" } ], "steps": [ { "id": 369588, "type": "CONVERSION", "creationTime": "2017-11-21T09:55:49.276Z", "balancesAfter": [ … ], "sourceAmount": { … }, "targetAmount": { … }, "fee": { … }, "rate": 0.88558 } ] }
Request
Returns the deposit limit for a profile based on regulatory requirements.
Useful for personal profiles located in countries that have hold limits. We advise calling this API before depositing money into an account if the profile is located in Singapore or Malaysia.
- Production Environmenthttps://api.wise.com/v1/profiles/{profileId}/balance-capacity
- Sandbox Environmenthttps://api.wise-sandbox.com/v1/profiles/{profileId}/balance-capacity
curl -i -X GET \
'https://api.wise.com/v1/profiles/{profileId}/balance-capacity?currency=SGD' \
-H 'Authorization: Bearer <YOUR_JWT_HERE>'{ "hasLimit": true, "depositLimit": { "amount": 2000, "currency": "SGD" } }
Request
If a balance goes over the regulatory hold limit, excess funds are automatically moved to another account at the end of the day.
Use this endpoint to specify a recipient where excess money will be transferred.
Primarily used for Singapore and Malaysia customers.
- Production Environmenthttps://api.wise.com/v1/profiles/{profileId}/excess-money-account
- Sandbox Environmenthttps://api.wise-sandbox.com/v1/profiles/{profileId}/excess-money-account
curl -i -X POST \
'https://api.wise.com/v1/profiles/{profileId}/excess-money-account' \
-H 'Authorization: Bearer <YOUR_JWT_HERE>' \
-H 'Content-Type: application/json' \
-d '{
"recipientId": 148393305
}'{ "userProfileId": 12321323, "recipientId": 148393305 }
Request
Provides an overview of your account's total valuation and available liquidity across all balances.
Returns total worth, total available (including overdraft), total cash, and overdraft details.
| Scenario | GBP balance | USD balance | Total Worth | Total Available | Overdraft Usage | Overdraft Limit |
|---|---|---|---|---|---|---|
| Positive account value with no overdraft | 2000 | 0 | 2000 | 2000 | 0 | 0 |
| Positive account value with overdraft | 2000 | -100 | 1900 | 2400 | 100 | 500 |
| Negative account value with overdraft | 0 | -100 | -100 | 400 | 100 | 500 |
- Production Environmenthttps://api.wise.com/v1/profiles/{profileId}/total-funds/{currency}
- Sandbox Environmenthttps://api.wise-sandbox.com/v1/profiles/{profileId}/total-funds/{currency}
curl -i -X GET \
'https://api.wise.com/v1/profiles/{profileId}/total-funds/EUR' \
-H 'Authorization: Bearer <YOUR_JWT_HERE>'OK - Successfully retrieved total funds.
Total worth of the account, including cash ledger balance and valuation of any asset portfolio if invested.
Total available balance, which is the sum of cash ledger balance and any approved overdraft limit.
Total cash balance across all balances, including group balances but excluding asset portfolios.
Overdraft details for the account.
Maximum overdraft available through an overdraft program. Zero if no approved overdraft.
{ "totalWorth": { "value": 2000, "currency": "EUR" }, "totalAvailable": { "value": 2500, "currency": "EUR" }, "totalCash": { "value": 2000, "currency": "EUR" }, "overdraft": { "limit": { "value": 500, "currency": "EUR" }, "used": { "value": 0, "currency": "EUR" }, "available": { "value": 500, "currency": "EUR" }, "availableByCurrency": [ { … } ] } }
Bank Account Details
Bank account details allow users to receive money into their Wise Multi-Currency Account. Each currency balance can have local bank details (for domestic payments) and international bank details (for SWIFT payments) where available.
Bank account details can be retrieved for existing balances, or new details can be ordered for currencies where they're available but not yet issued.