Distill Markets · Methodology · Version 2026.10.1 · Revised 24 October 2026 · Last reviewed 24 October 2026
Methodology
How the data is built, from the filing to the served field, and how it changes. Every per-company value names the filing and the XBRL concept it came from, so it can be checked against EDGAR. Computed metrics and aggregates are our work, so their rules are stated here in full, with where they stop.
Scope and sources
Sources
- SEC EDGAR, public domain
- The XBRL financial facts in 10-K and 10-Q filings, the filings index, Forms 3, 4 and 5, Schedules 13D and 13G, 13F-HR reports, 8-K item codes, and the registration, Form 25 and Form 15 filings that date a listing. Facts filed before XBRL are parsed from the text of each 10-K and held to a separately measured standard.
- Government agencies
- The macro series, read from each publisher directly: the Bureau of Labor Statistics, the Census Bureau, the Energy Information Administration, the Federal Reserve Board and the Federal Reserve Bank of Chicago. None of it comes from the SEC.
- Our classification
- Sector and industry labels on ticker search come from our own classification. The screener’s sector is mapped from the filer’s SEC SIC code, with a curated correction on the live screen.
Coverage is US domestic filers of 10-K and 10-Q. At 2015-12-31 the as-of universe holds 3,925 issuers (listed, over the revenue floor; the covered-company count on the docs ramp is a wider basis), read 24 October 2026. The floor and the way screen and export counts differ are under Revenue floor.
Companies filing 20-F or 40-F are outside every computed surface: the screener, sector aggregates, Piotroski, Altman and Sloan, the health ratios, capital cycles, revisions and every as-of view. They resolve on the company profile and the raw fundamentals lookup only. A 404 from a computed endpoint for a ticker that resolves on the profile means outside coverage. Absence from a screen is not evidence about a company.
What this data is
Each dataset below says where it comes from, the span it covers, how often it refreshes and where it stops. A filed dataset holds values as their source stated them; a computed one is our calculation under the rules on this page. A fact we have not measured on a deployed environment is left off its card.
XBRL facts
filedThe financial values filers tag in their XBRL filings, one row per concept and period, each carrying the accession and filing date it came from.
- Source
- The SEC companyfacts API, and the filing’s own XBRL instance document where companyfacts has not yet published a 10-K or 10-Q.
- Refresh
- Nightly at 23:30 UTC: filers with a new 10-K or 10-Q since their last fetch, plus the 200 longest unfetched. Filings 5 to 120 days old with no facts on file are read from their instance document, listed issuers first, up to 100 a night on production.
- Basis
- Filed: the value as its source stated it, checkable against the original.
LimitsOnly tags in the concept registry are loaded; a tag outside it is never ingested.
Cite asCIK · accession · read YYYY-MM-DD
Fact versions
filedEvery statement of a fact by every 10-K and 10-Q, amendments included, kept beside the earlier ones and keyed to the accession and filing date.
- Source
- The SEC’s quarterly Financial Statement Data Sets.
- Range
- Quarterly data sets from 2009q2.
- Refresh
- Checked nightly; a quarter is imported when the SEC publishes its data set, about four times a year, so filings from the current quarter arrive after it closes.
- Basis
- Filed: the value as its source stated it, checkable against the original.
LimitsPeriodic reports only (10-K, 10-Q, their amendments and transition forms); a row with no filing date is skipped, never given one.
Cite asCIK · accession · filing date · read YYYY-MM-DD
As-of universe
computedThe screenable universe at each calendar quarter-end, computed from the fact versions on file at that date under the current rules.
- Source
- Fact versions, with the listing and ticker history built from EDGAR submissions.
- Range
- Calendar quarter-ends from 2009-06-30.
- Refresh
- Rebuilt on demand when a scoring or identity rule changes; each build is named by its vintage.
- Basis
- Computed: our calculation under the rules stated in the methodology.
LimitsA past date’s answer can change when the rules or the fact record change. The vintage names the computation that ran, not the data it read.
Cite asas-of date · vintage · built_at · read YYYY-MM-DD
Text-derived history, FY1995-2009
filedAnnual fundamentals parsed from the text of 10-K filings made before XBRL, held to their own measured precision and served from the verified tier only.
- Source
- The text of each 10-K, parsed once from a fixed EDGAR archive.
- Range
- Fiscal years 1995 to 2009, annual.
- Refresh
- None. A closed corpus, loaded once.
- Basis
- Filed: the value as its source stated it, checkable against the original.
LimitsServed on the Pro tier’s pre2009:read scope.
Cite asCIK · accession · read YYYY-MM-DD
13F holdings
filedQuarterly holdings reported by institutional managers on Form 13F, with related filer CIKs grouped as one holder.
- Source
- 13F-HR and 13F-HR/A filings, parsed from their XML.
- Refresh
- Nightly. A quarter fills in over the 45 days managers have to file.
- Basis
- Filed: the value as its source stated it, checkable against the original.
LimitsEach manager’s book is stored to 95% of its value, at least 10 and at most 200 positions, so the holders listed for a ticker are not a complete register. The nightly parse reads the four trailing quarters; older quarters come from a separately loaded history.
Cite asmanager CIK · accession · quarter · read YYYY-MM-DD
Schedules 13D and 13G
filedBeneficial ownership above 5% of a class, as each reporting person stated it on Schedule 13D or 13G and their amendments.
- Source
- Schedule 13D and 13G filings and amendments, parsed from their XML.
- Range
- Parsed from the EDGAR December 2024 XML cutover forward; earlier filings come from a separately loaded history.
- Refresh
- Nightly at 23:30 UTC.
- Basis
- Filed: the value as its source stated it, checkable against the original.
LimitsFilings before the XML cutover have no structured document; they are never parsed nightly.
Cite asfiler name · accession · read YYYY-MM-DD
Form 4 insider transactions
filedOne row per transaction line an insider reports on Form 4, with the issuer taken from the document itself.
- Source
- Form 4 filings, parsed from their XML.
- Refresh
- Nightly at 23:30 UTC, and every 15 minutes from 13:00 to 21:59 UTC on weekdays.
- Basis
- Filed: the value as its source stated it, checkable against the original.
LimitsThe intraday lane reads EDGAR’s recent-filings feed; a filing that scrolls off it between polls arrives with the nightly run.
Cite asissuer CIK · accession · read YYYY-MM-DD
Macro series
filedGovernment economic series, read from the agency that publishes each one.
- Source
- The Bureau of Labor Statistics, the Energy Information Administration, the Federal Reserve Board, the Federal Reserve Bank of Chicago (the financial conditions index) and the Census Bureau.
- Refresh
- Nightly at 23:30 UTC; each series carries its own frequency (daily, weekly or monthly).
- Basis
- Filed: the value as its source stated it, checkable against the original.
Cite asseries id · observation date · read YYYY-MM-DD
Filing events
filedMaterial 8-K filings, one row per filing, each named by the 8-K item the filer selected and traced to its accession.
- Source
- 8-K filings and their item codes.
- Refresh
- Nightly at 23:30 UTC, and every 15 minutes from 13:00 to 21:59 UTC on weekdays.
- Basis
- Filed: the value as its source stated it, checkable against the original.
LimitsWhere a filing carries several items, the category is the most material specific one; the catch-all items 1.01, 8.01 and 9.01 yield to a specific co-filed item.
Cite asCIK · accession · item · read YYYY-MM-DD
Universe and identity
A row is keyed by the issuer’s CIK, the SEC registrant number, which is the only identifier that survives a symbol being reused or changed. Each row also carries three labels that answer different questions: the symbol the issuer trades under today, the symbol it traded under on the row’s date, and whether its common was exchange-listed on that date.
The identity fields
Identity on an as-of row
cikNumber(cikin the export)- The stable key. Join positions, outside data and later rebalances on it, never on a symbol.
ticker: the current symbol- The symbol the CIK trades under today, carried on every row for readability, at past dates too: a pre-2017 Coach row carries today’s
TPR. One per CIK: the security that trades as its common stock, with preferred, rights, when-issued and unit symbols ranked below it; remaining ties go to the shortest unpunctuated symbol, then the first alphabetically. symbolAtDate: the symbol at the date- Read from the issuer’s own Form 4 filings (the trading symbol the filer enters): the latest calendar quarter with a Form 4 at the date or in the four quarters before it, trailing only, so a symbol first filed after the date never answers for it.
symbolAtDateSourcesays where it came from:form4(a Form 4 named it),form4-none(the Form 4 said the issuer had no trading symbol, so the value is empty) orcurrent-label(no Form 4 in the window, so today’stickerstands in). The quarter’s first Form 4 names the symbol. A later symbol that is not the stem of the row’s ticker, and is the only symbol in the window’s two or more most recent filings, is served from its second quarter (Yahoo reads AABA from its second AABA quarter; a bankruptcy-period over-the-counter symbol reads the same way and gives way to the label’s symbol on its first return). A single filing of another symbol, or one alternating with the label’s, does not displace the label’s class; two filings in a row of a retired symbol do. Otherwise a multi-class issuer serves the class matching the row’s ticker, else the symbol named in the most quarters, else the latest. An over-the-counter venue suffix is dropped, and a filing that names the exchange itself as the symbol counts as no filing. listingStatusAtDate: the listing status at the dateexchangewhen a listing range covers the date,registeredwhen the issuer files with the SEC but no range covers it,neverwhen its filings show no exchange-listed common at any time. A range runs from the registration that listed the common (Form 8-A12B, a Form 10 spin-off registration, an 8-K12B successor) or, failing one, the first insider or ownership filing, to the filing date of the Form 25 that removed the class. It is read from the filing record as it stands today, and nothing filed after the date moves it. It reads null where the issuer’s filing list has not been read, on every row in an environment where the listing ranges are not loaded, and on the live screen.
In the panel export the same values are the columns symbol_at_date, symbol_at_date_source and listing_status_at_date. Their known gaps are under Limitations.
One holder per symbol per date
Symbols get reused: BBBY belonged to Bed Bath & Beyond Inc and now resolves to the Overstock successor that adopted it. A symbol belongs to one issuer per date in the as-of universe, so two rows never share a label (checked nightly).
Symbol claimants
- The issuer that holds the symbol today
- Keeps it at every date, shown as that issuer’s current symbol (another of its own symbols when it holds several).
- Every other issuer that has held the symbol
- Stays in the universe under a CIK label instead:
CIK0000886158is Bed Bath & Beyond Inc at any date. - A predecessor whose symbol’s current holder has no row at the date
- Keeps the symbol at those dates, for example before a successor was formed.
Listed equity
The screener covers US-listed common equity of US domestic filers. Many entities file XBRL without ever being a listed stock: captive finance subsidiaries, bond vehicles, preferred-stock trusts, ETFs. Each CIK is classified from its EDGAR submissions record, and preferred-share symbols are excluded.
Listing classification
- An exchange listing, a current ticker, or a Form 25 delisting notice on file
- Equity: in the universe.
- Keeps filing with none of those
- Shell: dropped from the screen.
- Not yet classified
- Kept. The rule fails open, so a company is never silently dropped.
- On an as-of date
- Never-listed shells are excluded at every date, and an issuer drops off once its listing has ended. The listing end is the date of a Form 25 (exchange delisting), a Form 15 (Section 12 deregistration), a symbol reassigned to a new CIK, or the ever-listed crawl’s own signal; the export names which in
listing_end_source. A source does not distinguish an acquisition from a bankruptcy.
Revenue floor
The universe is issuers with revenue of at least $10M. The panel export applies the floor as a retention rule. An issuer enters on the first quarter-end at which an annual report carrying a twelve-month income statement that clears the floor is on file, and stays until its listing ends. A company whose revenue later collapses is still a row, with its revenue as filed. A newly listed company, a spin-off or a merger successor joins with its first 10-K, not its first 10-Q. For a bank that tags no revenue total, the floor is read off revenue_financial_basis (see Financials, real estate and IFRS).
The as-of screen applies the floor to each row separately and reads revenue alone, so it can omit an issuer the export keeps, among them every pre-2018 bank that tags no revenue total. It reports the size of its own universe at the requested date as universeCount, so its count for a date can be lower than the export’s.
Ticker to CIK
A ticker in a request resolves to a CIK through the live SEC mapping first, then through a ticker history built from EDGAR submissions, which covers delisted and renamed issuers. Where a symbol has been reused, the most recently active mapping wins. A company with several share classes (GOOG, GOOGL) files once under one CIK, so it is one row in a screen and one input to a sector median.
Facts and concepts
From tag to concept
Filers tag the same line under different us-gaap tags. Revenue alone is tagged several ways. A registry maps the tags in use onto the served concepts and is also the ingestion whitelist: a tag outside it is never loaded. Where several mapped tags are present for one period, one is chosen.
Concept selection
- The concept has a priority chain (revenue, equity, long-term debt, the cash flows, net income and others)
- The first tier with any tagged value wins; inside a tier, the largest absolute value. For revenue, a tier whose winner is zero is skipped, and a tier winner below 80% of the largest mapped revenue tag loses to that tag.
- The concept has no chain (capex, depreciation, dividends, shares outstanding)
- The largest absolute value.
- Only a fallback alias is present
- Used only when no primary tag exists for that period; see Fallback aliases.
Every served fundamental names the tag it came from (revenueConceptUsed and its siblings), so the choice can be checked against the filing.
Where the facts come from
The nightly sync reads the SEC companyfacts feed. A new 10-K or 10-Q can take days to weeks to appear there, so the sync keeps asking for 21 days before returning the filer to the ordinary rotation. Each night, 10-K and 10-Q filings of ticker-mapped filers made 5 to 120 days ago with no facts on file (up to 100 a night, listed issuers first) are read from their XBRL instance document, the document companyfacts is built from, and loaded under the same key with their accession and filing date. Only non-dimensional numeric facts of the filer itself are kept. The fact versions behind point-in-time reads come from a different feed, the SEC’s quarterly financial statement datasets (see How the data changes).
Plausibility and staleness
A guard withholds a value, never corrects one
- A balance-sheet concept is more than 180 days behind the ticker’s newest period end
- Null. The usual cause is a tag the filer migrated to that is not mapped yet.
- An income or cash-flow value sits more than 45 days from the latest period
- Null, so an annual figure is never served as a quarter.
- An annual value is older than 15 months
- Null.
- Long-term debt exceeds total liabilities (or total assets) at the same period
- The row is removed.
- Revenue exceeds 50 times total assets, with assets of at least $1M
- The row is removed.
- A weighted-average share count is at the wrong scale against period-end shares or the series’ own median
- The row is removed.
Period ends on a 52- or 53-week year
Filers on a 52- or 53-week fiscal calendar end their year on a weekday near month-end, such as 29 or 30 December. The stored periodEnd is normalised to month-end, so it can sit about a day from the date printed on the filing. The value is unchanged, and periods stay comparable across filers.
How the data changes
A point-in-time read returns the filing record we hold, under the methodology version in force when it is computed. It changes for three reasons only: a filing that reaches us late (fact versions are loaded from the SEC’s quarterly financial statement datasets, so a read for a recent date fills in when the SEC publishes, each filing keeping its real filing date); a correction to our own parsing or computation; or a rule change, which moves the methodology version. Corrections and rule changes are listed, dated, at /changelog. Every as-of screen response and every panel export row names the build that produced it invintageandbuilt_at(builtAtin the JSON screen response). Earlier builds are kept but not served, so to re-run a backtest on exactly the data it used, save the export and itsvintagewith your results.
Latest-value reads (fundamentals, health, events, the live screen) report the most recent filed position and move whenever a company files or amends.
Computed on request, or read from a build
Point-in-time surfaces
- Single-name as-of fundamentals,
/api/v1/sec/fundamentals/{ticker}/as-of/{asOf} - Computed on each request from the fact versions on file, under the rules running at that moment. It carries no vintage. The X-Methodology-Version response header names the rules.
- As-of screen (
/api/v1/sec/screenwithasOf) and the panel export (/api/v1/sec/screen/export) - Read from the most recent build of each quarter-end. A build reruns on demand when a scoring or identity rule changes. An earlier build is kept beside the new one and is not served.
- Fact versions and revisions,
/api/v1/sec/versions/{ticker}and/api/v1/sec/revisions/{ticker} - Read from the version record directly. A version only ever joins the record; the comparison that flags a revision runs over what is held.
What the vintage identifies
vintage is pit. followed by twelve hex characters of a SHA-256 hash taken over the text of the as-of computation: the concept mapping, the plausibility guards and the formulas. It is derived, never set by hand, and changes whenever any of those change.
It names the computation only. The fact record grows backwards as coverage gaps are repaired, and the listing model and symbol history are rebuilt. Each can move a past date’s answer with the vintage unchanged. built_at says when the computation last ran for the date. Together they tell two files apart. They do not freeze a number.
Kinds of change, and what we publish
Change types
- A filing reaches us late
- Values for recent dates fill in, each under its real filing date. No entry: the record is catching up, and no rule changed.
- Wording or structure of this page
- Listed under Revisions; the version does not change.
- A rule change: a concept mapping, bound, identity or universe rule
- The version moves, with a dated entry at /changelog.
- A correction that moves served values
- A dated entry at /changelog saying what moved and why.
Fact versions are appended
Since 2009 each filing’s own statement of each fact, annual and quarterly, is stored keyed to its accession and filing date. A revised value is stored beside the earlier one, never over it. A row with no filing date is skipped. Text-derived pre-2009 facts are kept per parser version. One repair moved the filing date of 504 accessions where two SEC datasets disagreed onto the companyfacts date, which matched the EDGAR header in every case checked. No value changed.
What is visible as of a date
Visibility of a fact at an as-of date
- Filed after the as-of date
- Not visible.
- Its period ended after the as-of date, or after its own filing date
- Not visible.
- Its period ended more than 900 days before the as-of date
- Not visible.
- Several visible versions of one tag
- The latest filing wins for that tag; then the concept selection in Facts and concepts applies.
Each value carries its accession and filing date, so one as-of panel can mix accessions: each fact is the newest statement of itself on the date. The pre-2009 corpus follows different restatement semantics; see Pre-2009 text-derived data.
Detecting a revision
A revision is found by comparing the earliest version held of an annual fact with the latest. The relative change is |change| / max(|original|, 1,000,000 in the fact’s own unit), with a default threshold of 1%. The earliest version counts as a first print only when it was filed within 105 days of period end. Otherwise the row says “earliest held”.
A changed value is not by itself a restatement. Each row carries a changeType naming the mechanism where the evidence identifies one. The public change ledger applies a stricter rule: a change between 2% and 100%, made by a filing within 24 months of the period, that is not an entity change (no revenue originally, revenue later: the de-SPAC signature), counting only the first re-presentation of each change.
Nulls, fallbacks and withheld values
Null means unknown or not applicable, never zero. Four rules produce a null, or fill one, on purpose. Each is stated here so a null can be read for what it is.
Not computed for Financials and Real Estate
Seven screener metrics are defined on a statement shape that banks, insurers and REITs do not have. They are null for those sectors.
Sector-gated metrics
piotroski- Several of the nine tests read inventory, gross margin and asset turnover, which a bank balance sheet does not present.
altman_z- Calibrated on manufacturers; working-capital and retained-earnings ratios do not mean the same for a lender or a REIT.
fcf_margin- Operating cash flow minus capex, and a lender’s operating cash flow is dominated by lending flows.
fcf_conversion- The same denominator problem as fcf_margin.
accruals_ratio- Accruals against total assets are not comparable where the assets are the business.
m_score_5- Needs gross margin, which a bank’s or a REIT’s statements do not present.
gp_to_assets- No gross profit line.
A margin filter (net_margin, gross_margin, operating_margin) excludes Financials and Real Estate from the result set, because their margins are not comparable to an operating company’s. The response note says so whenever it happens. Every other metric is computed in every sector. Banks and real estate filers have measures of their own, under Financials, real estate and IFRS.
Altman Z″ and derived liabilities
When altman_z is served
- Total assets, current assets, current liabilities, retained earnings, operating income or equity missing, or total assets not positive
- Null.
- No liabilities total tagged
- Total liabilities is derived as total assets minus equity, the balance-sheet identity, and the score is served. Null when that difference is not positive. Filers that never tag a plain liabilities subtotal, such as
KO,TJX,CTASandADI, are scored this way. - The computed score falls outside −10 to 20
- Null, never clamped to the bound.
On the screener and the as-of panel the derivation subtracts parent-only equity, so a filer with significant noncontrolling interests has them counted as liabilities. The bias runs one way: a derived score reads slightly more distressed than a filed one would, never less. The derived totalLiabilities on the fundamentals summary subtracts total equity including noncontrolling interests.
Fallback aliases
Eight concept groups (Equity, Cash, AccountsPayable, RnD, ShareBuybacks, Dividends, Inventory, PPE) accept twelve secondary XBRL concepts that a minority of filers use in place of the primary ones, such as PartnersCapital for equity. About 540 filers gain a group they otherwise lack. Revenue has its own fallbacks: the industry revenue tags filers used before the 2018 revenue standard (UtilityRevenue, OilAndGasRevenue, FoodAndBeverageRevenue and others). A tagged zero counts as empty.
Fallback concepts
- The filer tagged any primary concept of the group for the period
- The primary wins; a fallback never displaces a value already served.
- The filer tagged none of them
- The fallback fills the empty coordinate.
- Single-name as-of panel, or a named
concept=on the versions and revisions routes - Fallback-sourced values are served.
- As-of screen and panel export
- A fallback fills a cell that would otherwise be empty, one value per group.
- Unfiltered versions and revisions listings
- Fallback-sourced values are excluded, so a null there means the primary tag is absent.
Values withheld as tagging errors
A filed fact that sits an exact factor of a thousand or a million from the issuer’s own settled level for that metric, where the series returns to that level afterwards, is read as a tagging error in the filing and served as null. Nothing is rescaled and no substitute is supplied. A filer that tagged 185 trillion shares outstanding for one period has no share count for that period here, and the rendered filing will show the difference.
The test needs at least 9 periods to establish a level. It exempts per-share figures, where a thousandfold move is usually a split.
Financials, real estate and IFRS
The routes that serve these fields are listed in the API docs. A field not computed for a filer is absent from its response. A non-bank carries no revenueFinancialBasis.
Banks and insurers
Bank revenue basis
- A bank tags net interest income and noninterest income for one period, and no revenue total
revenuestays null, as filed.revenueFinancialBasiscarries the sum of the two, withrevenueFinancialBasisConceptsUsed,revenueFinancialBasisPeriodEndandrevenueFinancialBasisFlowPeriodnaming the tags, the period and the window.- A bank that also tags its own
Revenues - Keeps that figure in
revenue, which can differ from the sum when the tag is a gross or partial total; both are served. - Either component missing
- All four basis fields are omitted.
- The panel export
- The same sum is the
revenue_financial_basiscolumn, at the same period end and span, empty where either line is missing, and never written intorevenue.
On the financial-health panel, banks that tag the lines also get efficiencyRatio, allowanceToLoans, depositsGrowthYoY and netInterestIncomeGrowthYoY on each period, each null unless every input is filed for that period over the same window, and each with a *Basis field naming its inputs. The allowance basis changed at CECL (2020 for large filers, 2023 for smaller ones), so allowanceToLoans is not comparable across that date; the basis field says which side of it a row sits on.
Real estate
Real Estate filers carry ffoNareit, funds from operations on the NAREIT definition: net income plus depreciation and amortization, less gains on property sales, plus real estate impairments, from the filed lines of one fiscal year on the consolidated statement as tagged. It approximates the NAREIT figure. The filer’s own reported FFO can adjust for items the tags do not isolate. ffoNareit is null unless every component, and a real estate investment property line, is tagged for the same year. ffoBasis names the year and the concepts used.
A realEstate block carries ffoPayout, propertyGrowthYoy, rentalRevenueGrowthYoy and debtToGrossProperty, each with its own *Basis field and each null unless every input was tagged for the same period. The block is omitted for a Real Estate filer that tags none of the inputs. Occupancy is not an XBRL concept, so it is not served.
Foreign private issuers (IFRS)
IFRS fields
accountingStandard- The taxonomy a 20-F or 40-F filer’s annual report is tagged in:
us-gaaporifrs-full. Absent for a US domestic filer. interestPaidClassification- Where an IFRS filer reports cash interest paid:
operating,financing,investingormixed, which decides whether its operating cash flow is before or after interest. Omitted from the JSON when the filing states none. The three tags behind it are not yet in the ingested corpus, so it is currently omitted for every filer. - Currency
- Figures are served as reported, in the filer’s own reporting currency, and never converted;
reportingCurrencysays which.
An IFRS filer is outside every computed surface; see Scope and sources.
Computed metrics
Annual basis
The cycle metrics are computed on a fiscal-year basis: the latest fiscal year with income-statement financials. Quarterly rows are excluded from the cycle views, because a single quarter’s capex over a partial quarter’s revenue is lumpy and its growth rate explodes.
Where a per-company call returns the latest quarter, it also carries a trailing-year figure (trailing*). trailingBasis reads “TTM” when four contiguous quarters were available and “FY” when the fiscal year was the only clean window. SEC filings carry no standalone fourth quarter, so where a trailing year closes on a fiscal year end, the fourth quarter is the annual less the first three. Each trailing figure resolves its own window, and trailingBasis names them separately (“mixed: revenue TTM, netIncome FY”) when they differ.
Formulas and bounds
Net / gross / operating margin
NetIncome / Revenue (gross: GrossProfit or Revenue−COGS; op: OperatingIncome)
Shown between −500% and +100%. A margin above revenue is a one-time gain, tiny revenue, or a wrong concept.
Debt / EBITDA
LongTermDebt / (OperatingIncome + D&A)
Shown when EBITDA is positive and |ratio| ≤ 30. The sector median excludes Financials, whose balance sheets have no comparable EBITDA.
Net debt / EBITDA
(LongTermDebt − Cash) / EBITDA
Same bounds as debt/EBITDA.
CapEx intensity
CapEx / Revenue (latest fiscal year)
Annual only; shown 0–200%.
R&D intensity
R&D expense / Revenue
Shown up to 1000%. Extreme values are real for pre-revenue biotech.
DSO / DIO (days)
Receivables/Revenue×365 ; Inventory/COGS×365
Shown 0–1095 days; long cycles can be genuine (aged wine inventory).
Buyback intensity
Share repurchases / Revenue (fiscal year)
Shown 0–100%.
Net dilution
Year-over-year change in shares outstanding
Nulled when |Δ| > 50%: that magnitude indicates a split or corporate action.
Financial health ratios
Debt/equity, current ratio, cash/debt, operating margin, net margin, ROA, ROE, operating cash flow/debt
Each is arithmetic over two filed lines, per filing period for the last 20 quarters, so any of them can be re-derived from the fundamentals endpoints. No composite score is computed.
Piotroski F-score
Count of nine fundamental-strength checks passed
The score carries the number of checks that had inputs; below four, the company is left unrated. Not scored for Financials or Real Estate.
Sloan accruals
(NetIncome − OperatingCashFlow) / average total assets
Assets averaged over the current and prior fiscal year, or current-year assets when no prior year is on file. Lower or negative means earnings are more cash-backed.
Altman Z″ (distress)
6.56·(WC/TA) + 3.26·(RE/TA) + 6.72·(EBIT/TA) + 1.05·(BookEquity/TL)
Book-value distress score (>2.6 safe, 1.1–2.6 grey, <1.1 distress). EBIT is operating income as filed; scores outside −10 to 20 are null. Excludes Financials and Real Estate. Penalises buyback-heavy firms, whose negative retained earnings read as weakness, so confirm distress with operating margin or interest coverage.
A ratio with a small denominator produces nonsense: a $3M-revenue shell with a one-time gain shows a 300% net margin. Two guards apply: a $10M revenue floor on the screener, and the per-metric bounds above, outside which a value is returned as null. The bounds are wide enough to keep genuine extremes and cut only the impossible.
Sector aggregates
Sector figures are medians across the in-scope companies in each sector, computed per fiscal year so the cycle views form a series. One outlier cannot move a median.
Ownership
Institutional holdings (13F)
Every manager holding $100M or more in 13F securities files a 13F-HR within 45 days of quarter end. Three rules govern aggregation.
13F aggregation
- A manager reports through several CIKs (Vanguard files through nine)
- One holder: related CIKs are grouped under a stable filer family, so holder counts are not inflated and a reorganisation does not read as an exit plus a new position.
- The newest quarter is inside the 45-day filing window
- Reported only once complete. Comparatives are computed only against quarters that passed the completeness guard.
- A change cannot be certified (incomplete baseline, no prior position)
- Null.
Two coverage limits apply. The ticker-to-manager view lists a manager only when the ticker is among their larger positions (books are stored to 95% of value, capped at 200 positions), so it is a partial holder register. Quarterly history spans 2017-03-31 to the current quarter. Values are normalised to whole dollars (pre-2023 filings reported thousands).
Blockholders (13D/G)
Schedules 13D and 13G and their amendments, parsed from the structured XML filings since the SEC’s December 2024 cutover and from filing text back to January 2015. Issuer, CUSIP and percent of class are taken from the document as filed; the percent is never recomputed.
Blockholder serving rules
- A filer group
- Keyed on the first reporting person’s name as filed. Schedule 13G carries no filer CIK.
- Several filings in a group
- The latest is shown. The headline percent is the largest across a filing’s persons, never their sum.
- The latest filing states under 5%
- Treated as exited and dropped.
- The latest filing is more than a year old
- Flagged stale, kept.
Insider transactions (Form 4)
One row per transaction line, parsed from the Form 4 XML. Issuer identity comes from the document itself, which re-anchors the roughly 30% of filings EDGAR indexes under the insider’s own CIK. Summary figures (open-market buys, sells, net shares) count non-derivative lines only; derivative lines are listed and counted separately.
Insider rules
- An open-market buy or sell priced at 50 times or more the ticker’s own trailing median (or a fiftieth, for common stock)
- Served null with priceUnreliable set. Tickers with fewer than three priced trades get no guard.
- One trade reported on two Form 4s by exactly two co-filers (same security, date, code, shares, price and holding after; one filer an entity)
- Collapsed to one row, with the co-filer named.
- Rule 10b5-1 plan
- The filing-level checkbox, present from about April 2023; null before that. The adoption date is read from the footnote when exactly one date is stated.
- A requested window starts before parsed coverage
- The response states where coverage begins, at the earliest parsed filing.
Deep history · pre-2009
Text-derived fundamentals, FY1995–2009
Fiscal years 1995–2008 predate XBRL, so that history is parsed from the text of each 10-K’s financial statements. That source is weaker than a tag the company asserted. FY2009 is the seam year: only the largest filers had adopted XBRL, so FY2009 also has a tier checked against XBRL. A third tier, continuity-widened, admits facts that survive in a single print.
This corpus serves each filing as originally printed. The as-of surface serves what was on file at the as-of date, amendments included. Apple’s FY2009 revenue is $36,537M here, from the original 2009-10-27 10-K, and $42,905M as of 2010-06-30, after the 2010-01-25 10-K/A adopting ASU 2009-13/14. Both are correct for what they represent. A series that splices the two across 2009 reads the accounting-standard adoption as a business event.
Text-derived fundamentals, FY1995–2009, non-financial single-registrant US filers. The continuity tier is measured at 98.0% precision (n=196, 95% CI 94.9%–99.2%). The continuity-widened tier is measured separately at 96.0% precision (n=200, 95% CI 92.3%–98.0%). The two are never blended. This data is not XBRL-grade and is never presented as such.
Precision measures transcription fidelity: whether the captured value matches what the filing printed, checked against independent human re-reads. Unit scale is checked three ways: the continuity and accounting-identity guards; a cross-fact coherence check against the filing’s other statements; and a level-plausibility scan against the company’s own history, which catches values about 1,000 times too large or too small.
A fact that fails a check is demoted: removed from the verified tier, never adjusted. Demotions: 2,131 from the coherence check, 7 rows individually confirmed wrong, and 1,615 from the level scan and later line-identity, units and column-pick checks. Absent beats wrong.
Known residuals: an over-scaled balance sheet at a typical assets-to-revenue ratio is caught only by absolute magnitude bounds, and a uniformly mis-scaled filing is invisible to cross-fact checks. Three soft cases are in the audit log and left as printed: a rounded selected-data figure, an 8-month fiscal-transition stub, and a receivables line that maps trade receivables only.
Filings
118,743
Fact rows
2,312,298
Verified facts
535,293
Verified, FY1995–2009
535,285
Verified facts sum all three tiers. Select tiers with the verifiedBy field. Of 123,021 10-K and 10-K405 filings parsed, 118,743 remain after removing unkeyable and period-suspect records and keeping the latest accession per company-year. Rows split into 1,158,720 current-fiscal-year facts and 1,153,578 comparative-vintage facts, the same figure as it reappears in the next year’s filing.
▸The full verification design tiers, coverage by year, per-concept coverage, error modes, exclusions
The three tiers
Verification tiers
continuity, FY1995–2009- The filing’s own value for its fiscal year, from a single registrant outside the financial-SIC range, read off a statement and passing the parser’s identity checks. The same fact re-parsed from the next year’s comparative column agrees. That is corroboration against our own second parse, weaker than the XBRL-era check. A fact with no adjacent filing never reaches this tier.
continuity-widened, 84,632 facts- Facts with one surviving print and no second print to check against, admitted by in-filing structural anchors and magnitude guards.
xbrl, FY2009 only, 5,623 rows- A genuine no-lookahead XBRL first print exists for the filer and concept, and the text value agrees (within 0.1% exact, or 2% close). The strongest tier: independent corroboration against the filer’s own tag.
continuityin FY2009, 4,741 rows- Filers with no XBRL first print, bridged as in FY1995–2008. A FY2009 row carries one of the two tiers, never both.
Coverage by fiscal year, FY1995–2008
The verified share is bounded by coverage: a correct fact from a filer with no adjacent-year filing cannot be verified. It holds between 35% and 55% across the window, with no post-2001 cliff.
| FY | Filings | Current facts | Verified | Verified share |
|---|---|---|---|---|
| 1995 | 2,791 | 22,436 | 10,187 | 45.4% |
| 1996 | 7,864 | 65,055 | 22,926 | 35.2% |
| 1997 | 7,590 | 68,077 | 32,887 | 48.3% |
| 1998 | 9,499 | 85,539 | 41,446 | 48.5% |
| 1999 | 9,284 | 89,031 | 40,230 | 45.2% |
| 2000 | 8,343 | 83,461 | 41,924 | 50.2% |
| 2001 | 8,396 | 85,457 | 43,761 | 51.2% |
| 2002 | 7,886 | 82,816 | 43,443 | 52.5% |
| 2003 | 7,769 | 78,939 | 38,497 | 48.8% |
| 2004 | 7,720 | 74,032 | 38,505 | 52.0% |
| 2005 | 8,263 | 79,648 | 42,572 | 53.5% |
| 2006 | 8,074 | 79,869 | 39,195 | 49.1% |
| 2007 | 7,188 | 73,131 | 40,194 | 55.0% |
| 2008 | 8,726 | 90,934 | 48,379 | 53.2% |
FY2009
The two FY2009 ladder tiers verify 10,364 of 90,813 current-fiscal-year facts, and 11,139 with the continuity-widened tier added: a 12.3% share against FY2008’s 53.2%, both counting all three tiers. FY2009 clears a narrower bar, and a fact that fails it is absent.
Density and reliability run opposite ways across the seam. The FY2009 facts that are served are checked to a higher standard, some against the filer’s own XBRL tag. FY2008’s higher density includes more facts never checked against an independent source.
Per-concept coverage
Balance-sheet stocks (cash, receivables, current assets) hold up better than income-statement flows exposed to restatement (operating income, revenue), because a restated comparative disagrees with the original and the check correctly fails it. The table covers all 535,293 verified facts across the three tiers.
| Concept | Verified facts | Share of verified facts |
|---|---|---|
| Net income | 38,910 | 7.3% |
| Cash | 38,396 | 7.2% |
| Depreciation & amortization | 38,240 | 7.1% |
| Current assets | 36,518 | 6.8% |
| Total assets | 36,237 | 6.8% |
| Current liabilities | 35,351 | 6.6% |
| CapEx | 34,669 | 6.5% |
| Revenue | 31,694 | 5.9% |
| Equity | 31,098 | 5.8% |
| Interest expense | 27,687 | 5.2% |
| Inventory | 27,482 | 5.1% |
| Long-term debt | 23,358 | 4.4% |
| Operating cash flow | 22,602 | 4.2% |
| Receivables | 18,896 | 3.5% |
| Operating income | 18,321 | 3.4% |
| Total liabilities | 17,911 | 3.3% |
| Gross profit | 17,457 | 3.3% |
| R&D expense | 11,695 | 2.2% |
| EPS (basic) | 10,195 | 1.9% |
| EPS (diluted) | 10,091 | 1.9% |
| Dividends | 8,485 | 1.6% |
Error modes
The 196-fact audit found 4 errors, all correlated failures: both filings of a pair mis-parse the same way, so the cross-check co-fails. Three modes account for all 4.
Flow item as stock (2 of 4)
A cash-flow-statement line (a period delta or a rollforward addition) captured as the matching balance-sheet stock, such as the change in receivables read as the receivables balance.
Wrong entity (1 of 4)
An equity-method joint venture’s own combined statements, filed in the same document in a foreign currency, matched instead of the registrant’s statements.
EPS variant (1 of 4)
Continuing-operations diluted EPS captured instead of total diluted EPS, masked because the two coincided in the adjacent comparative year.
Exclusions
- Financial-SIC filers (SIC 6000–6799) are never verified. Banks, insurers and REITs file no operating-income line and no current/non-current split, and the parser models neither. The gate removes 402,776 rows (17.4% of the corpus) across 5,066 filers. The rows are retained, not served, and outside this accuracy claim.
- Multi-registrant filings are gated out. A joint filing, such as a utility holding company with its subsidiaries, has combined statements the ladder does not attribute. 35,362 rows (1.5%) are excluded.
- Derived values never enter the verified tier. 43,940 rows (1.9%) are computed by subtraction, such as total liabilities from total assets minus equity, and continuity agreement on them would be circular.
Accuracy
Two checks answer two questions. A nightly benchmark measures how faithfully the pipeline carries the SEC feed it reads. Hand audits, run once in August 2026, read sampled values against the filings themselves.
Nightly benchmark
Every night, after the day’s facts are computed, a fixed list of large filers is compared cell by cell against the SEC companyfacts API, the feed the XBRL facts are ingested from. It measures fidelity to that feed, so a value that is wrong in companyfacts itself would agree. Every differing cell is published at /benchmark with its classification. A cell reads “ahead” when the instance-document path has served a period companyfacts does not yet show.
Hand audits, August 2026
Each layer was audited once against its primary source, the filing itself. The XBRL, Form 4 and 13F samples were read on 6 August 2026. The text-derived audit followed later that month. The 111 cases in the first three layers found no value errors in the 2009-and-later data. The audits are not repeated on a schedule.
| Layer | Audited period | Sample & method | Result |
|---|---|---|---|
| XBRL fundamentals | FY2010–2025 | 72 facts, 12 concepts × 6 era bands, 10-K first prints, read against the rendered statements | 72/72 exact |
| Insider (Form 4) | Live stream | 30 transactions re-read field by field from the filed XML | 29/30 exact, 1 ambiguous, 0 errors |
| Institutional ownership (13F) | 2016–2026 | 9 managers diffed against their actual filings, run twice | 9/9 exact |
| Text-derived fundamentals | FY1995–2009 | 196 verified-tier facts, stratified, independently re-derived | 98.0% precision (95% CI 94.9%–99.2%) |
Protocol
Independent readers fetch the primary document from EDGAR and re-derive each sampled value without seeing our stored value or the parser’s hints. The comparison happens after they report. Samples come from a seeded stratified sampler across eras and concepts. Every claim carries its n and every rate a Wilson 95% confidence interval.
XBRL, FY2010–2025
12 concepts across 6 era bands, sampled from 10-K first prints and checked against the rendered statements in the same filing: all 72 matched. The audit also tests mapping semantics: NetIncomeLoss excludes non-controlling interests, OperatingIncomeLoss maps to the printed operating subtotal, and a genuine zero is stored as a zero. One case showed a ticker-label defect (CIK, accession and value correct, ticker pointing at another registrant). It is a known defect in the served data.
Form 4
30 transactions re-read field by field from the filed XML: 29 exact, none wrong. The remaining case is two derivative rows identical on every field we store, differing only by exercise price, which we do not persist.
13F
9 managers for the quarter ended 31 March 2026, re-aggregated from the 13F-HR filings by three independent readers and diffed on totals, position counts and top-ten order. The first run failed two: option and principal-amount rows were dropped, understating Elliott by 20.97% and Duquesne by 13.02%, and hiding a $2.43bn index put hedge. After the fix every manager reconciles to the filer’s declared total to the dollar, and composition partitions the stored total exactly across all 233,249 manager-quarters. One discrepancy remains: a filer’s own $1k arithmetic error between its header total and its rows, where we serve the row sum.
Text-derived, FY1995–2009
The continuity tier is audited at 98.0% precision and the continuity-widened tier at 96.0%; the two are never blended. The tiers, the error modes and the exclusions are in Pre-2009 text-derived data.
Limitations
Every limit we know of, with its status: planned for a later release; addressed by the field that answers it; inherent in the source; accepted, with no work under way; or a stated convention. A correction that moves a served value is listed, dated, at /changelog.
New CIKs and first annual reports
planned for a later releaseAn issuer enters the as-of universe at the first date on which an annual report under its own CIK is knowable. Alphabet and PayPal are absent at 2015-12-31. Kraft Heinz is absent through 2016-12-31, because its first 10-K reports successor and predecessor columns that the SEC’s companyfacts feed does not carry undimensioned. Expect the first year of a new registrant to be missing.
Symbol history before 2019
acceptedThe symbol history starts with the 2019 cover-page tag. A few issuers whose only earlier symbol on file is a preferred (DuPont at 2015 and 2016 among them) are dropped by the preferred-share filter at those dates. They are present by CIK on the single-name as-of route. The dated symbol of a row that is present is served as
symbolAtDate.Symbol at the date: what the Form 4 record can show
inherentsymbolAtDateis read from each issuer’s own Form 4 filings. An issuer with no insider filing in the trailing year (commodity and currency trusts, funds, limited partnerships, SPAC shells, many small filers) carries the current label, withsymbolAtDateSourcereadingcurrent-label. A change inside a quarter reads from the next quarter’s first filing, and an insider can enter the old symbol on a later form. Sightings begin with 2009Q1, so the first grid dates look back less than a year. The selection rules are under Universe and identity.One listed-equity flag per issuer
addressed by listing status at the dateis_listed_equityis one value per issuer, so an issuer that was private for a span and later re-listed (Toys R Us, 2005 to 2018) reads as listed at dates inside that span. Never-listed debt-only filers that reach the universe are labelled by CIK. The dated reading islistingStatusAtDate.Listing status at the date: gaps in the filings
acceptedlistingStatusAtDateis derived from each issuer’s own filings and inherits their gaps. A move from an over-the-counter quote to Nasdaq before August 2006 was registered under Section 12(g), so no filing dates it, and the listing reads as starting at the first insider or ownership filing. A listing with neither a registration nor a Form 25 on file is known only from today’s exchange venue, so once it has ended it readsnever. Commodity, currency and bitcoin trusts file no insider forms and readneveralthough their shares trade on an exchange.Listing status at the date: ranges that stay open or close early
acceptedA listing with no Form 25 under the issuer’s own CIK stays open. A few hundred open ranges have no exchange venue today (uplistings registered and never completed, listings carried on by a successor under a new CIK), so those read
exchangepast the point they stopped. A debt-only filer whose Form 8-A12B registers notes rather than common readsexchange. Four issuers (CRH, Luxfer, Global Self Storage, Flutter) readregisteredfrom a Form 25 onward while their shares still trade on an exchange.Banks and other financials before 2018
conventionWhere no GAAP revenue concept was tagged,
revenueis empty andrevenue_financial_basiscarries net interest income plus noninterest income for the same period. Filter on either column. From 2018 both fill.Extension-tagged revenue
planned for a later releaseA small number of issuers tag revenue under a company-specific concept the registry does not map (Affiliated Managers, E*TRADE and Ensco at 2015 among them) and appear with an empty
revenuealthough a filing exists.Foreign private issuers
acceptedCompanies filing 20-F or 40-F are absent from every computed and screened surface, because those surfaces are built from 10-K and 10-Q filings only. See Scope and sources.
Aggregates are our calculation
inherentAny per-company input can be checked against EDGAR; a sector median is our calculation under the rules on this page, and no single filing contains it.
The XBRL record starts in 2009
inherentThe as-filed, versioned record begins with the XBRL mandate, so point-in-time queries are bounded there. Earlier years come from the text-derived dataset, never merged with the XBRL record, and every such fact says which dataset it came from.
Sector on an as-of screen is the raw SIC mapping
acceptedSome large companies file under a catch-all SIC code. The live screener carries a curated correction; the as-of screener does not, so on a historical date Walmart and Costco return Consumer Discretionary and Visa and Mastercard return Industrials. Filter on the metrics and join on
cik.Blockholder and 13F identities do not join
inherentThe 13D/G surface keys a filer by its name as filed, because Schedule 13G carries no filer CIK; the 13F surface keys a manager by a family slug or CIK. There is no reliable way to ask whether a blockholder is also a 13F filer.
Small caps are noisier
inherentBelow the revenue floor, sparse or unusual filings make individual ratios less reliable.
Revisions
The version changes when a formula, bound or universe rule on this page changes. Wording and structure changes are listed without a bump. Every API response names its version in the X-Methodology-Version header. A row lists a change under the version that first states it: the rules listed for 2026.10.1 are served from the API tag that carries that version, and a response that names 2026.09.3 was served under the earlier rule set. The page is read against the served data at each release train, and the reviewed date records the last read.
Version 2026.10.1 · Revised 24 October 2026 · Last reviewed 24 October 2026
2026-10-24
2026.10.1
Page restructured; how the data changes stated; version moved to follow the rules above.
2026-10-23
2026.10.1
As-of universe rebuilt: document-name tickers removed, listed-equity flag dated against the listing end.
2026-10-21
2026.10.1
Universe rules: CIK keying, pre-2018 industry revenue concepts, bank revenue basis, one holder per symbol per date.
2026-10-05
2026.09.3
Page restructured into nine sections; Facts and concepts, and the insider and 13D/G parts of Ownership, added. No formula, bound or universe rule changed, so the version is unchanged.
2026-09-09
2026.09.3
Reproducibility stated as two separate promises; the methodology version named on the wire.
2026-09-03
2026.09.2
Pre-2009 appendix folded into this page.
2026-09-03
2026.09.1
Each surface states what it covers and what it gates.
2026-08-26
2026.08
The 0 to 100 financial-health composite withdrawn; the underlying ratios stay.
2026-08-05
2026.08
Pre-2009 text-derived dataset documented, with its own measured precision.
Methodology version 2026.10.1, last revised 24 October 2026. This page and the accuracy benchmark are our representation as to the accuracy of the data, under section 8 of the Terms of Service.