MCP Server live — AI agents can now query 105M+ SEC facts. Connect your agent →
ValueinValuein
All SEC Filing Coverage
10-Q
Quarterly Report

Quarterly momentum. Before the crowd.

10-Q filings are filed three times per year — for Q1, Q2, and Q3 — making them the primary source of intra-year earnings momentum signals. Beat-and-raise patterns, working capital inflection, and gross margin inflection all show up here first.

  • Q1–Q3 unaudited financials for 12,000+ companies
  • QoQ and YoY growth calculations with single-query pivots
  • Amendment tracking — 10-Q/A restated values vs original
  • knowledge_at timestamps for point-in-time backtesting
  • YTD cash flow corrections via derived_quarterly_value

A note on cash flow in 10-Q filings

The SEC requires Q2 and Q3 cash flow statements to be reported on a year-to-date basis. Valuein automatically computes the quarter-specific (incremental) cash flow and stores it in derived_quarterly_value.

Always use COALESCE(derived_quarterly_value, numeric_value) for cash flow metrics in 10-Q queries to get the correct quarterly figure rather than the YTD cumulative.

Python SDK

SQL queries that deliver alpha

Production-ready queries using ValueinClient. Copy, run, adapt to your strategy.

Earnings Momentum — QoQ and YoY Revenue Growth

Detect quarterly revenue acceleration. Companies showing sequential QoQ re-acceleration after a slowdown are high-conviction momentum setups.

from valuein_sdk import ValueinClient, ValueinError

sql = """
WITH quarterly_rev AS (
    SELECT
        r.symbol, r.name, r.sector,
        f.fiscal_year,
        f.fiscal_period,
        f.period_end,
        f.numeric_value AS revenue
    FROM fact f
    JOIN references r USING (entity_id)
    WHERE f.form_type = '10-Q'
      AND f.standard_concept = 'Revenues'
      AND r.is_sp500 = TRUE
      AND f.fiscal_year >= 2022
    QUALIFY ROW_NUMBER() OVER (
        PARTITION BY r.symbol, f.fiscal_year, f.fiscal_period
        ORDER BY f.knowledge_at DESC
    ) = 1
),
with_growth AS (
    SELECT *,
        LAG(revenue, 1) OVER (PARTITION BY symbol ORDER BY period_end) AS prev_qtr_rev,
        LAG(revenue, 4) OVER (PARTITION BY symbol ORDER BY period_end) AS same_qtr_prior_yr
    FROM quarterly_rev
)
SELECT
    symbol, name, sector,
    fiscal_year, fiscal_period,
    ROUND(revenue / 1e6, 1)                                               AS revenue_m,
    ROUND((revenue / NULLIF(prev_qtr_rev, 0) - 1) * 100, 1)              AS qoq_growth_pct,
    ROUND((revenue / NULLIF(same_qtr_prior_yr, 0) - 1) * 100, 1)         AS yoy_growth_pct
FROM with_growth
WHERE fiscal_year = 2024
  AND yoy_growth_pct > 10
  AND qoq_growth_pct > 0
ORDER BY yoy_growth_pct DESC
LIMIT 25
"""

try:
    with ValueinClient() as client:
        df = client.query(sql)
        print(df)
except ValueinError as e:
    print(f"Valuein error: {e}")

Beat-and-Raise Pattern Detector

Find companies with three consecutive quarters of EPS improvement — a programmatic beat-and-raise signal derived purely from filed data.

from valuein_sdk import ValueinClient, ValueinError

sql = """
WITH eps_qtrs AS (
    SELECT
        r.symbol, r.name,
        f.fiscal_year,
        f.fiscal_period,
        f.period_end,
        f.numeric_value AS eps_diluted
    FROM fact f
    JOIN references r USING (entity_id)
    WHERE f.form_type = '10-Q'
      AND f.standard_concept = 'EarningsPerShareDiluted'
      AND r.is_sp500 = TRUE
      AND f.fiscal_year >= 2023
    QUALIFY ROW_NUMBER() OVER (
        PARTITION BY r.symbol, f.fiscal_year, f.fiscal_period
        ORDER BY f.knowledge_at DESC
    ) = 1
),
consecutive AS (
    SELECT *,
        LAG(eps_diluted, 1) OVER (PARTITION BY symbol ORDER BY period_end) AS eps_q1_ago,
        LAG(eps_diluted, 2) OVER (PARTITION BY symbol ORDER BY period_end) AS eps_q2_ago,
        LAG(eps_diluted, 3) OVER (PARTITION BY symbol ORDER BY period_end) AS eps_q3_ago
    FROM eps_qtrs
)
SELECT symbol, name,
    ROUND(eps_diluted, 2) AS eps_latest,
    ROUND(eps_q1_ago, 2)  AS eps_q1_ago,
    ROUND(eps_q2_ago, 2)  AS eps_q2_ago,
    ROUND(eps_q3_ago, 2)  AS eps_q3_ago
FROM consecutive
WHERE fiscal_year = 2024
  AND eps_diluted > eps_q1_ago
  AND eps_q1_ago  > eps_q2_ago
  AND eps_q2_ago  > eps_q3_ago
  AND eps_diluted > 0
ORDER BY eps_diluted DESC
LIMIT 20
"""

