Year-over-year structural diff, paragraph by paragraph

See what changed since last year

What did Apple change in its risk factors between the 2024 and 2025 10-K?

One call, once you have two accession numbers. The answer is not a wall of changed characters: it is paragraphs classified as added, removed or changed, where a changed pair carries both versions, a similarity score and a citation for each side. Four added words inside one paragraph show up as four added words.

Recorded Apple Inc., 10-K 2024-11-01 against 10-K 2025-10-31, on 23 October 2026 against parser version 3. Responses are trimmed to the fields the example is about; elisions are marked.

diff_sections

Align the two versions of one section and report only what moved.

Request

{
  "tool": "diff_sections",
  "arguments": {
    "accession_a": "0000320193-24-000123",
    "accession_b": "0000320193-25-000079",
    "section": "item_1a_risk_factors",
    "max_tokens": 1500,
    "ticker": "AAPL"
  }
}

Response

{
  "data": {
    "changed": [
      {
        "similarity": 0.71,
        "before": {
          "text": "... can materially adversely affect the Company's business,
                   results of operations and financial condition.",
          "para_idx": 4,
          "citation": "0000320193-24-000123 item_1a_risk_factors para 4 chars 25438-25677 parser v3"
        },
        "after": {
          "text": "... can materially adversely affect the Company's business,
                   results of operations, financial condition and stock price.",
          "para_idx": 3,
          "citation": "0000320193-25-000079 item_1a_risk_factors para 3 chars 25607-25859 parser v3"
        }
      }
      // ... 1 more on this page
    ],
    "added": [ /* 2 on this page */ ],
    "removed": [ /* 3 on this page */ ]
  },
  "meta": {
    "before": { "paragraph_count": 115, "char_length": 68458 },
    "after":  { "paragraph_count": 106, "char_length": 67734 },
    "similarity_threshold": 0.5,
    "unchanged_count": 46, "added_count": 24,
    "removed_count": 33, "changed_count": 36,
    "returned": 7, "returned_tokens": 1445,
    "next_page_token": "eyJ2IjoxLCJzIjoiaXRlbV8xYV9yaXNrX2ZhY3RvcnMiLCJwYSI6MywicGIiOjMsImkiOjd9"
  }
}

The changed pair above is the whole point: Apple added "and stock price" to the end of one sentence, and the paragraph moved from index 4 to index 3 because a paragraph above it was removed. A character differ reports both of those, indistinguishably, as a rewrite of everything that follows.

What to take from this

  • The unit is the paragraph, not the line. Reflowing one sentence shifts every byte after it, which is why a line differ on a filing reports a 60,000-character change where a filer added one clause.
  • Alignment is a patience diff over normalized paragraph text, anchored only on paragraphs that occur exactly once in each version. A 10-K repeats whole sentences of boilerplate, and anchoring on a repeated line pairs text with a copy of itself somewhere else in the document.
  • Between anchors, paragraphs are paired by word-trigram similarity against a threshold, 0.5 by default and yours to move. Above it you get one changed pair; below it you get an insertion and a deletion that happen to be adjacent. No embeddings, no model, no network.
  • The counts in meta describe the whole diff while the arrays are one page of it, so an agent can report 24 added and 33 removed without paging through all of them.

Next: Track one item across several years. Or run these tools against a filer of your own in the filing explorer, or read the full argument reference under the filings API.