Public data · active

SEC EDGAR APIs

Official JSON and bulk-data access to company filing submissions and XBRL facts.

What it covers

Official JSON and bulk-data access to company filing submissions and XBRL facts. The profile stays deliberately concise: use the linked official reference for endpoint schemas and current commercial terms.

Integration notes

Authenticate exactly as the provider documents, keep credentials out of client bundles, and retain upstream request identifiers when available. Pagination, retries, caching, and webhook verification should be implemented per product rather than inferred from another API.

Key endpoints

Endpoint Description
GET /cgi-bin/browse-edgar Company filing index
GET /Archives/edgar/data/{cik}/{acc}/ Filing documents
GET /api/xbrl/companyfacts/CIK{cik}.json XBRL company facts
GET /api/xbrl/companyconcept/CIK{cik}/{taxonomy}/{tag}.json XBRL concept data
GET /files/company_tickers_exchange.json Ticker-CIK mapping
GET /Archives/edgar/daily-index/ Daily filing index

Decision notes

Best suited to authoritative u.s. filing metadata and company xbrl facts. Before production, verify follow sec fair-access and user-agent rules. do not treat filing facts as investment advice. Mutable limits, prices, and versions were checked on 2026-09-13 and should be rechecked at purchase or deployment time.

Python example: company filings (no API key)

import httpx

BASE = "https://data.sec.gov"
# SEC REQUIRES a descriptive User-Agent with contact info — requests without one are blocked
HEADERS = {"User-Agent": "YourAppName/1.0 (contact@example.com)", "Accept-Encoding": "gzip"}

def get_filings(cik: str, form: str | None = None, count: int = 10) -> list[dict]:
    """Get recent filings for a CIK (10-digit, zero-padded)."""
    cik = cik.zfill(10)
    resp = httpx.get(f"{BASE}/submissions/CIK{cik}.json", headers=HEADERS, timeout=30)
    resp.raise_for_status()
    filings = resp.json()["filings"]["recent"]
    rows = []
    for i in range(min(count, len(filings["accessionNumber"]))):
        if form and filings["form"][i] != form:
            continue
        rows.append({
            "form": filings["form"][i],
            "filed": filings["filingDate"][i],
            "accession": filings["accessionNumber"][i].replace("-", ""),
        })
    return rows

# Apple's recent 10-K filings (CIK 320193)
for f in get_filings("320193", form="10-K", count=3):
    print(f["filed"], f["accession"])

Notes:

  • No API key — but a proper User-Agent with contact email is mandatory
  • Rate limit: 10 requests/second; be a good citizen
  • Company concept data (e.g. XBRL facts) lives under /api/xbrl/companyconcept/CIK{cik}/us-gaap/{tag}.json
  • Full-text search has a separate UI at efts.sec.gov; the JSON APIs above are the programmatic path

Integration surface

Versioning
Unversioned documented JSON endpoints; monitor SEC guidance
Resource groups
Submissions, Company facts, Company concepts, Bulk ZIP archives
Pagination
Submission history may be split into referenced files; bulk archives are available
Errors
HTTP status responses; throttle and identify requests
Webhooks
No webhooks documented
Official SDKs
None confirmed in the reviewed official sources.