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

# SEC Filing Read

> Extract the full text of a specific item from a SEC 10-K, 10-Q, or 8-K filing — the read half of the progressive-disclosure pattern.

<Note icon="sparkles">
  **Available as MCP tool**: `sec_filing_read` — call directly from Claude / Cursor / any MCP client. See [MCP Server](/en/integration/mcp-server) for the 60-second setup.
</Note>

<Badge color="green" icon="circle-check">Live</Badge>
 
<Badge color="blue" size="sm">1 credit per call</Badge>

## What it does for your agent

`sec_filing_read` is the **second step** in SEC Filing's progressive-disclosure pattern: after `sec_filing_browse` returns the list of filings for a ticker, use this tool to extract the full text of a specific item (Risk Factors, MD\&A, Financial Statements, earnings press releases, etc.). Pass either `accession_number` (recommended after browse, and **required for 8-K**) or `year` / `quarter` plus the section code(s), and the response carries the section text plus a manifest of the filing's other sections. Pass `items` (an array) to pull several sections in one call — still 1 credit — and a requested code the filing doesn't have is simply dropped from the result rather than erroring.

`sec_filing_read` is **not semantic search**: it performs parameterized lookup by `(ticker, filing_type, accession_number OR year[+quarter], item)` and returns the exact section text — no relevance ranking, no fuzzy matching.

## Response

<ResponseField name="data" type="FilingReadResult" required>
  <Expandable title="FilingReadResult fields">
    <ResponseField name="ticker" type="string" required>The ticker symbol.</ResponseField>
    <ResponseField name="filing_type" type="string" required>Filing type — `10-K`, `10-Q`, or `8-K`.</ResponseField>
    <ResponseField name="accession_number" type="string" required>SEC accession number of the matched filing.</ResponseField>
    <ResponseField name="year" type="integer" nullable>Calendar year of `period_of_report` (`null` for 8-K — event-driven, no period).</ResponseField>
    <ResponseField name="quarter" type="integer" nullable>Quarter of `period_of_report` (1-4 for 10-Q; `null` for 10-K and 8-K).</ResponseField>

    <ResponseField name="available_sections" type="SectionManifest[]" required>
      Manifest of every extractable section in this filing — use this to discover what else you could read.

      <Expandable title="SectionManifest fields">
        <ResponseField name="section_key" type="string" required>Item code (`1`, `1A`, `7`, `part1item2`, `item2.02` …).</ResponseField>
        <ResponseField name="section_title" type="string" required>Section name (`Business`, `Risk Factors` …).</ResponseField>
        <ResponseField name="ordinal" type="integer" required>Display order within the filing.</ResponseField>
        <ResponseField name="char_count" type="integer" required>Character count, or `0` if the section has not been read yet.</ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="items" type="Item[]" required>
      Extracted section content for the requested `items` (or every section when none are specified). Codes absent from the filing are omitted here — cross-check `available_sections`.

      <Expandable title="Item fields">
        <ResponseField name="number" type="string" required>Item code (e.g. `1A`, `part1item2`).</ResponseField>
        <ResponseField name="name" type="string" required>Section name (e.g. `Risk Factors`, `MD&A`).</ResponseField>
        <ResponseField name="text" type="string" required>Plain-text section body extracted from the filing.</ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="meta.creditsUsed" type="number">Credits consumed (always `1`).</ResponseField>
<ResponseField name="meta.remainingCredits" type="number">Account credits remaining.</ResponseField>

```json title="200 OK · sec_filing_read" expandable theme={null}
{
  "data": {
    "ticker": "NVDA",
    "filing_type": "10-K",
    "accession_number": "0001045810-26-000021",
    "year": 2025,
    "quarter": null,
    "available_sections": [
      { "section_key": "1", "section_title": "Business", "ordinal": 1, "char_count": 48578 },
      { "section_key": "1A", "section_title": "Risk Factors", "ordinal": 2, "char_count": 32100 },
      { "section_key": "7", "section_title": "MD&A", "ordinal": 10, "char_count": 25400 }
    ],
    "items": [
      {
        "number": "1A",
        "name": "Risk Factors",
        "text": "Item 1A. Risk Factors\n\nOur business, financial condition and operating results may be materially affected by..."
      }
    ]
  },
  "meta": { "creditsUsed": 1, "remainingCredits": 99 }
}
```

