---
title: "Get one external wallet's balance and earnings"
method: GET
path: "/v1/earn/external-wallet/earnings"
tags: ["Earn"]
---

# Get one external wallet's balance and earnings

`GET /v1/earn/external-wallet/earnings`

Returns live balance and total earned per deposit token for the required `ownerAddress`: `earned` is live value minus finalized SDP deposits, stated only when exact. When it cannot be stated — live value unavailable, movements still settling, or a finalized withdrawal on a held position — the figure is absent with a named reason, never zero. Figures cover currently held positions: a fully exited position's history drops out (it stays on the movements list). Live value reads the owner's whole vault balance, so shares acquired outside SDP inflate it.

## Query parameters

- `ownerAddress` string, required

## Headers

- `x-project-id` string — Selects the active project for this request. Required for session/dashboard callers. Ignored when authenticating with an API key, whose scope is fixed to the key's project.

## Response `200`

External-wallet earnings

- object — Standard success response envelope.
  - `data` object, required
    - `earnings` object, required
      - `ownerAddress` string, required — The external wallet: the customer's own Solana address. It signs and owns the shares; SDP holds no key for it. It also pays the network fee unless the build names a `feePayer`. The pattern is necessary but not sufficient — the string must additionally decode to a 32-byte public key, which no pattern can express, so a well-shaped base58 string that does not decode still answers 400.
      - `positionCount` integer, required
      - `unavailablePositionCount` integer, required
      - `totalsByToken` object[], required
        - `tokenMint` string, required
        - `positionCount` integer, required
        - `unavailablePositionCount` integer, required — Positions whose live value could not hydrate.
        - `currentValue` string — Live value across the token's positions. Absent when any contributing position is unavailable, so partial money is never presented as complete.
        - `totalDeposited` string, required — Sum of finalized SDP deposits — a ledger fact, always present.
        - `earned` string — `currentValue − totalDeposited`, stated only when exact and never coerced to zero. Live hydration reads the owner's whole vault balance, so shares acquired outside SDP inflate this figure — a documented property of non-custodial reads.
        - `earnedUnavailableReason` 'live_value_unavailable' | 'movements_pending' | 'withdrawals_not_valued' — Why `earned` is absent: live value failed to hydrate; a movement is still settling; or a currently held position has a finalized withdrawal (the ledger records exits in shares, so no exact token-denominated earned figure exists once money has gone out).
  - `meta` object, required — Response metadata.
    - `requestId` string, required — Request identifier for tracing.
    - `timestamp` string, date-time, required — ISO 8601 timestamp.

## Other responses

- `400` — Error
- `401` — Error
- `403` — Error
- `404` — Error
- `429` — Error
- `500` — Error
- `503` — Error

## Changes

- **2026-09-04** `787deeb0b4aa` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/solana/apis/solana-developer-platform-api/changes/v1/earn/external-wallet/earnings/get.md)

---

[API](https://skmtc.dev/solana/apis/solana-developer-platform-api.md) · [All operations](https://skmtc.dev/solana/apis/solana-developer-platform-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/solana/solana-developer-platform-api/revisions/787deeb0b4aa/schema)
