Virtual Accounts

Create a virtual account

Changed on

Create a virtual account for the business in the bank country given by bank_country. HitPay picks the bank that serves that location.

The locations a business can request depend on the business's own country:

Business countrybank_countryCurrencies received
sgsgSGD, USD, EUR, GBP, CAD, CHF, CNH, CNY, HKD, NOK, NZD, SEK
sgphPHP
sggbGBP, EUR
sgdkEUR
sgluEUR
phphPHP
auauAUD

The payment provider serving the location must have completed onboarding for the business, or the request returns 400. For sg and ph the business enables it under Settings > Payment Methods. HitPay sets up the provider for gb, dk, lu and au.

A business can hold one virtual account per location. If one already exists, the request returns 409 Conflict. The business must have payments enabled.

Migration note: bank_country is required. A request without it used to create the default virtual account for the business's country. It now returns 422. To keep the old behaviour, send the business's own country, for example {"bank_country": "sg"} for a Singapore business.

post/v1/virtual-accounts

Request

  • Base URL
    https://api.hit-pay.com
  • URL
    https://api.hit-pay.com/v1/virtual-accounts
  • Auth
    none declared. Required headers: X-BUSINESS-API-KEY

Headers

X-BUSINESS-API-KEYstring required
Example:b286daabf9921b5a01a4621f026c111e046f8911feba212996c92159b98427d

Request body

bank_countrystring required

Two-letter lowercase ISO 3166-1 code of the country the account is held in. See the table above.

payment_provider_methodstring

Optional. Pins the location to one payment method, e.g. dbs_va. Rejected with 400 if that method does not serve bank_country.

currencystring

Optional. The currency to receive, e.g. sgd. Only needed when more than one provider serves bank_country for the business.

Example request

{
  "bank_country": "sg",
  "payment_provider_method": "dbs_va",
  "currency": "sgd"
}

Response

Virtual account created successfully

idstring uuid

Virtual account ID

namestring

Display name of the virtual account

referencestring

Virtual account reference issued by the bank. For DBS Singapore this is the 7-digit VA number that forms the tail of account_number.

statusstring nullable

Provisioning status of the virtual account: pending, success, or rejected. pending means the bank has acknowledged the request but has not activated the account yet.

countrystring

Two-letter lowercase ISO 3166-1 country code of the business the virtual account belongs to

supported_currenciesstring[] nullable

Uppercase currency codes that can be received into this virtual account

holder_namestring

Account holder name, i.e. the registered name of the business

account_numberstring

Full account number to transfer funds to. For DBS Singapore this is the VA prefix and corporate code prepended to reference.

bank_namestring nullable

Name of the bank holding the virtual account

bank_swift_codestring nullable

SWIFT/BIC code of the bank. null for providers that settle without one, such as Philippine accounts on InstaPay and PESONet.

bank_countrystring

Two-letter lowercase ISO 3166-1 country code of the country the bank account is held in. Can differ from country, e.g. a Singapore business can hold an account in gb.

transfer_typesstring[]

Transfer rails the virtual account can receive funds over

created_atstring date-time

ISO 8601 timestamp of when the virtual account was created

updated_atstring date-time

ISO 8601 timestamp of when the virtual account was last updated

Example response

{
  "id": "9b3f1a2c-1d4e-4f6a-8b2c-7e9d0a1b2c3d",
  "name": "Acme Pte Ltd",
  "reference": "1234567",
  "status": "success",
  "country": "sg",
  "supported_currencies": [
    "SGD",
    "USD"
  ],
  "holder_name": "Acme Pte Ltd",
  "account_number": "8854911234567",
  "bank_name": "DBS Bank",
  "bank_swift_code": "DBSSSGSG",
  "bank_country": "sg",
  "bank_attributes": {
    "type": "local",
    "account_number": "8854911234567",
    "bank_name": "DBS Bank",
    "swift_code": "DBSSSGSG",
    "transfer_types": [
      "FAST",
      "SWIFT"
    ]
  },
  "transfer_types": [
    "FAST",
    "SWIFT"
  ],
  "created_at": "2026-06-08T15:30:10+08:00",
  "updated_at": "2026-06-08T15:30:10+08:00"
}

Changes

    • breaking

      added required request body

    • info

      added the non-success response with the status

    • info

      added the non-success response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • warning

      removed the optional property from the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status