# SEC EDGAR Fundamentals: Normalized Financial Statements API (`upward_enterprises/sec-edgar-fundamentals`) Actor

Normalized company fundamentals for any ticker or CIK: income statement, balance sheet and cash-flow history plus TTM margins, growth and leverage metrics, standardized across every filer's XBRL tags. Public EDGAR data, no API key. From $0.50 per 1,000 companies.

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

## Pricing

from $0.30 / 1,000 company fundamentals

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

## SEC EDGAR Fundamentals: Normalized Financial Statements API

**$0.50 per 1,000 companies ($0.30 on the Gold tier), no start fee, no API key.**

Raw EDGAR company facts are free, and nearly unusable: the same revenue line appears under a dozen different XBRL tags depending on the filer and the era, values repeat across amendments, and year-to-date figures sit next to discrete quarters. This Actor hands you the cleaned result instead: one row per company with its income statement, balance sheet and cash-flow history standardized into the same 26 line items for every filer, plus trailing-twelve-month metrics (growth, margins, ROE, current ratio, net debt, debt-to-equity) computed from those statements.

Companies are served from a maintained fundamentals store that ingests EDGAR server-side and re-ingests a company whenever a new financial filing lands, so a lookup never waits on SEC rate limits. A company nobody has ever requested is assembled from EDGAR on first lookup, then kept fresh the same way. If the store is ever unreachable, the Actor falls back to EDGAR directly and normalizes the raw company facts itself, and the row says which source produced it.

### What you get

**Company rows** (`kind: "company"`), one per requested ticker or CIK:

```json
{
  "kind": "company",
  "cik": "0000320193",
  "ticker": "AAPL",
  "name": "Apple Inc.",
  "fiscalYearEndMonth": 9,
  "source": "fintrinsiq-store",
  "dataAsOf": "2026-08-10T18:50:28.229Z",
  "latestFiling": { "accession": "0000320193-26-000020", "form": "10-Q", "filed": "2026-07-31", "period": "2026-06-27" },
  "metrics": {
    "ttmRevenue": 466823000000,
    "ttmNetIncome": 128930000000,
    "ttmEps": 8.71,
    "ttmFcf": 136683000000,
    "revenueGrowthYoY": 0.142,
    "grossMarginTtm": 0.487,
    "operatingMarginTtm": 0.332,
    "netMarginTtm": 0.276,
    "roeTtm": 1.488,
    "currentRatio": 1.003,
    "netDebt": 21945000000,
    "debtToEquity": 0.784
  },
  "periodsIncluded": ["annual"],
  "statements": {
    "annual": {
      "income": [
        { "periodEnd": "2025-09-27", "start": "2024-09-29", "fiscalYear": 2025, "form": "10-K", "filed": "2025-10-31",
          "values": { "revenue": 416161000000, "grossProfit": 195201000000, "operatingIncome": 133050000000, "netIncome": 112010000000, "epsDiluted": 7.46 } }
      ],
      "balance": [
        { "periodEnd": "2025-09-27", "fiscalYear": 2025, "form": "10-K", "filed": "2025-10-31",
          "values": { "totalAssets": 359241000000, "cashAndEquivalents": 29943000000, "stockholdersEquity": 73733000000 } }
      ],
      "cashflow": [
        { "periodEnd": "2025-09-27", "start": "2024-09-29", "fiscalYear": 2025, "form": "10-K", "filed": "2025-10-31",
          "values": { "operatingCashFlow": 111482000000, "capitalExpenditures": 12715000000, "freeCashFlow": 98767000000 } }
      ]
    }
  }
}
```

The 26 standardized line items: revenue, cost of revenue, gross profit, operating income, net income, diluted EPS, diluted share count, R\&D, SG\&A, stock-based compensation; total assets, total liabilities, stockholders' equity, cash and equivalents, long-term debt, current debt, short-term borrowings, short-term investments, current assets, current liabilities, shares outstanding; operating cash flow, capital expenditures, free cash flow (derived as operating cash flow minus capital expenditures), dividends paid, dividends per share.

A free **summary row** (`kind: "summary"`) closes every run: how many companies were delivered, how many came from the store vs. EDGAR direct, and which inputs could not be resolved (a ticker EDGAR has no filer for is listed there, never billed).

### How the normalization works

