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.
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.
cosineTF 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.
jaccardToken-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_embeddingCosine 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_divergenceThe 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_universeWhere 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_suspectedBoolean. 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-31Every 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
# 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:
[{
"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
| Tier | Price | Calls / mo | Universe & delivery |
|---|---|---|---|
| Free | $0 | 250 | Top-100 tickers · REST |
| Starter | $100/mo | 50K | 5K tickers · REST + GCS parquet |
| Pro | $300/mo | 500K | All tickers · REST + Iceberg (Snowflake/BigQuery) |
| Enterprise | Custom | Unlimited | All Pro + Analytics Hub + SLAs |
The Filing Change Signal is metered on every tier. Full plan details on the pricing page.
Browse by ticker
Top 100 below. Each page shows the change record shape and endpoint for that issuer at /filings/TICKER.
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.