Skip to main content
Query investor letters from hedge funds, partnerships, and registered funds as structured data: each letter is parsed into per-company investment theses with relationship, stance, conviction, and a source quote anchored to an exact page and character range in the original document. Start from a ticker, a manager, a full-text query, or the delta feed.

Quick start

List the most recent letters that discuss a company:
Each list item carries the letter identity, period, and coverage summary:
Fetch the full letter, including letter-level narratives and its inline theses:
The detail response adds narratives (market backdrop, positioning, performance commentary, outlook, firm updates), performanceFigures, provenance, and the extracted theses[]. Letters with more than 25 theses return the first 25 inline with a thesisCount and a link to GET /v1/fund-letters/theses?letter_id= for the rest.

The thesis model

A thesis is one manager’s view of one company in one letter. Its decision-context fields use fixed enums.

relationship

What the manager did or holds, as stated in the letter.

stance

The direction of the view expressed.

conviction

How strongly the manager expresses the view. Conviction is as expressed in the letter’s own language, never inferred from position size or tone — the record carries convictionBasis: "as_expressed" to make that explicit.

materiality.basis

Why the mention qualified as a thesis rather than a passing reference. Theses also carry nullable narrative fields (thesisSummary, variantPerception, riskSummary, catalystSummary, valuationSummary, businessQualitySummary, managementAssessment, capitalAllocationSummary, financialExpectations, performanceOrActionSummary) plus timeHorizon and positionSize. A narrative field is null when the letter does not discuss that dimension — extraction records what the manager wrote, it does not fill gaps. Screen theses across the corpus with GET /v1/fund-letters/theses:

Verify a quote against the source document

Every thesis includes a sourceQuote with one or more anchors that locate the quote in the original document:
The anchor contract: quote is always the exact span copied from the stored page text, so slicing the page markdown at [charStart, charEnd) reproduces it byte for byte. To verify:
The markdown response is page-segmented:
Slice semantics:
  1. Confirm the document’s sourceSha256 and paginationVersion match the anchor. Offsets are only meaningful against the same document bytes and the same pagination.
  2. Find the entry in pages[] whose page equals anchor.page.
  3. charStart is inclusive and charEnd is exclusive, indexing characters of that page’s markdown string. In JavaScript: pageEntry.markdown.slice(812, 912) === anchor.quote.
This equality holds for every anchor by construction. When a letter’s canonical source document is later replaced (for example, the fund’s own PDF supersedes a copy retrieved elsewhere), old anchors keep verifying: pass the anchor’s hash as ?sha= to retrieve the exact document variant the anchor was computed against:
Occasionally the model’s originally extracted wording differed slightly from the printed text; in that case quoteAsExtracted preserves the model’s version while quote remains the true span from the document. Slice verification always targets quote.

Deltas for agents: since and /changes

Two mechanisms keep a downstream copy current. since is a convenience filter on list endpoints: GET /v1/fund-letters?since=2026-07-01T00:00:00Z returns records updated after that timestamp. It is good for a quick catch-up query, but it is not a durable sync primitive — a record updated twice appears once, and you can miss ordering guarantees under concurrent writes. GET /v1/fund-letters/changes is the durable delta feed. It returns an ordered event sequence with a keyset cursor:
Event types: letter.published, letter.updated, letter.superseded, thesis.extracted, manager.added. Store nextCursor after each page and pass it back as cursor on the next poll. The cursor is keyset-based over the event sequence, so a poll loop never skips or double-counts events even while new letters are being ingested; process events idempotently on your side. /changes responses are never cached. letter.superseded matters for anchor hygiene: it fires when a letter’s canonical document is replaced. Superseded letter and thesis IDs continue to resolve to their successors, and superseded document variants stay retrievable through ?sha=.

Manager overview

Start from a manager instead of a company with the Fund Overview endpoint — one token-efficient briefing per firm:
Three things to know:
  • canonicalName is the name people actually say — curated for covered managers (“Oaktree Capital”, “GMO”), derived by stripping legal suffixes otherwise. name keeps the form the letters and filings use.
  • The overview is deliberately small: keyTheses carries at most 5 headline theses (ticker, relationship, stance, one line each), and nothing on the payload inlines page markdown, anchors, or full thesis bodies. Follow links.letters and links.theses when you need depth.
  • latestLetter is null for a manager with no processed letters yet — the curated profile (description, founders, website) still serves.
  • When the Fund Directory is enabled, the overview also carries a references block — { website: { url, confidence }, wikipedia: { url }, grokipedia: { url, confidence } } — the same proven-or-null external links served on the manager list (see the directory section below). Confidence is a verification tier, not a numeric score.

Top-10 positions from the latest 13F

Pass include=positions to inline latest13F — the manager’s latest canonical 13F report with its top 10 positions by reported value:
How to read it:
  • Positions come from the materialized 13F holder index with the same amendment/restatement canonicalization as the institutional-holders endpoints, so 13F-HR/A amendments are never double-counted. value is USD (13F values are reported in thousands; already scaled), and pctOfPortfolio is the position’s share of the report’s total reported value.
  • ticker is resolved from the reported CUSIP where a canonical listing exists, else null. totalPositions counts the report’s distinct issuer positions.
  • Get more: the overview inlines at most 10 positions. Follow links.holdings13F for the manager’s full 13F holdings surface (the same adviser cik also works with /v1/owners/institutional/investor for the paged portfolio view).
  • Without include=positions the latest13F key is omitted entirely; with it, a manager with no linked adviser CIK or no indexed 13F serves latest13F: null.
