> ## Documentation Index
> Fetch the complete documentation index at: https://docs.exponent.finance/llms.txt
> Use this file to discover all available pages before exploring further.

# Strategy position APY history

> Retrieve enriched position-level APYs for an exact snapshot or a page of snapshot history.

export const ApiResponse = ({children, errors = {}}) => {
  const [status, setStatus] = useState("200");
  const statuses = ["200", ...Object.keys(errors)];
  return <section className="api-response" aria-label="Response">
      <div className="api-response-header not-prose">
        <h2>Response</h2>
        <div className="api-response-format">
          {statuses.length > 1 ? <select aria-label="Response status" value={status} onChange={event => setStatus(event.target.value)}>
              {statuses.map(code => <option key={code} value={code}>{code}</option>)}
            </select> : <span>200</span>}
          <span className="api-response-mime">application/json</span>
        </div>
      </div>
      <div hidden={status !== "200"}>{children}</div>
      {status !== "200" && <div aria-live="polite">
          {Object.entries(errors[status]).map(([name, value]) => <ResponseField key={name} name={name} type={value === null ? "null" : Array.isArray(value) ? "array" : typeof value}>
              {name === "error" ? "Error message describing why the request failed." : "Additional error details."}
            </ResponseField>)}
        </div>}
    </section>;
};

## Path parameters

<ParamField path="address" type="string" required>
  Solana account address.
</ParamField>

## Query parameters

<ParamField query="snapshotId" type="number">
  Positive integer snapshot ID. When supplied, selects that snapshot and bypasses history pagination.
</ParamField>

<ParamField query="before" type="string">
  Timestamp cursor, exclusive. Use `nextCursor` from the previous response.
</ParamField>

<ParamField query="limit" type="number">
  Number of complete snapshots, from `1` to `168`. Default: `24`.
</ParamField>

<RequestExample dropdown>
  ```bash cURL theme={null}
  curl https://api.exponent.finance/strategies/managed/puiRBGikahXM4C7weFtNRFcs7bSUx8wVn1m5v6RA91o/position-apys
  ```

  ```python Python theme={null}
  import requests

  response = requests.get("https://api.exponent.finance/strategies/managed/puiRBGikahXM4C7weFtNRFcs7bSUx8wVn1m5v6RA91o/position-apys", timeout=30)
  response.raise_for_status()
  print(response.json())
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch("https://api.exponent.finance/strategies/managed/puiRBGikahXM4C7weFtNRFcs7bSUx8wVn1m5v6RA91o/position-apys");
  if (!response.ok) {
    throw new Error(`Request failed: ${response.status}`);
  }
  const data = await response.json();
  console.log(data);
  ```
</RequestExample>

