ledger.read.v1.LedgerReadService
ListTransfers
List finalized transfer history for an account. Supports optional subaccount, asset, inclusive time-bound, ordering, and cursor filters.
Request
curl --request POST \ \
--url 'https://api.testnet.polyester.com/ledger.read.v1.LedgerReadService/ListTransfers' \
--header 'Content-Type: application/json' \
--header 'Connect-Protocol-Version: 1' \
--data '{
"ledger": 1,
"limit": 100,
"pageToken": "eyJvZmZzZXQiOjEwMH0",
"reversed": false,
"subaccountId": "6789012345678",
"transferCode": "DEPOSIT",
"tsMaxUs": "1",
"tsMinUs": "1"
}'Responses
{
"nextPageToken": "eyJvZmZzZXQiOjIwMH0",
"transfers": [
{
"accountCode": "FUNDING",
"amountE18": {
"hi": "1",
"lo": "1"
},
"assetId": 100,
"balanceAfterE18": {
"hi": "1",
"lo": "1"
},
"destination": {
"accountId": "7563897446546",
"address": "0x3333333333333333333333333333333333333333",
"chainId": 1,
"kind": "FUNDING_ACCOUNT"
},
"flowId": "flow_7YWHMfk9JZeLMgZauHuiSxhJ",
"isDebit": false,
"linkId": "1",
"source": {
"accountId": "7563897446546",
"address": "0x3333333333333333333333333333333333333333",
"chainId": 1,
"kind": "FUNDING_ACCOUNT"
},
"transferCode": "DEPOSIT",
"transferId": "9155001234569",
"tsUs": "1"
}
]
}ledger.read.v1.ListTransfersRequestledger.read.v1.ListTransfersResponseOptional public subaccount ID. When omitted, subaccount-scoped API keys use their bound subaccount; other callers use their authenticated root account.
Maximum number of transfer rows to return. Defaults to 100 when omitted; maximum is 1000.
Sort direction. When true, rows are returned newest first; when false, rows are returned oldest first.
Optional lower transfer timestamp bound in microseconds since epoch (UTC), inclusive.
Optional upper transfer timestamp bound in microseconds since epoch (UTC), inclusive.
Optional filter by transfer reason.
Optional filter by asset ledger.
Opaque keyset cursor from a previous response. The cursor is exclusive and bound to the authenticated account, sub-account scope, filters, timestamp bounds, and sort direction.
Public unified asset ID. Resolve its symbol through the spot configuration API. U128 amounts in this row always use a fixed 18-decimal ledger scale.
Most significant 64 bits.
Least significant 64 bits.
Product reason for this transfer.
Account bucket affected by this transfer.
Transfer timestamp in microseconds since epoch (UTC).
Most significant 64 bits.
Least significant 64 bits.
True when this row is the debit leg; false when it is the credit leg.
Correlation ID used to group related transfer legs. Zero when unavailable.
Public lifecycle flow ID when this transfer belongs to a chain lifecycle flow.
Display classification for this transfer side.
Public root account or subaccount ID when this side is safe to identify. Never populated for private counterparties or non-user ledger accounts.
Address for this side when known. For EXTERNAL_ADDRESS this is an external-chain wallet address from lifecycle correlation; for identifiable Polyester accounts this is a Polyester smart-account address. May be empty until the corresponding lifecycle details are available.
PolyChain-registered external network identifier for EXTERNAL_ADDRESS. This matches chain.zipper.v1.ChainConfig.chain_id and is not the chain's native identifier (for example, an EIP-155 id) or the Polyester chain id.
Display classification for this transfer side.
Public root account or subaccount ID when this side is safe to identify. Never populated for private counterparties or non-user ledger accounts.
Address for this side when known. For EXTERNAL_ADDRESS this is an external-chain wallet address from lifecycle correlation; for identifiable Polyester accounts this is a Polyester smart-account address. May be empty until the corresponding lifecycle details are available.
PolyChain-registered external network identifier for EXTERNAL_ADDRESS. This matches chain.zipper.v1.ChainConfig.chain_id and is not the chain's native identifier (for example, an EIP-155 id) or the Polyester chain id.
Stable transfer identifier, an unsigned 128-bit integer as a decimal string. Both legs of a transfer share it; with account_code and is_debit it identifies this row.
Opaque cursor for the next page. Empty when no more results exist.
| Key | HTTP status | Connect code | Error | When |
|---|---|---|---|---|
| api-key-action-deny | 403 | permission_denied | API Key Policy Denied | API key policy does not allow this read action. |
| api-key-policy-not-found | 403 | permission_denied | API Key Policy Not Found | API key policy was not found. |
| api-key-policy-required | 403 | permission_denied | API Key Policy Required | API key policy is required for ledger reads. |
| api-key-root-scope-only | 403 | permission_denied | API Key Root Scope Only | This API key is scoped to the root account and cannot read sub-accounts. |
| api-key-subaccount-mismatch | 403 | permission_denied | API Key Sub-account Mismatch | This API key is bound to a different sub-account. |
| api-key-unknown | 403 | permission_denied | API Key Unknown | The authenticated API key has no metadata entry in the API key store. |
| auth-authentication-required | 401 | unauthenticated | Authentication Required | Authentication is required. |
| auth-session-kind-not-allowed | 403 | permission_denied | Interactive Session Required | This read accepts only an interactive session; API keys are refused. |
| bad-request | 400 | invalid_argument | Bad Request | — |
| invalid-account-id | 400 | invalid_argument | Invalid Account ID | — |
| invalid-argument | 400 | invalid_argument | Bad Request | — |
| invalid-subaccount-id | 400 | invalid_argument | Invalid Sub-account ID | — |
| ip-not-allowed | 401 | unauthenticated | API Key IP Not Allowed | API key is not authorized from this IP address. |
| key-disabled | 401 | unauthenticated | API Key Disabled | API key is disabled. |
| key-expired | 401 | unauthenticated | API Key Expired | API key has expired. |
| missing-account-id | 400 | invalid_argument | Missing Account ID | — |
| missing-headers | 400 | invalid_argument | Missing API Key Headers | Missing required API key authentication headers. |
| missing-wallet | 400 | invalid_argument | Missing Wallet | — |
| not-found | 404 | not_found | Not Found | — |
| permission-denied | 403 | permission_denied | Permission Denied | — |
| role-action-deny | 403 | permission_denied | Role Denied | Your role does not allow this read action. |
| server-error | 500 | internal | Server Error | — |
| signature-invalid | 401 | unauthenticated | Invalid API Key Signature | API key signature is invalid. |
| subaccount-policy-deny | 403 | permission_denied | Sub-account Policy Denied | Sub-account policy does not allow this read action. |
| subaccount-read-forbidden | 403 | permission_denied | Sub-account Read Forbidden | You do not have permission to read this sub-account. |
| timestamp-skew | 400 | invalid_argument | API Key Timestamp Skew | API key timestamp is outside the allowed skew window. |
| unauthenticated | 401 | unauthenticated | Unauthenticated | Ledger reads require a valid bearer JWT or signed API-key request. |
| upstream-error | 502 | unavailable | Upstream Error | — |
| wallet-not-found | 404 | not_found | Wallet Not Found | — |
| wallet-resolution-unavailable | 502 | unavailable | Wallet Resolution Unavailable | — |