---
title: "List one external wallet's positions"
method: GET
path: "/v1/earn/external-wallet/positions"
tags: ["Earn"]
---

# List one external wallet's positions

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

Returns one strict keyset page of live positions for an end-user wallet in the active partner project. `ownerAddress` is required — the same query addressing every per-owner read on this surface uses. A wallet outside the project's scope answers 404. Live fields are absent when provider hydration is unavailable, never replaced with zero.

## Query parameters

- `ownerAddress` string, required
- `limit` integer
- `before` string

## 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 position page

- object — Standard success response envelope.
  - `data` 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.
    - `positions` object[], required
      - `id` string, 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.
      - `provider` string, required
      - `providerReference` string, required — The vault's on-chain address.
      - `label` string, required
      - `tokenMint` string, required
      - `shareMint` string, required
      - `createdAt` string, date-time, required — ISO 8601 timestamp.
      - `closedAt` string, date-time, nullable, required — ISO 8601 timestamp.
      - `shares` string — Live share balance. Absent when hydration is unavailable; never coerced to zero.
      - `withdrawableShares` string — Live immediately redeemable shares. Absent when hydration is unavailable.
      - `tokenValue` string — Live deposit-token value. Absent when hydration is unavailable.
    - `hasMore` boolean, required
    - `nextCursor` string, nullable, required
  - `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/positions/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)