<ApiResponse errors={{"400": {"error": "<message>"}, "500": {"error": "<message>"}}}>
  <ResponseField name="vaultAddress" type="string">
    Managed strategy vault whose history was requested.
  </ResponseField>

  <ResponseField name="snapshotId" type="number | null">
    Newest snapshot ID, shared with the corresponding strategy APY chart point.
  </ResponseField>

  <ResponseField name="capturedAt" type="string | null">
    ISO 8601 capture timestamp of the newest returned snapshot.
  </ResponseField>

  <ResponseField name="parentAum" type="string">
    Raw quote-token AUM, present only when all child positions match the exact parent snapshot and timestamp.
  </ResponseField>

  <ResponseField name="fees" type="object | null">
    Fee settings recorded at the snapshot.

    <Expandable title="child attributes">
      <ResponseField name="managementFee" type="number | null">
        Annual management fee as a decimal; `0.02` means 2%.
      </ResponseField>

      <ResponseField name="managementFeeBps" type="string | null">
        Exact on-chain `management_fee_bps` value; use `managementFee` for the normalized annual rate.
      </ResponseField>

      <ResponseField name="withdrawalFeeBps" type="number | null">
        Queued-withdrawal fee in basis points.
      </ResponseField>

      <ResponseField name="instantWithdrawalFeeBps" type="number | null">
        Additional instant-withdrawal fee in basis points.
      </ResponseField>
    </Expandable>
  </ResponseField>

  <ResponseField name="positions" type="object[]">
    Positions belonging to the newest returned snapshot.

    <Expandable title="child attributes">
      <ResponseField name="id" type="number">
        Indexed position-snapshot record ID.
      </ResponseField>

      <ResponseField name="positionType" type="string | null">
        Position category, such as `reserves`, `tokenAccount`, or `kaminoObligation`.
      </ResponseField>

      <ResponseField name="assetMint" type="string">
        Mint identifying the position’s primary asset.
      </ResponseField>

      <ResponseField name="aum" type="string">
        Position value in raw quote-token units, preserved as a decimal string.
      </ResponseField>

      <ResponseField name="positionApy" type="number | null">
        Complete net position APY as a decimal; `null` when a required historical component is unavailable.
      </ResponseField>

      <ResponseField name="componentApy" type="number | null">
        APY subtotal represented by the available `apyComponents`.
      </ResponseField>

      <ResponseField name="positionApyStatus" type="string">
        Coverage status: `complete`, `excludesPrincipalToken`, or `excludesClmmFees`.
      </ResponseField>

      <ResponseField name="underlyingExposures" type="object[]">
        Underlying legs with asset mint, AUM, protocol, side, source address, and optional position address.
      </ResponseField>

      <ResponseField name="loopscaleActiveLendingExposure" type="object | null">
        Active lending strategy, principal mint, available raw principal, and loan buckets grouped by collateral and term.
      </ResponseField>

      <ResponseField name="apyComponents" type="object[]">
        Separate yield and incentive legs used to calculate `componentApy`.

        <Expandable title="child attributes">
          <ResponseField name="protocol" type="string">
            Protocol or intrinsic-yield source contributing this rate.
          </ResponseField>

          <ResponseField name="side" type="string">
            Exposure side: `supply`, `borrow`, `liquidity`, `senior`, or `junior`.
          </ResponseField>

          <ResponseField name="assetMint" type="string">
            Mint of the asset earning or paying this rate.
          </ResponseField>

          <ResponseField name="sourceAddress" type="string">
            Account from which the rate was resolved.
          </ResponseField>

          <ResponseField name="apy" type="number">
            Signed annualized coefficient applied to this component’s AUM; not an independently compounded APY.
          </ResponseField>

          <ResponseField name="aum" type="string">
            Signed base-denominated value used to weight the component rate.
          </ResponseField>

          <ResponseField name="ratePeriod" type="string">
            Rate lookback or basis, such as `current`, `contract`, `trailing7d`, or `costBasis`.
          </ResponseField>

          <ResponseField name="rateType" type="string">
            `base` for underlying yield or `incentive` for reward yield.
          </ResponseField>

          <ResponseField name="rewardMint" type="string">
            Reward token mint; present only for incentive components.
          </ResponseField>
        </Expandable>
      </ResponseField>
    </Expandable>
  </ResponseField>

  <ResponseField name="hasPositionApyData" type="boolean">
    Whether the snapshot contains real position APY data; false for legacy snapshots without it.
  </ResponseField>

  <ResponseField name="quotePriceUsd" type="number | null">
    Historical USD price of one quote token at `capturedAt`; null when no snapshot is available.
  </ResponseField>

  <ResponseField name="snapshots" type="object[]">
    Complete snapshot batches ordered newest first. Each contains `snapshotId`, `capturedAt`, optional `parentAum`, `fees`, `positions`, and `hasPositionApyData` using the field definitions above.
  </ResponseField>

  <ResponseField name="nextCursor" type="string | null">
    Pass as `before` to fetch the next history page. Null when history is exhausted.
  </ResponseField>
</ApiResponse>

