jnachi
Learning Hub
Finance & FinOps AI8 min readAdvanced

Multi-Table SEC 10-K/10-Q Parsing & XBRL Tag Extraction

Extract multi-year financial tables from SEC EDGAR filings, parse XBRL US-GAAP taxonomies, reconcile restated line items, and audit footnote disclosures.

Works with:sec-edgar-downloaderBeautifulSoup4Python xbrlLlamaParse

Key Takeaways

  • SEC EDGAR filings are published in HTML and Inline XBRL (iXBRL) format, embedding machine-readable accounting tags directly into filing documents
  • XBRL taxonomy concepts (e.g., `us-gaap:Revenues`, `us-gaap:OperatingIncomeLoss`) standardize financial line items across public companies
  • LLM agents must identify restatements and changes in accounting estimates across consecutive 10-K annual reports
  • Footnote disclosure tables (leases, segment reporting, stock-based compensation) require table-aware parsing algorithms

The Diagnostic Context

Extracting historical financial data from 200-page SEC 10-K annual filings manually takes hours. Utilizing automated XBRL extraction pipelines allows analysts to ingest structured financial data across thousands of public companies programmatically.

The Core Technique

Parsing SEC EDGAR Filings & XBRL Concepts

PYTHON
import requests
import json

def fetch_sec_company_facts(cik_str: str) -> dict:
    """
    Fetches SEC Company Facts API directly from EDGAR (Zero scrape latency).
    CIK must be 10 digits padded with leading zeros.
    """
    headers = {'User-Agent': 'JnachiFinance Research/1.0 (contact@jnachi.com)'}
    cik_padded = cik_str.zfill(10)
    url = f"https://data.sec.gov/api/xbrl/companyfacts/CIK{cik_padded}.json"
    
    response = requests.get(url, headers=headers)
    if response.status_code != 200:
        raise ConnectionError(f"SEC EDGAR returned status {response.status_code}")
        
    data = response.json()
    gaap_facts = data.get("facts", {}).get("us-gaap", {})
    
    # Extract Revenue History across 10-K filings:
    revenues = gaap_facts.get("Revenues", {}).get("units", {}).get("USD", [])
    annual_revenues = [r for r in revenues if r.get("form") == "10-K"]
    
    return {
        "company_name": data.get("entityName"),
        "cik": cik_str,
        "recent_annual_revenues": annual_revenues[-5:] # Last 5 years
    }

Handling Restatements & Footnote Leases

  • ASC 842 Lease Standards: Operating leases must be capitalized as Right-of-Use (ROU) assets with corresponding lease liabilities.
  • Segment Reporting (ASC 280): Ingest operating profit by business division and geographical region to model segment-level revenue drivers.
5-Minute Activation Challenge

Try This Right Now

Use the SEC Company Facts API structure above with Apple CIK (0000320193) to inspect how R&D Expense (`us-gaap:ResearchAndDevelopmentExpense`) is recorded over time!

Tip: Knowledge only becomes capability once you run the prompt yourself.

Comprehension Check

Test Your Instincts (1 Questions)

1

What is the primary advantage of querying SEC Inline XBRL (iXBRL) data over scraping raw HTML tables?