curl --request GET \
--url https://sandbox-api.polygon.technology/v0.11/virtual-accounts/{virtualAccountId}/transactions \
--header 'Authorization: Bearer <token>'import requests
url = "https://sandbox-api.polygon.technology/v0.11/virtual-accounts/{virtualAccountId}/transactions"
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.11/virtual-accounts/{virtualAccountId}/transactions', 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.11/virtual-accounts/{virtualAccountId}/transactions",
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.11/virtual-accounts/{virtualAccountId}/transactions"
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.11/virtual-accounts/{virtualAccountId}/transactions")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox-api.polygon.technology/v0.11/virtual-accounts/{virtualAccountId}/transactions")
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": "transaction",
"customerId": "<string>",
"precursor": {
"type": "depositAddress",
"details": {
"depositAddressId": "<string>",
"depositInstructions": {
"asset": "<string>",
"network": "<string>",
"address": "<string>",
"expiresAt": "2023-11-07T05:31:56Z"
}
}
},
"source": {
"type": "walletOms",
"category": "crypto",
"details": {
"id": "<string>",
"asset": "<string>",
"network": "<string>",
"blockchainAddress": "<string>",
"txHash": "<string>",
"blockchainAsset": {
"chainId": "<string>",
"tokenId": "<string>"
}
},
"party": {
"relationship": "customer",
"customerId": "<string>"
}
},
"destination": {
"type": "walletOms",
"category": "crypto",
"details": {
"id": "<string>",
"asset": "<string>",
"network": "<string>",
"blockchainAddress": "<string>",
"txHash": "<string>",
"blockchainAsset": {
"chainId": "<string>",
"tokenId": "<string>"
}
},
"party": {
"relationship": "customer",
"customerId": "<string>"
},
"payoutOrigin": {
"type": "bank",
"details": {
"accountHolder": "customer",
"accountHolderName": "<string>",
"accountNumber": "<string>",
"routingNumber": "<string>",
"virtualAccountId": "<string>"
}
}
},
"pricing": {
"source": {
"asset": "<string>",
"amountGross": "<string>",
"amountNet": "<string>",
"feesDeducted": {
"total": "<string>",
"developer": "<string>",
"oms": "<string>",
"gas": "<string>"
}
},
"destination": {
"asset": "<string>",
"amountGross": "<string>",
"amountNet": "<string>",
"feesDeducted": {
"total": "<string>",
"developer": "<string>",
"oms": "<string>",
"gas": "<string>"
}
},
"pair": "<string>",
"exchangeRate": "<string>",
"effectiveRate": "<string>",
"sponsorGas": true,
"sponsorGasCost": "<string>"
},
"estimatedArrival": "2023-11-07T05:31:56Z",
"error": {
"code": "<string>",
"message": "<string>",
"occurredAt": "2023-11-07T05:31:56Z",
"recoverable": true,
"manualRecovery": {
"type": "manualRecovery",
"instructions": "<string>",
"referenceFields": {
"transactionId": "<string>",
"sourceTxHash": "<string>"
}
}
},
"hold": {
"type": "senderAttribution",
"required": true,
"since": "2023-11-07T05:31:56Z",
"deadline": "2023-11-07T05:31:56Z",
"resolvedAt": "2023-11-07T05:31:56Z",
"txHash": "<string>",
"matchableExternalAccountCriteria": {
"type": "walletExternal",
"customerId": "<string>",
"blockchainAddress": "<string>",
"networkFamily": "<string>"
}
},
"metadata": {},
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"expiresAt": "2023-11-07T05:31:56Z",
"projectId": "<string>"
}
]
}List Virtual Account transactions
Returns the payment transactions that originated from this Virtual
Account, most recent first, with cursor-based pagination. Uses the same
grouped payment read model as GET /transactions, pinned to this virtual
account (equivalent to GET /transactions?virtualAccountId=).
This is a collection filter: it always returns 200 with the matching
transactions. An unknown, deleted, or other-tenant virtualAccountId
simply matches no rows and yields an empty list — it is not a 404. Use
GET /virtual-accounts/{virtualAccountId} to assert existence/ownership.
curl --request GET \
--url https://sandbox-api.polygon.technology/v0.11/virtual-accounts/{virtualAccountId}/transactions \
--header 'Authorization: Bearer <token>'import requests
url = "https://sandbox-api.polygon.technology/v0.11/virtual-accounts/{virtualAccountId}/transactions"
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.11/virtual-accounts/{virtualAccountId}/transactions', 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.11/virtual-accounts/{virtualAccountId}/transactions",
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.11/virtual-accounts/{virtualAccountId}/transactions"
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.11/virtual-accounts/{virtualAccountId}/transactions")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox-api.polygon.technology/v0.11/virtual-accounts/{virtualAccountId}/transactions")
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": "transaction",
"customerId": "<string>",
"precursor": {
"type": "depositAddress",
"details": {
"depositAddressId": "<string>",
"depositInstructions": {
"asset": "<string>",
"network": "<string>",
"address": "<string>",
"expiresAt": "2023-11-07T05:31:56Z"
}
}
},
"source": {
"type": "walletOms",
"category": "crypto",
"details": {
"id": "<string>",
"asset": "<string>",
"network": "<string>",
"blockchainAddress": "<string>",
"txHash": "<string>",
"blockchainAsset": {
"chainId": "<string>",
"tokenId": "<string>"
}
},
"party": {
"relationship": "customer",
"customerId": "<string>"
}
},
"destination": {
"type": "walletOms",
"category": "crypto",
"details": {
"id": "<string>",
"asset": "<string>",
"network": "<string>",
"blockchainAddress": "<string>",
"txHash": "<string>",
"blockchainAsset": {
"chainId": "<string>",
"tokenId": "<string>"
}
},
"party": {
"relationship": "customer",
"customerId": "<string>"
},
"payoutOrigin": {
"type": "bank",
"details": {
"accountHolder": "customer",
"accountHolderName": "<string>",
"accountNumber": "<string>",
"routingNumber": "<string>",
"virtualAccountId": "<string>"
}
}
},
"pricing": {
"source": {
"asset": "<string>",
"amountGross": "<string>",
"amountNet": "<string>",
"feesDeducted": {
"total": "<string>",
"developer": "<string>",
"oms": "<string>",
"gas": "<string>"
}
},
"destination": {
"asset": "<string>",
"amountGross": "<string>",
"amountNet": "<string>",
"feesDeducted": {
"total": "<string>",
"developer": "<string>",
"oms": "<string>",
"gas": "<string>"
}
},
"pair": "<string>",
"exchangeRate": "<string>",
"effectiveRate": "<string>",
"sponsorGas": true,
"sponsorGasCost": "<string>"
},
"estimatedArrival": "2023-11-07T05:31:56Z",
"error": {
"code": "<string>",
"message": "<string>",
"occurredAt": "2023-11-07T05:31:56Z",
"recoverable": true,
"manualRecovery": {
"type": "manualRecovery",
"instructions": "<string>",
"referenceFields": {
"transactionId": "<string>",
"sourceTxHash": "<string>"
}
}
},
"hold": {
"type": "senderAttribution",
"required": true,
"since": "2023-11-07T05:31:56Z",
"deadline": "2023-11-07T05:31:56Z",
"resolvedAt": "2023-11-07T05:31:56Z",
"txHash": "<string>",
"matchableExternalAccountCriteria": {
"type": "walletExternal",
"customerId": "<string>",
"blockchainAddress": "<string>",
"networkFamily": "<string>"
}
},
"metadata": {},
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"expiresAt": "2023-11-07T05:31:56Z",
"projectId": "<string>"
}
]
}Authorizations
Token from POST /auth/token
Path Parameters
Virtual Account ID (va_ prefix).
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 transaction. processing: funds in motion. awaitingAction:
non-terminal, blocked on developer/upstream/compliance (see hold); returns
to processing once cleared. completed: delivered. failed: terminal failure.
processing, awaitingAction, completed, failed Filter by corridor (source/destination category composite).
Composite of source and destination instrument categories, inferred
from each side. The cash corridors
(cryptoToCash, cashToCrypto) are derived from a cash-pickup destination /
cash-in source respectively; the rest map straight from the internal corridor type.
cryptoToCrypto, cryptoToCash, cryptoToFiatAccount, cashToCrypto, fiatAccountToCrypto, fiatAccountToFiatAccount Scope to a customer (sender or recipient). cst_ prefix.
Inclusive lower bound on createdAt.
Inclusive upper bound on createdAt.
Free-text search. Matches transaction id, customer id, or customer email.
Alias for search.
Filters to payments where ANY leg's underlying status is in the given set.
Response
The request has succeeded.
A paginated list of transactions.
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
Transaction ID (txn_ 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 "transaction".
transaction Current lifecycle status. See subStatus for finer granularity.
processing, awaitingAction, completed, failed The owning (sender) customer. OMSX customer TypeID (cst_…).
^[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})$What created this transaction, carrying that origin's deposit instructions.
Always present: the manual arm covers any transaction with no
automated origin.
- Deposit address
- Virtual account
- Cash-in
- Quote
- Manual
Hide child attributes
Hide child attributes
Type discriminator.
depositAddress depositAddress origin payload: the DA id + its on-chain inlet instructions.
Hide child attributes
Hide child attributes
Deposit Address ID (da_ 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})$The on-chain address senders deposit to, with its asset and network.
Hide child attributes
Hide child attributes
Same value as expectedSourceAsset.
Same value as expectedSourceNetwork.
Erebor-owned on-chain inlet address for this DA.
Placeholder for a future provider-imposed inlet expiry. Null for Erebor DDAs today; surfaced now so adding it later is not a breaking change.
The funding side: a typed instrument carrying identity and detail.
- 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.
walletOms High-level grouping: fiatAccount for bank or card accounts, crypto for wallets.
crypto WalletOms instrument details: an OMS-custodied crypto wallet.
Hide child attributes
Hide child attributes
Internal OMS wallet (wlt_ prefix; legacy acc_ also accepted on input).
^[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.
On-chain address.
How the wallet is held: custodial or embedded.
custodial, embedded On-chain transaction hash.
BPN extension: resolved on-chain asset identity (protocol/chainId/tokenId).
Structured identity of who is on this side.
- Customer
- Another customer
- Registered external account
- Unregistered external account
Hide child attributes
Hide child attributes
Relationship discriminator.
customer 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})$individual, business The receiving side: a typed instrument plus payoutOrigin.
- 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.
walletOms High-level grouping: fiatAccount for bank or card accounts, crypto for wallets.
crypto WalletOms instrument details: an OMS-custodied crypto wallet.
Hide child attributes
Hide child attributes
Internal OMS wallet (wlt_ prefix; legacy acc_ also accepted on input).
^[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.
On-chain address.
How the wallet is held: custodial or embedded.
custodial, embedded On-chain transaction hash.
BPN extension: resolved on-chain asset identity (protocol/chainId/tokenId).
Structured identity of who is on this side.
- Customer
- Another customer
- Registered external account
- Unregistered external account
Hide child attributes
Hide child attributes
Relationship discriminator.
customer 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})$individual, business Payout originates from a bank account. v0.10 wraps the fields in a details
envelope (matches the precursor shape). accountNumber/routingNumber are
full sending-account detail rendered on the Transaction only, null on
Quote/Deposit Address (choice-only).
- Bank
- Blockchain
Hide child attributes
Hide child attributes
Type discriminator.
bank Bank payout-origin detail. accountHolder(+Name) is the chosen sender
identity (echoed on Quote/DA too); accountNumber/routingNumber are the
full sending-account coordinates (Transaction only, else null); virtualAccountId
is the VA the funds were pulled from.
Hide child attributes
Hide child attributes
Who holds the payout bank account (OMS closed enum). customer is the only
valid value.
customer Name of the sending account holder.
Bank account number.
US ABA routing number.
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})$Consolidated economics.
Hide child attributes
Hide child attributes
Economics for the source side, denominated in the source asset.
Hide child attributes
Hide child attributes
Currency these amounts are in. Same as the side's instrument asset, repeated here so pricing is self-contained.
Amount on this side before fees are applied.
Amount after fees: what is actually pulled from a source, or delivered to a destination.
Itemized fees deducted on this side.
Hide child attributes
Hide child attributes
Per-side aggregated developer fee total in this side's asset. Always "0" in alpha - alpha invariant, mirrors the gas line.
Economics for the destination side, denominated in the destination asset.
Hide child attributes
Hide child attributes
Currency these amounts are in. Same as the side's instrument asset, repeated here so pricing is self-contained.
Amount on this side before fees are applied.
Amount after fees: what is actually pulled from a source, or delivered to a destination.
Itemized fees deducted on this side.
Hide child attributes
Hide child attributes
Per-side aggregated developer fee total in this side's asset. Always "0" in alpha - alpha invariant, mirrors the gas line.
Asset pair, e.g. "usdc/usd".
Mid-market rate between source and destination assets. Identity: source.amountNet × exchangeRate = destination.amountGross.
All-in rate including all fees. Identity: source.amountGross × effectiveRate = destination.amountNet.
The side you set amount on when creating the quote. OMS calculated the other side.
source, destination When true, OMS absorbs the destination gas cost. Currently always true.
Gas absorbed by the developer when sponsorGas is true. Currently always 0.00.
Corridor composite derived from the two sides.
cryptoToCrypto, cryptoToCash, cryptoToFiatAccount, cashToCrypto, fiatAccountToCrypto, fiatAccountToFiatAccount Status-scoped sub-state (e.g. processing.fundsPulled). Absent when the transaction
has no meaningful sub-state.
processing.fundsPulled, processing.cashPickupReady, processing.underReview, completed.cashPickupCollected, completed.cashPickupExpired, awaitingAction.awaitingSenderAttribution, awaitingAction.depositAddressFrozen, awaitingAction.depositAddressInactive, failed.attributionTimeout, failed.depositAddressFrozenTimeout, failed.depositAddressInactiveTimeout, failed.depositAddressClosed, processing.awaitingCryptoOut, processing.cryptoOut, processing.awaitingFiatOut, processing.fiatOut, processing.inboundPending, processing.inboundProcessing, failed.inboundFailed, failed.returnPending, failed.returnStarted, failed.returnComplete, failed.returnFailed Estimated completion time. Present when the destination rail has a predictable settlement time (e.g. bank payouts and some crypto legs); null otherwise.
Failure detail. Set when the transaction fails; includes refund or recovery state where applicable.
Hide child attributes
Hide child attributes
Machine-readable code.
Human-readable detail.
When the error occurred.
Whether the failure can be recovered.
Populated only for terminal failures with no resolved refund/return path (v0.11).
Hide child attributes
Hide child attributes
manualRecovery ANCHORAGE_SG, ANCHORAGE_US, AQUANOW_CA, B2C2_UK, B2C2_US, BITGO_SG, BITGO_US, BITSTAMP_US, BVNK_US, CIRCLE_FR, CIRCLE_US, CITIBANK_US, COINBASE_US, COINSMART_CA, COPPER_CH, COPPER_UK, CUMBERLAND_DRW_LLC_US, CUMBERLAND_SG, EREBOR_BANK_US, FALCONX_US, FIDELITY_UK, FIDELITY_US, FIREBLOCKS_APAC, FIREBLOCKS_US, GALAXY_KY, GEMINI_US, KRAKEN_BVI, KRAKEN_EU_IE, KRAKEN_UK, KRAKEN_US, NUBANK_BR, PAXOS_US, RAMP_NETWORK_US, ROBINHOOD_US, WINTERMUTE_GB, SELF_HOSTED, OTHER Reference identifiers for an operator-driven recovery.
Hide child attributes
Hide child attributes
Transaction ID (txn_ 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})$Transaction hash of the originating inbound transfer.
Present while status is awaitingAction; explains the hold + deadline.
Populated when the hold model is wired.
- Sender attribution
- Deposit address frozen
- Deposit address inactive
Hide child attributes
Hide child attributes
Type discriminator.
senderAttribution Whether the hold is still blocking; false once resolved.
When the hold started.
Deadline to resolve before timeout.
When the hold was resolved; null while outstanding.
The transaction hash of the unattributed inbound deposit.
Registering a matching walletExternal EA releases this hold.
Hide child attributes
Hide child attributes
Always walletExternal — the EA type that resolves the hold.
walletExternal 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})$On-chain address.
Network family (e.g. evm).
When the transaction was created.
When the transaction was last updated.
Expiry of the transaction's actionable window: present on auto-created transactions and on cash payouts (the pickup-code expiry), and retained after completion for audit. Null for other quote-initiated transactions.
The owning project. Populated only on the cross-project admin endpoints (e.g. GET /admin/transactions/redrivable) so operators can tell which project a stranded transaction belongs to. Omitted on partner endpoints, where the project is implicit from the auth token.
^prj_.+$Was this page helpful?