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

# Holdings (by investor)

> Get the 13F portfolio of any institutional investment manager, by SEC CIK.

### Overview

Get the full equity portfolio of any institutional investment manager that files SEC Form 13F (managers overseeing \$100M+ in assets).

Data comes directly from SEC Form 13F filings, including per-position share counts, market values, voting authority splits, and subsidiary-manager breakdowns. We preserve the full SEC filing fidelity: when a manager splits voting authority across subsidiaries (e.g., Berkshire across National Indemnity / GEICO), each split is exposed in a `subsidiaries` array on the position.

You can use this data to:

* Track every position held by a specific investment manager
* Compare position changes quarter-over-quarter
* Surface concentration, voting structure, and amendment activity

Note: Form 13F filings have a 45-day lag from quarter end and only include long positions in SEC-registered securities.

To get started, please create an account and grab your <b>API key</b> at [financialdatasets.ai](https://financialdatasets.ai).

You will use the API key to authenticate your API requests.

### Coverage

| Tickers | Years of Coverage | Updated |
| ------- | ----------------- | ------- |
| 18,000+ | 5+ years          | Daily   |

### Find an investor's CIK

Investors are queried by `filer_cik`, not by name. To discover a CIK, hit the helper endpoint:

```python Investors theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
import requests

# free endpoint, no API key required
url = 'https://api.financialdatasets.ai/institutional-holdings/investors/?name=BERK'
response = requests.get(url)

# each item is { "cik": "...", "name": "..." }
for investor in response.json().get('investors'):
    print(investor['cik'], investor['name'])
```

Pass `?name=PREFIX` to filter to filers whose names start with that prefix (case-insensitive). Without `name`, the endpoint returns the first 100 filers alphabetically.

**CIKs can change over time.** The SEC sometimes renames or restructures filer entities, so an investor's CIK may not be stable across years. The `/investors` lookup always returns the active CIK for the entity currently filing under that name, so prefer it over hard-coding CIKs from old documents.

### Filtering the Data

`filer_cik` is required. By default, the response is the filer's **most recent 13F**. To see history, add `report_period` filters:

* `report_period_lte`
* `report_period_lt`
* `report_period_gte`
* `report_period_gt`
* `report_period`

For example, `report_period_gte=2024-01-01&report_period_lte=2025-12-31` returns every position the filer reported across that window.

By default, `limit` is `10` (max `200`).

### Subsidiaries

When a 13F filer reports the same security across multiple voting-authority splits (e.g., parent + subsidiary advisors), the top-level position aggregates the splits and a `subsidiaries` array preserves each underlying row. The `subsidiaries` field is omitted when there is only one underlying row.

### Examples

<CodeGroup>
  ```python Latest portfolio theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
  import requests

  # add your API key to the headers
  headers = {
      "X-API-KEY": "your_api_key_here"
  }

  # set your query params
  filer_cik = '0001067983'    # Berkshire Hathaway's CIK
  limit = 100                 # number of positions to return

  # create the URL
  url = (
      f'https://api.financialdatasets.ai/institutional-holdings/'
      f'?filer_cik={filer_cik}'
      f'&limit={limit}'
  )

  # make API request
  response = requests.get(url, headers=headers)

  # parse institutional_holdings from the response
  institutional_holdings = response.json().get('institutional_holdings')
  ```

  ```python Historical range theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
  import requests

  # add your API key to the headers
  headers = {
      "X-API-KEY": "your_api_key_here"
  }

  # set your query params
  filer_cik = '0001067983'
  limit = 200
  report_period_lte = '2025-12-31' # end date
  report_period_gte = '2024-01-01' # start date

  # create the URL
  url = (
      f'https://api.financialdatasets.ai/institutional-holdings/'
      f'?filer_cik={filer_cik}'
      f'&limit={limit}'
      f'&report_period_lte={report_period_lte}'
      f'&report_period_gte={report_period_gte}'
  )

  # make API request
  response = requests.get(url, headers=headers)

  # parse institutional_holdings from the response
  institutional_holdings = response.json().get('institutional_holdings')
  ```
</CodeGroup>


## OpenAPI

````yaml GET /institutional-holdings
openapi: 3.0.1
info:
  title: Financial Datasets API
  description: >-
    Stock market API with real-time and historical financial data for 27,000+
    tickers over 30+ years. Financial statements, equity prices, insider trades,
    SEC filings, and more.
  version: 1.0.0
  license:
    name: MIT
    url: https://opensource.org/licenses/MIT
  contact:
    name: API Support
    url: mailto:support@financialdatasets.ai
    email: support@financialdatasets.ai
  termsOfService: https://financialdatasets.ai/terms-of-use
servers:
  - url: https://api.financialdatasets.ai/
    description: Production server
security:
  - X-API-KEY: []
tags:
  - name: Financial Statements
    description: Access to income statements, balance sheets, and cash flow statements
  - name: Market Data
    description: Real-time and historical price data
  - name: Company Information
    description: Company facts like ticker, name, and description
  - name: Earnings
    description: Earnings data and related information
  - name: News
    description: Real-time and historical news articles
  - name: SEC Filings
    description: SEC filings and regulatory documents
  - name: Insider Trades
    description: Insider trading activity and transactions
  - name: Activist Ownership
    description: Activist stakes from SEC Schedule 13D filings, in real time
  - name: Beneficial Ownership
    description: >-
      Holders of more than 5% of a company's shares, from SEC Schedules 13D and
      13G
  - name: Insider Ownership
    description: Insider ownership statements from SEC Forms 3 and 5
  - name: Institutional Holdings
    description: SEC-direct 13F equity holdings of institutional investment managers
  - name: Index Funds
    description: >-
      ETF and index-fund holdings, weights, and the funds that hold a given
      security
  - name: Financial Metrics
    description: Financial ratios, metrics, and key performance indicators
  - name: Macroeconomics
    description: Real-time and historical macroeconomic data like interest rates
  - name: KPIs
    description: Sector-specific operational KPIs extracted from earnings releases.
paths:
  /institutional-holdings:
    get:
      tags:
        - Institutional Holdings
      summary: Get 13F institutional holdings
      description: >-
        Query 13F institutional holdings by filer CIK or by held ticker. Provide
        exactly one of `filer_cik` or `ticker`. When no `report_period` filter
        is supplied, `?filer_cik=...` returns the filer's most recent 13F and
        `?ticker=...` returns one position per institutional filer whose most
        recent 13F currently includes the ticker (filers who have since dropped
        the position are excluded).
      operationId: getInstitutionalHoldings
      parameters:
        - name: filer_cik
          in: query
          description: >-
            The 10-digit zero-padded SEC CIK of the institutional filer.
            Mutually exclusive with `ticker`.
          schema:
            type: string
        - name: ticker
          in: query
          description: >-
            The held security's ticker symbol. Mutually exclusive with
            `filer_cik`. Without a `report_period` filter, returns one position
            per institutional filer whose most recent 13F currently includes
            this ticker.
          schema:
            type: string
        - name: limit
          in: query
          description: 'The maximum number of positions to return (default: 10, max: 200).'
          required: false
          schema:
            type: integer
            default: 10
            maximum: 200
        - $ref: '#/components/parameters/ReportPeriod'
        - $ref: '#/components/parameters/ReportPeriodGte'
        - $ref: '#/components/parameters/ReportPeriodLte'
        - $ref: '#/components/parameters/ReportPeriodGt'
        - $ref: '#/components/parameters/ReportPeriodLt'
      responses:
        '200':
          description: Institutional holdings response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InstitutionalHoldingsResponse'
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '402':
          $ref: '#/components/responses/PaymentRequiredError'
        '404':
          $ref: '#/components/responses/NotFoundError'
components:
  parameters:
    ReportPeriod:
      name: report_period
      in: query
      description: Filter by exact report period date in YYYY-MM-DD format.
      required: false
      schema:
        type: string
        format: date
    ReportPeriodGte:
      name: report_period_gte
      in: query
      description: >-
        Filter by report period greater than or equal to date in YYYY-MM-DD
        format.
      required: false
      schema:
        type: string
        format: date
    ReportPeriodLte:
      name: report_period_lte
      in: query
      description: Filter by report period less than or equal to date in YYYY-MM-DD format.
      required: false
      schema:
        type: string
        format: date
    ReportPeriodGt:
      name: report_period_gt
      in: query
      description: Filter by report period greater than date in YYYY-MM-DD format.
      required: false
      schema:
        type: string
        format: date
    ReportPeriodLt:
      name: report_period_lt
      in: query
      description: Filter by report period less than date in YYYY-MM-DD format.
      required: false
      schema:
        type: string
        format: date
  schemas:
    InstitutionalHoldingsResponse:
      type: object
      description: >-
        Envelope keyed by `ticker` (ticker mode) or `filer_cik` (filer mode),
        with the position list under `institutional_holdings`.
      properties:
        ticker:
          type: string
          description: Echoed back when the request used `?ticker=...` mode.
        filer_cik:
          type: string
          description: Echoed back when the request used `?filer_cik=...` mode.
        institutional_holdings:
          type: array
          items:
            $ref: '#/components/schemas/InstitutionalHolding'
    InstitutionalHolding:
      type: object
      description: >-
        A single position from a 13F filing. When the filer split voting
        authority across multiple subsidiary managers, the top-level fields
        aggregate shares and value across the splits and the underlying rows
        appear in `subsidiaries`.
      properties:
        ticker:
          type: string
          description: >-
            The ticker symbol of the held security. May be null if the CUSIP
            could not be resolved.
        name_of_issuer:
          type: string
          description: Issuer name as reported on the 13F.
        cusip:
          type: string
          description: 9-character CUSIP of the held security.
        report_period:
          type: string
          format: date
          description: The reporting period (quarter end) of the filing.
        filing_date:
          type: string
          format: date
          description: The date the filing was submitted to the SEC.
        form_type:
          type: string
          enum:
            - 13F-HR
            - 13F-HR/A
          description: The 13F form type (original `13F-HR` or amendment `13F-HR/A`).
        accession_number:
          type: string
          description: The SEC accession number for this filing.
        title_of_class:
          type: string
          description: Security class as reported (e.g., `COM`, `COM CL A`, `PREF`).
        put_call:
          type: string
          nullable: true
          enum:
            - null
            - Put
            - Call
          description: >-
            Set to `Put` or `Call` for option positions; `null` for the
            underlying equity.
        shares:
          type: integer
          format: int64
          description: Number of shares (or principal amount) held.
        value_usd:
          type: integer
          format: int64
          description: Position market value in USD as reported on the 13F.
        reported_price:
          type: number
          nullable: true
          description: >-
            Per-share price implied by the reported value and shares (the 13F
            equivalent of Dataroma's `Reported Price`). May be null when our
            price lookup is unavailable for this CUSIP.
        filer_cik:
          type: string
          description: >-
            Present only in ticker-mode responses. The 10-digit SEC CIK of the
            filer.
        filer_name:
          type: string
          description: Present only in ticker-mode responses. The filer's name.
        subsidiaries:
          type: array
          description: >-
            Present only when the position aggregates multiple SEC
            information-table rows (voting authority splits). Omitted for
            single-row positions.
          items:
            $ref: '#/components/schemas/InstitutionalHoldingSubsidiary'
    ErrorResponse:
      type: object
      properties:
        error:
          type: string
          description: A short error message.
        message:
          type: string
          description: A more detailed error message.
    InstitutionalHoldingSubsidiary:
      type: object
      description: >-
        One SEC information-table row underlying a position (voting-authority
        split).
      properties:
        row_num:
          type: integer
          description: Zero-indexed row number from the SEC information table.
        shares:
          type: integer
          format: int64
        value_usd:
          type: integer
          format: int64
        shares_principal_amount_type:
          type: string
          enum:
            - SH
            - PRN
          description: '`SH` for shares; `PRN` for principal amount (debt-like instruments).'
        investment_discretion:
          type: string
          enum:
            - SOLE
            - DFND
            - OTR
          description: SEC investment-discretion code.
        voting_authority_sole:
          type: integer
          format: int64
        voting_authority_shared:
          type: integer
          format: int64
        voting_authority_none:
          type: integer
          format: int64
        other_managers:
          type: array
          items:
            type: string
          description: >-
            SEC `OtherManagers` identifiers indicating which subsidiary manager
            reported this row.
  responses:
    BadRequestError:
      description: Bad request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: Bad Request
            message: Invalid request parameters
    UnauthorizedError:
      description: Unauthorized
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: Unauthorized
            message: Invalid API key provided
    PaymentRequiredError:
      description: The request requires a paid subscription
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: Payment Required
            message: >-
              This endpoint requires a paid subscription. Please upgrade your
              plan.
    NotFoundError:
      description: The specified resource was not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: Not Found
            message: Ticker XXXX not found
  securitySchemes:
    X-API-KEY:
      type: apiKey
      name: X-API-KEY
      description: API key for authentication.
      in: header

````