try:
    with ValueinClient() as client:
        df = client.query(sql)
        print(df)
except ValueinError as e:
    print(f"Valuein error: {e}")

Working Capital Deterioration Alert

Screen for companies where working capital has declined three quarters in a row — a leading indicator of liquidity stress before it becomes a headline.

from valuein_sdk import ValueinClient, ValueinError

sql = """
WITH wc_qtrs AS (
    SELECT
        r.symbol, r.name,
        f.fiscal_year, f.fiscal_period, f.period_end,
        MAX(CASE WHEN standard_concept = 'AssetsCurrent'      THEN numeric_value END) AS current_assets,
        MAX(CASE WHEN standard_concept = 'LiabilitiesCurrent' THEN numeric_value END) AS current_liab
    FROM fact f
    JOIN references r USING (entity_id)
    WHERE f.form_type = '10-Q'
      AND f.standard_concept IN ('AssetsCurrent', 'LiabilitiesCurrent')
      AND r.is_sp500 = TRUE
      AND f.fiscal_year >= 2023
    GROUP BY r.symbol, r.name, f.fiscal_year, f.fiscal_period, f.period_end
),
with_wc AS (
    SELECT *,
        current_assets - current_liab AS working_capital,
        LAG(current_assets - current_liab, 1) OVER (PARTITION BY symbol ORDER BY period_end) AS wc_q1_ago,
        LAG(current_assets - current_liab, 2) OVER (PARTITION BY symbol ORDER BY period_end) AS wc_q2_ago
    FROM wc_qtrs
)
SELECT symbol, name,
    ROUND(working_capital / 1e6, 0) AS wc_latest_m,
    ROUND(wc_q1_ago       / 1e6, 0) AS wc_q1_ago_m,
    ROUND(wc_q2_ago       / 1e6, 0) AS wc_q2_ago_m
FROM with_wc
WHERE fiscal_year = 2024
  AND working_capital < wc_q1_ago
  AND wc_q1_ago < wc_q2_ago
ORDER BY working_capital ASC
LIMIT 20
"""

try:
    with ValueinClient() as client:
        df = client.query(sql)
        print(df)
except ValueinError as e:
    print(f"Valuein error: {e}")

Gross Margin Compression — Sector Benchmarks

Track gross margin trends by sector across the last 6 quarters. Input cost inflation, pricing power erosion, and mix shifts all show up here before hitting the bottom line.

from valuein_sdk import ValueinClient, ValueinError

sql = """
SELECT
    r.sector,
    f.fiscal_year,
    f.fiscal_period,
    ROUND(
        AVG(
            MAX(CASE WHEN standard_concept = 'GrossProfit' THEN numeric_value END) /
            NULLIF(MAX(CASE WHEN standard_concept = 'Revenues' THEN numeric_value END), 0)
        ) * 100, 1
    ) AS avg_gross_margin_pct,
    COUNT(DISTINCT r.symbol) AS companies
FROM fact f
JOIN references r USING (entity_id)
WHERE f.form_type = '10-Q'
  AND f.standard_concept IN ('GrossProfit', 'Revenues')
  AND r.is_sp500 = TRUE
  AND f.fiscal_year >= 2023
GROUP BY r.sector, f.fiscal_year, f.fiscal_period
ORDER BY r.sector, f.fiscal_year, f.fiscal_period
"""

try:
    with ValueinClient() as client:
        df = client.query(sql)
    print(df.pivot_table(
        index="sector",
        columns=["fiscal_year", "fiscal_period"],
        values="avg_gross_margin_pct"
    ))
except ValueinError as e:
    print(f"Valuein error: {e}")
MCP Server

Natural language over quarterly data

The Valuein MCP server connects Claude and other AI assistants to your 10-Q dataset. Ask plain-English questions about quarterly momentum, beat-and-raise patterns, and sector trends — no SQL required.

Show me S&P500 companies with accelerating quarterly revenue growth in 2024
Which companies had four consecutive quarters of EPS improvement in 2023?
Find tech sector companies where gross margins compressed more than 5 percentage points YoY
What is the working capital trend for NVDA over the last 8 quarters?
Excel Power Query

Quarterly data in your spreadsheet

Pull 8 quarters of any company's P&L directly into Excel. Your model refreshes within hours of a new 10-Q hitting EDGAR.

Power Query M-Code — Quarterly EPS
let
    Src = Parquet.Document(
        Web.Contents(
            "https://data.valuein.biz/v1/sp500/fact",
            [Headers = [#"X-API-Key" = "vi_live_your_key"]]
        )
    ),
    Filtered = Table.SelectRows(Src,
        each [symbol] = "NVDA"
          and [form_type] = "10-Q"
          and [standard_concept] = "EarningsPerShareDiluted"),
    Sorted = Table.Sort(Filtered,
        {{"period_end", Order.Descending}}),
    Top8 = Table.FirstN(Sorted, 8)
in Top8

Catch earnings acceleration before the crowd

Free tier. 100 API calls/day. From install to DataFrame in 60 seconds.