Next free-source hunt
We check for new free financial data every Wednesday.
Datasets / Fundamentals
sec.gov/

SEC EDGAR APIs

Freeauth: noneCustom#fundamentals#filings#xbrl✓ verified Oct 21, 2026

SEC EDGAR APIs

Official SEC REST/JSON APIs for filing history and XBRL financial data. No API key required; SEC's fair-access policy sets a maximum of 10 requests per second, and SEC asks you to declare a User-Agent with contact details.

The U.S. Securities and Exchange Commission publishes free, official JSON APIs at data.sec.gov: every company's filing history (10-K, 10-Q, 8-K...) and XBRL company facts — standardized financial-statement values going back to 2009. No API key, no signup.

Required Attribution:

Requested: "Please consider appropriate citation to the SEC as the source."

Coverage

Submissions API: filing history for every EDGAR filer, with metadata such as names, tickers and exchanges. XBRL APIs (companyconcept, companyfacts, frames): financial-statement data from 10-Q, 10-K, 8-K, 20-F, 40-F, 6-K and variants (XBRL required since 2009). Updated in real time as filings are disseminated; nightly bulk ZIPs. Free, no key.

Good for

  • Training fundamentals / earnings-quality models on point-in-time reported data
  • Filings agents that watch 8-Ks and summarize them with an LLM
  • Cross-sectional factor research using frames (one concept, all companies, one period)

Verdict

Accessing official SEC filing data for fundamental analysis and monitoring. Updates are near real-time (typical processing delay under 1 second for submissions and under 1 minute for XBRL; longer at peak filing times). No CORS support. Nightly bulk ZIPs available around 3am ET. SEC asks you to declare a User-Agent with contact details; in our test on 2026-10-24, requests without one were blocked (HTTP 403). Example: 'User-Agent: MyCompany/1.0 (contact@example.com)'. Pair with SEC Filing Alert recipe for monitoring.

Endpoints

EndpointReturns
/submissions/CIK##########.jsonFiling history & company metadata
/api/xbrl/companyfacts/CIK##########.jsonAll XBRL facts for one company
/api/xbrl/companyconcept/CIK…/us-gaap/Revenues.jsonOne concept over time
/api/xbrl/frames/us-gaap/Revenues/USD/CY2025Q2I.jsonOne concept across all filers

Get the free weekly email

Free weekly email of newly verified free data. Unsubscribe by emailing us.

Use in your agent

Load SEC EDGAR XBRL company facts into pandas and Parquet. Checked against the provider's documentation on Oct 29, 2026.

Raw skill file (/skills/sec-edgar-apis.md)Also in our MCP server: call get_ingestion_skill with {"slug": "sec-edgar-apis"}.

Access

  • No account or API key.
  • Send a User-Agent header that names you and gives a contact email (SEC asks automated tools to declare one).

Request

bash
curl -H 'User-Agent: Your Name your.email@example.com' https://data.sec.gov/api/xbrl/companyfacts/CIK0000320193.json

Format

JSON: facts → taxonomy (us-gaap, dei, …) → concept → units (USD, shares, …) → a list of reported values with end, val, accn, fy, fp, form, filed, and start and frame when present.

Load into pandas and Parquet

Needs Python 3 with requests, pandas and pyarrow.

python
"""SEC EDGAR XBRL company facts -> long pandas table -> Parquet. No key; declare a User-Agent."""
import requests
import pandas as pd

HEADERS = {"User-Agent": "Your Name your.email@example.com"}  # SEC asks you to declare who you are
CIK = "0000320193"  # 10-digit CIK with leading zeros (this one is Apple Inc.)
r = requests.get(f"https://data.sec.gov/api/xbrl/companyfacts/CIK{CIK}.json", headers=HEADERS, timeout=60)
r.raise_for_status()
facts = r.json()["facts"]

rows = []
for taxonomy, concepts in facts.items():          # e.g. "us-gaap", "dei"
    for concept, body in concepts.items():
        for unit, points in body["units"].items():  # e.g. "USD", "shares"
            for p in points:
                rows.append({"taxonomy": taxonomy, "concept": concept, "unit": unit, **p})

df = pd.DataFrame(rows)
for c in ("start", "end", "filed"):
    if c in df:
        df[c] = pd.to_datetime(df[c])
df.to_parquet("sec_companyfacts_320193.parquet", index=False)
print(len(df), "facts;", df["concept"].nunique(), "concepts; forms:", sorted(df["form"].dropna().unique())[:6])

Run by us on 2026-10-29 (python 3.13.5 | pandas 3.1.0 | pyarrow 26.0.0 | requests 2.34.2). Result: 25,135 reported values across 505 concepts for CIK 0000320193 (Apple Inc.).

Limits

  • Rate limit: at most 10 requests per second in total, however many machines you use; above that, requests may be limited for a brief period.
  • For many companies, use the nightly bulk file companyfacts.zip instead of one request per company.

Quirks

  • The CIK in the URL must be 10 digits with leading zeros.
  • Later filings repeat earlier values and can restate them, so one concept, unit, start and end can carry different values (Observed 2026-10-29: 426 such periods for Apple, for example AccruedLiabilitiesCurrent at 2008-09-27 is 3.719B in the 10-K and 4.224B in the later 10-K/A). To keep the latest reported value per period, sort by filed and keep the last row for each concept, unit, start and end, and keep accn so each value traces back to its filing.
  • Companies report the same idea under different concepts (revenue has several us-gaap tags), so check which concept a company uses.
  • Observed 2026-10-24: requests without a declared User-Agent returned HTTP 403.
  • data.sec.gov does not support CORS, so call it from a script or server, not from browser JavaScript.

Terms and attribution

  • SEC asks for appropriate citation of the SEC as the source. EDGAR data is public information; the EDGAR name and logos are restricted.

Sources

Information and education only. Not financial, investment, legal or tax advice. Listings can be inaccurate, incomplete or out of date and are provided "as is". Free tiers, limits and licenses belong to each provider and can change, so check the provider's own terms before you rely on them. Terms & Disclaimer