# Company Financials API: SEC EDGAR XBRL Fundamentals (`boubap/sec-edgar-financials`) Actor

Financials of US listed companies and foreign issuers from the official SEC EDGAR XBRL API: revenue, net income, EPS, cash flow, balance sheet and margins. One row per fiscal year or quarter, Q4 computed. Also lists 10-K, 10-Q and 8-K filings. No API key.

- **URL**: https://apify.com/boubap/sec-edgar-financials.md
- **Developed by:** [Baptiste Bouton](https://apify.com/boubap) (community)
- **Categories:** Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Company Financials API: SEC EDGAR XBRL Fundamentals

One row per company and fiscal period, taken from the SEC's own EDGAR XBRL API: revenue, gross profit, operating income, net income, EPS, operating cash flow, capital expenditure, free cash flow, assets, liabilities, equity, cash, debt and margins. Annual, quarterly or both. Fourth quarters and quarterly cash flows are computed for you. A second mode lists a company's SEC filings (10-K, 10-Q, 8-K, 20-F and more) with links to the documents.

Look companies up by ticker (AAPL, BRK.B) or by SEC CIK number. The data comes from `data.sec.gov`, not from page scraping. No API key, no SEC account.

### What it adds to the raw API

The SEC `companyfacts` API returns every XBRL fact a company ever filed, concept by concept, with a duplicate for each later report. The Actor turns that into a table:

- **One row per fiscal year or quarter**, with 18 metrics side by side and margins computed.
- **Fourth quarters.** Companies report Q4 only inside the annual 10-K. The Actor computes it as the year minus the first nine months and lists those metrics in `derivedMetrics`.
- **Quarterly cash flows.** 10-Q reports give cash flows year to date. The Actor subtracts the previous quarter to get the quarter alone.
- **Concept changes.** Revenue was `SalesRevenueNet` before 2018 and `RevenueFromContractWithCustomerExcludingAssessedTax` after, for example. The Actor picks the right concept period by period, and `sourceConcepts` shows which one.
- **US GAAP and IFRS.** Foreign issuers filing 20-F or 40-F reports (Novo Nordisk, Canadian Natural Resources) use the same columns, in their reporting currency.
- **Restatements.** When a later report restates a figure, you get the latest value.
- **Fiscal years as the company reports them to the SEC.** Apple's fiscal 2025 ends in September 2025, Walmart's fiscal 2026 in January 2026, Target's fiscal 2025 in January 2026.

### Use cases

- **Screening and comparisons**: the last 5 years of revenue, margins and free cash flow for a list of tickers, in one table.
- **Financial models and spreadsheets**: quarterly figures for a company, Q4 included, ready for Excel or Google Sheets.
- **Earnings tracking**: schedule a weekly run on your watchlist and get each new quarter as it is filed.
- **Filing monitoring**: new 10-K, 10-Q and 8-K filings of a list of companies, with the 8-K item numbers (2.02 results, 5.07 shareholder votes).
- **AI agents and RAG**: fundamentals and document links as structured data, through the Apify MCP server.

### Input

Financials, by fiscal year:

```json
{
  "companies": ["AAPL", "MSFT", "NVO"],
  "mode": "financials",
  "period": "annual",
  "fiscalYearFrom": 2022
}
```

Quarters (Q4 included) and fiscal years together: `"period": "both"`.

Filings of the last year:

```json
{
  "companies": ["AAPL", "NVDA"],
  "mode": "filings",
  "formTypes": ["10-K", "10-Q", "8-K"],
  "filedFrom": "2025-10-01"
}
```

| Field | Description |
|---|---|
| `companies` | Tickers or CIK numbers, one per line. At most 500 per run. |
| `mode` | `financials` (default) or `filings`. |
| `period` | `annual` (default), `quarterly` or `both`. |
| `fiscalYearFrom` | Oldest fiscal year. Default: 5 years ago. |
| `formTypes` | Filings mode: forms to return. Empty list for all company forms. |
| `includeAmendments` | Filings mode: also return 10-K/A, 8-K/A and so on. Default true. |
| `filedFrom`, `filedTo` | Filings mode: filing date range (YYYY-MM-DD). Default: the last 365 days. |
| `maxResults` | Maximum rows for the whole run. Default 1000. |
| `userAgentContact` | Optional: your organization and contact, sent to the SEC instead of the Actor's page. |

### Output

One financials row, from a real run on 23 October 2026 (Apple, fiscal year 2025):

```json
{
  "cik": "0000320193",
  "companyName": "Apple Inc.",
  "ticker": "AAPL",
  "exchange": "Nasdaq",
  "sic": "3571",
  "sicDescription": "Electronic Computers",
  "period": "annual",
  "fiscalYear": 2025,
  "fiscalPeriod": "FY",
  "periodStart": "2024-09-29",
  "periodEnd": "2025-09-27",
  "form": "10-K",
  "filed": "2025-10-31",
  "accessionNumber": "0000320193-25-000079",
  "filingUrl": "https://www.sec.gov/Archives/edgar/data/320193/000032019325000079/0000320193-25-000079-index.htm",
  "currency": "USD",
  "revenue": 416161000000,
  "costOfRevenue": 220960000000,
  "grossProfit": 195201000000,
  "researchAndDevelopment": 34550000000,
  "operatingIncome": 133050000000,
  "netIncome": 112010000000,
  "epsBasic": 7.49,
  "epsDiluted": 7.46,
  "dilutedShares": 15004697000,
  "operatingCashFlow": 111482000000,
  "capitalExpenditure": 12715000000,
  "totalAssets": 359241000000,
  "currentAssets": 147957000000,
  "totalLiabilities": 285508000000,
  "currentLiabilities": 165631000000,
  "stockholdersEquity": 73733000000,
  "cashAndEquivalents": 35934000000,
  "longTermDebt": 78328000000,
  "freeCashFlow": 98767000000,
  "grossMargin": 0.4691,
  "operatingMargin": 0.3197,
  "netMargin": 0.2692,
  "derivedMetrics": [],
  "sourceConcepts": {
    "revenue": "us-gaap:RevenueFromContractWithCustomerExcludingAssessedTax",
    "netIncome": "us-gaap:NetIncomeLoss",
    "operatingCashFlow": "us-gaap:NetCashProvidedByUsedInOperatingActivities",
    "totalAssets": "us-gaap:Assets"
  }
}
```

`sourceConcepts` lists one concept per metric; four are shown here. The fourth quarter of the same year, from the same run, has `"fiscalPeriod": "Q4"`, `"periodStart": "2025-06-29"`, `"revenue": 102466000000`, `"netIncome": 27466000000`, `"epsDiluted": null` (earnings per share do not add up across quarters) and `derivedMetrics` listing the computed fields.

One filings row, from a real run on the same day:

```json
{
  "cik": "0000320193",
  "companyName": "Apple Inc.",
  "ticker": "AAPL",
  "form": "8-K/A",
  "filingDate": "2026-09-01",
  "reportDate": "2026-04-17",
  "acceptedAt": "2026-09-02T00:30:35.000Z",
  "accessionNumber": "0001140361-26-035325",
  "items": ["5.02"],
  "description": "8-K/A",
  "isXBRL": true,
  "isInlineXBRL": true,
  "sizeBytes": 241262,
  "documentUrl": "https://www.sec.gov/Archives/edgar/data/320193/000114036126035325/ef20081427_8ka.htm",
  "filingIndexUrl": "https://www.sec.gov/Archives/edgar/data/320193/000114036126035325/0001140361-26-035325-index.htm"
}
```

A value is `null` when the company does not report it: banks have no gross profit, and some companies (Berkshire Hathaway, Visa) report earnings per share by share class only.

### Speed and cost

A run on 40 large US companies, annual and quarterly from fiscal 2021, returned 1,100 rows in 49 seconds with the default 512 MB of memory. The Actor sends at most 5 requests per second to the SEC, half of the SEC's limit of 10.

### Pricing

You pay per row returned, no subscription: one row is one company and fiscal period, or one filing. Companies that are not found cost nothing.

| Event | Price | Per 1,000 |
|---|---|---|
| `financial-period` (one company, one fiscal year or quarter) | $0.003 | $3 |
| `filing` (one SEC filing) | $0.001 | $1 |

Example: 5 years of annual figures for 100 companies is 500 rows, about $1.50. Set `maxResults` to cap the bill of a run.

Each run is billed for every row it returns, even if an earlier run returned the same row: runs do not remember each other. On a schedule, keep the window short. In filings mode, set `filedFrom` to the date of the previous run. In financials mode, set `fiscalYearFrom` to the current fiscal year, so a weekly run returns at most 5 rows per company (the year to date and its quarters).

### Integrations

- **Google Sheets, Excel, Airtable**: run the Actor on a schedule and export the dataset as CSV or XLSX, or use the Apify integration for Google Sheets.
- **Make, Zapier, n8n**: use the Apify module or node "Run Actor", then "Get dataset items", and send each new quarter to Slack, email or a database.
- **Apify MCP server**: expose the Actor to Claude or another AI agent and ask "revenue and free cash flow of NVDA for the last 8 quarters".
- **API**: call the Actor from Python or JavaScript with the Apify client and read the dataset as JSON.

### Searches this Actor answers

Income statement, balance sheet and cash flow by ticker, annual and quarterly. Free cash flow and margins for a list of stocks. 10-K and 10-Q data as JSON or CSV. SEC XBRL companyfacts as a flat table. 8-K and 10-K filing alerts. 20-F fundamentals for foreign issuers.

### Tips

- For a 10-year history, set `fiscalYearFrom` to 10 years ago. XBRL data starts in 2009 for the largest companies and in 2011 for the others.
- Share classes: `BRK.B` and `BRK-B` both work.
- If a ticker is not found, give the CIK number from [EDGAR company search](https://www.sec.gov/edgar/search/).
- After a reorganization, a ticker can move to a new holding company with a new CIK and a short history (XOM now points to ExxonMobil Holdings Corp). Give the former CIK as well to get the earlier years.
- To follow new quarters, schedule a weekly run with `period: "quarterly"` and `fiscalYearFrom` set to the current fiscal year: each run returns the quarters of that year, the newest included, and bills them again (see Pricing).
- To follow new filings, schedule a run in filings mode and move `filedFrom` to the date of the previous run, so each filing is billed once.

### FAQ

**Do I need an SEC account or API key?** No. The SEC's EDGAR APIs are public.

**Which companies are covered?** Every company that files financial statements with the SEC in XBRL: US listed companies of all sizes, and foreign issuers filing 20-F or 40-F reports. Funds and trusts that do not file XBRL financial statements are reported in the log and not billed. Quarterly rows exist only for companies that file 10-Q reports: foreign issuers filing 20-F or 40-F reports publish annual figures only in XBRL, so they get fiscal-year rows.

**Why does a quarter show values in `derivedMetrics`?** Those values are computed, not reported for that quarter: Q4 is the year minus nine months, and quarterly cash flows are the year-to-date figure minus the previous quarter's. Per-share values and share counts are never computed this way and stay `null` when not reported.

**Are the figures as originally reported or restated?** Restated: each value is the latest one the company filed for that period. `form`, `filed` and `accessionNumber` point to the report that first gave the period. Quarters use the same XBRL concept as their fiscal year, so that they add up to it. After a spin-off or the sale of a business, a company restates its past years but not always its past quarters: the four quarters of such a year can then differ from the restated total.

**Are per-share values adjusted for stock splits?** No. Earnings per share are the values filed for each period, so years before a split are not comparable with years after it.

**Does it return insider trades or people's names?** No. The output describes companies only. Forms 3, 4 and 5 (insider trades), Form 144, Schedules 13D and 13G (large shareholders) and proxy material from dissident shareholders (DFAN14A, PREN14A, DEFN14A) are excluded, and CIK numbers of individual filers are refused. No officer, director or signatory names, and no addresses.

**What does the Actor send to the SEC?** The SEC asks automated tools to identify themselves. The Actor sends `ApifyFactory sec-edgar-actor (contact via apify.com/boubap)`. Set `userAgentContact` if you prefer to be identified directly.

**Is this investment advice?** No. The data is what companies filed with the SEC. Check the filing (`filingUrl`) before relying on a figure.

### Related Actors

Other Actors from the same account, also pay per result:

- [French Company Search](https://apify.com/boubap/france-companies-scraper): French companies with SIREN, NAF code and published revenue.
- [Tech Stack Detector](https://apify.com/boubap/tech-stack-detector): The technologies a company's website runs on.
- [Google Trends Explore API](https://apify.com/boubap/google-trends-explore): Search interest for a brand or product over time.

# Actor input Schema

## `companies` (type: `array`):

Stock tickers (AAPL, BRK.B) or SEC CIK numbers (320193), one per line. US listed companies and foreign issuers that file with the SEC. At most 500 per run.

## `mode` (type: `string`):

Financials gives normalized income statement, balance sheet and cash flow figures per fiscal year or quarter. Filings lists the company's SEC filings with links to the documents.

## `period` (type: `string`):

Fiscal years, fiscal quarters, or both. Quarterly cash flows and fourth quarters are computed from year-to-date and annual figures, and listed in derivedMetrics.

## `fiscalYearFrom` (type: `integer`):

Oldest fiscal year to return. Default: 5 years ago. XBRL data starts in 2009 for large companies and in 2011 for the others.

## `formTypes` (type: `array`):

Forms to return, one per line, for example 10-K, 10-Q, 8-K, 20-F, DEF 14A, S-1. Leave empty for all company forms. Forms 3, 4, 5, 144, Schedules 13D and 13G and proxy material from dissident shareholders (DFAN14A, PREN14A, DEFN14A) are never returned: they are filed by or about individuals.

## `includeAmendments` (type: `boolean`):

Also return amended versions of the requested forms, such as 10-K/A for 10-K.

## `filedFrom` (type: `string`):

Oldest filing date (YYYY-MM-DD). Default: one year ago. EDGAR goes back to 1994. On a schedule, set it to the date of the previous run: each run bills every filing it returns.

## `filedTo` (type: `string`):

Latest filing date (YYYY-MM-DD). Leave empty for today.

## `maxResults` (type: `integer`):

Maximum number of rows for the whole run, across all companies. Each row is billed once.

## `userAgentContact` (type: `string`):

The SEC asks automated tools to say who is calling. By default the Actor declares itself with its Apify page. Set your organization and a contact address here, for example Acme Corp data@acme.com, if you prefer to be identified directly.

## Actor input object example

```json
{
  "companies": [
    "AAPL",
    "MSFT",
    "NVO"
  ],
  "mode": "financials",
  "period": "annual",
  "fiscalYearFrom": 2022,
  "formTypes": [
    "10-K",
    "10-Q",
    "8-K"
  ],
  "includeAmendments": true,
  "maxResults": 1000
}
```

# Actor output Schema

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

Dataset items of the run: one item per result, with the fields described in the dataset schema.

# 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 = {
    "companies": [
        "AAPL",
        "MSFT",
        "NVO"
    ],
    "fiscalYearFrom": 2022
};

// Run the Actor and wait for it to finish
const run = await client.actor("boubap/sec-edgar-financials").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 = {
    "companies": [
        "AAPL",
        "MSFT",
        "NVO",
    ],
    "fiscalYearFrom": 2022,
}

# Run the Actor and wait for it to finish
run = client.actor("boubap/sec-edgar-financials").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 '{
  "companies": [
    "AAPL",
    "MSFT",
    "NVO"
  ],
  "fiscalYearFrom": 2022
}' |
apify call boubap/sec-edgar-financials --silent --output-dataset

```

## MCP server setup

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

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/qJIm6LCtjm3rCfTKf/builds/cHEa6sOIVQi3HqmiS/openapi.json
