> ## 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.

# Wallet earned and claimable rewards

> Retrieve earned, claimed, and claimable emissions for a wallet.

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="userAddress" type="string" required>
  User wallet address.
</ParamField>

## Query parameters

<ParamField query="marketId" type="string">
  Filter by reward campaign ID.
</ParamField>

<RequestExample dropdown>
  ```bash cURL theme={null}
  curl https://api.exponent.finance/orderbook-emissions/claimable/HRt73vbP87cUmzJJAH5tWyCuwyN9Syws2RxqND9pTMs4
  ```

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

  response = requests.get("https://api.exponent.finance/orderbook-emissions/claimable/HRt73vbP87cUmzJJAH5tWyCuwyN9Syws2RxqND9pTMs4", timeout=30)
  response.raise_for_status()
  print(response.json())
  ```

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

<ApiResponse errors={{"500": {"error": "<message>"}}}>
  <ResponseField name="balances" type="object[]">
    Earned, claimed, and currently claimable rewards by campaign and token.

    <Expandable title="child attributes">
      <ResponseField name="balances[].sources" type="object[] | null">
        Breakdown of reward accrual and claims by eligible source. Omitted when unavailable.

        <Expandable title="child attributes">
          <ResponseField name="balances[].sources[].sourceType" type="'direct' | 'loopscale' | 'farm' | 'liquidity'">
            Kind of position or account that earned these rewards.
          </ResponseField>

          <ResponseField name="balances[].sources[].sourceAddress" type="string">
            Address identifying the eligible reward source.
          </ResponseField>

          <ResponseField name="balances[].sources[].earnedRaw" type="string">
            Reward amount earned by this source, in raw reward-token units.
          </ResponseField>

          <ResponseField name="balances[].sources[].claimedRaw" type="string">
            Reward amount already claimed from this source, in raw reward-token units.
          </ResponseField>

          <ResponseField name="balances[].sources[].claimableRaw" type="string">
            Reward amount available to claim from this source, in raw reward-token units.
          </ResponseField>
        </Expandable>
      </ResponseField>

      <ResponseField name="balances[].market_id" type="string">
        Campaign identifier associated with this reward balance.
      </ResponseField>

      <ResponseField name="balances[].orderbook_address" type="string | null">
        Orderbook account associated with the order or reward.
      </ResponseField>

      <ResponseField name="balances[].campaign_type" type="'orderbook_quote' | 'yt_holder' | 'tranching_lp_holder'">
        Reward eligibility category recorded for the campaign.
      </ResponseField>

      <ResponseField name="balances[].vault_address" type="string | null">
        Yield or strategy vault associated with this record.
      </ResponseField>

      <ResponseField name="balances[].tranching_market_address" type="string | null">
        Tranching market associated with the position or campaign.
      </ResponseField>

      <ResponseField name="balances[].tranche_side" type="'senior' | 'junior'">
        Tranche: `senior` or `junior`.
      </ResponseField>

      <ResponseField name="balances[].user_address" type="string">
        Wallet to which this record belongs.
      </ResponseField>

      <ResponseField name="balances[].emission_mint" type="string">
        Mint of the reward token paid or accrued.
      </ResponseField>

      <ResponseField name="balances[].emission_decimals" type="number">
        Reward-token decimal places used to convert raw amounts to token units.
      </ResponseField>

      <ResponseField name="balances[].earned_raw" type="string">
        Total reward amount earned, in raw reward-token units.
      </ResponseField>

      <ResponseField name="balances[].claimed_raw" type="string">
        Reward amount already claimed, in raw reward-token units.
      </ResponseField>

      <ResponseField name="balances[].claimable_raw" type="string">
        Reward amount currently available to claim, in raw reward-token units.
      </ResponseField>

      <ResponseField name="balances[].updated_at" type="string">
        Most recent update to this record, in ISO 8601 format.
      </ResponseField>
    </Expandable>
  </ResponseField>
</ApiResponse>

<ResponseExample>
  ```json 200 theme={null}
  {
    "balances": [
      {
        "market_id": "8JtnQcPr-EPjFWdd5-e6ec638b",
        "orderbook_address": "8JtnQcProV3bF1KUF9ohqRrnGpQCmMjTS6XxXv1aoXam",
        "user_address": "HRt73vbP87cUmzJJAH5tWyCuwyN9Syws2RxqND9pTMs4",
        "emission_mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
        "emission_decimals": 6,
        "earned_raw": "15343",
        "claimed_raw": "405",
        "claimable_raw": "14938",
        "updated_at": "2026-10-14T15:48:24.168Z",
        "campaign_type": "orderbook_quote",
        "vault_address": "Cmry6B5824MGAKrtL2u7YG9PiLZLoTBWs8hVaCJeUFaH",
        "tranching_market_address": null,
        "tranche_side": null,
        "sources": null
      },
      {
        "market_id": "Cmry6B58-EPjFWdd5-5638885d",
        "orderbook_address": null,
        "user_address": "HRt73vbP87cUmzJJAH5tWyCuwyN9Syws2RxqND9pTMs4",
        "emission_mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
        "emission_decimals": 6,
        "earned_raw": "1952205",
        "claimed_raw": "1919885",
        "claimable_raw": "32320",
        "updated_at": "2026-10-14T15:18:23.479Z",
        "campaign_type": "yt_holder",
        "vault_address": "Cmry6B5824MGAKrtL2u7YG9PiLZLoTBWs8hVaCJeUFaH",
        "tranching_market_address": null,
        "tranche_side": null,
        "sources": null
      }
    ]
  }
  ```

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


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