Skip to content
Executive summary

The Position Report is a point-in-time balance snapshot. Each row reports one account-and-asset balance as of a timestamp you choose.

  • Send a POST request to /v1/exports/position with your target domain and an asOfTimestamp.
  • Filter by vault, ticker, and account, and choose whether to include child domains and zero balances.
  • The service returns 18 fixed columns in CSV or JSON, plus balance control totals.

Use the Position Report to verify end-of-day balances against your core systems, calculate regulatory capital, and produce tax reporting. Each row represents the balance of one account for one asset (a single account-and-ticker pair) at the point in time you request.

Prerequisites

To generate a Position Report, you need the following:

PrerequisiteAdditional information
A valid bearer token (JWT)See Authentication.
A profile in the target domain with a role that grants read access to accountsSee Access control.
The target domain's IDThe domain you want to report on.

Endpoint

POST /v1/exports/position

The service generates a balance snapshot for every account in the target domain as of asOfTimestamp.

Request fields

Send the request body as application/json.

FieldTypeRequiredDefaultDescription
domainIdstring (UUID)YesThe target domain. You must have read access to accounts in this domain.
asOfTimestampstring (ISO 8601)YesThe point in time for the balance snapshot. Can't be in the future.
includeChildDomainsbooleanNofalseInclude balances from descendant domains. The service access-checks each child individually.
vaultIdsstring[] (UUID)NoInclude only the listed vaults. Maximum 1,000 entries.
tickerIdsstring[] (UUID)NoInclude only the listed assets. Maximum 1,000 entries. The report includes every asset in scope — including locked or unvetted assets — so use this filter to restrict the output to the assets you need.
accountIdsstring[] (UUID)NoInclude only the listed accounts. Maximum 1,000 entries.
includeZeroBalancesbooleanNofalseInclude accounts that hold a zero balance.
format"CSV" | "JSON"YesThe output format.

Example request

curl -X POST "https://{host}/v1/exports/position" \
  -H "Authorization: Bearer <jwt>" \
  -H "Content-Type: application/json" \
  -d '{
    "domainId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "asOfTimestamp": "2026-06-15T23:59:59Z",
    "includeChildDomains": true,
    "includeZeroBalances": false,
    "format": "CSV"
  }'

The response is returned as a single file with a Content-Disposition attachment header and an X-Export-Id header for tracing. For the response structure of each format, see Output formats.

Output columns

Each row represents one account-and-asset balance. Column order is a fixed contract. The domainId and domainName columns are per-balance: they identify the domain that owns each balance, which can differ from the domain you requested when you include child domains.

#ColumnTypeNullableDescription
1domainIdstring (UUID)NoThe domain that owns this balance.
2domainNamestringNoThe domain's display name.
3vaultTypestringNoThe vault's backing type, passed through from the core system, such as MPC or HSM. Not a fixed enumeration.
4vaultIdstring (UUID)NoThe vault identifier.
5vaultNamestringNoThe vault's display name.
6accountIdstring (UUID)NoThe account identifier.
7accountNamestringNoThe account's display name.
8accountTypestringNoThe account type, currently vault or gas station. Additional types are planned for later phases.
9ledgerNamestringNoThe blockchain network name as configured by the operator, such as XRPL Testnet August 2024 or Ethereum Mainnet.
10addressOnLedgerstringNoThe on-chain address for this account.
11tickerIdstring (UUID)NoThe asset identifier.
12tickerKindstringNoThe asset kind. One of Native, Token, or Contract.
13tickerNamestringNoThe full asset name, such as Ether.
14tickerSymbolstringYesThe asset symbol, such as ETH. Empty if not set.
15reservedBalancestring (decimal)NoThe reserved balance at asOfTimestamp.
16quarantineBalancestring (decimal)NoThe quarantined balance at asOfTimestamp.
17totalBalancestring (decimal)NoThe total balance at asOfTimestamp.
18ledgerBalanceTimestampstring (ISO 8601)YesWhen the service last wrote the balance. Empty on zero-balance rows (no contributing entries as of the timestamp). This is a database write time, not the on-chain block time.

Balance columns (reservedBalance, quarantineBalance, totalBalance) are decimal strings in the asset's native unit. In CSV, the service quotes them to preserve precision. Always parse them as strings. See Financial precision.

Control totals

The metadata header includes the following control totals, each a sum across every row in the report. Use them to verify that your ingested file is complete and uncorrupted. For how to verify, see Control totals.

FieldDescription
balanceTotalAmountThe sum of all totalBalance values.
balanceReservedAmountThe sum of all reservedBalance values.
balanceQuarantinedAmountThe sum of all quarantineBalance values.

Errors

If the service returns an error, the response body is a client-safe JSON object and never exposes internal details. Common cases for the Position Report include:

  • 400: A required field is missing, a UUID or timestamp is malformed, asOfTimestamp is in the future, or a filter array exceeds 1,000 entries.
  • 401: The JWT is missing or invalid.
  • 403: You lack access to the target domain.
  • 413: The request scope exceeds a report limit — either more than 100 accessible domains, or a result that would exceed 100,000 rows.
  • 429: A duplicate request within 60 seconds while a previous export is still processing, or you already have 2 exports processing.
  • 502: The upstream balance source is temporarily unavailable.

For the full list, see Error responses.


Next steps

PageDescription
Movement ReportGenerate a transaction history for a date range.
Export referenceLook up output formats, financial precision rules, access control, operational limits, and error responses.
Data export overviewReview report types, export metadata, and control totals.