Veem Multi-Currency Wallet
The Wallet APIs enable users to manage digital wallets, including creating wallets, funding or withdrawing balances, and performing currency conversions
Currently, following currencies are supported:
| Currency | Description |
|---|---|
| USD | United States Dollar |
| CAD | Canadian Dollar |
| EUR | Euro |
| CNY | Chinese Yuan |
| GBP | British Pound Sterling |
| INR | Indian Rupee |
| JPY | Japanese Yen |
| KRW | South Korean Won |
| MXN | Mexican Peso |
| PHP | Philippine Peso |
| SAR | Saudi Riyal |
| ZAR | South African Rand |
| AUD | Australian Dollar |
| TRY | Turkish Lira |
| IDR | Indonesian Rupiah |
Authorization
OAuth2 token is required in the Authorization header.
Headers
Three headers are required to use this endpoint.
Required Headers
Name
Type
Required
Description
Authorization
stringYes
Bearer token (OAuth 2.0) This header holds the bearer token required to use Veem's public API, and belongs to the owner account. Failure to use a valid bearer token will result in a 404 (Not Found) status code in the response. An example of a valid header value is as follows:
Bearer c047594b-082c-4da1-be89-08fe3770f4b3See Get Access Token section to generate your Bearer token
X-Request-Id
stringYes
This is a unique string that identifies the current API request, and should follow the UUID format. Reusing this header without changing the value will result in a 409 (Conflict) status code in the response. An example X-request-id is as follows:
48855846-628d-4177-b071-80332a116f0a
Content-Type
stringYes
The content type of the request. Must be
application/json
Sandbox Endpoints
Veem's Sandbox environment provides a number of endpoints that can be used to configure testing scenarios.
Use the base URL to access the endpoints in sandbox environment.
POST https://sandbox-api.veem.com/veem/Create Wallet
All accounts have USD wallet created by default.
POST /v1.2/walletsUse the table above to check the available currencies.
{
"currencyCode": "EUR"
}{
"id": 66760,
"accountId": null,
"availableBalance": {
"number": 0,
"currency": "EUR"
},
"pendingBalance": {
"number": 0,
"currency": "EUR"
},
"totalBalance": {
"number": 0,
"currency": "EUR"
},
"status": "Active"
}Add funds
To add funds to your wallet, use this endpoint. A valid funding method is required. You can retrieve your funding methods here.
POST /v1.2/payments/wallet/addFunds{
"amount": {
"number": 100,
"currency": "USD"
},
"fundingMethod": {
"id": 3518,
"type": "Bank"
},
"onBehalfAccountId": 12345 // see Partner Notes
}{
"requestId": "93c4f7df-3b70-4b5b-b496-87f81e0f2b59",
"payee": {
"email": "[email protected]",
"countryCode": "US",
"phone": "tel:+1-204-661-1473"
},
"payeeAmount": {
"number": 81.10,
"currency": "EUR"
},
"status": "Sent",
"goodFundsPayment": false,
"realTimePayment": false,
"extraInfo": {
"customInfo": null,
"isPayeeCoveringCardFee": null
},
"id": 1357754,
"exchangeRate": {
"fromAmount": 100,
"fromCurrency": "USD",
"toAmount": 100,
"toCurrency": "USD"
},
"feeInformation": {
"payerInfo": {
"originalAmount": 100.00,
"feeAmount": 0.00,
"totalAmount": 100.00,
"currency": "USD"
},
"payeeInfo": {
"originalAmount": 85.37,
"feeAmount": 4.27,
"totalAmount": 81.10,
"currency": "EUR",
"fees": [
{
"name": "FX Markup",
"displayValue": "0.050000 USD->EUR",
"priceItemType": "FX_MARKUP",
"rate": 0.050000
},
{
"name": "FX Marked Up",
"displayValue": "0.853730000000 USD->EUR",
"priceItemType": "FX_TOTAL_RATE",
"rate": 0.811044
}
]
}
},
"timeCreated": "2025-06-27T07:56:25.395-07:00",
"timeUpdated": "2025-06-27T07:56:27.216-07:00",
"fastTransfer": false,
"cancelable": false,
"payerFundingMethodType": "Bank",
"receiverFundingMethodType": "Wallet"
}Partner Notes:
- A partner account can be configured to make this API request on behalf of their customers. This requires internal configuration for the partner account by Veem. Once the internal configuration is enabled, the API request can be made using partner account bearer token.
onBehalfAccountIdis an optional parameter, this needs to be included on the request body in case of partner making an API request on behalf of their customer. This is the customer Veem account ID, e.g.453221.
List Wallets - Balance
Retrieve a list of all wallets and check their current balances.
GET /v1.2/walletsPartner Notes:
- A partner account can be configured to make this API request on behalf of their customers. This requires internal configuration for the partner account by Veem. Once the internal configuration is enabled, the API request can be made using partner account bearer token.
onBehalfAccountIdis an optional query string parameter, this needs to be included on the request URL in case of partner making an API request on behalf of their customer. This is the customer Veem accountId, e.g?onBehalfAccountId=457725
[
{
"id": 66760,
"status": "Active",
"availableBalance": {
"number": 0.00,
"currency": "EUR"
},
"pendingBalance": {
"number": 81.10,
"currency": "EUR"
},
"totalBalance": {
"number": 81.10,
"currency": "EUR"
}
},
{
"id": 66704,
"status": "Active",
"availableBalance": {
"number": 0.00,
"currency": "USD"
},
"pendingBalance": {
"number": 0.00,
"currency": "USD"
},
"totalBalance": {
"number": 0.00,
"currency": "USD"
}
}
]List Wallet by ID - Balance
Retrieve a wallet and check their current balances.
GET /v1.2/wallets/{{wallet_id}}Partner Notes:
- A partner account can be configured to make this API request on behalf of their customers. This requires internal configuration for the partner account by Veem. Once the internal configuration is enabled, the API request can be made using partner account bearer token.
onBehalfAccountIdis an optional query string parameter, this needs to be included on the request URL in case of partner making an API request on behalf of their customer. This is the customer Veem accountId, e.g?onBehalfAccountId=457725
{
"id": 66704,
"status": "Active",
"availableBalance": {
"number": 0.00,
"currency": "USD"
},
"pendingBalance": {
"number": 0.00,
"currency": "USD"
},
"totalBalance": {
"number": 0.00,
"currency": "USD"
}
}Wallet Withdraw
The withdraw endpoint allows to withdraw money from the wallet. The withdrawal will transfer the funds to the account's default funding method, whether it’s a bank account or card.
POST /v1.2/payments/wallet/withdraw{
"amount": {
"number": 50,
"currency": "USD"
}
}{
"id": 12345,
"payee": {
"email": "[email protected]",
"phone": "tel:+33-1-23-45-67-89",
"countryCode": "FR"
},
"status": "Sent",
"claimLink": "https://api.veem.com/api/c/ABCDEF",
"requestId": "e5dbaf73-38c2-4a92-bf3d-87bc65d77a9i",
"payeeAmount": {
"number": 15224,
"currency": "USD"
},
"timeCreated": "2024-08-22T16:54:54.367-07:00",
"timeUpdated": "2024-08-22T16:54:56.024-07:00",
"fastTransfer": false,
"debitCreditTxn": {
"debitTxn": null,
"creditTxn": null
}
}Move funds between Wallets
The convert endpoint allows to transfer funds between different wallets under their account.
Note: When moving funds between wallets, both the source and target wallet should exist.
POST /v1.2/payments/wallet/convertRequest Payloads
The API supports two types fund movement between wallet balances - sending exact amount and receiving exact amount.
Sending Exact Amount
Used when the user specifies the exact amount to send from the source wallet.
{
"sourceWallet": {
"currency": "USD",
"number": 50
},
"destinationWallet": {
"currency": "CAD"
},
"onBehalfAccountId": 12345 // see Partner Notes
}{
"requestId": "fffc75b1-f182-4102-8452-9cca226da7b4",
"payee": {
"email": "[email protected]",
"countryCode": "US",
"phone": "***************6962"
},
"payeeAmount": {
"number": 65.44,
"currency": "CAD"
},
"status": "Sent",
"goodFundsPayment": false,
"realTimePayment": false,
"extraInfo": {},
"id": 1460203,
"exchangeRate": {
"fromAmount": 50.00,
"fromCurrency": "USD",
"toAmount": 65.44,
"toCurrency": "CAD",
"rate": 1.308820
},
"feeInformation": {
"payerInfo": {
"originalAmount": 50.00,
"feeAmount": 0.00,
"totalAmount": 50.00,
"currency": "USD"
},
"payeeInfo": {
"originalAmount": 68.37,
"feeAmount": 2.93,
"totalAmount": 65.44,
"currency": "CAD",
"fees": [
{
"name": "FX Markup",
"displayValue": "0.042900 USD->CAD",
"priceItemType": "FX_MARKUP",
"rate": 0.042900
},
{
"name": "FX Marked Up",
"displayValue": "1.367485000000 USD->CAD",
"priceItemType": "FX_TOTAL_RATE",
"rate": 1.308820
}
]
}
},
"timeCreated": "2025-12-24T09:49:30.303-08:00",
"timeUpdated": "2025-12-24T09:49:33.377-08:00",
"paymentApproval": {
"approvalStatus": "Pending",
"approverNumberRequired": 1,
"approverNumber": 0,
"userApprovalList": [
{
"id": 163271,
"paymentApprovalId": 73450,
"userId": 372722,
"firstName": "Ada",
"lastName": "Lovelace",
"username": "[email protected]",
"email": "[email protected]",
"status": "Active",
"approvalStatus": "Pending"
}
]
},
"fastTransfer": false,
"cancelable": false,
"payerFundingMethodType": "Wallet",
"receiverFundingMethodType": "Wallet",
"originalRequestId": "fffc75b1-f182-4102-8452-9cca226da7b4"
}Receiving Exact Amount
Used when the user specifies the exact amount to receive in the destination wallet.
{
"sourceWallet": {
"currency": "USD"
},
"destinationWallet": {
"currency": "CAD",
"number": 100
},
"onBehalfAccountId": 12345 // see Partner Notes
}{
"requestId": "e23cbdf8-9ac1-4d82-bfef-b6d0e826c176",
"payee": {
"email": "[email protected]",
"countryCode": "US",
"phone": "***************6962"
},
"payeeAmount": {
"number": 100.00,
"currency": "CAD"
},
"status": "Sent",
"goodFundsPayment": false,
"realTimePayment": false,
"extraInfo": {},
"id": 1460205,
"exchangeRate": {
"fromAmount": 100.00,
"fromCurrency": "CAD",
"toAmount": 100.00,
"toCurrency": "CAD"
},
"feeInformation": {
"payerInfo": {
"originalAmount": 100.00,
"feeAmount": 23.85,
"totalAmount": 76.15,
"currency": "USD",
"fees": [
{
"name": "FX Markup",
"displayValue": "0.039900 USD->CAD",
"priceItemType": "FX_INVERSE_MARKUP",
"rate": 0.039900
},
{
"name": "FX Marked Up",
"displayValue": "1.367695000000 USD->CAD",
"priceItemType": "FX_TOTAL_RATE",
"rate": 1.313124
}
]
},
"payeeInfo": {
"originalAmount": 100.00,
"feeAmount": 0.00,
"totalAmount": 100.00,
"currency": "CAD"
}
},
"timeCreated": "2025-12-24T09:58:55.235-08:00",
"timeUpdated": "2025-12-24T09:58:57.093-08:00",
"paymentApproval": {
"approvalStatus": "Pending",
"approverNumberRequired": 1,
"approverNumber": 0,
"userApprovalList": [
{
"id": 163272,
"paymentApprovalId": 73451,
"userId": 372722,
"firstName": "Ada",
"lastName": "Lovelace",
"username": "[email protected]",
"email": "[email protected]",
"status": "Active",
"approvalStatus": "Pending"
}
]
},
"fastTransfer": false,
"cancelable": false,
"payerFundingMethodType": "Wallet",
"receiverFundingMethodType": "Wallet",
"originalRequestId": "e23cbdf8-9ac1-4d82-bfef-b6d0e826c176"
}Partner Notes:
- A partner account can be configured to make this API request on behalf of their customers. This requires internal configuration for the partner account by Veem. Once the internal configuration is enabled, the API request can be made using partner account bearer token.
onBehalfAccountIdis an optional parameter, this needs to be included on the request body in case of partner making an API request on behalf of their customer. This is the customer Veem account ID, e.g.453221.
Validation Rules
- The number field cannot be sent in both
sourceWalletanddestinationWalletat the same time. The request should be structured to either specify:- The amount to send
sourceWallet.number - The amount to receive
destinationWallet.number
- The amount to send
- At least one wallet must be USD, either source or destination
Error Responses
| HTTP Status | Description |
|---|---|
| 400 Bad Request | Converting number must be provided either in sourceWallet OR destinationWallet, but not both or neither. |
| 400 Bad Request | Missing Wallet Source currency code |
| 400 Bad Request | The amount $500000 exceeds the available balance |
| 400 Bad Request | Choose USD as one currency to proceed with conversion |
Updated 7 days ago
