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/5xxand honoursRetry-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.
| Field | Type | Required | What 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
| Event | Price | When |
|---|---|---|
| Actor start | $0.20 | Once per run, covers warm-up and proxy session setup. |
| Result row emitted | $0.0020 | Per 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?
Why do some tag/period or company/tag combinations return nothing?
What's the difference between frame mode and company mode?
Why is `start_date` null on some rows?
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