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

# Discover Strategies

> Browse Glider's public, mirrorable strategies — curated picks or top performers.

Returns Glider's public, mirrorable strategies so you can surface them to your
users and mirror them via the enrollment flow. Every result is public and
mirrorable — use the returned `strategyId` with `POST /v2/enroll`.

* Auth: `x-api-key` header (required). No additional scope is needed.

Choose a `collection`:

* `curated` — a hand-picked set of strategies, in editorial order.
* `top_performing` — strategies ranked by live analytics. Use `sort` to choose
  the ranking.

Both collections are cursor-paginated (keyset): pass the `nextCursor` from the
previous response as the `cursor` query parameter to fetch the next page.
`nextCursor` is `null` when there are no more results. Keep `collection` stable
across pages. For `top_performing` the cursor already encodes its `sort`, so you
may follow `nextCursor` without re-sending `sort`; if you do send it, it must
match the cursor's. A cursor from one collection (or one `sort`) is rejected if
replayed against another.

<ParamField query="collection" type="string" required>
  Which catalog to return: `curated` or `top_performing`.
</ParamField>

<ParamField query="sort" type="string" default="tvl.desc">
  Ranking for `top_performing`. One of `tvl.desc`, `inflows7d.desc`, or
  `users.desc`. Ignored for `curated`.
</ParamField>

<ParamField query="limit" type="integer" default="50">
  Max strategies per page. Min 1, max 50. Applies to both collections; follow
  `nextCursor` to page beyond the first set.
</ParamField>

<ParamField query="cursor" type="string">
  Opaque pagination cursor from a previous response. Must be paired with the same
  `collection` that produced it. For `top_performing` the cursor carries its
  `sort`, so `sort` need not be re-sent; if sent, it must match.
</ParamField>

Each item carries display metadata — including `maxApy`, the Glider-managed
advertised maximum APY as a decimal percentage string (e.g. `"10.00"` = 10%;
absent when not advertised) — its current `allocation` (asset weights, in
the same shape as `GET /v2/strategies`), and a `metrics` object:

* `metrics.tvlUsd` — total value locked across the strategy's active
  portfolios, as a USD decimal string rounded to 2 decimal places. `null` when
  the value is temporarily unavailable (never conflated with a real `"0.00"`).
* `metrics.portfolioCount` — number of portfolios created from the strategy.
  `null` when temporarily unavailable.
* `metrics.performance.summary` — target-allocation performance over standard
  lookback windows (1d…12m), in the same shape as
  `GET /v2/strategies/{strategyId}/performance`. A window is omitted when the
  strategy's price history is shorter than that lookback. For the full
  chartable curve behind a summary, pass the item's `strategyId` to
  `GET /v2/strategies/{strategyId}/performance`.

A discovery `strategyId` also works with the read endpoints
`GET /v2/strategies/{strategyId}`,
`GET /v2/strategies/{strategyId}/schedule`,
`GET /v2/strategies/{strategyId}/versions`, and
`GET /v2/strategies/{strategyId}/preferences` — all returning the creator's
stored configuration where present (schedule and preference fields are
`null` when the creator has none on record; only the owner can change them).

Common error responses:

* `400` (`API_400`) when `collection` is missing/invalid or `sort`/`limit` is
  invalid
* `400` (`API_400`) when an explicit `sort` conflicts with the one the `cursor`
  was issued for
* `400` (`API_002`) when `cursor` is malformed or was issued for a different
  `collection`
* `401` when `x-api-key` header is missing or the key is invalid
* `500` on unexpected server errors

<RequestExample>
  ```bash cURL theme={null}
  curl --request GET \
    --url 'https://api.glider.fi/v2/discovery/strategies?collection=top_performing&sort=tvl.desc&limit=20' \
    --header 'x-api-key: gldr_sk_your_api_key'
  ```

  ```javascript JavaScript theme={null}
  // Both collections paginate — follow `nextCursor`, keeping collection (and sort,
  // for top_performing) stable across pages.
  const response = await fetch(
    "https://api.glider.fi/v2/discovery/strategies?collection=top_performing&sort=tvl.desc&limit=20",
    { headers: { "x-api-key": "gldr_sk_your_api_key" } },
  );
  const data = await response.json();

  // Fetch next page if present
  if (data.nextCursor) {
    const next = await fetch(
      `https://api.glider.fi/v2/discovery/strategies?collection=top_performing&sort=tvl.desc&cursor=${encodeURIComponent(data.nextCursor)}`,
      { headers: { "x-api-key": "gldr_sk_your_api_key" } },
    );
  }
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "success": true,
    "data": {
      "strategies": [
        {
          "strategyId": "01JWZEE2MF30KVRMRX53N88VA4",
          "name": "Balanced Growth",
          "description": "Multi-chain balanced allocation strategy",
          "maxApy": "10.00",
          "allocation": {
            "assets": [
              { "assetId": "eip155:1/erc20:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", "weight": "60" },
              { "assetId": "eip155:1/erc20:0xdac17f958d2ee523a2206206994597c13d831ec7", "weight": "40" }
            ]
          },
          "createdAt": "2026-01-01T00:00:00.000Z",
          "metrics": {
            "tvlUsd": "1250342.18",
            "portfolioCount": 421,
            "performance": {
              "summary": {
                "windows": [
                  { "window": "1d",  "percentChange": "0.4521",  "since": "2026-04-29" },
                  { "window": "1w",  "percentChange": "1.7812",  "since": "2026-04-23" },
                  { "window": "1m",  "percentChange": "3.4910",  "since": "2026-03-30" },
                  { "window": "3m",  "percentChange": "8.1004",  "since": "2026-01-30" },
                  { "window": "6m",  "percentChange": "10.7240", "since": "2025-10-30" },
                  { "window": "12m", "percentChange": "12.4187", "since": "2025-04-30" }
                ]
              }
            }
          },
          "canMirror": true
        }
      ]
    },
    "nextCursor": null
  }
  ```

  ```json 400 theme={null}
  {
    "success": false,
    "error": {
      "code": "API_400",
      "message": "Invalid request"
    }
  }
  ```
</ResponseExample>
