VectorFin/Filing Change Signal
filings/changesLive · ~235 tickers

Filing Change Signal

Narrative Drift on SEC filings

Companies rarely announce that something changed. They edit the disclosure quietly, and the edit shows up months before the price does. The Filing Change Signal reads every new 10-K and 10-Q against the same issuer's prior-year filing and tells you, section by section, how much the language moved and whether the meaning moved with it.

Why it matters

The Zillow tell

In its fiscal-2020 10-K, Zillow quietly expanded its risk-factor language around Zillow Offers, the iBuying business that bought homes to flip. Nothing in the headline numbers forced the change; the words simply got more cautious. Over the following year the company wound the program down and the stock fell sharply. The disclosure moved first.

That is the pattern academics call Lazy Prices (Cohen, Malloy & Nguyen, Journal of Finance, 2020): firms that change how they describe themselves tend to be telling you something, and markets are slow to read it. We do not publish a return target or sell a backtest of our own here — Zillow is an illustration of the mechanism, not a promise. What we ship is the measurement that surfaces these edits consistently, across every covered filing, the week they land.

Universe

~235 tickers

Forms

10-K + 10-Q

Refresh

Weekly (Sun)

Sections

risk_factors · mda · document

Delivery

REST · Iceberg

Bitemporality

effective_ts + knowledge_ts

Two readings of a change, and the gap between them

Most filing-diff tools only count words that moved. That floods you with noise: legal teams reformat boilerplate every year. We compute a lexical change and a semantic change for each section, then publish the gap. When the words moved but the meaning did not, you are looking at a reshuffle. When both moved together, like Zillow, you are looking at a real shift.

cosine

Lexical change — cosine

TF cosine over the section text, numbers kept (the Cohen-Malloy-Nguyen method). Change = 1 − cosine. Catches reworded sentences and reordered paragraphs that keyword diffs miss.

jaccard

Lexical change — jaccard

Token-set Jaccard. Change = 1 − jaccard. A set-overlap view that is blunt to phrasing but sensitive to vocabulary the issuer added or dropped this year.

cosine_embedding

Semantic change

Cosine over 768-dim Gemini section embeddings (gemini-embedding-2-preview). Change = 1 − cosine_embedding. Measures whether the meaning moved, not just the words.

lex_sem_divergence

Lexical-semantic divergence

The differentiator: (1−cosine) − (1−cosine_embedding). High lexical with low semantic = a format reshuffle (format_switch_suspected). High on both = a genuine disclosure shift worth reading.

change_pctile_universe

Cross-sectional percentile

Where this filing's change ranks across the universe, computed as-of its own knowledge_ts. No look-ahead: a filing is never ranked against changes that were not yet knowable.

format_switch_suspected

Format-switch flag

Boolean. Set when the words moved a lot but the meaning barely did — a template swap or HTML reformat. Lets you down-weight noise instead of chasing it.

Point-in-time, by construction

2026-06-142025-12-31

Every record carries two clocks. The effective_ts is the period the filing reports on; the knowledge_ts is the moment EDGAR accepted it, which is the first instant the change was knowable. Percentiles are ranked as-of that knowledge_ts, so a backtest never sees a filing ranked against changes from the future. Tables are append-only; we never rewrite a row.

We also keep honest nulls. When an issuer declares no material changes to a section, parse_status comes back empty rather than a fabricated zero. When a section is incorporated by reference, not_found says so. We never invent a metric to fill a gap.

Coverage and cadence

The signal covers our ~235-ticker universe across both annual and quarterly reports. A 10-K is compared to the prior-year 10-K; a 10-Q is compared to the same quarter a year earlier, so seasonal disclosure (a Q3 versus a Q4) never masquerades as a change. The pipeline refreshes weekly, on Sundays, picking up whatever the issuers filed during the week.

Each filing is scored at three grains: risk_factors (Item 1A), mda (Item 7, Management's Discussion & Analysis), and document (the whole filing). Risk factors are usually where the quiet edits live.

One call

bash
# Year-over-year change metrics for the latest AAPL filings
curl https://api.vectorfinancials.com/v1/filings/AAPL/changes \
  -H "X-API-Key: vf_sk_your_key_here" \
  -G \
  -d "form_type=10-K" \
  -d "section=risk_factors" \
  -d "limit=5"

Returns a JSON array of FilingChangeRecord. Each record carries the comparison pair and a per-section breakdown:

json
[{
  "ticker": "AAPL", "cik": "0000320193",
  "accession": "0000320193-25-000079",
  "prior_accession": "0000320193-24-000123",
  "filing_type": "10-K", "comparison": "yoy_same_type",
  "effective_ts": "2025-09-27T00:00:00Z",
  "knowledge_ts": "2025-11-01T21:14:00Z",
  "sections": [{
    "section_id": "risk_factors", "parse_status": "ok",
    "cosine": 0.91, "jaccard": 0.88,
    "change_pctile_universe": 0.74,
    "cosine_embedding": 0.97,
    "lex_sem_divergence": 0.06,
    "format_switch_suspected": false,
    "word_count": 14820, "prior_word_count": 14110,
    "null_reason": null
  }]
}]

Available on all tiers and metered. See the field reference for every field and how to read it.

Access

TierPriceCalls / moUniverse & delivery
Free$0250Top-100 tickers · REST
Starter$100/mo50K5K tickers · REST + GCS parquet
Pro$300/mo500KAll tickers · REST + Iceberg (Snowflake/BigQuery)
EnterpriseCustomUnlimitedAll Pro + Analytics Hub + SLAs

The Filing Change Signal is metered on every tier. Full plan details on the pricing page.

Read the edits, not the headlines

Free tier covers the top 100 tickers and 250 calls a month, no credit card. Pro delivers the full universe via Iceberg, Snowflake, or BigQuery.