getApplicationConfig is session-authenticated (call it after a user logs in). The six reporting methods are public: they need no session or key, and each selects its application by clientId — the same public client ID your frontend logs in with. An unknown or inactive client ID returns 404, and so does the client ID of a builder the explorer hides: the reporting methods follow the same builder display rules as the explorer and the public analytics, and a hidden builder reads exactly like one that does not exist. A builder shown as part of a group is still reported as itself.
The reporting methods are rate limited per client IP: 60 requests per minute sustained, with a burst of 120. Over the limit the API returns 429 with a Retry-After header.
() => Promise<ApplicationConfigResponse>
Retrieve application configuration for the current client ID. Session-authenticated.Returns:
ApplicationConfigResponse:id: string — application UUIDname: string — application nameallowedOrigins: string[] — CORS-allowed originswebhookUrl?: string — webhook URL for event deliveryvaultContractAddress: string — vault contract address for this applicationclientId: string — application client ID, embedded in on-chain deposit calls
(params: ListAppOrdersParams) => Promise<ListAppOrdersResponse>
List orders placed by the application’s users. Public.Parameters:
params:ListAppOrdersParamsclientId: string — the application’s public client ID (required)pageSize?: number — items per page, 1 to 1000 (default 20); a larger value is rejectedpageToken?: string — cursor pagination. Omitted or""starts the walk; otherwise pass the previous response’snextPageToken. There is nopage: the SDK rejects one with aValidationErrorbefore sending, and a raw REST request carrying it gets400. The filters must match the request that minted the tokenstatus?: string — filter by order status (e.g.SUBMITTED,PARTIALLY_FILLED,FILLED,SETTLED,CANCELLED,EXPIRED,REJECTED)userId?: string — filter by user UUIDtradingPairId?: string — filter by trading pair UUIDside?: string — filter by side:BUYorSELLorderType?: string — filter by order type (e.g.LIMIT,MARKET,STOP_LOSS,TAKE_PROFIT,STOP_LIMIT,TRAILING_STOP)
ListAppOrdersResponse:orders:AppOrder[]— matching orderspageSize: number — items per pagenextPageToken: string — cursor for the next page,""once the walk is exhausted. Each page over-fetches one row, so an empty token is definitive: follow a non-empty token, stop on an empty one
503 instead of running long. Narrow the filters or retry later.(params: ListAppUsersParams) => Promise<ListAppUsersResponse>
List the application’s users. Public.Parameters:
params:ListAppUsersParamsclientId: string — the application’s public client ID (required)pageSize?: number — items per page, 1 to 1000 (default 20); a larger value is rejectedpageToken?: string — cursor pagination. Omitted or""starts the walk; otherwise pass the previous response’snextPageToken. There is nopage: the SDK rejects one with aValidationErrorbefore sending, and a raw REST request carrying it gets400. The filters must match the request that minted the tokenisActive?: boolean — filter by active statusaccountType?: string — filter by account type:masterorsubaddress?: string — filter by wallet address (partial match, case-insensitive)
ListAppUsersResponse:users:AppUser[]— matching userstotal: number — users matching the filter, bounded by the server count ceilingpageSize: number — items per pagetotalPages: number — pages at thispageSize, bounded by the same ceilingnextPageToken: string — cursor for the next page,""once the walk is exhausted. Each page over-fetches one row, so an empty token is definitive: follow a non-empty token, stop on an empty onetotalCapped: boolean —truewhen more than the server ceiling matched, sototal/totalPagesare a lower bound
created_at is nullable on this table, so it cannot be a total cursor key, and excluding the rows without one would hide users from the listing an application reconciles against.(params: ListAppMovementsParams) => Promise<ListAppMovementsResponse>
List ledger movements (deposits, withdrawals, trades, fees, etc.) for the application’s users. Public.Parameters:
params:ListAppMovementsParamsclientId: string — the application’s public client ID (required)pageSize?: number — items per page, 1 to 1000 (default 20); a larger value is rejectedpageToken?: string — cursor pagination. Omitted or""starts the walk; otherwise pass the previous response’snextPageToken. There is nopage: the SDK rejects one with aValidationErrorbefore sending, and a raw REST request carrying it gets400. The filters must match the request that minted the tokenuserId?: string — filter by user UUIDtransactionType?: string — filter by transaction type (e.g.DEPOSIT,WITHDRAWAL,TRADE,FEE,FUNDING,LIQUIDATION,INTEREST,REWARD)entryType?: string — filter by entry type (e.g.CREDIT,DEBIT,LOCK,UNLOCK,FEE)assetId?: string — filter by asset UUID
ListAppMovementsResponse:movements:AppMovement[]— matching movementspageSize: number — items per pagenextPageToken: string — cursor for the next page,""once the walk is exhausted. Each page over-fetches one row, so an empty token is definitive: follow a non-empty token, stop on an empty one
transactionType DEPOSIT or WITHDRAWAL, entryType CREDIT or DEBIT, referenceType margin_account_deposit or margin_account_withdrawal, and referenceId the margin account. They carry no balanceBefore, balanceAfter, lockedBefore or lockedAfter, and balanceId falls back to the margin account’s ID when it has no bound collateral balance. The filters and pageToken cover them. Margin funding from before v1.0.87 is not listed, and funding payments are not part of this listing.(params: ListAppBalancesParams) => Promise<ListAppBalancesResponse>
List user wallet balances held within the application. Public.Funds held in a margin account are not included, so a user funded through margin can show zero here. Read those users from
GET /api/v1/applications/margin-accounts with listApplicationMarginAccounts.Parameters:params:ListAppBalancesParamsclientId: string — the application’s public client ID (required)pageSize?: number — items per page, 1 to 1000 (default 20); a larger value is rejectedpageToken?: string — cursor pagination. Omitted or""starts the walk; otherwise pass the previous response’snextPageToken. There is nopage: the SDK rejects one with aValidationErrorbefore sending, and a raw REST request carrying it gets400. The filters must match the request that minted the tokenuserId?: string — filter by user UUIDassetId?: string — filter by asset UUID
ListAppBalancesResponse:balances:AppBalance[]— matching balances.lastSyncAt,lastSyncBlockandonChainBalanceare deprecated: they are not kept up to date and must not be used, and they are not a sync or health signaltotal: number — balances matching the filter, bounded by the server count ceilingpageSize: number — items per pagetotalPages: number — pages at thispageSize, bounded by the same ceilingnextPageToken: string — cursor for the next page,""once the walk is exhausted. Each page over-fetches one row, so an empty token is definitive: follow a non-empty token, stop on an empty onetotalCapped: boolean —truewhen more than the server ceiling matched, sototal/totalPagesare a lower bound
updatedAt, which the removed page-number mode sorted on: that column changes on every balance movement, so a walk over it could repeat or skip rows with no concurrent insert at all.(params: ListAppMarginAccountsParams) => Promise<ListAppMarginAccountsResponse>
List the application’s margin accounts, one row per margin account with sub-accounts beside their parent. Public.Margin collateral is not a wallet balance, so an application that funds its users through margin reads it here, not from
listApplicationBalances.Parameters:params:ListAppMarginAccountsParamsclientId: string — the application’s public client ID (required)address?: string — keep only this wallet’s margin accounts. A wallet with no margin account in the application returns an empty pagepageSize?: number — items per page, 1 to 1000 (default 20); a larger value is rejectedpageToken?: string — cursor pagination. Omitted or""starts the walk; otherwise pass the previous response’snextPageToken. The filters must match the request that minted the token
ListAppMarginAccountsResponse:marginAccounts:AppMarginAccount[]—marginAccountId,userId,address,subaccountKey(defaultis the parent),marginAccountState(ACTIVEorCLOSED),collateral,equity,freeCollateral,withdrawableCollateral,updatedAttotal: number — margin accounts matching the filter, bounded by the server count ceilingpageSize: number — items per pagetotalPages: number — pages at thispageSize, bounded by the same ceilingnextPageToken: string — cursor for the next page,""once the walk is exhaustedtotalCapped: boolean —truewhen more than the server ceiling matched, sototal/totalPagesare a lower bound
(params: GetAppStatsParams) => Promise<GetAppStatsResponse>
Fetch aggregate volume and fee metrics for an application. Public.Stats are scoped to trades where this application’s users were the taker.Parameters:
params:GetAppStatsParamsclientId: string — the application’s public client ID (required)since?: string — ISO 8601 datetime, e.g."2026-01-01T00:00:00Z". Omit for all-time
503. All-time stats for a large application can hit it; pass since to narrow the window.Returns: GetAppStatsResponse:volume: string — total quote volume (normalized, human-readable)makerFee: string — total maker fees collectedtakerFee: string — total taker fees collectedapplicationTakerFee: string — builder fees your application charged its users as takers (taker side only)tradeCount: number — total number of tradesapplicationMakerFee?: string — maker add-ons your application charged its users as makersbuilderFeeTotal?: string — your total builder-fee revenue:applicationTakerFeeplusapplicationMakerFee

