# SEC EDGAR Financial Statements: XBRL Company Fundamentals (`opendata-feeds/sec-edgar-fundamentals`) Actor

Company fundamentals from SEC EDGAR XBRL: revenue, net income, EPS, assets, liabilities, equity, cash flow and capex per 10-K or 10-Q period, by ticker or CIK. One clean row per company-period, latest restated values, only-new mode. $2 per 1,000 company-periods.

- **URL**: https://apify.com/opendata-feeds/sec-edgar-fundamentals.md
- **Developed by:** [OpenData Feeds](https://apify.com/opendata-feeds) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 company-period delivereds

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 EDGAR Financial Statements: XBRL Company Fundamentals by Ticker or CIK

Give it a list of tickers or CIK numbers. Get back each company's **key financial-statement figures, one clean row per fiscal year or quarter**, straight from the SEC's official XBRL data.

- **13 normalized metrics:** revenue, net income, operating income, total assets, total liabilities, stockholders' equity, cash and cash equivalents, EPS (basic and diluted), shares outstanding, weighted average diluted shares, operating cash flow and capital expenditure.
- **Annual (10-K) and quarterly (10-Q) periods**, with fiscal year, fiscal period, period start and end, filed date, accession number and a link to the filing.
- **Normalized across companies.** Companies tag the same line with different XBRL concepts (`Revenues`, `RevenueFromContractWithCustomerExcludingAssessedTax`, `SalesRevenueNet`...). The Actor maps them to one field and tells you which concept it used.
- **Restatements handled.** When a later filing restates a number, you get the latest filed value, and each metric names the filing it came from.
- **Official SEC API only.** The Actor reads the SEC's `companyfacts` API on data.sec.gov. There is no scraping, no browser and no proxy, and it stays well under the SEC's fair-access limit.
- **Only-new mode for monitoring.** Schedule it daily or weekly, and it returns (and charges for) only periods it hasn't delivered before, including amended filings.
- **$2.00 per 1,000 company-periods.** You pay only for periods delivered.

#### Who uses it

- **Quant and fintech builders** who need clean fundamentals in a database or a model without parsing XBRL.
- **Analysts** comparing a peer group's revenue, margins and balance sheets across years.
- **AI agents** answering "what was X's revenue last year?" through Apify's MCP server.
- **Screeners and dashboards** refreshed after each earnings season.

#### Input

| Field | What it does |
|---|---|
| `companies` (required) | Tickers (`AAPL`, `BRK-B`) or SEC CIK numbers (`320193`, `0000320193`, `CIK0000320193`). |
| `periodType` | `annual` (10-K, default), `quarterly` (10-Q) or `both`. |
| `fromYear` | Keep fiscal years from this year on (default 2020). `0` keeps everything (XBRL starts around 2009–2011). |
| `metrics` | Pick metrics to include. Empty means all 13. |
| `onlyNew` + `stateKey` | Return only company-periods not delivered by an earlier run of the same monitor. |
| `maxItems` | Cap on company-periods per run. `0` = no cap. Newest periods of each company come first. |
| `userAgent` | Optional. The SEC asks automated clients to identify themselves (`Company Name contact@example.com`). Leave empty to use the Actor's own declared User-Agent. |

Example:

```json
{
  "companies": ["EXMP", "9999999902"],
  "periodType": "both",
  "fromYear": 2022,
  "metrics": ["revenue", "netIncome", "epsDiluted", "operatingCashFlow"],
  "onlyNew": true,
  "stateKey": "peer-group"
}
```

#### Output

One item per company-period. Example (fictional company, trimmed to five metrics):

```json
{
  "cik": "9999999901",
  "ticker": "EXMP",
  "companyName": "Example Corp",
  "periodType": "annual",
  "fiscalYear": 2024,
  "fiscalPeriod": "FY",
  "form": "10-K",
  "periodStart": "2024-01-01",
  "periodEnd": "2024-12-31",
  "filedDate": "2025-02-18",
  "accessionNumber": "9999999901-25-000012",
  "filingIndexUrl": "https://www.sec.gov/Archives/edgar/data/9999999901/9999999901-25-000012-index.html",
  "metrics": {
    "revenue": {
      "value": 1380000000,
      "unit": "USD",
      "concept": "us-gaap:Revenues",
      "months": 12,
      "accn": "9999999901-25-000012",
      "filed": "2025-02-18"
    },
    "netIncome": {
      "value": 180000000,
      "unit": "USD",
      "concept": "us-gaap:NetIncomeLoss",
      "months": 12,
      "accn": "9999999901-25-000012",
      "filed": "2025-02-18"
    },
    "assets": {
      "value": 2300000000,
      "unit": "USD",
      "concept": "us-gaap:Assets",
      "months": null,
      "accn": "9999999901-25-000012",
      "filed": "2025-02-18"
    },
    "epsDiluted": {
      "value": 1.77,
      "unit": "USD/shares",
      "concept": "us-gaap:EarningsPerShareDiluted",
      "months": 12,
      "accn": "9999999901-25-000012",
      "filed": "2025-02-18"
    },
    "sharesOutstanding": {
      "value": 100400000,
      "unit": "shares",
      "concept": "dei:EntityCommonStockSharesOutstanding",
      "months": null,
      "accn": "9999999901-25-000012",
      "filed": "2025-02-18"
    }
  },
  "metricsFound": 13,
  "source": "SEC EDGAR XBRL companyfacts (data.sec.gov)",
  "retrievedAt": "2026-10-30T09:00:00.000Z"
}
```

Each metric has:

- `value` and `unit` (`USD`, `USD/shares`, `shares`, or the filer's own currency);
- `concept`, the XBRL tag it came from;
- `months`: 12 for annual figures, 3 for quarterly ones, `null` for balance-sheet figures at period end;
- `accn` and `filed`, the filing that reported this number.

A metric the company did not report is left out. It is never filled with zero.

Export as JSON, CSV, Excel or HTML, or call it from the API, Make, Zapier, n8n or an AI agent (MCP). The run's `SUMMARY` record lists companies found, periods delivered, periods skipped as already seen, and `notFound`. That list holds tickers the SEC doesn't list and companies with no XBRL data. They don't stop the run.

#### Pricing

**Pay per event: $0.002 per company-period delivered ($2.00 per 1,000).**

| You run | Company-periods | You pay |
|---|---|---|
| 1 company, 10 years of annual data | 10 | $0.02 |
| 500 companies, 5 years of annual data | ≈ 2,500 | ≈ $5.00 |
| 100 companies, 5 years of annual + quarterly data | ≈ 2,000 | ≈ $4.00 |
| 500 companies, weekly, only-new (≈ 4 new filings per company a year) | ≈ 2,000 a year | ≈ $4.00 a year |

Set **Maximum cost per run** in the run options to cap spend. The Actor stops cleanly at your limit and says so in the log and in `SUMMARY.stoppedAtSpendingLimit`. Apify's free plan includes $5 of monthly usage, enough for about 2,500 company-periods.

#### Limits

- **US GAAP filers on 10-K and 10-Q.** Foreign private issuers filing 20-F or 40-F under IFRS are not covered.
- **Quarterly rows are Q1 to Q3.** There is no 10-Q for the fourth quarter. Derive it as the fiscal year minus Q1 to Q3.
- **Quarterly cash flows are year-to-date.** 10-Qs report cash flows only from the start of the fiscal year, so `months` is 6 or 9 on those metrics.
- **Figures are as the company tagged them.** Banks and insurers often don't report `Revenues` or `OperatingIncomeLoss`, and those metrics are then absent.
- **Company-level totals only.** No segment or product breakdowns. No insider, officer or ownership data.
- **Comparative-only periods are not rows.** For example, the year before a company's first XBRL filing.
- Data appears on the SEC's API within about a minute of a filing being disseminated.

#### Source and terms

The data comes from the U.S. Securities and Exchange Commission's EDGAR system, through its public XBRL API (data.sec.gov). The SEC states that "Information presented on sec.gov is considered public information and may be copied or further distributed by users of the web site without the SEC's permission."

The Actor follows the SEC's fair-access policy: at most 5 requests per second (the SEC's limit is 10), a declared User-Agent, and back-off when asked to slow down.

**This Actor is not affiliated with, endorsed by, or approved by the SEC.** Figures are reproduced as filed. Check the linked filing before relying on a number.

#### FAQ

**Why is a metric missing for some years?** The company didn't tag that line with any of the concepts this Actor maps, or didn't report it in that filing. The `concept` field shows which tags are used.

**Why does a number differ from the original 10-K?** It was restated in a later filing. `accn` and `filed` on the metric point to that later filing. The row's own `accessionNumber` is the filing that reported the period.

**Can I use my own SEC User-Agent?** Yes, put `Your Company you@example.com` in `userAgent`.

**Something broke or a company is missing?** Open an issue on the Issues tab with the ticker or CIK. Issues are answered within 24 hours.

# Actor input Schema

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

Stock tickers (AAPL, BRK-B) or SEC CIK numbers (320193, 0000320193 or CIK0000320193). Tickers are resolved with the SEC's company_tickers.json.

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

Annual periods come from 10-K filings, quarterly periods (Q1 to Q3) from 10-Q filings.

## `fromYear` (type: `integer`):

Keep periods whose fiscal year is this year or later. 0 keeps all years (XBRL data starts around 2009).

## `metrics` (type: `array`):

Which normalized metrics to include. Empty means all of them.

## `onlyNew` (type: `boolean`):

For scheduled runs: remember the company-periods already delivered (by filing and period end) and return, and charge for, only new ones. An amended filing counts as new.

## `stateKey` (type: `string`):

Name for the only-new memory, so different schedules keep separate lists.

## `maxItems` (type: `integer`):

0 means no limit. Newest periods of each company come first. Use the run's maximum-cost setting to cap spend overall.

## `userAgent` (type: `string`):

The SEC asks automated clients to identify themselves, as "Company Name contact@example.com". Leave empty to use the Actor's own declared User-Agent.

## Actor input object example

```json
{
  "companies": [
    "AAPL",
    "MSFT"
  ],
  "periodType": "annual",
  "fromYear": 2020,
  "metrics": [],
  "onlyNew": false,
  "stateKey": "default",
  "maxItems": 0
}
```

# Actor output Schema

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

Company-periods with financial metrics, one item per charged event, in the default dataset.

## `summary` (type: `string`):

Counts for the run (found, delivered, skipped, errors, spending-limit stop) in the SUMMARY record.

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("opendata-feeds/sec-edgar-fundamentals").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",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("opendata-feeds/sec-edgar-fundamentals").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"
  ]
}' |
apify call opendata-feeds/sec-edgar-fundamentals --silent --output-dataset

```

## MCP server setup

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

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/pHW2yM0TbbrIJqkze/builds/VUyczCQfa6thmYzgb/openapi.json
