Skip to content

Get Balance Updates

Retrieve historical deposit, withdrawal, and transfer transactions for a subaccount. This endpoint returns balance changes from on-chain deposits, withdrawals, and internal transfers, excluding funding payments.

Endpoint

POST https://papi.synthetix.io/v1/trade

Request

Request Format

{
  "params": {
    "action": "getBalanceUpdates",
    "subAccountId": "1867542890123456789",
    "actionFilter": "DEPOSIT",
    "limit": 50,
    "offset": 0,
    "startTime": 1704067200000,
    "endTime": 1704153600000
  },
  "expiresAfter": 1704153600,
  "signature": {
    "v": 28,
    "r": "0x19480589384695193600abcdef19480589384695193600abcdef19480589384695193600abcdef19480589384695193600abcdef",
    "s": "0xabcdef19480589384695193600abcdef19480589384695193600abcdef19480589384695193600abcdef19480589384695193600"
  }
}

Request Parameters

ParameterTypeRequiredDescription
paramsobjectYesRequest parameters wrapper
params.actionstringYesMust be "getBalanceUpdates"
params.subAccountIdstringYesSubAccount ID to retrieve balance updates for
params.actionFilterstringNoFilter by action type: "DEPOSIT", "WITHDRAWAL", "TRANSFER", or comma-separated (e.g. "DEPOSIT,WITHDRAWAL"). Defaults to all types
params.limitintegerNoMaximum number of results to return (default: 50, max: 1000)
params.offsetintegerNoPagination offset (default: 0, max: 10000)
params.startTimeintegerNoStart of time range as Unix timestamp in milliseconds. Defaults to 7 days before endTime (or 7 days ago if neither is set)
params.endTimeintegerNoEnd of time range as Unix timestamp in milliseconds. Defaults to 7 days after startTime (or now if neither is set). Maximum range is 365 days
ParameterTypeRequiredDescription
nonceuint64Yes*Positive integer nonce (must be incrementing and unique per request)
signatureobjectYesEIP-712 signature object
expiresAfteruint64NoUnix milliseconds expiration timestamp (5x rate limit on stale cancels)

:::info Common Parameters These are top-level request parameters. The subAccountId parameter is specified within the params object (see each endpoint's parameter table). :::

:::info SubAccountAction Endpoints Endpoints using SubAccountAction signing (getPositions, getOpenOrders, getOrderHistory, getTrades, getFundingPayments, getSubAccount, getSubAccounts, getDelegatedSigners, getBalanceUpdates, getWithdrawableAmounts) do not require the nonce parameter. Only signature and optional expiresAfter are needed. :::

Response

Response Structure

FieldTypeDescription
statusstringAlways "ok" for successful requests or "error" for failures
responseobjectResponse object containing balance updates (omitted when status is "error")
errorobjectError details (only present when status is "error")
request_idstringRequest tracking identifier

Success Response

{
  "status": "ok",
  "response": {
    "balanceUpdates": [
      {
        "id": "12345",
        "subAccountId": "1867542890123456789",
        "action": "DEPOSIT",
        "status": "success",
        "amount": "1000.00",
        "fee": "0.00",
        "grossAmount": "1000.00",
        "collateral": "USDT",
        "timestamp": 1704067200000
      },
      {
        "id": "12346",
        "subAccountId": "1867542890123456789",
        "action": "WITHDRAWAL",
        "status": "success",
        "amount": "-500.00",
        "fee": "5.00",
        "grossAmount": "-495.00",
        "collateral": "USDT",
        "timestamp": 1704153600000,
        "destinationAddress": "0xabcdef1234567890abcdef1234567890abcdef12",
        "txHash": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890"
      }
    ]
  },
  "request_id": "5ccf215d37e3ae6d"
}

Empty Result

{
  "status": "ok",
  "response": {
    "balanceUpdates": []
  },
  "request_id": "5ccf215d37e3ae6f"
}

Balance Update Object

FieldTypeDescription
idstringUnique transaction ID (string for JS BigInt compatibility)
subAccountIdstringSubaccount ID associated with the transaction (string for JS BigInt compatibility)
actionstringAction type: "DEPOSIT", "WITHDRAWAL", or "TRANSFER"
statusstringTransaction status: "pending", "success", or "failed"
amountstringNet amount changed (positive for deposits, negative for withdrawals)
feestringFee charged for the transaction
grossAmountstringTotal amount including fee (amount + fee)
collateralstringCollateral symbol (e.g., "USDT", "WETH")
timestampintegerUnix timestamp in milliseconds when the transaction was created
destinationAddressstringDestination address for withdrawals (optional, only for withdrawals)
txHashstringOn-chain transaction hash (optional)
fromSubAccountIdstringSource subaccount ID for internal transfers (optional, string for JS BigInt compatibility)
toSubAccountIdstringTarget subaccount ID for internal transfers (optional, string for JS BigInt compatibility)

Error Response

{
  "status": "error",
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "limit cannot exceed 1000"
  },
  "request_id": "5ccf215d37e3ae6d"
}

