Get Virtual Account
curl --request GET \
--url https://api.hopnow.io/v1/accounts/{account_id}/virtual-account-groups/{group_id}/virtual-accounts/{virtual_account_id} \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.hopnow.io/v1/accounts/{account_id}/virtual-account-groups/{group_id}/virtual-accounts/{virtual_account_id}"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.hopnow.io/v1/accounts/{account_id}/virtual-account-groups/{group_id}/virtual-accounts/{virtual_account_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.hopnow.io/v1/accounts/{account_id}/virtual-account-groups/{group_id}/virtual-accounts/{virtual_account_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.hopnow.io/v1/accounts/{account_id}/virtual-account-groups/{group_id}/virtual-accounts/{virtual_account_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.hopnow.io/v1/accounts/{account_id}/virtual-account-groups/{group_id}/virtual-accounts/{virtual_account_id}")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hopnow.io/v1/accounts/{account_id}/virtual-account-groups/{group_id}/virtual-accounts/{virtual_account_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "<string>",
"object": "<string>",
"account_id": "<string>",
"currency": "<string>",
"status": "<string>",
"label": "<string>",
"balances": {
"available": "<string>",
"pending_payin": "<string>",
"held_for_payout": "<string>",
"total": "<string>"
},
"beneficiary_name": "<string>",
"bank_name": "<string>",
"account_number": "<string>",
"account_number_last4": "<string>",
"iban": "<string>",
"swift_bic": "<string>",
"routing_number": "<string>",
"routing_number_type": "<string>",
"bank_address": {},
"beneficiary_address": {},
"provisioned_at": "<string>",
"created": "<string>",
"updated": "<string>",
"created_by": "<string>",
"updated_by": "<string>"
}Virtual Accounts
Get Virtual Account
Retrieve a single virtual account by its ID
GET
/
v1
/
accounts
/
{account_id}
/
virtual-account-groups
/
{group_id}
/
virtual-accounts
/
{virtual_account_id}
Get Virtual Account
curl --request GET \
--url https://api.hopnow.io/v1/accounts/{account_id}/virtual-account-groups/{group_id}/virtual-accounts/{virtual_account_id} \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.hopnow.io/v1/accounts/{account_id}/virtual-account-groups/{group_id}/virtual-accounts/{virtual_account_id}"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.hopnow.io/v1/accounts/{account_id}/virtual-account-groups/{group_id}/virtual-accounts/{virtual_account_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.hopnow.io/v1/accounts/{account_id}/virtual-account-groups/{group_id}/virtual-accounts/{virtual_account_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.hopnow.io/v1/accounts/{account_id}/virtual-account-groups/{group_id}/virtual-accounts/{virtual_account_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.hopnow.io/v1/accounts/{account_id}/virtual-account-groups/{group_id}/virtual-accounts/{virtual_account_id}")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hopnow.io/v1/accounts/{account_id}/virtual-account-groups/{group_id}/virtual-accounts/{virtual_account_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "<string>",
"object": "<string>",
"account_id": "<string>",
"currency": "<string>",
"status": "<string>",
"label": "<string>",
"balances": {
"available": "<string>",
"pending_payin": "<string>",
"held_for_payout": "<string>",
"total": "<string>"
},
"beneficiary_name": "<string>",
"bank_name": "<string>",
"account_number": "<string>",
"account_number_last4": "<string>",
"iban": "<string>",
"swift_bic": "<string>",
"routing_number": "<string>",
"routing_number_type": "<string>",
"bank_address": {},
"beneficiary_address": {},
"provisioned_at": "<string>",
"created": "<string>",
"updated": "<string>",
"created_by": "<string>",
"updated_by": "<string>"
}Returns one virtual account with its current status, bank details and balances. This is the endpoint to poll after Create Virtual Account: a new virtual account is
pending with no bank details until the provider issues them.
Requires an API key with read access on the virtual_accounts scope.
Path Parameters
string
required
The account’s external ID (starts with
acct_)string
required
The virtual account group’s external ID (starts with
vag_). A group belonging to another account returns 404.string
required
The virtual account’s external ID (starts with
va_). It must sit in this group on this account: a virtual account in another group of the same account returns 404.Response
string
Virtual account identifier (starts with
va_)string
Always returns
"virtual_account"string
Account ID (starts with
acct_). The response does not repeat group_id.string
Currency code of the virtual account
string
Virtual account status:
pending: created, bank details not yet issued. Not payable, and not usable as a payout funding source or transfer leg.active: bank details issued andprovisioned_atset. Payable, and usable for payouts and transfers. It also shows up in List Deposit Instructions.frozen: balance movements blocked by Hop.disabled: closed by Hop; terminal.
string
Label, or
nullobject
string
Account holder a payer should address the deposit to, or
null while pendingstring
Bank holding the account, or
null while pendingstring
Full account number, or
null while pending and on accounts identified by IBANstring
Account number masked as
**** + last 4. The IBAN is masked instead when there is no account number. null while pending.string
Full IBAN, or
null while pending and on accounts identified by account numberstring
SWIFT/BIC code, or
nullstring
Routing number or sort code, or
nullstring
What
routing_number holds, for example ROUTING_NUMBER or SORT_CODE; null when there is no routing numberobject
Bank address for wire instructions (
address_line, city, region, postal_code, country), or nullobject
Account holder address for wire instructions, same shape as
bank_address, or nullstring
ISO 8601 timestamp when the bank details became available, or
null while pending. Treat status being active together with a non-null provisioned_at as the signal that the virtual account is ready to receive money.string
ISO 8601 timestamp when created
string
ISO 8601 timestamp when last updated
string
Actor that created the virtual account: the API key id (starts with
ak_) when opened through this API, otherwise the actor Hop recordedstring
Actor that last updated the virtual account, or
nullErrors
| Status | code | When |
|---|---|---|
404 | RESOURCE_NOT_FOUND | group_id is unknown or belongs to another account, or virtual_account_id is unknown or sits outside that group |
Request Example
curl "https://api.hopnow.io/v1/accounts/acct_ka44qsvpo8q3wtzuwfqf0h6u/virtual-account-groups/vag_8p2m5k9t3w6b1r4n7z0c5v3h/virtual-accounts/va_6b3n9k1q4t7w2z5m8p0r3d6f" \
-H "X-API-Key: your_api_key" \
-H "X-Signature: hmac_signature" \
-H "X-Timestamp: 1234567890" \
-H "X-Nonce: abc123"
Response Example
{
"id": "va_6b3n9k1q4t7w2z5m8p0r3d6f",
"object": "virtual_account",
"account_id": "acct_ka44qsvpo8q3wtzuwfqf0h6u",
"currency": "EUR",
"status": "active",
"label": "EU Collections",
"balances": {
"available": "250.00",
"pending_payin": "0.00",
"held_for_payout": "0.00",
"total": "250.00"
},
"beneficiary_name": "Acme GmbH",
"bank_name": "Example Bank",
"account_number": null,
"account_number_last4": "****3000",
"iban": "DE89370400440532013000",
"swift_bic": "DEUTDEFFXXX",
"routing_number": null,
"routing_number_type": null,
"bank_address": {
"address_line": "1 Bank Street",
"city": "Frankfurt",
"region": null,
"postal_code": "60311",
"country": "DE"
},
"beneficiary_address": {
"address_line": "22 Hauptstrasse",
"city": "Berlin",
"region": null,
"postal_code": "10115",
"country": "DE"
},
"provisioned_at": "2026-01-15T10:12:00Z",
"created": "2026-01-15T10:00:00Z",
"updated": "2026-01-15T10:12:00Z",
"created_by": "ak_3f7k9m2p5r8t1v4x6z0b3n5q",
"updated_by": null
}