SEC Financials Scraper avatar

SEC Financials Scraper

Pricing

from $3.10 / 1,000 results

Go to Apify Store
SEC Financials Scraper

SEC Financials Scraper

Get clean, normalised financial statements for US public companies from the SEC EDGAR XBRL API by ticker or CIK: revenue, net income, EPS, assets, cash flow, plus margins, ROE, ROA and YoY growth. Batch a whole watchlist, or screen one metric across every filer. No API key.

Pricing

from $3.10 / 1,000 results

Rating

0.0

(0)

Developer

Norm Data

Norm Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Norm Data

🏛️ SEC Financials Scraper

Pull clean, normalised financial statements for US public companies straight from the official SEC EDGAR XBRL API by ticker or CIK. Revenue, net income, EPS, assets, equity and cash flow as one flat row per company per fiscal period, with computed margins, ROE, ROA and year-over-year growth already worked out. Batch a whole watchlist, or run the market-wide screener for one metric across every filer. No API key, no login.

Here is one real row (trimmed), for Apple FY2024:

{
"ticker": "AAPL",
"cik": "320193",
"company_name": "Apple Inc.",
"sic_description": "Electronic Computers",
"exchange": "Nasdaq",
"fiscal_year": 2024,
"fiscal_period": "FY",
"period_end": "2024-09-28",
"form": "10-K",
"filed_date": "2024-11-01",
"revenue": 391035000000,
"gross_profit": 180683000000,
"operating_income": 123216000000,
"net_income": 93736000000,
"eps_diluted": 6.08,
"total_assets": 364980000000,
"total_equity": 56950000000,
"operating_cash_flow": 118254000000,
"capex": 9447000000,
"free_cash_flow": 108807000000,
"gross_margin": 0.4621,
"operating_margin": 0.3151,
"net_margin": 0.2397,
"return_on_equity": 1.6459,
"revenue_growth_yoy": 0.0202,
"source_url": "https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=320193&type=10-K",
"scraped_at": "2026-09-08T20:00:00.000Z"
}

What it does

Reads the SEC's XBRL company-facts API (data.sec.gov), which the SEC publishes for public programmatic use. Three modes:

  • Companies - paste a list of tickers or CIKs and get a full, normalised statement for every fiscal period: 20+ income-statement, balance-sheet and cash-flow line items, plus ratios and YoY growth. One row per company per period.
  • Concept - one metric (e.g. revenue) as a clean time series for a list of companies.
  • Frame (screener) - one metric for every company that reported it in a calendar period. "Revenue for all US filers in CY2024" comes back as ~3,000 rows.

