---
title: "Virtual Accounts"
source_url: https://docs.rapyd.net/en/virtual-accounts-369207.html
lang: en
---

# 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](https://docs.rapyd.net/en/glossary.md#UUID-945d98cf-adae-e1cf-2606-c7fae8b4a7e1_reconciliation "Reconciliation"). Virtual account numbers are active as long as the wallet account is active.

Create a [virtual account](https://docs.rapyd.net/en/glossary.md#UUID-945d98cf-adae-e1cf-2606-c7fae8b4a7e1_virtual_account "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 [vIBAN](https://docs.rapyd.net/en/glossary.md#UUID-945d98cf-adae-e1cf-2606-c7fae8b4a7e1_viban "Virtual International Bank Account Number")s in Europe and local bank account formats in other markets that do not use the [IBAN](https://docs.rapyd.net/en/glossary.md#UUID-945d98cf-adae-e1cf-2606-c7fae8b4a7e1_iban "International Bank Account Number") 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, 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, 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](https://docs.rapyd.net/en/creating-a-rapyd-wallet.md "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.

![van-diagram.jpg](image/img-cf5ec616c5f7f8a769dce1a0388dee99.jpg)

#### Virtual Account Workflow

## Step 1 - Issuing a Virtual Account Number to a Wallet

![issuing-a-va.jpg](image/img-78d01f88f2fe86b9833b476234c946d6.jpg)

1. 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.
2. The back end asks Rapyd to issue a virtual bank account number to the wallet.
3. Rapyd issues the virtual bank account number and returns a confirmation to your back end.
4. You display the bank account number to the customer.

## Step 2 - Receiving Funds into the Virtual Account Number

The same customer wants to make a new payment through the Virtual Account.

![receiving-funds.jpg](image/img-36b7884565dfab3f782b2e76e773edd1.jpg)

1. You call [List Virtual Accounts by Rapyd Wallet](https://docs.rapyd.net/en/list-virtual-accounts-by-rapyd-wallet-365103.md "List Virtual Accounts by Rapyd Wallet").
2. Rapyd returns the Virtual Account Number details.
3. You present to the Virtual Account Number including account ID to the customer.
4. The customer sends funds to the Virtual Account Number Details. The funds are converted to the requested currency.
5. Rapyd sends you a [webhook](https://docs.rapyd.net/en/webhooks.md "Webhooks") notification of the deposited funds.

## Virtual Accounts With Foreign Exchange

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.

#### How Virtual Accounts Work

> **Note:**
>
> To run the examples of this use case, you must create the following ID in your own [sandbox](https://docs.rapyd.net/en/glossary.md#UUID-945d98cf-adae-e1cf-2606-c7fae8b4a7e1_sandbox "Sandbox"):
>
> - **ewallet** - Run [Create Wallet](https://docs.rapyd.net/en/create-wallet.md "Create Wallet") for the customer's wallet. Use the **ID** you get in the response.

## Issuing a Virtual Account Number to the Wallet

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](https://docs.rapyd.net/en/issue-virtual-account-to-wallet.md "Issue Virtual Account 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. |

### Issue Virtual Account Number to Wallet Request

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.

## Issue Virtual Account Number for Rapyd Wallet (Singapore)

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](https://docs.rapyd.net/en/glossary.md#UUID-945d98cf-adae-e1cf-2606-c7fae8b4a7e1_iban "International Bank Account Number") with the number  **DK4289000092780662**.
- Both accounts have a [BIC](https://docs.rapyd.net/en/glossary.md#UUID-945d98cf-adae-e1cf-2606-c7fae8b4a7e1_bic "Bank Identifier Code") 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.

## Update Requested Currency by Virtual Account Number

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:  - ISO currency code - null - empty string ("") |

### Update Requested Currency by Virtual Account Number Request

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"
      }
      ```

### Update Requested Currency by Virtual Account Number Response

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.