Every filer is mapped through one tag-alias table, in priority order. Revenue alone is merged from `RevenuesNetOfInterestExpense`, `Revenues`, `RevenueFromContractWithCustomerExcludingAssessedTax`, `SalesRevenueNet` and four more tags, so a company's history stays continuous when its tagging changes (most filers switched revenue tags around 2018 with ASC 606). Where a period was restated, the value from the latest filing wins. Periods that were derived rather than reported directly (for example a fourth quarter differenced from the annual figure) are marked `derived: true` on the period. Valuation metrics that need a share price (P/E, market cap) are null: EDGAR carries no prices and this Actor does not invent them.

### Inputs

| Input | Default | Notes |
|---|---|---|
| Tickers | none | Any SEC-registered filer's ticker, e.g. AAPL, MSFT, JPM |
| CIKs | none | With or without leading zeros; resolved through EDGAR submissions |
| Periods | annual | `annual`, `quarterly`, or `both` |
| Years of history | 10 | Up to 30; XBRL history reaches back to about 2009 for most filers |
| Include TTM metrics | on | Metrics are computed from the statements; off drops the block |
| Max companies per run | 100 | Up to 1,000, processed in input order |

Worked example: a 500-company universe refresh, annual statements, 10 years back, costs 500 x $0.0005 = **$0.25** on the Free tier ($0.15 on Gold), and typically finishes in a few minutes because most rows come straight from the store.

### Pricing

Pay per company delivered. Free $0.0005, Bronze $0.00045, Silver $0.000375, Gold $0.0003 per company. Unresolvable tickers are reported in the summary row and never charged. There is no charge for the summary row.

### Notes and limits

- Data is SEC EDGAR public data, redistributed under the SEC's fair-access terms; the Actor declares itself to the SEC and stays under five requests a second on the direct path.
- Fundamentals change when companies file, not intraday. The store polls for new filings on a freshness cycle (hours, not weeks); `dataAsOf` and `latestFiling` on every row say exactly how current that company is.
- Banks, insurers and utilities report some lines differently; the alias table handles the common cases (a bank's top line is revenue net of interest expense), and a line a filer does not report is simply absent from `values`, never zero-filled.

### Enjoying this Actor?

If it saved you from wrestling XBRL, a review on the Store page helps other builders find it, and it tells us to keep the history deep and the alias table current. Questions and tag-mapping requests are welcome on the Issues tab; we answer fast.

# Actor input Schema

## `ciks` (type: `array`):

SEC Central Index Keys, with or without leading zeros, e.g. 320193 for Apple. Use for filers whose ticker you do not know.

## `includeMetrics` (type: `boolean`):

On (default): each company row carries trailing-twelve-month metrics computed from the statements: revenue and EPS growth, gross/operating/net/free-cash-flow margins, ROE, current ratio, net debt and debt-to-equity. Metrics need a current share price for valuation ratios (P/E, market cap), which are null when no licensed quote is available.

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

Upper limit on companies processed in one run, in input order. The summary row says whether the limit cut the request.

## `periods` (type: `string`):

Annual statements (one row per fiscal year), quarterly statements, or both. Annual is the default and the cheapest to store and process downstream.

## `proxyConfiguration` (type: `object`):

Normally not needed. Companies are served from a maintained fundamentals store; EDGAR is only touched directly if the store is unreachable, and then the Actor falls back to Apify Proxy automatically if SEC.gov rate-limits the platform address.

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

Stock tickers to fetch, e.g. AAPL, MSFT, JPM. Any SEC-registered filer works, including companies nobody has looked up before: a first lookup assembles the full history from EDGAR, later lookups are served from our maintained store.

## `yearsBack` (type: `integer`):

How many years of statements to include, counted back from today. EDGAR XBRL history reaches back to about 2009 for most filers.

## Actor input object example

```json
{
  "ciks": [
    "320193"
  ],
  "includeMetrics": true,
  "maxItems": 100,
  "periods": "annual",
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "tickers": [
    "AAPL",
    "MSFT"
  ],
  "yearsBack": 10
}
```

# Actor output Schema

## `all` (type: `string`):

No description

## `companyColumns` (type: `string`):

No description

## `csv` (type: `string`):

No description

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("upward_enterprises/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 = {}

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,upward_enterprises/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/kilpH1LnZh7Fsei3Y/builds/63JNV16tyZIlWxUWZ/openapi.json
