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

Material events. Within 4 days.

Companies must file an 8-K within 4 business days of any material event. Earnings announcements, M&A deals, CEO departures, dividend declarations, guidance revisions — the 8-K is where corporate events hit the public record first. Valuein indexes every 8-K with filing date and knowledge_at timestamps so you can build event-driven strategies with clean temporal boundaries.

  • Earnings announcements (Item 2.02) with precise filing timestamps
  • M&A events — acquisition agreements and closings
  • Executive appointments and departures (Item 5.02)
  • Dividend declarations and special distributions
  • Guidance revisions and material contract disclosures

Why 8-K timing matters for backtesting

The filing_date in the filing table is the SEC acceptance timestamp — the moment the document became public. Use this as your event date, not the period_end, to avoid look-ahead bias in event-driven backtests.

All 8-K filing dates are available in the filing Parquet table, separate from the fact table which holds financial figures from 10-K and 10-Q filings.

Python SDK

Event-driven queries that deliver alpha

Production-ready queries using ValueinClient combining 8-K metadata with fundamental context.

Earnings Announcement Event Timeline

Map every earnings release to its precise filing date. Build a programmatic earnings calendar and measure announcement lag — critical for event-driven strategies.

from valuein_sdk import ValueinClient, ValueinError

sql = """
SELECT
    r.symbol,
    r.name,
    r.sector,
    fi.period_end          AS reporting_period,
    fi.filing_date         AS announcement_date,
    fi.knowledge_at        AS entered_valuein_at,
    DATEDIFF('day', fi.period_end, fi.filing_date) AS days_after_period_end
FROM filing fi
JOIN references r USING (entity_id)
WHERE fi.form_type = '8-K'
  AND r.is_sp500 = TRUE
  AND fi.filing_date >= '2024-01-01'
  AND fi.filing_date < '2025-01-01'
ORDER BY fi.filing_date DESC
LIMIT 100
"""

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

M&A Event Screen — Acquisition Announcements

Cross-reference 8-K filing density with the acquirer's balance sheet to build event-driven signals. Companies with strong cash and low leverage make better acquirers.

from valuein_sdk import ValueinClient, ValueinError

filings_sql = """
SELECT
    r.symbol, r.name, r.sector,
    fi.filing_date
FROM filing fi
JOIN references r USING (entity_id)
WHERE fi.form_type = '8-K'
  AND r.is_sp500 = TRUE
  AND fi.filing_date BETWEEN '2024-01-01' AND '2024-12-31'
ORDER BY fi.filing_date DESC
"""

health_sql = """
SELECT
    r.symbol,
    MAX(CASE WHEN standard_concept = 'CashAndCashEquivalentsAtCarryingValue'
        THEN numeric_value END) AS cash,
    MAX(CASE WHEN standard_concept = 'LongTermDebt'
        THEN numeric_value END) AS long_term_debt,
    MAX(CASE WHEN standard_concept = 'Assets'
        THEN numeric_value END) AS total_assets
FROM fact f
JOIN references r USING (entity_id)
WHERE f.form_type = '10-Q'
  AND f.fiscal_year = 2024
  AND r.is_sp500 = TRUE
GROUP BY r.symbol
"""

try:
    with ValueinClient() as client:
        eightk_df = client.query(filings_sql)
        health_df  = client.query(health_sql)
    result = eightk_df.merge(health_df, on="symbol", how="left")
    strong = result[result["long_term_debt"] / result["total_assets"].clip(lower=1) < 0.3]
    print(strong.head(20))
except ValueinError as e:
    print(f"Valuein error: {e}")

Executive Change Tracker — CEO and CFO Transitions

CEO and CFO transitions are among the most statistically significant fundamental events for forward 12-month performance. Cross-reference 8-K density with financial trajectory.

from valuein_sdk import ValueinClient, ValueinError

sql = """
WITH eight_k_counts AS (
    SELECT
        r.symbol, r.name, r.sector,
        COUNT(*) AS eight_k_count
    FROM filing fi
    JOIN references r USING (entity_id)
    WHERE fi.form_type = '8-K'
      AND r.is_sp500 = TRUE
      AND fi.filing_date >= '2024-01-01'
    GROUP BY r.symbol, r.name, r.sector
),
financial_trend AS (
    SELECT
        r.symbol,
        MAX(CASE WHEN standard_concept = 'NetIncomeLoss' AND fiscal_year = 2024
            THEN numeric_value END) AS net_income_2024,
        MAX(CASE WHEN standard_concept = 'NetIncomeLoss' AND fiscal_year = 2023
            THEN numeric_value END) AS net_income_2023
    FROM fact f
    JOIN references r USING (entity_id)
    WHERE f.form_type = '10-K' AND r.is_sp500 = TRUE
    GROUP BY r.symbol
)
SELECT
    e.symbol, e.name, e.sector,
    e.eight_k_count,
    ROUND(f.net_income_2024 / 1e6, 0) AS net_income_2024_m,
    ROUND(f.net_income_2023 / 1e6, 0) AS net_income_2023_m,
    ROUND(
        (f.net_income_2024 - f.net_income_2023) /
        NULLIF(ABS(f.net_income_2023), 0) * 100, 1
    ) AS ni_change_pct
FROM eight_k_counts e
JOIN financial_trend f USING (symbol)
ORDER BY e.eight_k_count DESC
LIMIT 25
"""

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

Dividend Sustainability Screen

Track FCF coverage of dividend payments to flag dividends at risk before a cut is announced.

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
    ) / 1e6 AS fcf_m,
    ABS(
        MAX(CASE WHEN standard_concept = 'PaymentsOfDividendsCommonStock'
            THEN numeric_value END)
    ) / 1e6 AS div_paid_m,
    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(ABS(MAX(CASE WHEN standard_concept = 'PaymentsOfDividendsCommonStock'
            THEN numeric_value END)), 0), 2
    ) AS fcf_div_coverage
FROM fact f
JOIN references r USING (entity_id)
WHERE f.form_type = '10-K'
  AND f.fiscal_year = 2024
  AND r.is_sp500 = TRUE
GROUP BY r.symbol, r.name, r.sector
HAVING div_paid_m > 0
ORDER BY fcf_div_coverage ASC NULLS LAST
LIMIT 20
"""

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

Event-driven research with AI

Ask Claude to surface recent 8-K activity, cross-reference with balance sheet health, and flag companies with high event density relative to sector peers.

Which S&P500 companies filed 8-Ks with the most material events in Q1 2024?
Show me the earnings announcement dates for all mega-cap tech companies in 2024
Find companies where dividend FCF coverage ratio dropped below 1.5x in 2024
List all 8-K filings from energy sector companies in the last 90 days
Excel Power Query

8-K filing history in Excel

Pull the full 8-K filing history for any company into Excel and annotate key events on your DCF model timeline.

Power Query M-Code — 8-K Filing Log
let
    Src = Parquet.Document(
        Web.Contents(
            "https://data.valuein.biz/v1/sp500/filing",
            [Headers = [#"X-API-Key" = "vi_live_your_key"]]
        )
    ),
    Filtered = Table.SelectRows(Src,
        each [symbol] = "TSLA"
          and [form_type] = "8-K"
          and [filing_date] >= #date(2024, 1, 1)),
    Sorted = Table.Sort(Filtered,
        {{"filing_date", Order.Descending}})
in
    Sorted

Build your event-driven strategy today

Free tier. 100 API calls/day. Combine 8-K events with fundamental context in one query.