Virtual Accounts
Accept Payments Locally. | Enterprise
When a virtual account is created, it is linked to a wallet account. Each Rapyd wallet can have multiple virtual accounts. This structure makes it easier to identify incoming payments and to group numerous payments into a single wallet which can simplify reconciliation. Virtual account numbers are active as long as the wallet account is active.
Create a virtual account number to efficiently collect cross border payments from your customers through different payment methods such as bank transfers. Rapyd’s virtual account numbers are multi-use in nature so customers can use the same number to send repeated payments over a long period of time.
A virtual account can be used to disburse funds repeatedly over time. Common use cases include disbursing money to a beneficiary, or disbursing funds for payroll.
Rapyd currently supports vIBANs in Europe and local bank account formats in other markets that do not use the IBAN standard.
When creating your virtual account number, be sure to generate it with the country code you expect your customers to send payment to, considering that a payer may have international charges depending on their location and their own bank's policies.
Please refer to the table below for country codes and the currencies supported in each market.
Country Code | Supported Currencies |
---|---|
GB | GBP |
DE | EUR * |
DK | AED, AUD, CAD, CHF, CZK, DKK, HKD, HRK, HUF, ILS, JPY, MXN, NOK, NZD, PLN, RON, SAR, SEK, SGD, TRY, USD, ZAR |
MX | MXN |
SG | SGD, USD, AUD, CAD, CHF, EUR, GBP, HKD, JPY, NOK, NZD, SEK |
AU | AUD, USD |
NZ | NZD, USD |
ID | IDR |
*Receive EUR transfers across 36 countries within the SEPA region
Note
You do not need to be in the country specified in order to create a virtual account number utilizing that country code.
For example, a customer owns a wallet as described in Creating a Rapyd Wallet. The customer wants their wallet to have a virtual account number so that they can transfer money directly into the wallet. The customer provides information requested by your website or mobile application, and he receives a bank account number for their wallet.
A customer on your website or mobile app requests a virtual bank account number for the customer's wallet, and provides the required information. You request a currency conversion for the payment.
The back end asks Rapyd to issue a virtual bank account number to the wallet.
Rapyd issues the virtual bank account number and returns a confirmation to your back end.
You display the bank account number to the customer.
The same customer wants to make a new payment through the Virtual Account.
You call List Virtual Accounts by Rapyd Wallet.
Rapyd returns the Virtual Account Number details.
You present to the Virtual Account Number including account ID to the customer.
The customer sends funds to the Virtual Account Number Details. The funds are converted to the requested currency.
Rapyd sends you a webhook notification of the deposited funds.
You can request a currency conversion for your Virtual Account by specifying the requested currency using the requested_currency
field. The requested currency is what the funds will be converted to when you collect payments or create payouts using your Virtual Account.
All supported currencies can be converted with FX. Selecting a requested currency has no impact on the currencies the Virtual Account can receive.
Prerequisites
To run the examples of this use case, you must create the following ID in your own sandbox:
ewallet - Run Create Wallet for the customer's wallet. Use the ID you get in the response.
You ask Rapyd to issue a Virtual Account number to the customer's wallet.
For that, you'll use Issue Virtual Account Number to Wallet with the following parameters:
Description of Body Parameters
Body Parameter | Description |
---|---|
ewallet | Enter the wallet 'id' that you received when you created the wallet in your sandbox. For purposes of this use case lesson, we are using ewallet_45c238c0d8882467128318e6a4977eed, which is the wallet ID we created in our sandbox. |
country | Enter GB as the country code for Great Britain, where the customer lives. |
requested_currency | Enter USD as the requested currency. This parameter is optional. |
currency | Enter GBP as the currency code for Pounds. |
description | Enter Issuing virtual account number to wallet as a comment. |
You ask Rapyd to issue the Virtual Account number to the wallet.
Request
// Request URL: POST https://sandboxapi.rapyd.net/v1/issuing/bankaccounts // Message body: { "currency": "GBP", "country": "GB", "requested_currency": "USD", "description": "Issuing bank account number to wallet", "ewallet": "ewallet_45c238c0d8882467128318e6a4977eed" }
.NET Core
using System; using System.Text.Json; namespace RapydApiRequestSample { class Program { static void Main(string[] args) { try { var requestObj = new { country = "SK", currency = "EUR", description = "Issuing bank account number to wallet", ewallet = "ewallet_45c238c0d8882467128318e6a4977eed" }; string request = JsonSerializer.Serialize(requestObj); string result = RapydApiRequestSample.Utilities.MakeRequest("POST", "/v1/issuing/bankaccounts", request); Console.WriteLine(result); } catch (Exception e) { Console.WriteLine("Error completing request: " + e.Message); } } } }
JavaScript
const makeRequest = require('<path-to-your-utility-file>/utilities').makeRequest; async function main() { try { const body = { currency: 'EUR', country: 'SK', description: 'Issuing bank account number to wallet', ewallet: 'ewallet_45c238c0d8882467128318e6a4977eed' }; const result = await makeRequest('POST', '/v1/issuing/bankaccounts', body); console.log(result); } catch (error) { console.error('Error completing request', error); } }
PHP
<?php $path = $_SERVER['DOCUMENT_ROOT']; $path .= "/<path-to-your-utility-file>/utilities.php"; include($path); $body = [ 'currency' => 'EUR', 'country' => 'SK', 'description' => 'Issuing bank account number to wallet', 'ewallet' => 'ewallet_45c238c0d8882467128318e6a4977eed' ]; try { $object = make_request('post', '/v1/issuing/bankaccounts', $body); var_dump($object); } catch (Exception $e) { echo "Error: $e"; } ?>
Python
from pprint import pprint from utilities import make_request body = { "currency": "EUR", "country": "SK", "description": "Issuing bank account number to wallet", "ewallet": "ewallet_45c238c0d8882467128318e6a4977eed", } results = make_request(method='post', path=f'/v1/issuing/bankaccounts', body=body) pprint(results)
Issue Virtual Account Number to Wallet Response
Let's take a look at the response.
Response
{ "status": { "error_code": "", "status": "SUCCESS", "message": "", "response_code": "", "operation_id": "6ccb0572-93ad-4dbf-b419-76b14876c29d" }, "data": { "id": "issuing_64c7c4c32189fa8689ec9fe050aff3d9", "merchant_reference_id": "issuing_64c7c4c32189fa8689ec9fe050aff3d9", "ewallet": "ewallet_45c238c0d8882467128318e6a4977eed", "bank_account": { "Iban": "GB3645888045987523520112" }, // ... "status": "ACT", "description": "Issuing bank account number to wallet", "currency": "GBP", "requested_currency": "USD", "transactions": [] } }
The data
section of this response shows:
The Rapyd ID of the wallet's bank account number is issuing_64c7c4c32189fa8689ec9fe050aff3d9. Since the request did not specify a reference ID, this number is also used for
merchant_reference_id
. When you run this example in your own sandbox, you will get a different ID.ewallet
is the ID of the customer's wallet.The
bank_account
in this case has an IBAN with the number GB3645888045987523520112.The
currency
is GBP.The
requested_currency
is USD.The
status
is ACT. This means that the bank account number is active.
Your website shows the customer a confirmation and the bank account number.
More examples are included below for additional countries, Singapore and and Denmark.
Request (Singapore)
{ "currency": "SGD", "country": "SG", "description": "Issue bank account number to wallet", "ewallet": "ewallet_3d03be4b6ed60a217fb1faa7c01ae2ca", "merchant_reference_id": "bankaccountnumber12345543", "metadata": { "merchant_defined": true } }
Request (Denmark)
{ "currency": "SGD", "country": "DK", "description": "Issue bank account number to wallet", "ewallet": "ewallet_3d03be4b6ed60a217fb1faa7c01ae2ca", "merchant_reference_id": "bankaccountnumber12345543", "metadata": { "merchant_defined": true } }
Response (Singapore)
{ "status": { "error_code": "", "status": "SUCCESS", "message": "", "response_code": "", "operation_id": "63e2bb39-8087-4d94-9d7d-89070efc701a" }, "data": { "id": "issuing_96671e3831b29f9af01202a47c872203", "merchant_reference_id": "bankaccountnumber12345543", "ewallet": "ewallet_3d03be4b6ed60a217fb1faa7c01ae2ca", "bank_account": { "beneficiary_name": "Rapyd Holdings Pte Ltd", "address": "12 Marina Boulevard, DBS Asia Central, Marina Bay Financial Center Tower 3", "country_iso": "SG", "bank": "DBS Bank", "zip": "018892", "country": "Singapore", "account_number": "8850780138613670", "bic": "DBSSSGSGXXX" }, "metadata": { "merchant_defined": true }, "status": "ACT", "description": "Issue test bank account", "funding_instructions": null, "currency": "SGD", "transactions": [] } }
Response (Denmark)
{ "status": { "error_code": "", "status": "SUCCESS", "message": "", "response_code": "", "operation_id": "7db8425e-64a2-49bd-bcc0-dab00fba9cc5" }, "data": { "id": "issuing_cf1359c4812a4f3f01db92a76b583b79", "merchant_reference_id": "bankaccountnumber12345543", "ewallet": "ewallet_3d03be4b6ed60a217fb1faa7c01ae2ca", "bank_account": { "beneficiary_name": "CashDash UK Limited", "address": "Northwest House, 119 Marylebone Road NW1 5PU", "country_iso": "DK", "iban": "DK4289000092780662", "bic": "SXPYDKKK" }, "metadata": { "merchant_defined": true }, "status": "ACT", "description": "Issue test bank account", "funding_instructions": null, "currency": "SGD", "transactions": [] } }
The data
section of this response shows:
The Rapyd ID of the wallet's Virtual Account number in Singapore is issuing_96671e3831b29f9af01202a47c872203 .
The Rapyd ID of the wallet's Virtual Account number in Denmark is issuing_cf1359c4812a4f3f01db92a76b583b79 .
The
merchant_reference_id
is also bankaccountnumber12345543 When you run this example in your own sandbox, you will get a different ID.ewallet
is the ID of the customer's wallet.The bank account in Singapore is an
account_number
8850780138613670 .The bank account in Denmark has an IBAN with the number DK4289000092780662.
Both accounts have a BIC assigned to them. DBSSSGSGXXX (Singapore) or SXPYDKKK (Denmark).
The
currency
is SGD.The
status
is ACT. This means that the bank account number is active.
You ask Rapyd to update the requested currency by the Virtual Account number to the customer's wallet.
For that, you'll use Update Requested Currency by Virtual Account Number with the following parameters:
Description of Path Parameters
Path Parameter | Description |
---|---|
issuing_token | A virtual account issuing token starting with issuing_ . |
Description of Body Parameters
Body Parameter | Description |
---|---|
requested_currency | Allowed values:
|
You ask Rapyd to update the requested currency by the Virtual Account number to the customer's wallet.
Request
// Request URL: POST https://sandboxapi.rapyd.net//v1/issuing/bankaccounts/issuing_293e65543872d2a87057b48dd657dd06 // Message body: { "requested_currency": "USD" }
Let’s take a look at the response.
Response
{ "status": { "error_code": "", "status": "SUCCESS", "message": "", "response_code": "", "operation_id": "e213cb38-8a8f-4ae7-b124-2da91e6baaeb" }, "data": { "id": "issuing_293e65543872d2a87057b48dd657dd06", "merchant_reference_id": "5rtfgk897ter0df0m", "ewallet": "ewallet_eb221f9155cf0895c8a4e8b1ad6b844d", "bank_account": { "beneficiary_name": "CashDash UK Limited", "address": "Northwest House, 119 Marylebone Road NW1 5PU", "country_iso": "DE", "iban": "DE07202208000092780641", "bic": "SXPYDEHH" }, "metadata": { "merchant_defined": true }, "status": "ACT", "description": "Issue test bank account", "funding_instructions": null, "currency": "EUR", "requested_currency": "USD", "transactions": [] } }
The data section of this response shows:
The Rapyd ID of the wallet's bank account number is issuing_293e65543872d2a87057b48dd657dd06. If the request did not specify a reference ID, this number would also be used for
merchant_reference_id
. When you run this example in your own sandbox, you will get a different ID.ewallet
is the ID of the customer's wallet.The
bank_account
in this case has an IBAN with the number DE07202208000092780641.The
currency
is EUR.The
requested_currency
is USD.The
status
is ACT. This means that the bank account number is active.