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)
| Endpoint | Purpose |
|---|---|
GET /v1/fund-letters | The 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}/pdf | The original letter document. API reference |
GET /v1/fund-letters/investors | Every 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/companies | Every company with at least one thesis, with coverage stats. API reference |
GET /v1/company/fund-letters | Everything 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:
| Identifier | Example | Identifies |
|---|---|---|
letterId | fscl_document_5TXS2CWP534 | One published letter (and its PDF) |
investorId | fscl_investor_4NYT7FZS641 | One investment firm |
fundId | fscl_fund_8QHH7PGT769 | One 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 List — companyFiscalIdentifier, 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:
| Value | The letter contains… |
|---|---|
substantive_thesis | A substantive investment argument for the company |
performance_attribution | The position's contribution to fund performance |
portfolio_action | A buy/trim/exit action taken in the period |
meaningful_position_size | Disclosure of a meaningful position size |
valuation_discussion | A valuation argument |
catalyst_discussion | Identified catalysts |
risk_or_bear_case | A risk discussion or bear case |
substantive_negative_view | A substantive negative/short view |
mistake_or_exit_review | A post-mortem of a mistake or exit |
Each thesis carries the investor's decision context:
| Field | Values |
|---|---|
relationship | long, short, new_position, added, trimmed, sold, exited, watchlist, negative_research, issuer |
stance | bullish, bearish, mixed, neutral |
conviction | high, medium, low, unknown |
timeHorizon | short_term, medium_term, long_term (nullable) |
positionSizePercent | Numeric percent, only when the letter discloses it for this security individually (nullable) |
positionSizeBasis | What 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 canonicalYYYYQnkey (e.g.2026Q1). The same format is used byfirstPeriod/latestPeriodin 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). Theyear/quarterfilters on/v1/fund-lettersmatch 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&M → companyKey=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.