The same briefing is available over MCP as fund_letters.manager_overview (same include argument) and in the SDKs as getFundManagerOverview(managerId, { include: "positions" }) / get_fund_manager_overview(manager_id, include="positions"). The CLI twin is secapi fund-letters overview --manager-id mgr_... --include positions.

Fund Directory

GET /v1/fund-letters/managers is the browsable fund directory: every manager record carries coverage stats, and — once the directory expansion is enabled server-side — reference links, a latest-13F summary, and the directory filters below. Browse by fund or CIO name, by a ticker the fund holds, by theme, or by 13F quarter:
Directory filters: q (fund/CIO substring), ticker (held in the latest 13F), cik (adviser CIK), theme, strategy (approach or styleTags), has_13f, min_letters, min_positions, publishes_letters, period (YYYYQn 13F quarter; quarter is an alias), and sort (aum_desc | positions_desc | letters_desc | name_asc). Each directory record adds these fields to the manager shape:
Three rules the directory enforces:
  • References are proven or absent. references mirrors resolver-verified links only — a website, Wikipedia, or Grokipedia entry that was not confidently resolved serves null, never a guessed URL. confidence is the resolver’s verification tier — verified_crawl or form_adv for a website, verified or probable for Grokipedia — and is null for hand-curated entries.
  • latest13F is a summary, not holdings. It carries the latest report date (with its YYYYQn period), position count, and reported AUM. For the full position list, follow the existing 13F cross-link (crossLinks.holdings13F) — see the next section.
  • Letterless managers are labeled. The expanded universe includes 13F filers that publish no letters; they carry publishesLetters: false and zeroed coverage counts. Filter them in or out with publishes_letters=true|false.
While the directory expansion is disabled, the endpoint lists letter-publishing managers with the pre-directory fields only, and directory-only parameters are ignored. The directory is available over MCP as fund_letters.managers, in the SDKs as listFundLetterManagers(params) / list_fund_letter_managers(**params) (with iter_fund_letter_managers for auto-pagination), and on the CLI as secapi fund-letters managers --ticker NVDA --sort aum_desc.

Cross-check a thesis against 13F holdings

Theses carry crossLinks into the rest of the SEC API, so a claim in a letter can be checked against what the manager’s adviser actually reported:
A useful loop: read the thesis (relationship: added, stance: bullish), then follow crossLinks.holdings13F to confirm the adviser’s reported position moved in the same direction that quarter. When a letter discusses a position without disclosing its size, some theses include an estimated size with positionSize.basis: "estimated_from_13f_adviser". Read the disclosures on that basis before using the number:
  • The denominator is the adviser’s aggregate 13F portfolio value (adviserTotal13FValueUsd, asOfQuarter are included), not the fund’s net asset value. For a multi-fund adviser those differ materially, and estimates are suppressed entirely when the adviser clearly runs multiple funds.
  • Estimates exist only for long-family relationships. 13F reports cover long positions in 13(f) securities, so short positions can never be estimated this way.
  • Estimates are computed from share-type 13F rows only; put and call entries are excluded.
  • 13F data is filed with a delay, so the estimate reflects the most recent reported quarter, which may not be the letter’s period.
A stated positionSize with a different basis is the manager’s own disclosure from the letter, with an anchor like any other extracted value.

Document access by distribution tier

Every letter carries a distribution field that governs document access: For third_party letters, follow the sourceUrl to the original document. Thesis extractions and structured fields remain fully available across all three tiers; the tiers only govern serving the document body. format=pdf returns a 302 redirect rather than bytes, so pass -L to curl:

Letter types and sources

Filter the corpus by what kind of letter and where it came from:
  • letter_type=hedge_fund_letter — letters from hedge funds and private partnerships, sourced from the funds’ own publication channels.
  • letter_type=registered_fund_letter — shareholder letters extracted from N-CSR and N-CSRS reports filed with the SEC. Since mid-2024, open-end mutual funds and ETFs generally no longer include manager letters in their filed shareholder reports, so filed-report coverage concentrates in closed-end funds while open-end commentary comes from fund websites.
  • source=fund_website | edgar | aggregator — where the document was retrieved. source records retrieval; distribution governs document access.
Period filters accept period=YYYYQn or separate year and quarter integers, plus published_from / published_to date bounds.

Search the letter bodies

Beyond structured filters, search the full letter text lexically or semantically:
Search hits carry highlights[] with a snippet and a page anchor, and semantic hits carry {score, letter, chunkText, anchor} — the same anchor shape as thesis quotes, so search results verify against document?format=markdown the same way.

Fund Letters product overview

Endpoints, billing, and plan access for the fund-letters surface.

Ownership workflows

The 13F and institutional-ownership flows behind the cross-links.

Migrate from Fiscal.ai

Endpoint, identifier, and pagination mapping for Fiscal.ai fund-letters users.