## Notes

<Tip>
  **Two-step lookup is canonical**: call `sec_filing_browse` first (free) to get the list of filings, grab the `accession_number` you want, then call `sec_filing_read` (1 credit) with that accession + a specific `item`. This avoids ambiguity around `period_of_report` vs `filed_at` years for 10-Q.
</Tip>

<Tip>
  Inspect `available_sections[i].char_count` before pulling more sections — long items (Risk Factors, MD\&A) can be tens of thousands of characters. Read one section per call to keep agent context small.
</Tip>

<Tip>
  Need several sections from one filing? Pass `items` (e.g. `["item2.02","item9.01"]`) to fetch them in a single call — still 1 credit — and skip pulling large exhibits you didn't ask for.
</Tip>

<Warning>
  **10-K, 10-Q, and 8-K use different item code systems** — see the parameter reference below. Mixing them returns `400`.
</Warning>

<Warning>
  **Missing codes are dropped, not errored.** A format-valid `item` / `items` code the filing doesn't contain is omitted from the result (check `available_sections` for what exists). The call returns `400` only when *none* of the requested codes can be returned; a malformed code (wrong system for the filing type) still returns `400`.
</Warning>

<Warning>
  For 10-Q, **`year` alone is not enough** — you must pass either `year + quarter`, or `accession_number`. `year` for 10-Q without `quarter` returns `400`.
</Warning>

<Warning>
  **8-K must be located by `accession_number`.** It is event-driven (many filings per year), so `year` / `quarter` cannot identify one — browse first, then read by `accession_number`. Passing `year` or `quarter` for 8-K returns `400`.
</Warning>

<Warning>
  Plain-text output only. HTML / structured tables are not exposed by this tool. Very recently filed reports may take a moment to become available while they are processed.
</Warning>

## Direct invocation

<Accordion title="HTTP / SDK examples" icon="terminal">
  <CodeGroup>
    ```typescript MCP (Claude / Cursor) theme={null}
    // 1) Browse to get the list of filings
    {
      "method": "tools/call",
      "params": {
        "name": "sec_filing_browse",
        "arguments": { "ticker": "NVDA", "filing_type": "10-K", "limit": 5 }
      }
    }

    // 2) Read Risk Factors + MD&A (items 1A, 7) from the latest 10-K in one call
    {
      "method": "tools/call",
      "params": {
        "name": "sec_filing_read",
        "arguments": {
          "ticker": "NVDA",
          "filing_type": "10-K",
          "accession_number": "0001045810-26-000021",
          "items": ["1A", "7"]
        }
      }
    }
    ```

    ```python Python (HTTP) theme={null}
    import os, requests

    base = "https://api.llmquantdata.com"
    headers = {"Authorization": f"Bearer {os.environ['LLMQUANT_API_KEY']}"}

    # 1) Browse
    filings = requests.get(
        f"{base}/api/filings",
        headers=headers,
        params={"ticker": "NVDA", "filing_type": "10-K", "limit": 5},
    ).json()["data"]

    # 2) Read items 1A + 7 from the most recent 10-K in one call
    latest = filings[0]
    resp = requests.get(
        f"{base}/api/filings/sections",
        headers=headers,
        params={
            "ticker": "NVDA",
            "filing_type": "10-K",
            "accession_number": latest["accession_number"],
            "items": "1A,7",
        },
    ).json()
    print(resp["data"]["items"][0]["text"][:500])
    ```

    ```bash cURL theme={null}
    # 1) Browse
    curl "https://api.llmquantdata.com/api/filings?ticker=NVDA&filing_type=10-K&limit=5" \
      -H "Authorization: Bearer $LLMQUANT_API_KEY"

    # 2) Read items 1A + 7 in one call
    curl "https://api.llmquantdata.com/api/filings/sections?ticker=NVDA&filing_type=10-K&accession_number=0001045810-26-000021&items=1A,7" \
      -H "Authorization: Bearer $LLMQUANT_API_KEY"
    ```
  </CodeGroup>
