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

# List Portfolios

> Returns the authenticated tenant's user portfolios with cursor-based pagination.

Returns all portfolios owned by the authenticated tenant — identity,
strategy, per-chain smart accounts, and rebalance schedule state. Real-time
balances and USD values are served by
`GET /v2/portfolios/{portfolioId}/positions`; keep them separate so list
polling stays cheap.

* Auth: `x-api-key` header (required)
* Scope: `portfolios:read`

All on-chain identifiers are [CAIP](https://github.com/ChainAgnostic/CAIPs)-shaped.
End-user wallets use the chain-agnostic CAIP-10 form `eip155:0:<address>`
(the same EOA works on every EIP-155 chain). Smart accounts are chain-bound
(`eip155:<chainId>:<address>`) because a smart account exists only at that
(chain, address) tuple. Raw addresses and numeric chain IDs never appear on
the wire. Owners are EVM EOAs today.

Results are cursor-paginated in `createdAt` descending order. Pass the
`nextCursor` value from the previous response as the `cursor` query
parameter to fetch the next page. `nextCursor` is `null` when there are no
more results. Archived portfolios are excluded.

<ParamField query="ownerAccountId" type="string">
  Filter to a single end-user's portfolios under this tenant. CAIP-10
  account identifier. For EVM EOAs, use the chain-agnostic form
  `eip155:0:0x<address>`. Mixed-case input is accepted; the address part is
  normalized to lowercase.
</ParamField>

<ParamField query="strategyId" type="string">
  Filter to portfolios mirroring a specific strategy (ULID returned by
  `POST /v2/strategies`).
</ParamField>

<ParamField query="status" type="string">
  Filter by rebalance schedule status. One of `active`, `paused`. When set,
  portfolios without a schedule are excluded.
</ParamField>

<ParamField query="limit" type="integer" default="50">
  Max portfolios per page. Min 1, max 200.
</ParamField>

<ParamField query="cursor" type="string">
  Opaque pagination cursor from a previous response.
</ParamField>

Common error responses:

* `400` when a filter value is malformed (invalid CAIP-10, unknown status enum, bad cursor) or `limit` is out of range
* `401` when `x-api-key` header is missing or the key is invalid
* `403` when the API key lacks the `portfolios:read` scope
* `500` on unexpected server errors

<RequestExample>
  ```bash cURL theme={null}
  curl --request GET \
    --url 'https://api.glider.fi/v2/portfolios?limit=50' \
    --header 'x-api-key: gldr_sk_your_api_key'
  ```

  ```bash cURL (filter by user) theme={null}
  curl --request GET \
    --url 'https://api.glider.fi/v2/portfolios?ownerAccountId=eip155:0:0xabcdef0000000000000000000000000000000001&status=active' \
    --header 'x-api-key: gldr_sk_your_api_key'
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch(
    "https://api.glider.fi/v2/portfolios?limit=50",
    { 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/portfolios?limit=50&cursor=${encodeURIComponent(data.nextCursor)}`,
      { headers: { "x-api-key": "gldr_sk_your_api_key" } },
    );
  }
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "success": true,
    "data": {
      "portfolios": [
        {
          "portfolioId": "pf_01JWZEE2MF30KVRMRX53N88VA4",
          "ownerAccountId": "eip155:0:0xabcdef0000000000000000000000000000000001",
          "strategyId": "01JWZEE2MF30KVRMRX53N88VA4",
          "strategyName": "Conservative Yield",
          "strategyDescription": "Multi-chain balanced allocation strategy",
          "smartAccounts": [
            { "accountId": "eip155:8453:0xe3a2d1f49aee887e42655b56371d4d76bbf58058" }
          ],
          "schedule": {
            "status": "active",
            "frequency": "daily",
            "intervalMs": 86400000,
            "nextDueAt": "2026-04-16T12:00:00.000Z",
            "lastRebalanceAt": "2026-04-15T12:00:00.000Z"
          },
          "createdAt": "2026-04-10T08:30:00.000Z"
        }
      ]
    },
    "nextCursor": "eyJjIjoiMjAyNi0wNC0xMFQwODozMDowMC4wMDBaIiwiaSI6InBmXzAxSldaRUUyTUYzMEtWUk1SWDUzTjg4VkE0In0"
  }
  ```

  ```json 400 theme={null}
  {
    "success": false,
    "error": {
      "code": "API_400",
      "message": "Request validation failed",
      "details": [
        "ownerAccountId: Must be a valid CAIP-10 account identifier (chainNamespace:chainReference:address)"
      ]
    }
  }
  ```
</ResponseExample>