The normalisation is the point. Filers report the same line item under different XBRL tags depending on the year and the company (Apple's revenue lives under RevenueFromContractWithCustomerExcludingAssessedTax, Revenues and SalesRevenueNet across different filings). This Actor maps every variant to one clean revenue column, dedupes re-stated values to the latest filing, and drops 8-K and proxy re-statements that would otherwise corrupt the series.

Why this scraper

  • Clean columns, not raw tags. Every other SEC financials Actor hands you the messy XBRL tag and leaves the normalisation to you. This one gives you revenue, net_income, eps_diluted ready to use.
  • Batch input with ticker to CIK auto-resolution. Paste AAPL, MSFT, NVDA; most Actors make you look up and supply the 10-digit CIK yourself.
  • Ratios and growth built in. Margins, ROE, ROA, current ratio, debt-to-equity, free cash flow, and YoY revenue / net income / EPS growth on every row.
  • Screener mode. One metric across the whole market in a single period - a bulk dataset no other Actor offers.
  • One row per input. Tickers that do not resolve come back as an error row so your output lines up with your list.
  • No API key, no login. The SEC data is free; so is a well-packaged version of it.

How it compares

CapabilityThis actorOther SEC financials scrapers on Apify
Financial line items by ticker or CIKyesyes
Normalised metrics (one clean column per line item)yesraw XBRL tags
Batch multi-ticker input + ticker to CIK resolutionyesoften CIK only, one at a time
Computed margins, ROE, ROA, ratiosyesrare
Year-over-year growthyesrare
Market-wide screener (one metric, every filer)yesno
Restatement de-duplication + 8-K noise filteringyesrare
One row per input (error rows for bad tickers)yesno
Declared dataset schema + free-plan previewyesrare

Use cases

  • Fundamentals database. Load revenue, margins and growth for a universe of tickers into a factor model or a screener.
  • Sales and market intelligence. Filter B2B prospects by revenue, growth or profitability.
  • Investment diligence. Pull 5-10 years of financials for a company and its public comps before a deal.
  • Benchmarking. Use Frame mode to rank an entire industry (by SIC) on one metric.
  • Monitoring. Re-run a watchlist on a schedule; the filed_date and accession_number fields make restatements easy to spot.

Quickstart

{
"mode": "companies",
"identifiers": ["AAPL", "MSFT", "NVDA"],
"period": "annual",
"fiscalYearFrom": 2020,
"maxItems": 50
}

Revenue time series for two companies:

{ "mode": "concept", "identifiers": ["AAPL", "TSLA"], "metric": "revenue", "period": "annual" }

Every US filer's revenue for calendar year 2024:

{ "mode": "frame", "metric": "revenue", "framePeriod": "CY2024", "maxItems": 5000 }

Input reference

FieldApplies toDescription
maxItemsallCeiling on rows written.
modeallcompanies, concept or frame.
identifierscompanies, conceptTickers or CIKs. Tickers resolve automatically.
periodcompanies, conceptannual (10-K), quarterly (10-Q) or both.
fiscalYearFrom / fiscalYearTocompanies, conceptFilter by the calendar year the period ends in.
includeRatioscompaniesAdd margins, ROE, ROA, ratios and YoY growth.
metricconcept, frameWhich line item to pull (revenue, net_income, total_assets, ...).
framePeriodframeCY2024 (year), CY2024Q1 (quarter), CY2024Q1I (balance-sheet instant).

Output reference (selected)

One row per company per fiscal period (companies mode). Values are null when the filer did not report that item, never invented.

FieldDescription
ticker / cik / company_nameIdentity. cik is the SEC key.
sic / sic_description / exchange / state_of_incorporationCompany metadata.
fiscal_year / fiscal_periodYear the period ends in, and FY / Q1 / Q2 / Q3.
period_start / period_end / form / filed_date / accession_numberFiling provenance.
revenue ... eps_dilutedIncome statement, normalised across XBRL tag variants.
total_assets ... shares_outstandingBalance sheet.
operating_cash_flow / capex / dividends_paid / free_cash_flowCash flow.
gross_margin / operating_margin / net_margin / rd_intensityMargins (with includeRatios).
return_on_equity / return_on_assets / current_ratio / debt_to_equityRatios.
revenue_growth_yoy / net_income_growth_yoy / eps_diluted_growth_yoyYoY change vs the prior same period.
metric / value / periodConcept and Frame mode rows.
query / errorSet on an unresolved-identifier row.
source_urlEDGAR filing history for the company.
scraped_atISO 8601 collection timestamp.

Run via API and CLI

curl -X POST "https://api.apify.com/v2/acts/USERNAME~sec-financials-scraper/run-sync-get-dataset-items?token=<TOKEN>" \
-H "Content-Type: application/json" \
-d '{"mode":"companies","identifiers":["AAPL","MSFT"],"period":"annual","fiscalYearFrom":2020}'
$apify call USERNAME/sec-financials-scraper --input '{"mode":"frame","metric":"revenue","framePeriod":"CY2024","maxItems":5000}'

Fetch results

$curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"

<DATASET_ID> is defaultDatasetId on the run object.

Billing and limits

  • Pay per result. Billed per row written. The current rate is on the Actor's Pricing tab.
  • No charge on failure. A run that produces zero rows fails with a message and is not billed.
  • An unresolved ticker still writes one error: "not found" row and is billed as a base row.
  • Free Apify plans run the built-in 10-row sample only. Upgrade to run your own settings.
  • The SEC API allows about 10 requests per second; this Actor stays well under it.

FAQ and troubleshooting

Do I need an API key or login? No. data.sec.gov is a US government open-data host with no key, no login and no captcha. The Actor sends a descriptive User-Agent as the SEC asks.

Why is a metric null? The filer did not report that XBRL line item for that period. Banks, for example, rarely report capex the standard way. Missing values are null, never guessed.

Why does fiscal_year differ from what the company calls its fiscal year? It is the calendar year the period ends in - the convention most data vendors use. A company with a June year-end has its "FY2025" period end in June 2025.

How does it handle restatements? For each period it keeps the value from the most recent 10-K / 10-Q, and ignores 8-K earnings releases and DEF 14A proxies that re-quote the same numbers without a proper period tag.

What is Frame mode for? Screening. {"mode":"frame","metric":"net_income","framePeriod":"CY2024"} returns every US filer's 2024 net income in one run - a market-wide dataset.

Is this an official SEC tool? No. Independent, not affiliated with the SEC. It reads only data the SEC publishes as open data.

Local development

bun install
bun test # offline: normalisation and input logic against synthetic fixtures
bun run src/main.ts # reads storage/key_value_stores/default/INPUT.json