Skip to content
Executive summary

The Movement Report is a transaction history for a date range. Each row reports one transfer, including amounts, fees, on-chain details, and counterparties.

  • Send a POST request to /v1/exports/movement with your target domain and a date range of up to 30 days.
  • By default, the report includes only settled transactions. Filter by vault, ticker, account, and status.
  • The service returns 39 fixed columns in CSV or JSON, plus a value control total.

Use the Movement Report to reconcile activity for specific audit periods, remediate reconciliation breaks, and satisfy tax reporting requirements. Each row represents one transfer. Transaction-level fields repeat across the rows that belong to the same transaction.

Prerequisites

To generate a Movement 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 transactionsSee Access control.
The target domain's IDThe domain you want to report on.

Endpoint

POST /v1/exports/movement

The service generates a transaction history for the target domain within the date range you specify.

Request fields

Send the request body as application/json.

FieldTypeRequiredDefaultDescription
domainIdstring (UUID)YesThe target domain. You must have read access to transactions in this domain.
dateRange.startstring (ISO 8601)YesThe start of the date range. Can't be in the future.
dateRange.endstring (ISO 8601)YesThe end of the date range. Can't be before start. The range can't exceed 30 days.
includeChildDomainsbooleanNofalseInclude transfers 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.
custodyStatusstring[]No["Completed"]Filter by custody status. See Status filtering.
ledgerStatusstring[]No["Confirmed"]Filter by ledger status. See Status filtering.
format"CSV" | "JSON"YesThe output format.

Status filtering

By default, the Movement Report includes only settled transactions—those with a custody status of Completed and a ledger status of Confirmed. This default is designed for reconciliation, where you want only finalized activity.

To include other statuses, pass the full set of values you want:

FieldAccepted values
custodyStatusBroadcasting, Completed, Failed, Interrupted, Pending, Prepared, Preparing, Reserved
ledgerStatusDetected, Confirmed, Expired, Replaced

To retrieve every status, pass all values explicitly. Omit a field to keep its settled-only default. Sending an empty array ([]) returns a 400 error—each status filter must contain at least one value when provided.

Example request

curl -X POST "https://{host}/v1/exports/movement" \
  -H "Authorization: Bearer <jwt>" \
  -H "Content-Type: application/json" \
  -d '{
    "domainId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "dateRange": {
      "start": "2026-06-01T00:00:00Z",
      "end": "2026-06-15T23:59:59Z"
    },
    "includeChildDomains": false,
    "custodyStatus": ["Completed"],
    "ledgerStatus": ["Confirmed"],
    "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 transfer. Column order is a fixed contract. The report-level domainId and domainName come from your request. The per-transfer senderDomainId and recipientDomainId identify the domains of the counterparties.

