# SEC Financial Statements API - 10-K & 10-Q Fundamentals (XBRL) (`eu_open_data/sec-financial-statements`) Actor

Annual and true quarterly financial statements for any SEC filer from official EDGAR XBRL data: revenue, net income, EPS, balance sheet, cash flow and margins in one clean schema, with Q4 and quarterly cash flow correctly derived and every value traceable to its XBRL tag and filing.

- **URL**: https://apify.com/eu\_open\_data/sec-financial-statements.md
- **Developed by:** [joeri munsterman](https://apify.com/eu_open_data) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.00 / 1,000 financial periods

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## SEC Financial Statements API - 10-K & 10-Q Fundamentals (XBRL)

Annual and **true quarterly** financial statements for any company that files with the SEC, straight from the official **EDGAR XBRL API**: income statement, balance sheet, cash flow and margins in **one fixed schema**, with every value traceable to its XBRL tag and filing.

Give it tickers (`AAPL`, `BRK.B`) or CIK numbers and get one row per company per fiscal year or fiscal quarter. No API key, no scraping, no proxies: this is the SEC's own public-domain data.

### Why not just call the SEC API yourself

The data is free, but turning it into a clean table of quarters is where scripts go wrong:

- **Quarterly cash flow does not exist as a number.** A 10-Q reports cash flow only year-to-date: 3, 6 and 9 months. The second quarter's operating cash flow is the 6-month figure minus the 3-month figure. This Actor does that subtraction for you.
- **Q4 is never filed.** There is no 10-Q for the fourth quarter. Q4 revenue, net income and cash flow are the full year minus the first nine months. This Actor derives them, so a quarterly series has no hole every fourth row.
- **`fy` is the fiscal year of the report, not of the number.** A 10-K for 2025 also carries 2024 and 2023 as comparatives, all labelled `fy: 2025`. This Actor assigns each period its own fiscal year, and corrects the cases where the SEC data itself is inconsistent.
- **The same line item has many tags.** Apple reported revenue as `SalesRevenueNet` until 2018 and as `RevenueFromContractWithCustomerExcludingAssessedTax` since. Microsoft reports selling and general expenses as two separate tags. Banks report no revenue at all. This Actor maps all of these onto one field per line item.
- **Restatements mix badly.** Subtracting a restated full year from an originally reported nine months gives nonsense. Here every number comes from the filing of that period itself, so derived quarters are consistent.
- **Proxy statements contain XBRL too.** Since 2022 a DEF 14A carries net income for the pay-versus-performance table. Only 10-K, 10-Q, 20-F and 40-F figures are used here.

We checked the result on 480 randomly chosen SEC filers: the four derived quarters add up to the reported fiscal year, except where the company rounds to millions or restated its figures later (which each row flags).

### What you get

| | |
|---|---|
| **Income statement** | `revenue`, `costOfRevenue`, `grossProfit`, `researchAndDevelopment`, `sellingGeneralAdministrative`, `operatingIncome`, `interestExpense`, `incomeTax`, `netIncome`, `depreciationAmortization`, `epsBasic`, `epsDiluted`, `weightedAverageDilutedShares` |
| **Balance sheet** | `cashAndEquivalents`, `inventory`, `currentAssets`, `totalAssets`, `currentLiabilities`, `totalLiabilities`, `longTermDebt`, `stockholdersEquity` |
| **Cash flow** | `operatingCashFlow`, `capitalExpenditure`, `investingCashFlow`, `financingCashFlow`, `dividendsPaid`, `shareRepurchases` |
| **Calculated** | `freeCashFlow`, `ebitda`, `grossMarginPercent`, `operatingMarginPercent`, `netMarginPercent`, `currentRatio` |
| **Period** | `fiscalYear`, `fiscalPeriod` (FY, Q1-Q4), `periodStart`, `periodEnd`, `currency`, `accountingStandard` |
| **Traceability** | `form`, `accessionNumber`, `filedOn`, `filingUrl`, `xbrlTags` (the tag behind each value), `derivedFields` (how each calculated value was computed), `revisedInLaterFilings` |

**Foreign filers work too.** Companies filing a 20-F or 40-F under IFRS (SAP, TSMC, Novo Nordisk) are mapped onto the same fields, in their reporting currency (EUR, TWD, DKK). They file annually only, so quarterly mode returns nothing for them.

### Input

```json
{
  "tickers": ["AAPL", "MSFT", "NVDA"],
  "periodType": "quarterly",
  "periods": 8
}
```

- `tickers`: tickers or CIK numbers, up to 500 per run. `BRK.B`, `brk-b` and `0001067983` all work.
- `periodType`: `annual` (fiscal years) or `quarterly` (discrete Q1 to Q4).
- `periods`: how many of the most recent periods per company, 1 to 40.

### Example output

One quarterly row for Apple (abbreviated):

```json
{
  "type": "financial-period",
  "ticker": "AAPL",
  "cik": 320193,
  "companyName": "Apple Inc.",
  "periodType": "quarterly",
  "fiscalYear": 2026,
  "fiscalPeriod": "Q3",
  "periodStart": "2026-03-29",
  "periodEnd": "2026-06-27",
  "currency": "USD",
  "accountingStandard": "US GAAP",
  "revenue": 109417000000,
  "grossProfit": 54770000000,
  "operatingIncome": 35695000000,
  "netIncome": 29789000000,
  "epsDiluted": 2.02,
  "totalAssets": 383266000000,
  "stockholdersEquity": 107520000000,
  "operatingCashFlow": 34369000000,
  "capitalExpenditure": 2455000000,
  "freeCashFlow": 31914000000,
  "grossMarginPercent": 50.06,
  "netMarginPercent": 27.23,
  "form": "10-Q",
  "filedOn": "2026-07-31",
  "filingUrl": "https://www.sec.gov/Archives/edgar/data/320193/000032019326000020/0000320193-26-000020-index.htm",
  "derivedFields": {
    "operatingCashFlow": "9M YTD minus 6M YTD",
    "capitalExpenditure": "9M YTD minus 6M YTD"
  },
  "revisedInLaterFilings": [],
  "xbrlTags": {
    "revenue": "us-gaap:RevenueFromContractWithCustomerExcludingAssessedTax",
    "operatingCashFlow": "us-gaap:NetCashProvidedByUsedInOperatingActivities"
  }
}
```

All amounts are in the reporting currency's units, not thousands or millions. Expenses and payments (`capitalExpenditure`, `dividendsPaid`, `shareRepurchases`) are positive numbers, as filed.

### Typical uses

- **Screening and valuation models**: a clean quarterly series of revenue, margins and free cash flow for a watchlist, ready for a spreadsheet or a pandas DataFrame.
- **AI agents and research assistants**: ask for a company's last eight quarters and get numbers with a link to the filing to cite.
- **Backtesting**: every value is as it was reported in that period's own filing, so there is no look-ahead from later restatements. `revisedInLaterFilings` tells you which values were changed afterwards.
- **Earnings monitoring**: schedule it after earnings season and get the newest quarter for your whole list in one run.

### Pricing

Pay per event: you pay for results, not for runtime.

| Event | Price |
|---|---|
| `financial-period` | $0.015 per company-period row |

Five fiscal years for 20 companies is 100 rows, so $1.50. Tickers that are not found, and companies without XBRL financials, cost nothing.

### Notes and limits

- **Per-share figures and share counts are never derived.** They do not add up across quarters, so Q4 `epsBasic`, `epsDiluted` and `weightedAverageDilutedShares` are `null` unless the company reports them for the quarter.
- **A field is `null` when the company does not report it.** Banks have no gross profit or current assets; a biotech without sales has no revenue. For banks, `revenue` is net interest income plus noninterest income, marked in `derivedFields`.
- **Quarterly values use one tag per fiscal year**, and only one whose full-year value matches the annual figure. If none does, the quarterly field stays empty rather than showing a sub-item.
- **As reported, not restated.** Each value comes from the filing of that period. If the company later revised it, the field name is listed in `revisedInLaterFilings`.
- **Coverage**: companies filing XBRL financial statements with the SEC, roughly from 2009 onwards. Funds, trusts, and OTC-only foreign companies without SEC filings return no rows; the run log names them.
- **Freshness**: the SEC updates its XBRL data within minutes of a filing being accepted.

### Source

[SEC EDGAR APIs](https://www.sec.gov/search-filings/edgar-application-programming-interfaces): `data.sec.gov/api/xbrl/companyfacts` and `www.sec.gov/files/company_tickers.json`. Public-domain US government data. Requests identify this Actor and stay well below the SEC's fair-access limit of 10 requests per second.

This Actor is not affiliated with or endorsed by the SEC. It restructures the data but does not correct what companies filed.

# Actor input Schema

## `tickers` (type: `array`):

US stock tickers (AAPL, BRK.B) or SEC CIK numbers (320193), one per line. Foreign companies filing 20-F or 40-F work too, e.g. SAP, TSM, NVO. Up to 500 per run.

## `periodType` (type: `string`):

Annual fiscal years (10-K, 20-F, 40-F), or discrete fiscal quarters Q1-Q4 (10-Q plus the 10-K for Q4). Quarterly cash flow and Q4 are derived from year-to-date figures, because filers do not report them separately. Foreign filers report annually only.

## `periods` (type: `integer`):

How many of the most recent periods to return per company. Also caps the cost, since billing is per company-period row.

## Actor input object example

```json
{
  "tickers": [
    "AAPL",
    "MSFT",
    "NVDA"
  ],
  "periodType": "annual",
  "periods": 5
}
```

# Actor output Schema

## `results` (type: `string`):

Every company-period row with all fields, including xbrlTags and derivedFields.

## `overview` (type: `string`):

Ticker, period, revenue, net income, diluted EPS, cash flow, assets, equity and net margin.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "tickers": [
        "AAPL",
        "MSFT",
        "NVDA"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("eu_open_data/sec-financial-statements").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "tickers": [
        "AAPL",
        "MSFT",
        "NVDA",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("eu_open_data/sec-financial-statements").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "tickers": [
    "AAPL",
    "MSFT",
    "NVDA"
  ]
}' |
apify call eu_open_data/sec-financial-statements --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,eu_open_data/sec-financial-statements"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/UNzyMGJ1Egy6hPViu/builds/RlWdxzfQ1IxU3Z426/openapi.json
