---
title: "Read an LP portfolio (legacy)"
method: GET
path: "/api/v1/lp/portfolio"
tags: ["Legacy LP (v1)"]
---

# Read an LP portfolio (legacy)

`GET /api/v1/lp/portfolio`

## Request

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

Frozen v1 contract; requires a verified account email. Optional case-insensitive legal-name filter. No v2 stable identifiers, currency, per-commitment fee breakdown, carry, stage or capital-return breakdown. No v2 rate limiter. Use v2 for new integrations. Required key scope: lp:read.

## Query parameters

- `email` string, required: Verified invitation email, trimmed and lowercased. Unverified accounts are excluded from the frozen v1 API.
- `fund_legal_name` string: Optional case-insensitive exact legal name. All matching funds are included; prefer fund_id for an unambiguous selection.

## Response `200`

Legacy portfolio, holdings and totals, with name-based associations.

- V1LpPortfolioResponse
  - `success` true, required
  - `data` object, required
    - `lp` object, required
      - `email` string, required
      - `displayName` string, nullable, required
      - `entityCount` integer, required
    - `summary` object, required
      - `totalCommitted` number, required
      - `totalCalled` number, required
      - `totalPaid` number, required
      - `totalDistributed` number, required
      - `totalFeesAccrued` number, required
      - `fundCount` number, required
    - `funds` object[], required
      - `fundLegalName` string, required
      - `fundClassName` string, nullable, required
      - `subscriptionAmount` number, required
      - `capitalCalled` number, required
      - `capitalPaid` number, required
      - `distributed` number, required
      - `feesAccrued` number, required
      - `feesByType` object, required: Recognized fee amounts keyed by fee type; excludes realized carry, reported separately.
      - `signedAt` string, date-time, nullable, required
      - `isActive` boolean, required
    - `commitments` object[], required
      - `fundLegalName` string, required
      - `fundClassName` string, nullable, required
      - `subscriptionAmount` number, required
      - `signedAt` string, date-time, nullable, required
      - `subscribedAt` string, date-time, nullable, required
      - `createdAt` string, date-time, required
    - `taxDocuments` object[], required
      - `fundLegalName` string, required
      - `taxYear` integer, required
      - `fileName` string, required
      - `createdAt` string, date-time, required
    - `pendingSignatures` object[], required
      - `fundLegalName` string, required
      - `purpose` string, required
      - `createdAt` string, date-time, required
    - `unpaidCapitalCalls` object[], required
      - `fundLegalName` string, required
      - `amount` number, required
      - `dueDate` string, date-time, nullable, required
      - `emailSentAt` string, date-time, nullable, required
    - `holdings` object[], required
      - `type` 'fund-interest', required
      - `status` 'active' | 'pending-subscription', required
      - `fundLegalName` string, required
      - `fundClassName` string, nullable, required
      - `holderEntityName` string, nullable, required
      - `featuredPortfolioCompanies` object[], required
        - `name` string, nullable, required
        - `logoUrl` string, nullable, required
      - `entryPrice` number, required
      - `entryDate` string, date-time, nullable, required
      - `numUnits` number, nullable, required
      - `unitPrice` number, nullable, required
      - `grossValue` number, required
      - `distributionsReceived` number, required
      - `totalGrowthAmount` number, required
      - `totalGrowthPercent` number, nullable, required
      - `irr` number, nullable, required
      - `isActive` boolean, required
      - `endedAt` string, date-time, nullable, required
    - `holdingsSummary` object, required
      - `totalEntryPrice` number, required
      - `totalGrossValue` number, required
      - `totalDistributionsReceived` number, required
      - `totalGrowthAmount` number, required
      - `totalGrowthPercent` number, nullable, required
      - `weightedIrr` number, nullable, required: Portfolio money-weighted XIRR, despite the legacy field name; a fraction, not a percentage number.

## Other responses

- `400`: INVALID_PARAMS: missing or invalid email, fund identifier or query parameters.
- `401`: MISSING_API_KEY or INVALID_API_KEY: missing, invalid or revoked key.
- `403`: INSUFFICIENT_SCOPE: the key lacks the required scope.
- `404`: LP_NOT_FOUND, NO_PORTFOLIO_DATA or FUND_NOT_FOUND: the account, portfolio or requested fund is not visible in the key’s team.
- `500`: INTERNAL_ERROR: unexpected server error.

---

[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)
