Get earnings
Gets one customer wallet's live balance and earnings per deposit token.
GET/
earned is live value plus observed withdrawal payouts (totalWithdrawn) minus finalized deposits (totalDeposited), and appears only when it is exact. Otherwise it is left out with an earnedUnavailableReason, such as a live value that is unavailable, movements that are still settling, or a withdrawal payout SDP did not observe; never show it as zero. A wallet with no positions returns positionCount: 0 and an empty totalsByToken, not 404. Totals cover the positions the wallet holds now: a fully withdrawn position drops out here but stays in the movements list. Live value reads the wallet's whole balance in the strategy, so shares acquired outside SDP raise it.
Requires an API key with the earn.read action.
Query parameters
-
ownerAddress·string· required · min length 32 · max length 44 · pattern^[1-9A-HJ-NP-Za-km-z]{32,44}$· example9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWMThe customer's wallet address: an external wallet, so SDP holds no key for it. It signs, owns the shares, and pays the network fee unless the build names a
feePayer. It must decode to a 32-byte public key; a base58 string that matches the pattern but does not decode returns 400.
Headers
-
x-project-id·string· min length 1 · exampleprj_exampleRequired for dashboard sessions. API keys use their assigned project.
Responses
-
200Earnings per deposit token-
data·object· required-
earnings·object· required-
ownerAddress·string· required · example9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWMThe customer's wallet address.
-
positionCount·integer· required · min 0 -
unavailablePositionCount·integer· required · min 0 -
totalsByToken·object[]· required-
tokenMint·string· required · example4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU -
positionCount·integer· required · min 0 -
unavailablePositionCount·integer· required · min 0Positions whose live value could not be read.
-
currentValue·string· max length 128 · pattern^\d+(\.\d+)?$· example25.42Live value across the token's positions, including any par intermediate they hold. Absent when any contributing position is unavailable, so partial money is never presented as complete.
-
totalDeposited·string· required · max length 128 · pattern^\d+(\.\d+)?$· example25.42Sum of observed finalized SDP deposits. Excludes unobserved receipts (see
deposits_not_valued). -
totalWithdrawn·string· required · max length 128 · pattern^\d+(\.\d+)?$· example25.42Sum of the observed payouts of finalized withdrawals. Always present. Excludes withdrawals whose payout SDP did not observe (see
withdrawals_not_valued). -
earned·string· max length 129 · pattern^-?\d+(\.\d+)?$· example5.2currentValue + totalWithdrawn - totalDeposited, present only when exact and never zero-filled. The live value reads the wallet's whole balance in the strategy, so shares acquired outside SDP raise this figure. -
earnedUnavailableReason·string· one oflive_value_unavailable,movements_pending,withdrawals_pending,deposits_not_valued,withdrawals_not_valuedWhy
earnedis absent:live_value_unavailable(a live value could not be read),movements_pending(a movement is still settling),withdrawals_pending(a held position has an open withdrawal request, whose shares leave the wallet before its payout, which can take days), ordeposits_not_valuedandwithdrawals_not_valued(SDP did not observe a finalized deposit or withdrawal, sototalDepositedortotalWithdrawnis incomplete).
-
-
-
-
meta·object· requiredResponse metadata.
-
requestId·string· required · min length 1 · examplereq_exampleRequest identifier for tracing.
-
timestamp·string· required · formatdate-time· example2025-01-01T00:00:00.000ZISO 8601 timestamp.
-
-
-
400Bad Request-
error·object· requiredStandard error payload.
-
code·string· requiredMachine-readable error code.
-
message·string· requiredHuman-readable error message.
-
details·objectOptional error details for debugging.
*·any
-
-
meta·object-
requestId·string· min length 1 · examplereq_exampleRequest identifier for tracing.
-
-
-
401UnauthorizedSame fields as
400. -
403Forbidden. Requires theearn.readaction: an API key must hold it (a module'smanageorexecutealso covers itsread), and a signed-in member's organization role must include it. Without it the error is INSUFFICIENT_PERMISSIONS anderror.details.actionnames the action. Any other 403 names its own reason.Same fields as
400. -
429Too Many RequestsSame fields as
400. -
500Internal Server ErrorSame fields as
400. -
503Service UnavailableSame fields as
400.