---
title: "Read a page of all LP portfolios"
method: GET
path: "/api/v2/lp/portfolios"
tags: ["Portfolio sync"]
---

# Read a page of all LP portfolios

`GET /api/v2/lp/portfolios`

## Request

- Base URL: `https://capitalcompany.ai`
- URL: `https://capitalcompany.ai/api/v2/lp/portfolios`
- Auth: one of:
  - HTTP bearer
  - API key in header `x-api-key`

Full roster scan, up to 25 LP emails per page. Keep the FIRST page’s nextCursor until the entire scan succeeds; send its rosterVersion on later pages and advance offset by limit. Only save the cursor and reconcile removals after all pages succeed. ROSTER_CHANGED requires restarting from offset 0. Each portfolio can independently succeed or fail inside an HTTP 200 response. Required key scope: lp:read.

## Query parameters

- `limit` integer: Maximum roster or affected-email rows examined per page (1–25). Omitted means 10; unchanged and removed rows also count.
- `offset` integer: Number of roster rows to skip; omitted means 0. Advance by the requested limit, not the number of changed portfolios.
- `rosterVersion` string: Full-scan roster token returned by the first page. Send on later full-scan pages; on ROSTER_CHANGED restart at offset 0 without it. Do not combine with changeCursor.

## Response `200`

Versioned portfolios, roster token, durable change cursor and pagination. totalCount counts roster entries. unchangedEmails and removedEmails are empty for GET.

- LpPortfoliosResponse
  - `success` true, required
  - `data` object, required
    - `totalCount` integer, required: Full-scan roster size or incremental affected-email count, including unchanged and removed rows.
    - `nextCursor` string, required: Opaque revision token. For a full scan retain the FIRST page’s cursor and save it only after completing all pages. For an incremental scan use it as windowCursor on later pages, then save it after the whole window succeeds.
    - `rosterVersion` string, required
    - `portfolios` union[], required
      - union
        - object
          - `email` string, required
          - `version` string, required
          - `success` true, required
          - `data` object, required
            - `lp` object, required
              - …
            - `summary` object, required
              - …
            - `funds` object[], required
              - …
            - `commitments` object[], required
              - …
            - `taxDocuments` object[], required
              - …
            - `pendingSignatures` object[], required
              - …
            - `unpaidCapitalCalls` object[], required
              - …
            - `holdings` object[], required
              - …
            - `holdingsSummary` object, required
              - …
        - object
          - `email` string, required
          - `version` string, required
          - `success` false, required
          - `error` object, required
            - `code` 'INVALID_PARAMS', required
            - `message` string, required
            - `status` integer, required
        - object
          - `email` string, required
          - `version` string, required
          - `success` false, required
          - `error` object, required
            - `code` 'LP_NOT_FOUND', required
            - `message` string, required
            - `status` integer, required
        - object
          - `email` string, required
          - `version` string, required
          - `success` false, required
          - `error` object, required
            - `code` 'NO_PORTFOLIO_DATA', required
            - `message` string, required
            - `status` integer, required
        - object
          - `email` string, required
          - `version` string, required
          - `success` false, required
          - `error` object, required
            - `code` 'FUND_NOT_FOUND', required
            - `message` string, required
            - `status` integer, required
    - `unchangedEmails` string[], required: Portfolios on this page whose successful response matches a submitted version. Keep the locally stored payload.
    - `removedEmails` string[], required: Emails no longer in the visible roster. Reconcile removals only after all pages complete successfully.
    - `pagination` object, required
      - `limit` integer, required
      - `offset` integer, required
      - `hasMore` boolean, required

## Other responses

- `400`: INVALID_PARAMS: request validation failed.
- `401`: MISSING_API_KEY or INVALID_API_KEY: missing, invalid or revoked key.
- `403`: INSUFFICIENT_SCOPE: the key lacks the required scope.
- `409`: ROSTER_CHANGED: restart at offset 0 without rosterVersion.
- `429`: RATE_LIMIT_EXCEEDED: respect Retry-After before retrying.
- `500`: INTERNAL_ERROR: unexpected server error.

## Changes

- **2026-10-19** `b99bb24f107d`: 2 warning
  - added the new `from-invested-capital` enum value to the `data/portfolios/items/anyOf[subschema #1]/data/commitments/items/feeTerms/items/collectionMethod` response property for the response status `200`
  - added the new `initial-investment` enum value to the `data/portfolios/items/anyOf[subschema #1]/data/commitments/items/feeTerms/items/earningCondition` response property for the response status `200`

[Operation history](https://skmtc.dev/capitalcompany/apis/capital-company-external-api/changes/api/v2/lp/portfolios/get.md)

---

[API](https://skmtc.dev/capitalcompany/apis/capital-company-external-api.md) · [All operations](https://skmtc.dev/capitalcompany/apis/capital-company-external-api/llms.txt) · [OpenAPI document](https://skmtc.dev/capitalcompany/apis/capital-company-external-api/revisions/b99bb24f107d?raw)
