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

# Implied APY history

> Returns indexed implied APY and PT/YT price observations in chronological order. Results are not bucketed server-side. Provide at least one vault, CLMM market, or orderbook address.

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>;
};

## Query parameters

<ParamField query="vaultAddress" type="string">
  Include the vault’s active CLMM markets and orderbooks. Overrides all explicit venue-address parameters.
</ParamField>

<ParamField query="marketAddress" type="string">
  One active CLMM market address.
</ParamField>

<ParamField query="marketAddresses" type="string">
  Comma-separated active CLMM market addresses. Combined with `marketAddress` and deduplicated.
</ParamField>

<ParamField query="orderbookAddress" type="string">
  One active orderbook address.
</ParamField>

<ParamField query="orderbookAddresses" type="string">
  Comma-separated active orderbook addresses. Combined with `orderbookAddress` and deduplicated.
</ParamField>

<ParamField query="startDate" type="string">
  Inclusive ISO 8601 start timestamp. Takes precedence over `timeframeSeconds`.
</ParamField>

<ParamField query="endDate" type="string">
  Inclusive ISO 8601 end timestamp.
</ParamField>

<ParamField query="limit" type="integer">
  Maximum records returned, starting with the earliest matching observation. Omit for complete matching history.
</ParamField>

<ParamField query="timeframeSeconds" type="number">
  Derive the start relative to now or `referenceTimestamp`, only when `startDate` is absent.
</ParamField>

<ParamField query="referenceTimestamp" type="number">
  Reference time in milliseconds for deriving the start. Defaults to now; does not set `endDate`.
</ParamField>

Only venues currently marked active are selected, including for historical windows. Unknown or inactive explicit venue addresses are ignored. No matching active venues or observations returns `[]`.

<RequestExample dropdown>
  ```bash cURL theme={null}
  curl 'https://api.exponent.finance/implied-apy-chart?marketAddress=6CFxKYZkRUDBcJSHo3PBHJ7iBiCmEXePrCFT26mZx1id&startDate=2026-09-25T00:00:00Z&endDate=2026-10-05T00:00:00Z'
  ```

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

  response = requests.get("https://api.exponent.finance/implied-apy-chart?marketAddress=6CFxKYZkRUDBcJSHo3PBHJ7iBiCmEXePrCFT26mZx1id&startDate=2026-09-25T00:00:00Z&endDate=2026-10-05T00:00:00Z", timeout=30)
  response.raise_for_status()
  print(response.json())
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch("https://api.exponent.finance/implied-apy-chart?marketAddress=6CFxKYZkRUDBcJSHo3PBHJ7iBiCmEXePrCFT26mZx1id&startDate=2026-09-25T00:00:00Z&endDate=2026-10-05T00:00:00Z");
  if (!response.ok) {
    throw new Error(`Request failed: ${response.status}`);
  }
  const data = await response.json();
  console.log(data);
  ```
</RequestExample>

For an entire vault, use `vaultAddress=Cmry6B5824MGAKrtL2u7YG9PiLZLoTBWs8hVaCJeUFaH`. For the last seven days, use `timeframeSeconds=604800`.

<ApiResponse errors={{"400": {"error": "<message>"}, "404": {"error": "<message>"}, "500": {"error": "<message>"}}}>
  | Field | Type | Description |
  | - | - | - |
  | `timestamp` | string | Indexed observation timestamp. |
  | `impliedApy` | number | Decimal APY: `0.09` represents 9%. |
  | `ptPrice` | number | PT price at the observation. |
  | `ytPrice` | number | YT price at the observation. |
  | `yearsToMaturity` | number | Remaining time to vault maturity in years. |
</ApiResponse>

<ResponseExample>
  ```json 200 theme={null}
  [
    {
      "timestamp": "2026-09-25T17:31:34+00:00",
      "impliedApy": 0.066863034752582,
      "ptPrice": 0.973288544925515,
      "ytPrice": 0.0267114550744851,
      "yearsToMaturity": 0.418318937087773
    },
    {
      "timestamp": "2026-09-25T17:33:09+00:00",
      "impliedApy": 0.0697571420191101,
      "ptPrice": 0.97218638953532,
      "ytPrice": 0.02781361046468,
      "yearsToMaturity": 0.418315924657534
    }
  ]
  ```

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

  ```json 404 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.