10-KAnnual filings. 30+ years of alpha.
The 10-K is the most information-dense document a public company produces. Audited financials, risk factors, segment breakdowns, management commentary. We standardize every XBRL tag across 19,000+ companies so your queries work across tickers and decades without schema gymnastics.
- Full income statement, balance sheet, cash flow statement
- Segment-level revenue and operating income
- Historical data from 1993 to present
- Amendment tracking — 10-K/A restated values preserved
- Point-in-time: accepted_at timestamps for clean backtests
~85M
Annual report facts in dataset
200+
Standardized financial concepts
1993
Earliest filing year
< 24h
Post-EDGAR processing time
SQL queries that deliver alpha
Production-ready queries using ValueinClient. Copy, run, adapt.
5-Year Revenue CAGR Screener
Find S&P500 companies with 5-year revenue CAGR above 15% — the core compounders screen. Uses a single pivot over the fact table for efficiency.
Show the query ↓Hide the query ↑
from valuein_sdk import ValueinClient, ValueinError sql = """SELECT r.symbol, r.name, r.sector, MAX(CASE WHEN standard_concept = 'Revenues' AND fiscal_year = 2024 THEN numeric_value END) AS rev_2024, MAX(CASE WHEN standard_concept = 'Revenues' AND fiscal_year = 2019 THEN numeric_value END) AS rev_2019, ROUND( POWER( MAX(CASE WHEN standard_concept = 'Revenues' AND fiscal_year = 2024 THEN numeric_value END) / NULLIF(MAX(CASE WHEN standard_concept = 'Revenues' AND fiscal_year = 2019 THEN numeric_value END), 0), 0.2 ) - 1, 4 ) AS cagr_5yrFROM fact fJOIN references r ON f.entity_id = r.cikJOIN index_membership im ON im.cik = r.cikWHERE f.form_type = '10-K' AND f.standard_concept = 'Revenues' AND im.index_name = 'SP500' AND im.removal_date IS NULL AND r.is_active = TRUEGROUP BY r.symbol, r.name, r.sectorHAVING cagr_5yr > 0.15ORDER BY cagr_5yr DESCLIMIT 25""" try: with ValueinClient() as client: df = client.run_query(sql) print(df)except ValueinError as e: print(f"Valuein error: {e}")Operating Leverage Detector
Find companies where operating margin expanded more than 3 percentage points over 3 years — a hallmark of businesses with fixed-cost structures scaling into profit.
Show the query ↓Hide the query ↑
from valuein_sdk import ValueinClient, ValueinError sql = """WITH annual_metrics AS ( SELECT r.symbol, r.name, f.fiscal_year, MAX(CASE WHEN standard_concept = 'Revenues' THEN numeric_value END) AS revenue, MAX(CASE WHEN standard_concept = 'OperatingIncomeLoss' THEN numeric_value END) AS op_income FROM fact f JOIN references r ON f.entity_id = r.cik JOIN index_membership im ON im.cik = r.cik WHERE f.form_type = '10-K' AND f.fiscal_year BETWEEN 2021 AND 2024 AND im.index_name = 'SP500' AND im.removal_date IS NULL GROUP BY r.symbol, r.name, f.fiscal_year),margins AS ( SELECT symbol, name, fiscal_year, op_income / NULLIF(revenue, 0) AS op_margin FROM annual_metrics)SELECT m24.symbol, m24.name, ROUND(m21.op_margin * 100, 1) AS margin_2021_pct, ROUND(m24.op_margin * 100, 1) AS margin_2024_pct, ROUND((m24.op_margin - m21.op_margin) * 100, 1) AS margin_expansion_ppFROM margins m24JOIN margins m21 USING (symbol, name)WHERE m24.fiscal_year = 2024 AND m21.fiscal_year = 2021 AND (m24.op_margin - m21.op_margin) > 0.03ORDER BY margin_expansion_pp DESCLIMIT 20""" try: with ValueinClient() as client: df = client.run_query(sql) print(df)except ValueinError as e: print(f"Valuein error: {e}")Free Cash Flow Quality Screen
High FCF conversion — where FCF exceeds net income — signals earnings quality. Companies with persistent FCF > net income generate real cash, not accrual accounting profits.
Show the query ↓Hide the query ↑
from valuein_sdk import ValueinClient, ValueinError sql = """SELECT r.symbol, r.name, r.sector, ROUND( MAX(CASE WHEN standard_concept = 'NetCashProvidedByUsedInOperatingActivities' THEN COALESCE(derived_quarterly_value, numeric_value) END) - ABS(MAX(CASE WHEN standard_concept = 'PaymentsToAcquirePropertyPlantAndEquipment' THEN numeric_value END)), 0 ) AS fcf, ROUND( MAX(CASE WHEN standard_concept = 'NetIncomeLoss' THEN numeric_value END), 0 ) AS net_income, ROUND( (MAX(CASE WHEN standard_concept = 'NetCashProvidedByUsedInOperatingActivities' THEN COALESCE(derived_quarterly_value, numeric_value) END) - ABS(MAX(CASE WHEN standard_concept = 'PaymentsToAcquirePropertyPlantAndEquipment' THEN numeric_value END))) / NULLIF(MAX(CASE WHEN standard_concept = 'NetIncomeLoss' THEN numeric_value END), 0), 2 ) AS fcf_conversion_ratioFROM fact fJOIN references r ON f.entity_id = r.cikJOIN index_membership im ON im.cik = r.cikWHERE f.form_type = '10-K' AND f.fiscal_year = 2024 AND im.index_name = 'SP500' AND im.removal_date IS NULLGROUP BY r.symbol, r.name, r.sectorHAVING fcf > 0 AND fcf_conversion_ratio > 1.1ORDER BY fcf_conversion_ratio DESCLIMIT 20""" try: with ValueinClient() as client: df = client.run_query(sql) print(df)except ValueinError as e: print(f"Valuein error: {e}")Return on Invested Capital (ROIC) Trend
ROIC is the most reliable predictor of long-term equity returns. This query computes ROIC across 5 annual filings and filters to companies sustaining above 15% average.
Show the query ↓Hide the query ↑
from valuein_sdk import ValueinClient, ValueinError sql = """WITH invested_capital AS ( SELECT r.symbol, r.name, f.fiscal_year, MAX(CASE WHEN standard_concept = 'OperatingIncomeLoss' THEN numeric_value END) * (1 - 0.21) AS nopat, MAX(CASE WHEN standard_concept = 'Assets' THEN numeric_value END) - MAX(CASE WHEN standard_concept = 'LiabilitiesCurrent' THEN numeric_value END) AS ic FROM fact f JOIN references r ON f.entity_id = r.cik JOIN index_membership im ON im.cik = r.cik WHERE f.form_type = '10-K' AND f.fiscal_year BETWEEN 2020 AND 2024 AND im.index_name = 'SP500' AND im.removal_date IS NULL GROUP BY r.symbol, r.name, f.fiscal_year)SELECT symbol, name, fiscal_year, ROUND(nopat / NULLIF(ic, 0) * 100, 1) AS roic_pctFROM invested_capitalWHERE ic > 0QUALIFY AVG(nopat / NULLIF(ic, 0)) OVER (PARTITION BY symbol) > 0.15ORDER BY symbol, fiscal_year""" try: with ValueinClient() as client: df = client.run_query(sql) print(df.pivot(index=["symbol", "name"], columns="fiscal_year", values="roic_pct"))except ValueinError as e: print(f"Valuein error: {e}")Query 10-K data with natural language
The Valuein MCP (Model Context Protocol) server connects Claude, ChatGPT, and other AI assistants directly to your 10-K dataset. Ask a question in plain English — the MCP server translates it to the right DuckDB query and returns structured results.
Add your Valuein API key to your Claude Desktop or Cursor config and get instant access to 30+ years of annual filings without writing a single line of SQL.
{ "mcpServers": { "valuein": { "command": "uvx", "args": ["valuein-mcp"], "env": { "VALUEIN_API_KEY": "vi_live_your_key" } } }}Example prompts for 10-K data:
MCP server available for Pro and Enterprise subscribers. See pricing →
Start with 10-K data today
Free tier includes sample data. Pro unlocks the full S&P500 universe.