</Accordion>

## Full parameter reference

<Accordion title="sec_filing_read — request parameters" icon="sliders">
  <ParamField query="ticker" type="string" required>
    U.S. equity ticker (e.g. `AAPL`, `NVDA`, `META`).
  </ParamField>

  <ParamField query="filing_type" type="string" required>
    Filing type — `10-K`, `10-Q`, or `8-K`.
  </ParamField>

  <ParamField query="year" type="integer">
    Calendar year of `period_of_report`. **Required** for 10-K when `accession_number` is omitted; required together with `quarter` for 10-Q when `accession_number` is omitted. Not used for 8-K (locate by `accession_number`).
  </ParamField>

  <ParamField query="quarter" type="integer">
    Quarter of `period_of_report` (1-4). Only valid for 10-Q (rejected for 10-K and 8-K). Required when looking up a 10-Q by `year` (without `accession_number`).
  </ParamField>

  <ParamField query="items" type="string[]">
    Fetch several sections in one call. Over HTTP, comma-separate them (`items=item2.02,item9.01`); for the MCP tool, pass an array. The codes are the same as `item` below. Up to 25 per call, duplicates removed, still 1 credit. A code this filing doesn't have is skipped; you only get a `400` when none of them match. Omit to return every section.
  </ParamField>

  <ParamField query="item" type="string">
    Singular alias for `items` (HTTP only; the MCP tool exposes only `items`) — equivalent to `items=[<item>]`. Omit to return every extractable section.

    **10-K item codes:** `1`, `1A`, `1B`, `1C`, `2`, `3`, `4`, `5`, `6`, `7`, `7A`, `8`, `9`, `9A`, `9B`, `10`, `11`, `12`, `13`, `14`, `15`.

    **10-Q item codes:** `part1item1`, `part1item2`, `part1item3`, `part1item4`, `part2item1`, `part2item1a`, `part2item2`, `part2item3`, `part2item4`, `part2item5`, `part2item6`.

    **8-K item codes:** vary per filing (event-driven) — e.g. `item2.02` (earnings / Results of Operations), `item5.02` (executive changes), `item1.01` (material agreement), `item8.01` (other events), plus exhibits like `ex99.1` (press release). Read `available_sections` from any response to see the exact set a given 8-K contains.

    Common picks: 10-K `1` (Business) · `1A` (Risk Factors) · `7` (MD\&A) · `8` (Financial Statements) · `10` (Directors / Officers); 10-Q `part1item1` (Financial Statements) · `part1item2` (MD\&A) · `part2item1a` (Risk Factors).
  </ParamField>

  <ParamField query="accession_number" type="string">
    Exact SEC accession number (e.g. `0001045810-26-000021`). Recommended after `sec_filing_browse`, and **required for 8-K**. Cannot be combined with `year` or `quarter`.
  </ParamField>
</Accordion>

## Related

<Columns cols={3}>
  <Card title="SEC Filing Browse" icon="folder-open" href="/en/api/filings/browse">
    Step 1 — list available filings for a ticker before calling read.
  </Card>

  <Card title="13F Holdings by Manager" icon="briefcase" href="/en/api/filings/13f-by-manager">
    Institutional ownership data — a different SEC filing family (Form 13F).
  </Card>

  <Card title="MCP Server setup" icon="plug" href="/en/integration/mcp-server">
    Connect Claude / Cursor / any harness in 60 seconds.
  </Card>
</Columns>
