alterlab-edgartools — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited alterlab-edgartools (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Python library for accessing all SEC filings since 1994 with structured data extraction.
| Scenario | Use Instead |
|---|---|
| Market prices, OHLCV, quotes, or technical indicators | alterlab-alpha-vantage |
| Macroeconomic time series (GDP, corporate profits, rates) by FRED series ID | alterlab-fred |
| Aggregate hedge-fund statistics from Form PF published by the OFR | alterlab-hedgefund-monitor |
| Federal debt, Treasury statements, or auction results | alterlab-usfiscaldata |
The SEC requires identification for API access. Always set identity before any operations:
from edgar import set_identity
set_identity("Your Name [email protected]")Set via environment variable to avoid hardcoding: EDGAR_IDENTITY="Your Name [email protected]".
edgartools sends this identity as the HTTP User-Agent the SEC asks for ("Sample Company Name AdminContact@<domain>.com") and throttles itself to 9 requests/second by default (EDGAR_RATE_LIMIT_PER_SEC), under the SEC's 10 requests/second fair-access ceiling — keep that default for sec.gov, because the SEC may block IP addresses that exceed it.
uv pip install edgartools
# For AI/MCP features:
uv pip install "edgartools[ai]"API examples here are checked against edgartools 5.58.0 (current as of 2026-09). To run a one-off without a venv: uv run --with edgartools python .... In 5.x, cashflow_statement() is a deprecated alias (removed in 6.0) — use cash_flow_statement().
from edgar import Company, find
company = Company("AAPL") # by ticker
company = Company(320193) # by CIK (fastest)
results = find("Apple") # by name search# Company filings
filings = company.get_filings(form="10-K")
filing = filings.latest()
# Global search across all filings
from edgar import get_filings
filings = get_filings(2024, 1, form="10-K")
# By accession number
from edgar import get_by_accession_number
filing = get_by_accession_number("0000320193-23-000106")# Form-specific object (most common approach)
tenk = filing.obj() # Returns TenK, EightK, Form4, ThirteenF, etc.
# Financial statements (10-K/10-Q)
financials = company.get_financials() # annual
financials = company.get_quarterly_financials() # quarterly
income = financials.income_statement()
balance = financials.balance_sheet()
cashflow = financials.cash_flow_statement()
# XBRL data
xbrl = filing.xbrl()
income = xbrl.statements.income_statement()text = filing.text() # plain text
html = filing.html() # HTML
md = filing.markdown() # markdown (good for LLM processing)
filing.open() # open in browsercompany.name # "Apple Inc."
company.cik # 320193
company.get_ticker() # "AAPL" (primary); company.tickers -> list
company.industry # "ELECTRONIC COMPUTERS"
company.sic # "3571"
company.shares_outstanding # 15115785000.0
company.public_float # 2899948348000.0
company.fiscal_year_end # "0930"
company.get_exchanges() # ["Nasdaq"]| Form | Object | Key Properties |
|---|---|---|
| 10-K | TenK | financials, income_statement, balance_sheet, risk_factors |
| 10-Q | TenQ | financials, income_statement, balance_sheet |
| 8-K | EightK | items, press_releases |
| Form 4 | Form4 | reporting_owners, insider_name, market_trades, to_dataframe() |
| 13F-HR | ThirteenF | infotable, total_value, holdings |
| DEF 14A | ProxyStatement | executive_compensation, voting_proposals, peo_total_comp |
| SC 13D/G | Schedule13D / Schedule13G | total_shares, total_percent, items (13D) |
| Form D | FormD | offering_data, related_persons, primary_issuer |
Important: filing.financials does NOT exist. Use filing.obj().financials.
filing.financials → AttributeError; use filing.obj().financialsget_filings() has no limit param; use .head(n) or .latest(n)amendments=False for multi-period analysis (amended filings may be incomplete)None before accessing optional dataLoad these when you need detailed information:
.docs and .to_context() propertiesCite the filing (company, form, accession number, filing date) for every figure you report.
Part of the AlterLab Academic Skills suite.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.