<ResponseExample>
  ```json 200 theme={null}
  {
    "vaultAddress": "puiRBGikahXM4C7weFtNRFcs7bSUx8wVn1m5v6RA91o",
    "snapshotId": 230892,
    "capturedAt": "2026-10-14T15:32:23+00:00",
    "fees": {
      "managementFee": 0.001,
      "managementFeeBps": "1000",
      "withdrawalFeeBps": 0,
      "instantWithdrawalFeeBps": 50
    },
    "positions": [
      {
        "id": 722248,
        "positionType": "reserves",
        "assetMint": "rkubjTrZYioRSeXwDnhwGQzvW3qkcin72JSxUt3WMVp",
        "aum": "23482767239437",
        "underlyingExposures": [],
        "loopscaleActiveLendingExposure": null,
        "positionApy": 0.04820683434682648,
        "componentApy": 0.04820683434682648,
        "positionApyStatus": "complete",
        "apyComponents": [
          {
            "protocol": "standardYield",
            "side": "supply",
            "assetMint": "rkubjTrZYioRSeXwDnhwGQzvW3qkcin72JSxUt3WMVp",
            "sourceAddress": "84nsuBADtkK8jwBrPFMiVVDm7PxN7Ytducf1Um7vxkYS",
            "apy": 0.04820683434682649,
            "aum": "23482767239437",
            "ratePeriod": "trailing1Epoch",
            "rateType": "base"
          }
        ]
      },
      {
        "id": 722249,
        "positionType": "tokenAccount",
        "assetMint": "So11111111111111111111111111111111111111112",
        "aum": "2",
        "underlyingExposures": [],
        "loopscaleActiveLendingExposure": null,
        "positionApy": 0,
        "componentApy": 0,
        "positionApyStatus": "complete",
        "apyComponents": []
      }
    ],
    "hasPositionApyData": true,
    "quotePriceUsd": 104.53939838398755,
    "snapshots": [
      {
        "snapshotId": 230892,
        "capturedAt": "2026-10-14T15:32:23+00:00",
        "fees": {
          "managementFee": 0.001,
          "managementFeeBps": "1000",
          "withdrawalFeeBps": 0,
          "instantWithdrawalFeeBps": 50
        },
        "positions": [
          {
            "id": 722248,
            "positionType": "reserves",
            "assetMint": "rkubjTrZYioRSeXwDnhwGQzvW3qkcin72JSxUt3WMVp",
            "aum": "23482767239437",
            "underlyingExposures": [],
            "loopscaleActiveLendingExposure": null,
            "positionApy": 0.04820683434682648,
            "componentApy": 0.04820683434682648,
            "positionApyStatus": "complete",
            "apyComponents": [
              {
                "protocol": "standardYield",
                "side": "supply",
                "assetMint": "rkubjTrZYioRSeXwDnhwGQzvW3qkcin72JSxUt3WMVp",
                "sourceAddress": "84nsuBADtkK8jwBrPFMiVVDm7PxN7Ytducf1Um7vxkYS",
                "apy": 0.04820683434682649,
                "aum": "23482767239437",
                "ratePeriod": "trailing1Epoch",
                "rateType": "base"
              }
            ]
          },
          {
            "id": 722249,
            "positionType": "tokenAccount",
            "assetMint": "So11111111111111111111111111111111111111112",
            "aum": "2",
            "underlyingExposures": [],
            "loopscaleActiveLendingExposure": null,
            "positionApy": 0,
            "componentApy": 0,
            "positionApyStatus": "complete",
            "apyComponents": []
          }
        ],
        "hasPositionApyData": true
      },
      {
        "snapshotId": 230832,
        "capturedAt": "2026-10-14T14:32:38+00:00",
        "fees": {
          "managementFee": 0.001,
          "managementFeeBps": "1000",
          "withdrawalFeeBps": 0,
          "instantWithdrawalFeeBps": 50
        },
        "positions": [
          {
            "id": 722019,
            "positionType": "reserves",
            "assetMint": "rkubjTrZYioRSeXwDnhwGQzvW3qkcin72JSxUt3WMVp",
            "aum": "23482767239437",
            "underlyingExposures": [],
            "loopscaleActiveLendingExposure": null,
            "positionApy": 0.04820683434682648,
            "componentApy": 0.04820683434682648,
            "positionApyStatus": "complete",
            "apyComponents": [
              {
                "protocol": "standardYield",
                "side": "supply",
                "assetMint": "rkubjTrZYioRSeXwDnhwGQzvW3qkcin72JSxUt3WMVp",
                "sourceAddress": "84nsuBADtkK8jwBrPFMiVVDm7PxN7Ytducf1Um7vxkYS",
                "apy": 0.04820683434682649,
                "aum": "23482767239437",
                "ratePeriod": "trailing1Epoch",
                "rateType": "base"
              }
            ]
          },
          {
            "id": 722020,
            "positionType": "tokenAccount",
            "assetMint": "So11111111111111111111111111111111111111112",
            "aum": "2",
            "underlyingExposures": [],
            "loopscaleActiveLendingExposure": null,
            "positionApy": 0,
            "componentApy": 0,
            "positionApyStatus": "complete",
            "apyComponents": []
          }
        ],
        "hasPositionApyData": true
      }
    ],
    "nextCursor": "2026-10-13T15:32:43+00:00"
  }
  ```

  ```json 400 theme={null}
  {
    "error": "<message>"
  }
  ```

  ```json 500 theme={null}
  {
    "error": "<message>"
  }
  ```
</ResponseExample>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.