curl --request GET \
--url https://sandbox-api.polygon.technology/v0.13/virtual-accounts \
--header 'Authorization: Bearer <token>'import requests
url = "https://sandbox-api.polygon.technology/v0.13/virtual-accounts"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox-api.polygon.technology/v0.13/virtual-accounts', 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://sandbox-api.polygon.technology/v0.13/virtual-accounts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://sandbox-api.polygon.technology/v0.13/virtual-accounts"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://sandbox-api.polygon.technology/v0.13/virtual-accounts")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox-api.polygon.technology/v0.13/virtual-accounts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"object": "<string>",
"limit": 123,
"hasMore": true,
"nextCursor": "<string>",
"previousCursor": "<string>",
"data": [
{
"id": "<string>",
"object": "virtualAccount",
"customerId": "<string>",
"customer": {
"id": "<string>",
"name": "<string>"
},
"status": "pending",
"sourceToDestination": "cryptoToCrypto",
"statusReason": "<string>",
"source": {
"asset": "<string>",
"network": "<string>"
},
"depositInstructions": {
"bankUs": [
{
"bankName": "<string>",
"bankAddress": "<string>",
"accountNumber": "<string>",
"routingNumber": "<string>",
"accountType": "<string>",
"BIC": "<string>",
"beneficiary": {
"name": "<string>",
"address": "<string>"
},
"memo": "<string>",
"supportedSources": [
{
"asset": "<string>",
"network": "<string>"
}
]
}
]
},
"provider": "<string>",
"payoutOrigin": {
"type": "bank",
"id": "<string>",
"accountHolder": "customer",
"accountHolderName": "<string>"
},
"destination": {
"type": "walletCrypto",
"category": "crypto",
"id": "<string>",
"asset": "<string>",
"network": "<string>",
"displayName": "<string>",
"party": {
"relationship": "customer",
"id": "<string>",
"name": "<string>"
},
"memo": "<string>"
},
"returnDestination": {
"type": "bankUs",
"network": "ach",
"id": "<string>"
},
"sponsorGas": true,
"bankMemo": "<string>",
"label": "<string>",
"metadata": {},
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"failureReason": "provisioningTimeout",
"deletionRequestedAt": "2023-11-07T05:31:56Z",
"deletionRequestedBy": "<string>",
"finalBalance": {
"value": "<string>",
"currency": "<string>",
"display": "<string>"
}
}
]
}List all Virtual Accounts
List all Virtual Accounts across the organization. Spans every customer in the caller’s organization; optionally filter by status and/or customer.
curl --request GET \
--url https://sandbox-api.polygon.technology/v0.13/virtual-accounts \
--header 'Authorization: Bearer <token>'import requests
url = "https://sandbox-api.polygon.technology/v0.13/virtual-accounts"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox-api.polygon.technology/v0.13/virtual-accounts', 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://sandbox-api.polygon.technology/v0.13/virtual-accounts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://sandbox-api.polygon.technology/v0.13/virtual-accounts"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://sandbox-api.polygon.technology/v0.13/virtual-accounts")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox-api.polygon.technology/v0.13/virtual-accounts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"object": "<string>",
"limit": 123,
"hasMore": true,
"nextCursor": "<string>",
"previousCursor": "<string>",
"data": [
{
"id": "<string>",
"object": "virtualAccount",
"customerId": "<string>",
"customer": {
"id": "<string>",
"name": "<string>"
},
"status": "pending",
"sourceToDestination": "cryptoToCrypto",
"statusReason": "<string>",
"source": {
"asset": "<string>",
"network": "<string>"
},
"depositInstructions": {
"bankUs": [
{
"bankName": "<string>",
"bankAddress": "<string>",
"accountNumber": "<string>",
"routingNumber": "<string>",
"accountType": "<string>",
"BIC": "<string>",
"beneficiary": {
"name": "<string>",
"address": "<string>"
},
"memo": "<string>",
"supportedSources": [
{
"asset": "<string>",
"network": "<string>"
}
]
}
]
},
"provider": "<string>",
"payoutOrigin": {
"type": "bank",
"id": "<string>",
"accountHolder": "customer",
"accountHolderName": "<string>"
},
"destination": {
"type": "walletCrypto",
"category": "crypto",
"id": "<string>",
"asset": "<string>",
"network": "<string>",
"displayName": "<string>",
"party": {
"relationship": "customer",
"id": "<string>",
"name": "<string>"
},
"memo": "<string>"
},
"returnDestination": {
"type": "bankUs",
"network": "ach",
"id": "<string>"
},
"sponsorGas": true,
"bankMemo": "<string>",
"label": "<string>",
"metadata": {},
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"failureReason": "provisioningTimeout",
"deletionRequestedAt": "2023-11-07T05:31:56Z",
"deletionRequestedBy": "<string>",
"finalBalance": {
"value": "<string>",
"currency": "<string>",
"display": "<string>"
}
}
]
}Authorizations
Token from POST /auth/token
Query Parameters
Page size, supported range 1-100. The default and maximum are per-resource (see each endpoint's description; most endpoints default to 50) and are resolved at runtime from configuration. Values outside the range are clamped to the nearest bound rather than rejected. The range is published machine-readably via the x-minimum/x-maximum OpenAPI extensions below — deliberately NOT via @minValue/@maxValue, which emit JSON-Schema minimum/maximum and make the generated SDK (Zod) reject values the server accepts and clamps. See PaginatedList.limit for the effective value applied.
Filter by status.
Lifecycle of a Virtual Account. pending: awaiting bank provisioning. active: accepting deposits. frozen: deposits held by compliance. inactiveActionRequired: destination unusable - re-point destination to recover. closed: permanently disabled. deleted: close flow finalized. failed: provisioning failed.
pending, active, frozen, closed, deleted, failed, inactiveActionRequired Filter to a single customer (cst_ prefix).
Response
The request has succeeded.
Paginated list of VirtualAccount resources.
Resource type discriminator.
The effective page size applied to this response, after clamping an out-of-range or unset requested limit into the supported bound.
True when more rows exist beyond this page in the direction of travel (forward by default, backward when endingBefore was supplied).
Opaque cursor pointing at the last item in this page. Present when data is non-empty. Pass as startingAfter to fetch the next page; hasMore=false signals no more pages forward.
Opaque cursor pointing at the first item in this page. Present when data is non-empty. Pass as endingBefore to page backward; when this yields an empty response the client is at the start of the list.
The page of results.
Hide child attributes
Hide child attributes
Virtual Account ID (va_ prefix).
^[a-z]+_([0-9a-hjkmnp-tv-z]{26}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$Resource type discriminator. Always "virtualAccount".
virtualAccount The OMS customer that owns this record (cst_ prefix).
^[a-z]+_([0-9a-hjkmnp-tv-z]{26}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$Display-safe summary of the owning customer (customer.id equals customerId). Returned on list and detail responses.
Current lifecycle status of the virtual account.
pending, active, frozen, closed, deleted, failed, inactiveActionRequired Corridor composite derived from the destination type — fiatAccountToCrypto for a crypto-wallet destination (inbound fiat auto-converts), or fiatAccountToFiatAccount for a bank or walletFiat destination (inbound USD forwarded onward — the same token for both; walletFiat introduces no new corridor).
cryptoToCrypto, cryptoToCash, cryptoToFiatAccount, cashToCrypto, fiatAccountToCrypto, fiatAccountToFiatAccount Human-readable explanation of the current status.
Bank coordinates senders use to deposit into this Virtual Account. Null until the provider has opened the account, so a pending Virtual Account carries none.
Hide child attributes
Hide child attributes
Hide child attributes
Hide child attributes
US domestic only; null for SWIFT.
US domestic only; null for SWIFT. Always "checking" when present.
SWIFT only; null for US domestic.
Who senders should address the deposit to — the party the funds are ultimately credited to. On a SWIFT routing block this is the holding bank itself, and the customer is named in that block's memo; on a US domestic block it is the customer. Response-only, determined by OMS and not configurable on create. address is a single formatted display line, e.g. "6 Acme Way, Bentonville, AR 72712 US".
SWIFT only; null for US domestic. OMS-generated: "FFC ".
The institution that issues and custodies this Virtual Account — currently "Erebor Bank, N.A." or "Coinme Inc.". Assigned by OMS from your project's configuration, never supplied by you. Read it when you need to tell an end user or a support ticket which institution is holding the deposited funds. It is not the entity an outbound forward is sent under — that is payoutOrigin.accountHolderName, which is set by whoever executes the payout and can name a different company. New providers may be added, so treat the string as free-form rather than a fixed set. Read-only; omitted when the vendor is unrecognized.
Where the onward forward of an inbound deposit is sent from, and whose legal identity it goes out under. Response-only, derived from the destination type and the issuing institution. A bank destination renders the bank arm; a crypto-wallet destination renders the blockchain arm with a null accountHolder, since a crypto payout has no sending legal identity. Absent for a walletFiat destination, whose delivery is an internal ledger movement rather than a payout. accountHolder and accountHolderName are also null whenever OMS cannot name the issuing institution.
Hide child attributes
Hide child attributes
bank, blockchain Public TypeID, e.g. txn_01h455vb4pex5vsknk084sn02q; legacy UUID suffixes are accepted until non-v7 rows are retired.
^[a-z]+_([0-9a-hjkmnp-tv-z]{26}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$Whose legal identity the payment is sent under. Determined by OMS from the route's configuration — not a request field. Null for destinations that have no sending legal identity (crypto and cash payouts).
customer, paymentProvider The legal name the payment is sent under, resolved from accountHolder — the customer's own legal name for customer, or "Coinme Inc FBO its Customers" for paymentProvider. This is what the recipient's bank shows on the credit. Like accountHolder and unlike id, it is populated as soon as it is determinable, so it appears on Quote and Deposit Address responses as well as Transactions. Null whenever accountHolder is null.
V0.10: unified side shape.
- OMS wallet
- External wallet
- Fiat wallet
- US bank account
- IBAN bank account
- Canadian bank account
- Card
- Cash
Hide child attributes
Hide child attributes
Type discriminator.
walletCrypto High-level grouping: fiatAccount for bank or card accounts, crypto for wallets.
crypto OMS wallet ID (wlt_ prefix). Dereference via GET /wallets/{id}. Null while a deposit is still in flight and the wallet it lands in has not resolved yet.
^[a-z]+_([0-9a-hjkmnp-tv-z]{26}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$Canonical asset identifier.
Network identifier.
Opaque, render-only summary for list/detail display. Never a full account number/IBAN/PAN.
Structured identity of who is on this side.
Hide child attributes
Hide child attributes
Which kind of party this is.
customer, otherCustomer, externalRegistered, externalUnregistered cst_ for customer/otherCustomer; ctp_ for externalRegistered; null for externalUnregistered.
^[a-z]+_([0-9a-hjkmnp-tv-z]{26}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$Display name. Null only when genuinely unknown (an unattributed external sender).
Free-text message that travelled with the transfer on this side's rail. Never populated on this instrument — no rail behind it carries a message — so the key is always absent. A memo appears only on the bank arms (bankUs, bankIban, bankCanada).
The configured fiat return destination (v0.11-8) for failed outbound legs; absent/null when none is set (the project return policy applies instead, once T13 wires the waterfall).
- US bank account
- IBAN bank account
- Canadian bank account
- Fiat wallet
Hide child attributes
Hide child attributes
Whether OMS absorbs the on-chain gas cost for the destination delivery. Persisted from the create/update request (currently only true is accepted).
Wire/ACH memo the customer can include with deposits.
Partner display label.
When the virtual account was created.
When the virtual account was last updated.
Set when status = failed; closed enum identifying the failure category.
provisioningTimeout, systemError, ereborRejected, deletePendingTimeout, coinmeDeclined Set when DELETE has been requested but the close webhook has not yet finalized.
Identity (JWT subject claim) of the caller who invoked DELETE.
DDA balance snapshot at the moment the VA flipped to deleted.
Was this page helpful?