Usage Examples

Get All Balance Updates

{
  "params": {
    "action": "getBalanceUpdates",
    "subAccountId": "1867542890123456789"
  },
  "expiresAfter": 1704153600,
  "signature": { "v": 28, "r": "0x...", "s": "0x..." }
}

Get Deposits Only

{
  "params": {
    "action": "getBalanceUpdates",
    "subAccountId": "1867542890123456789",
    "actionFilter": "DEPOSIT"
  },
  "expiresAfter": 1704153600,
  "signature": { "v": 28, "r": "0x...", "s": "0x..." }
}

Get Withdrawals Only

{
  "params": {
    "action": "getBalanceUpdates",
    "subAccountId": "1867542890123456789",
    "actionFilter": "WITHDRAWAL"
  },
  "expiresAfter": 1704153600,
  "signature": { "v": 28, "r": "0x...", "s": "0x..." }
}

Paginated Request

{
  "params": {
    "action": "getBalanceUpdates",
    "subAccountId": "1867542890123456789",
    "limit": 100,
    "offset": 100
  },
  "expiresAfter": 1704153600,
  "signature": { "v": 28, "r": "0x...", "s": "0x..." }
}

EIP-712 Signature

const domain = {
  name: "Synthetix",
  version: "1",
  chainId: 1,
  verifyingContract: "0x0000000000000000000000000000000000000000",
};
 
const types = {
  SubAccountAction: [
    { name: "subAccountId", type: "uint256" },
    { name: "action", type: "string" },
    { name: "expiresAfter", type: "uint256" },
  ],
};
 
const message = {
  subAccountId: "1867542890123456789",
  action: "getBalanceUpdates",
  expiresAfter: 0,
};
 
const signature = await signer._signTypedData(domain, types, message);

Implementation Notes

  • Returns deposit, withdrawal, and internal transfer transactions (excludes funding payments)
  • Results are ordered by timestamp (most recent first)
  • Default limit is 50 results per request, maximum is 1000
  • Pagination offset maximum is 10,000
  • Use pagination with limit and offset for large result sets
  • When startTime and endTime are both omitted, the default time window is the last 7 days
  • When only one time bound is supplied, the other is automatically extended by 7 days (end time is capped at now)
  • Maximum allowed time range is 365 days; requests spanning a longer period are rejected
  • For funding payment history, use Get Funding Payments
  • Authentication requires signature by account owner or authorized delegate

Signing

All trading methods are signed using EIP-712. Each successful trading request will contain:

  • A piece of structured data that includes the sender address
  • A signature of the hash of that structured data, signed by the sender

For detailed information on EIP-712 signing, see EIP-712 Signing.

Nonce Management

The nonce system prevents replay attacks and ensures order uniqueness:

  • Use any positive integer as nonce
  • Each nonce must be greater than the previous one (incrementing)
  • Date.now() is a convenient option, not a requirement
  • If nonce conflicts occur, increment by 1 and retry

:::note SubAccountAction Exception SubAccountAction endpoints (getPositions, getOpenOrders, getOrderHistory, getTrades, getFundingPayments, getSubAccount, getSubAccounts, getDelegatedSigners, getBalanceUpdates, getWithdrawableAmounts) do not require a nonce. Only the signature and optional expiresAfter parameters are needed. :::

Error Handling

Common error scenarios:

Error CodeDescriptionRetryable
UNAUTHORIZEDEIP-712 signature validation failedNo
VALIDATION_ERRORRequest validation failedNo
MISSING_REQUIRED_FIELDRequired field is missingNo
INVALID_FORMATField format is invalidNo
INVALID_VALUEInvalid parameter valueNo
RATE_LIMIT_EXCEEDEDToo many requests in time windowYes
INSUFFICIENT_MARGINNot enough margin for tradeNo
ORDER_NOT_FOUNDOrder does not existNo
OPERATION_TIMEOUTOperation timed outYes
Error CodeMessageDescription
VALIDATION_ERRORsubAccountId is requiredNo subaccount ID was provided
VALIDATION_ERRORlimit cannot exceed 1000Limit parameter exceeds maximum
VALIDATION_ERRORlimit must be non-negativeNegative limit value provided
VALIDATION_ERRORoffset must be non-negativeNegative offset value provided
VALIDATION_ERRORoffset cannot exceed 10000Offset exceeds maximum of 10000
VALIDATION_ERRORinvalid action filter, available filters: DEPOSIT, WITHDRAWAL, TRANSFERInvalid action filter value
INTERNAL_ERRORFailed to retrieve balance updatesServer error retrieving data

Related Endpoints