Fiscal.ai API - Fund Letters

The complete guide to the Fund Letters endpoints — investor letters, extracted company theses, permanent identifiers, coverage, and how the corpus is curated.

Fund Letters gives you what professional investors actually write about companies: thousands of quarterly, annual, and interim letters from hedge funds, mutual funds, and investment partnerships — parsed into structured, per-company investment theses you can query by company, investor, fund, or period.

What the corpus covers

Fiscal.ai continuously collects investor letters from public sources, extracts their content with a research-grade pipeline, and publishes a curated corpus:

  • Thousands of letters from hundreds of investment firms, covering reporting periods from 2020 to the present, with new letters added daily.
  • A structured thesis for every company materially discussed in each letter — its stance, conviction, position sizing, thesis/risk/catalyst/valuation summaries, and a representative verbatim quote.
  • Letter-level context — market backdrop, portfolio positioning, performance narrative, and structured performance figures against the fund's benchmark.
  • Investor profiles — each firm's strategy, style, sector and geographic focus, evidenced from its own letters.

The corpus is deliberately curated. Only letters whose full content was captured and passed quality checks are published; paywalled fragments, scanned images with unreliable text, and non-letter documents are excluded. The same letter distributed through multiple channels appears exactly once. Only companies in the Fiscal.ai coverage universe are linked, so every thesis resolves to a real, queryable company.

The data model

Four entity types, linked by permanent identifiers:

Investor (investment firm)
  └── Funds (the vehicles it manages)
        └── Letters (its published letters, each stamped with a reporting period)
              └── Theses (one per security materially discussed)
                    └── Company (resolved Fiscal.ai company)
EndpointPurpose
GET /v1/fund-lettersThe letters for a calendar year (optionally one quarter), newest first. Narrow by investorId/fundId. API reference
GET /v1/fund-letters/{letterId}One letter in full: narratives, performance figures, and every company thesis. API reference
GET /v1/fund-letters/{letterId}/pdfThe original letter document. API reference
GET /v1/fund-letters/investorsEvery covered investment firm with coverage stats and style profile. API reference
GET /v1/fund-letters/investors/{investorId}One firm's full profile, funds, and letter feed. API reference
GET /v1/fund-letters/companiesEvery company with at least one thesis, with coverage stats. API reference
GET /v1/company/fund-lettersEverything investors say about one company — the full thesis feed. API reference

Identifiers

Fund-letter entities carry their own identifier family, distinct by design from company identifiers so the two can never be confused:

IdentifierExampleIdentifies
letterIdfscl_document_5TXS2CWP534One published letter (and its PDF)
investorIdfscl_investor_4NYT7FZS641One investment firm
fundIdfscl_fund_8QHH7PGT769One fund/vehicle

These identifiers are permanent: they never change across publishes, and they are checksummed, so a mistyped identifier fails validation instead of silently resolving to the wrong record. If two records are ever discovered to be the same real-world entity (for example, the same firm ingested under two names), they are merged rather than deleted — previously returned identifiers keep resolving.

Company references inside fund-letter responses use the exact field naming of the v3 Companies ListcompanyFiscalIdentifier, companyKey, displayNameEnglish, the GICS hierarchy, marketCapUsd, and a nested primaryListing — so a company block read from a fund letter is interchangeable with one read from any other endpoint.

Counts drift by design:

Coverage counts (letters, investors, companies, theses) can change slightly between daily publishes: new letters arrive, and company links follow the live Fiscal.ai universe. Treat count deltas as normal, not as errors. Identifiers never change.

Theses: what the letter actually says

A thesis is published only when the letter materially discusses a company — a passing index mention never becomes a thesis. The materialityBasis field states why the discussion qualified:

ValueThe letter contains…
substantive_thesisA substantive investment argument for the company
performance_attributionThe position's contribution to fund performance
portfolio_actionA buy/trim/exit action taken in the period
meaningful_position_sizeDisclosure of a meaningful position size
valuation_discussionA valuation argument
catalyst_discussionIdentified catalysts
risk_or_bear_caseA risk discussion or bear case
substantive_negative_viewA substantive negative/short view
mistake_or_exit_reviewA post-mortem of a mistake or exit

Each thesis carries the investor's decision context:

FieldValues
relationshiplong, short, new_position, added, trimmed, sold, exited, watchlist, negative_research, issuer
stancebullish, bearish, mixed, neutral
convictionhigh, medium, low, unknown
timeHorizonshort_term, medium_term, long_term (nullable)
positionSizePercentNumeric percent, only when the letter discloses it for this security individually (nullable)
positionSizeBasisWhat the percent is measured against: portfolio, fund, nav, aum, net, gross, other (nullable)

The narrative fields (thesisSummary, variantPerception, riskSummary, catalystSummary, valuationSummary, businessQualitySummary, managementAssessment, capitalAllocationSummary, financialExpectations, performanceOrActionSummary) summarize what the letter itself argues — they are extractions, not Fiscal.ai's opinion. sourceQuote carries a representative verbatim passage. Fields are null when the letter simply doesn't address that dimension.

Periods

Every letter carries one canonical period, in three convenient forms:

  • reportPeriod — the canonical YYYYQn key (e.g. 2026Q1). The same format is used by firstPeriod/latestPeriod in every coverage stat, so periods compare and group consistently across the whole API.
  • reportPeriodYear + reportPeriodQuarter — the same period as integers (annual letters are assigned the quarter their period ends in). The year/quarter filters on /v1/fund-letters match against these.
  • periodLabel — the reporting period exactly as the letter states it (free text, e.g. "Quarter Ended March 31, 2026"; nullable).

Querying a company

GET /v1/company/fund-letters accepts every standard company identifier — companyKey, ticker + exchange/micCode, cik, figi, fscl, or (license-permitting) isin/cusip — exactly like the rest of the API. See Company Querying. Company keys are uppercase and case-sensitive, and a few contain characters that must be URL-encoded in query strings (XNSE_M&McompanyKey=XNSE_M%26M).

The response is the company's complete thesis feed, newest reporting period first, each thesis with a reference to the investor, fund, and letter it came from. Companies without fund-letter coverage return 404; /v1/fund-letters/companies lists the covered universe.

Access and plans

Fund Letters requires the fund_letters feature on your API key — contact sales to add it to your plan. On the free trial, /v1/company/fund-letters is available for the free-trial companies; the corpus-wide list endpoints require the feature. Standard rate limits apply.