#ColumnTypeNullableDescription
1domainIdstring (UUID)NoThe report-level domain from your request.
2domainNamestringNoThe report-level domain's display name.
3registeredAtstring (ISO 8601)NoWhen the service registered the transfer.
4transactionIdstring (UUID)NoThe transaction identifier. Repeated for all transfers in the same transaction.
5onLedgerTransactionIdstringYesThe on-chain transaction hash. Empty until the transaction is confirmed.
6transferIdstring (UUID)NoThe transfer identifier, unique per row.
7transferKindstringNoThe transfer type. One of Transfer, Fee, or Recovery.
8enrichedTransactionValuestring (decimal)NoThe human-readable decimal value, such as 1.5 XRP.
9rawTransactionValuestringNoThe raw ledger-native value, such as 1500000 drops. No decimal conversion.
10ledgerNamestringNoThe blockchain network name as configured by the operator, such as XRPL Testnet August 2024 or Ethereum Mainnet.
11tickerIdstring (UUID)NoThe asset identifier.
12tickerNamestringNoThe full asset name.
13tickerSymbolstringYesThe asset symbol. Empty if not set.
14quarantinedbooleanNoWhether this transfer is quarantined.
15custodyStatusstringNoThe custody processing status.
16ledgerStatusstringNoThe ledger confirmation status.
17ledgerTimestampstring (ISO 8601)YesWhen the service last updated the ledger status.
18blockTimestring (ISO 8601)YesThe on-chain block time. Empty until confirmation.
19senderAddressstringYesThe on-chain sender address.
20senderDomainIdstring (UUID)YesThe sender account's domain. Empty for external senders.
21senderMemoTagstringYesThe XRPL source tag. Empty for non-XRPL chains.
22senderInternalbooleanNotrue if the sender is within the platform.
23senderNamestringYesThe sender account's display name.
24senderIdstring (UUID)YesThe sender account identifier.
25senderAccountTypestringYesThe sender account type, currently vault or gas station. Empty for external senders; pipe-separated for multi-sender transfers.
26senderVaultTypestringYesThe sender vault's backing type passed through from the core system, such as MPC or HSM, or external if the sender is off-platform.
27senderVaultIdstring (UUID)YesThe sender vault identifier. Empty for external senders.
28senderVaultNamestringYesThe sender vault's display name. Empty for external senders.
29recipientAddressstringYesThe on-chain recipient address.
30recipientDomainIdstring (UUID)YesThe recipient account's domain. Empty for external recipients.
31recipientMemoTypestringYesThe memo type for Stellar transfers (Text, Id, Hash, Return). Empty for XRPL and Hedera.
32recipientMemoTagstringYesThe XRPL destination tag, Stellar memo value, or Hedera memo string.
33recipientInternalbooleanNotrue if the recipient is within the platform.
34recipientNamestringYesThe recipient account's display name. Empty for external recipients.
35recipientIdstring (UUID)YesThe recipient account identifier. Empty for external recipients.
36recipientAccountTypestringYesThe recipient account type, currently vault or gas station. Empty for external recipients.
37recipientVaultTypestringYesThe recipient vault's backing type passed through from the core system, such as MPC or HSM, or external if the recipient is off-platform.
38recipientVaultIdstring (UUID)YesThe recipient vault identifier. Empty for external recipients.
39recipientVaultNamestringYesThe recipient vault's display name. Empty for external recipients.

Value columns

The report includes both a converted and a raw value for each transfer:

  • enrichedTransactionValue is the human-readable decimal value in the asset's native unit, such as 1.5 XRP. Use this for reconciliation and reporting.
  • rawTransactionValue is the raw ledger-native value in the smallest denomination, such as 1500000 drops. The service doesn't convert it to decimal.

Both are strings. Always parse them as strings. See Financial precision.

Fee transfers

Network fees appear as their own rows with a transferKind of Fee. The report doesn't link a fee row to the transfer that incurred it — if your reconciliation needs fees attributed to specific transfers, match them downstream using the transactionId or onLedgerTransactionId columns.

Multi-sender transfers

When a transfer has multiple senders—for example, on UTXO-model chains—the service separates all sender-side fields with a pipe (|) within the cell, in a consistent order across every sender field. This lets you align the sender attributes positionally.

External counterparties

When a sender or recipient is off-platform, the service uses a consistent external convention: the counterparty's ...VaultType is external, its ...DomainId and ID fields are empty, and its ...Internal flag is false.

Control totals

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

FieldDescription
valueSumThe sum of all enrichedTransactionValue 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 Movement Report include:

  • 400: A required field is missing, a UUID or timestamp is malformed, dateRange.end is before start, the range exceeds 30 days, a status array is empty, 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 transfers.
  • 429: A duplicate request within 60 seconds while a previous export is still processing, or you already have 2 exports processing.

A single Movement Report can return at most 100,000 transfers. If your scope exceeds this, the service returns a 413 error after resolving your requested scope, before generating the file. Narrow the date range or add filters, then request again.

For the full list, see Error responses.


Next steps

PageDescription
Position ReportGenerate a point-in-time balance snapshot.
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.