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

# Vault points

> Returns aggregated points for all users in a vault, grouped by user, platform, and season.

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="vaultAddress" type="string" required>
  Vault address.
</ParamField>

## Query parameters

<ParamField query="page" type="number" default="1">
  Page number.
</ParamField>

<ParamField query="limit" type="number" default="500">
  Users per page. Maximum: `500`.
</ParamField>

<RequestExample dropdown>
  ```bash cURL theme={null}
  curl 'https://api.exponent.finance/points/vault/78MLjMXyKyjwXtHXCuZHnBUH5wMh89KwBpvoFvcBzxN1?page=1&limit=2'
  ```

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

  response = requests.get("https://api.exponent.finance/points/vault/78MLjMXyKyjwXtHXCuZHnBUH5wMh89KwBpvoFvcBzxN1?page=1&limit=2", timeout=30)
  response.raise_for_status()
  print(response.json())
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch("https://api.exponent.finance/points/vault/78MLjMXyKyjwXtHXCuZHnBUH5wMh89KwBpvoFvcBzxN1?page=1&limit=2");
  if (!response.ok) {
    throw new Error(`Request failed: ${response.status}`);
  }
  const data = await response.json();
  console.log(data);
  ```
</RequestExample>

<ApiResponse errors={{}}>
  <ResponseField name="data" type="object[]">
    Aggregated points grouped by wallet, platform, and season.

    <Expandable title="child attributes">
      <ResponseField name="user_address" type="string">
        Wallet address.
      </ResponseField>

      <ResponseField name="vault_address" type="string">
        Yield or strategy vault associated with this record.
      </ResponseField>

      <ResponseField name="platform" type="string">
        Points platform identifier.
      </ResponseField>

      <ResponseField name="season" type="number">
        Points season.
      </ResponseField>

      <ResponseField name="lp_points" type="number">
        Accumulated LP points.
      </ResponseField>

      <ResponseField name="yt_points" type="number">
        Accumulated YT points.
      </ResponseField>

      <ResponseField name="updated_at" type="string">
        Latest update timestamp.
      </ResponseField>
    </Expandable>
  </ResponseField>

  <ResponseField name="pagination" type="object">
    Pagination metadata.

    <Expandable title="child attributes">
      <ResponseField name="page" type="integer">
        Current one-based page.
      </ResponseField>

      <ResponseField name="limit" type="integer">
        Records per page.
      </ResponseField>

      <ResponseField name="total_count" type="integer">
        Total matching records.
      </ResponseField>

      <ResponseField name="total_pages" type="integer">
        Total page count.
      </ResponseField>

      <ResponseField name="has_next" type="boolean">
        Whether another page exists.
      </ResponseField>

      <ResponseField name="has_prev" type="boolean">
        Whether a previous page exists.
      </ResponseField>
    </Expandable>
  </ResponseField>
</ApiResponse>

<ResponseExample>
  ```json 200 theme={null}
  {
    "pagination": {
      "page": 1,
      "limit": 2,
      "total_count": 1031,
      "total_pages": 516,
      "has_next": true,
      "has_prev": false
    },
    "data": [
      {
        "season": 0,
        "platform": "bulk",
        "lp_points": 88888,
        "yt_points": 0,
        "updated_at": "2026-07-13T09:29:24.86476+00:00",
        "user_address": "12oZsw7J74aw6bkPGHrKSAzAsNXAtSG6vvYvWTp5c6Fz",
        "vault_address": "78MLjMXyKyjwXtHXCuZHnBUH5wMh89KwBpvoFvcBzxN1"
      },
      {
        "season": 0,
        "platform": "bulk",
        "lp_points": 177776,
        "yt_points": 88888,
        "updated_at": "2026-07-13T09:29:24.86476+00:00",
        "user_address": "13gJdFuGXGV5JxkJKQXQBLKXJeMpHXpXAymyDUp9oyUN",
        "vault_address": "78MLjMXyKyjwXtHXCuZHnBUH5wMh89KwBpvoFvcBzxN1"
      }
    ]
  }
  ```
</ResponseExample>


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