SEC XBRL Financials Scraper icon

Developer tools

SEC XBRL Financials Scraper — Revenue, Assets & EPS

Pull structured SEC XBRL financial facts — Revenue, Assets, NetIncomeLoss, or any US-GAAP/IFRS/DEI concept — as clean typed rows. Frame mode returns every US filer's reported value for one period in one call; company mode returns one filer's full reporting history. No scraping of filing HTML, no manual XBRL parsing.

Free Apify credit covers a first run. No credit card to try.

What this Actor scrapes

SEC's XBRL API is the fastest way to pull standardized financial facts — Revenue, Assets, NetIncomeLoss, and hundreds of other US-GAAP/IFRS/DEI concepts — straight out of company filings, but it is split across a frames endpoint (every filer, one concept, one period) and a companyconcept endpoint (one filer, full history), keyed by a taxonomy/tag/unit combination you are expected to already know, plus 10-digit CIKs instead of tickers. This Actor resolves tickers to CIKs, walks both endpoints, and normalises every fact — including the instant-vs-duration quirk where balance-sheet items carry no start date — into one flat row per company/concept/period.

What we handle for you

  • 🎯 Resolves tickers to CIKs automatically — pass AAPL, get the zero-padded 10-digit CIK SEC's API expects, no manual EDGAR lookups.
  • 🧩 Normalises two endpoint shapes into one row — frame mode (every filer, one period) and company mode (one filer, full history) land in the same flat schema.
  • 🪧 Skips expected 404s per combination — most tag/period and company/tag pairs are legitimately unreported; the Actor logs and continues instead of crashing the run.
  • 🔁 Retries with exponential backoff on 429/5xx and honours Retry-After — up to 5 attempts per request.
  • 🧭 Self-throttles to SEC's fair-access expectations — a descriptive User-Agent and a bounded request rate keep every run inside SEC's published guidance.
  • 🧊 Clean, typed dataset rows — Pydantic-validated, ISO-8601 timestamps, JSON/CSV/Excel export straight from the Apify Console.

Use cases

  • Screen every US public filer's reported Revenue or NetIncomeLoss for a given quarter in one pull.
  • Backfill a fintech model with a company's full multi-year history for one accounting concept.
  • Cross-check a target's reported Assets or shares outstanding before an equity research call.
  • Feed a quant screener with standardized, filer-comparable facts straight from source filings.

Input

Paste this into the Apify Console, or send it as the run input over the API. Proxy settings are on by default; you rarely need to touch them.

FieldTypeRequiredWhat it does
mode string no Which SEC XBRL endpoint family to query: frame mode pulls every filer for one concept/period; company mode pulls one or more filers' full history for one or more concepts.
taxonomy string no XBRL taxonomy the concept belongs to, e.g. us-gaap, ifrs-full or dei.
tag string no Single XBRL concept for frame mode, e.g. Revenues, Assets or NetIncomeLoss. Required when mode is frame.
unit string no XBRL unit for frame mode, e.g. USD, USD-per-shares or shares.
periods array no One or more SEC frame ids, e.g. CY2023Q1I (instant), CY2023Q1 (quarterly) or CY2023 (annual). Required when mode is frame.
tickers_or_ciks array no Tickers (e.g. AAPL) or zero-padded 10-digit CIK strings. Required when mode is company.
tags array no XBRL concept names to fetch per company, all under the same taxonomy. Required when mode is company.
user_agent string no SEC Fair Access requires a descriptive User-Agent naming a contact; unidentified clients get 403'd.
max_results integer no Stop after this many financial-fact rows. Each row is one billed result.
proxy_configuration object no Leave this off unless your account requires egress through Apify Proxy.
{
  "mode": "frame",
  "taxonomy": "us-gaap",
  "tag": "Revenues",
  "unit": "USD",
  "periods": [
    "CY2023Q1I"
  ],
  "max_results": 5,
  "proxy_configuration": {
    "useApifyProxy": false
  }
}

Output

One row per result, schema-validated before it is written. Export JSON, CSV, Excel or XML from the run, or read it over the API.

ciktickerentity_nametaxonomytagunitframeperiodfiscal_yearfiscal_periodformaccession_numberfiled_datestart_dateend_datevalue

{
  "cik": "0000320193",
  "ticker": "AAPL",
  "entity_name": "Apple Inc.",
  "taxonomy": "us-gaap",
  "tag": "Revenues",
  "unit": "USD",
  "frame": "CY2023Q1I",
  "period": "CY2023Q1I",
  "fiscal_year": 2023,
  "fiscal_period": "Q1",
  "form": "10-Q",
  "accession_number": "0000320193-23-000006",
  "filed_date": "2023-02-03",
  "start_date": null,
  "end_date": "2022-12-31",
  "value": 117154000000.0,
  "scraped_at": "2026-08-18T12:00:00+00:00"
}

Pricing

EventPriceWhen
Actor start$0.20Once per run, covers warm-up and proxy session setup.
Result row emitted$0.0020Per result written to the dataset.

You pay only for results that land. Cap any run with maxTotalChargeUsd. See pricing & billing for worked examples.

FAQ

Do I need an API key?
No. SEC publishes this data keylessly; the Actor sends the required descriptive User-Agent SEC's Fair Access policy expects and self-throttles to stay within its request-rate expectations.
Why do some tag/period or company/tag combinations return nothing?
Most XBRL tag/period pairs (frame mode) or company/tag pairs (company mode) are legitimately unreported — not every filer tags every concept every period. The Actor logs and skips these rather than failing the run.
What's the difference between frame mode and company mode?
Frame mode returns every filer's value for one concept in one period — good for cross-sectional screens. Company mode returns one or more filers' full reported history for one or more concepts — good for a time series on names you already know.
Why is `start_date` null on some rows?
SEC XBRL distinguishes instant facts (balance-sheet items reported as of a single date, e.g. total Assets) from duration facts (income-statement items reported over a period). Instant facts have no start date — that's expected, not missing data.

Ready to run it?

Open the listing on Apify, paste the input above, and watch rows land. If it ever breaks, it is our problem before it is yours.

Related Actors

Teams that run this also run