Skip to main content

Documentation

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.

van-diagram.jpg
issuing-a-va.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.

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

receiving-funds.jpg
  1. You call 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 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_number8850780138613670 .

  • 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:

  • ISO currency code

  • null

  • empty string ("")

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.