This pulls SEC filings through EdgarTools and gives you structured access to 10-Ks, 10-Qs, insider trades, and financials without parsing PDFs. The standout feature is the token efficiency strategy: calling .to_context() first saves 60-90% on tokens before you drill into full XBRL data. You can compare revenue across companies, track insider Form 4s, or analyze balance sheets over multiple periods using the Entity Facts API. The docs are thorough with five common workflows and clear guidance on when to use bulk filings versus company-specific queries. Just remember to set your identity with set_identity() first since the SEC legally requires it, or everything fails.
npx -y skills add eng0ai/eng0-template-skills --skill sec-edgar-skill --agent claude-codeInstalls into .claude/skills of the current project.
CRITICAL: Run this setup before ANY EdgarTools operations:
from edgar import set_identity
set_identity("Your Name your.email@example.com") # SEC requires identification
This is a SEC legal requirement. Operations will fail without it.
EdgarTools must be installed:
pip install edgartools
ALWAYS use .to_context() first - it provides summaries with 56-89% fewer tokens:
| Object | repr() tokens | .to_context() tokens | Savings |
|---|---|---|---|
| Company | ~750 | ~75 | 90% |
| Filing | ~125 | ~50 | 60% |
| XBRL | ~2,500 | ~275 | 89% |
| Statement | ~1,250 | ~400 | 68% |
Rule: Call .to_context() first to understand what's available, then drill down.
from edgar import get_filings
# Get recent 10-K filings
filings = get_filings(form="10-K")
# Filter by date range
filings = get_filings(form="10-K", year=2024, quarter=1)
# Multiple form types
filings = get_filings(form=["10-K", "10-Q"])
from edgar import get_current_filings
# Get today's filings from RSS feed
current = get_current_filings()
# Filter by form type
current_10k = get_current_filings().filter(form="10-K")
from edgar import Company
# By ticker
company = Company("AAPL")
# By CIK
company = Company("0000320193")
# Get company's filings
filings = company.get_filings(form="10-K")
latest_10k = filings.latest()
Best for comparing trends across periods:
company = Company("AAPL")
# Get income statement for multiple periods
income = company.income_statement(periods=5)
print(income) # Shows 5 years of data
# Get balance sheet
balance = company.balance_sheet(periods=3)
# Get cash flow
cashflow = company.cash_flow_statement(periods=3)
Best for comprehensive single-filing analysis:
company = Company("AAPL")
filing = company.get_filings(form="10-K").latest()
# Get XBRL data
xbrl = filing.xbrl()
# Access financial statements
statements = xbrl.statements
income_stmt = statements.income_statement
balance_sheet = statements.balance_sheet
cash_flow = statements.cash_flow_statement
from edgar import Company
companies = ["AAPL", "MSFT", "GOOGL"]
for ticker in companies:
company = Company(ticker)
income = company.income_statement(periods=3)
print(f"\n{ticker} Revenue Trend:")
print(income)
from edgar import Company
company = Company("NVDA")
filing = company.get_filings(form="10-K").latest()
# Get filing metadata
print(filing.to_context())
# Get full text (expensive - 50K+ tokens)
# text = filing.text()
# Get specific sections
# items = filing.items() # Risk factors, MD&A, etc.
from edgar import Company
company = Company("TSLA")
insider_filings = company.get_filings(form="4") # Form 4 = insider trades
for filing in insider_filings[:10]:
print(filing.to_context())
from edgar import get_filings
# Get recent tech 10-Ks (use SIC codes)
# SIC 7370-7379 = Computer Programming, Data Processing
filings = get_filings(form="10-K", year=2024)
# Filter by company characteristics after retrieval
from edgar import Company
company = Company("AMZN")
# 5-year income statement
income = company.income_statement(periods=20) # 20 quarters = 5 years
# 5-year balance sheet
balance = company.balance_sheet(periods=20)
print("Income Statement Trend:")
print(income)
print("\nBalance Sheet Trend:")
print(balance)
CRITICAL DISTINCTION:
filing = company.get_filings(form="10-K").latest()
# Search WITHIN the filing document (finds text in the 10-K)
results = filing.search("climate risk")
# Search API DOCUMENTATION (finds how to use EdgarTools)
docs_results = filing.docs.search("how to extract")
Do NOT mix these up!
company = Company("AAPL")
company.to_context() # Summary with available actions
company.name # Company name
company.cik # CIK number
company.sic # SIC code
company.industry # Industry description
company.get_filings() # Access filings
filing.to_context() # Summary
filing.form # Form type (10-K, 10-Q, etc.)
filing.filing_date # Date filed
filing.accession_number
filing.text() # Full document text (EXPENSIVE)
filing.markdown() # Markdown format
filing.xbrl() # XBRL financial data
filing.items() # Document sections
xbrl = filing.xbrl()
xbrl.to_context() # Summary
xbrl.statements # All financial statements
xbrl.facts # Individual facts/metrics
stmt = xbrl.statements.income_statement
print(stmt) # ASCII table format
stmt.to_dataframe() # Pandas DataFrame
# BAD - expensive and error-prone
text = filing.text()
# try to regex parse revenue from text...
# GOOD - structured and accurate
income = company.income_statement(periods=3)
# BAD - wastes tokens
text = filing.text() # 50K+ tokens
# GOOD - minimal tokens
print(filing.to_context()) # ~50 tokens
| Form | Description | Use Case |
|---|---|---|
| 10-K | Annual report | Full-year financials, business description |
| 10-Q | Quarterly report | Quarterly financials |
| 8-K | Current report | Material events (M&A, exec changes) |
| DEF 14A | Proxy statement | Executive comp, board info |
| 4 | Insider trading | Stock transactions by insiders |
| 13F | Institutional holdings | What hedge funds own |
| S-1 | IPO registration | Pre-IPO filings |
| 424B | Prospectus | Bond/stock offerings |
from edgar import Company
try:
company = Company("INVALID")
except Exception as e:
print(f"Company not found: {e}")
# Check if filings exist
filings = company.get_filings(form="10-K")
if len(filings) == 0:
print("No 10-K filings found")
For detailed documentation, see:
Or use the built-in docs:
from edgar import Company
company = Company("AAPL")
company.docs.search("how to get revenue")
juliusbrussee/caveman
mattpocock/skills
shadcn/improve
obra/superpowers
forrestchang/andrej-karpathy-skills
vercel-labs/skills