# SEC EDGAR Financials API: Revenue, EPS & Fundamentals (`aeriontsai/us-company-financials`) Actor

Normalized annual or quarterly fundamentals from SEC EDGAR XBRL filings (10-K, 10-Q, 20-F, 40-F) by ticker or CIK: revenue, net income, EPS, assets, debt, cash flow, plus optional recent filings index. One row per company. Not affiliated with the SEC.

- **URL**: https://apify.com/aeriontsai/us-company-financials.md
- **Developed by:** [Aerion](https://apify.com/aeriontsai) (community)
- **Categories:** Business, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 50.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 company financials

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

## US Company Financials from Public Filings

Pull normalized financial statements for US-listed and SEC-registered companies straight from their SEC EDGAR XBRL filings. Enter tickers or CIK numbers and get one row per company with revenue, net income, EPS, assets, liabilities, debt and cash flow for recent fiscal years or quarters, plus an optional index of recent 10-K, 10-Q and 8-K filings. Export as JSON, CSV or Excel; you pay per company.

### What does US Company Financials from Public Filings do?

Give it a list of company CIK numbers (or ticker symbols) and it returns **one row per company** with
normalized key financials for the most recent fiscal years or quarters, taken from the XBRL financial data
that companies file with the U.S. Securities and Exchange Commission (10-K, 10-Q, 20-F, 40-F). Optionally it
also lists the company's recent annual, quarterly and current reports (10-K, 10-Q, 8-K and amendments).

Key figures per period (each `null` when no value was found under the XBRL tags this Actor maps for that figure - never 0; a company may report a figure under a tag that is not mapped, see Limitations):

- Income statement: revenue, cost of revenue, gross profit, operating income, net income, basic and diluted EPS, weighted average diluted shares
- Balance sheet: total assets, current assets, cash and equivalents, total liabilities, current liabilities, long-term debt, stockholders' equity, shares outstanding
- Cash flow statement: operating, investing and financing cash flow, capital expenditure, dividends paid

How the figures are normalized:

- **One currency per company** (for example USD, or EUR for a company reporting under IFRS); per-share values in that currency per share; share counts in shares.
- **US GAAP and IFRS**: figures come from the us-gaap taxonomy or, for IFRS filers (for example on Form 20-F), the ifrs-full taxonomy.
- **Alternative tags**: companies use different tags for the same figure over time (for example three different revenue tags); a fixed priority list picks one per period, and the `concepts` field shows which tag was used.
- **Restatements**: when a later filing reports a different value for the same period, the **latest filed** value is used and the metric is listed in `restated`.
- **Fiscal periods**: fiscal year and period (FY, Q1-Q4) come from the filing for that period; for older periods seen only as comparatives in a later filing they are calculated and marked `labelSource: "derived"`.
- **Annual vs quarterly**: annual = fiscal years of about 52-53 weeks; quarterly = 3-month periods only (6- and 9-month year-to-date figures are not used).
- **No calculated quarters**: a fourth quarter is **not** calculated as "full year minus nine months". Quarterly rows appear only for quarters the company reported as 3-month figures, so Q4 is usually missing. Quarterly cash-flow figures are usually empty for Q2 and Q3, because companies report cash flows year-to-date.

How fresh is the data? The source updates the company data as filings are processed (usually within minutes,
longer at peak filing times). Each run reads the current data at the time of the run.

### How much does it cost?

This Actor uses **pay-per-event** pricing. You pay **per company**, not per period or per figure.

| Event | When | Price (USD) |
|---|---|---|
| `company-financials` | one company row saved (all requested periods and figures for that company) | 0.01 |
| `filing-row` | one filings-index row saved (only when "Include recent filings index" is on) | 0.001 |
| Actor start | charged by the platform when a run starts | 0.00005 |

Nothing is charged for a company that is not found, has no XBRL financial data, or has no value for the
selected statements. Set **Maximum rows** (`maxItems`) or a run spending limit to cap your cost; the Actor stops
cleanly and keeps the rows collected so far. With a spending limit, the run stops as soon as the remaining
budget cannot pay for another company row.

### Input

| Field | Type | Description |
|---|---|---|
| `ciks` | array of strings | CIK numbers (1-10 digits, leading zeros optional). |
| `tickers` | array of strings | Optional ticker symbols, mapped to CIKs with the company ticker list published by the SEC. At least one CIK or ticker is required; at most 100 together. |
| `statements` | array | `income`, `balance`, `cashflow` (default: all three). |
| `periodType` | string | `annual` (default) or `quarterly`. |
| `periods` | integer | Most recent periods per company, 1-20 (default 4). |
| `includeFilingsIndex` | boolean | Also output recent filings (default false). |
| `filingForms` | array | Forms for the filings index: 10-K, 10-K/A, 10-Q, 10-Q/A, 8-K, 8-K/A (default: all six). No other forms are supported. |
| `maxFilingsPerCompany` | integer | Newest filing rows per company, 1-1000 (default 20). |
| `maxItems` | integer | Stop after this many rows in total (company rows plus filing rows; default 100). |

Example input:

```json
{ "ciks": ["320193"], "statements": ["income", "balance"], "periodType": "annual", "periods": 4, "includeFilingsIndex": false }
```

### Output

Company row example (from a local test run on **synthetic** test data for an invented company; `periods`
shortened to one entry here):

```json
{
  "rowType": "company-financials",
  "cik": "9990000101",
  "entityName": "Example Widgets Inc",
  "tickers": [
    "XMPLW"
  ],
  "exchanges": [
    "Nasdaq"
  ],
  "sic": "3990",
  "sicDescription": "Miscellaneous Manufacturing Industries",
  "fiscalYearEnd": "1231",
  "stateOfIncorporation": "DE",
  "taxonomy": "us-gaap",
  "currency": "USD",
  "units": {
    "money": "USD",
    "perShare": "USD/shares",
    "shares": "shares"
  },
  "periodType": "annual",
  "statements": [
    "income",
    "balance",
    "cashflow"
  ],
  "metrics": [
    "revenue",
    "costOfRevenue",
    "grossProfit",
    "operatingIncome",
    "netIncome",
    "epsBasic",
    "epsDiluted",
    "weightedAverageDilutedShares",
    "totalAssets",
    "currentAssets",
    "cashAndEquivalents",
    "totalLiabilities",
    "currentLiabilities",
    "longTermDebt",
    "stockholdersEquity",
    "sharesOutstanding",
    "operatingCashFlow",
    "investingCashFlow",
    "financingCashFlow",
    "capitalExpenditure",
    "dividendsPaid"
  ],
  "periodsReturned": 4,
  "periods": [
    {
      "fiscalYear": 2023,
      "fiscalPeriod": "FY",
      "labelSource": "filing",
      "periodStart": "2023-01-01",
      "periodEnd": "2023-12-31",
      "form": "10-K",
      "lastFiledDate": "2024-08-02",
      "accessionNumbers": [
        "9990000101-24-000004",
        "9990000101-24-000018"
      ],
      "values": {
        "revenue": 1300000000,
        "costOfRevenue": null,
        "grossProfit": 520000000,
        "operatingIncome": 150000000,
        "netIncome": 110000000,
        "epsBasic": 1.1,
        "epsDiluted": 1.08,
        "weightedAverageDilutedShares": 101500000,
        "totalAssets": 2500000000,
        "currentAssets": 820000000,
        "cashAndEquivalents": 260000000,
        "totalLiabilities": 1400000000,
        "currentLiabilities": 450000000,
        "longTermDebt": 430000000,
        "stockholdersEquity": 1100000000,
        "sharesOutstanding": 100000000,
        "operatingCashFlow": 190000000,
        "investingCashFlow": -80000000,
        "financingCashFlow": -55000000,
        "capitalExpenditure": 75000000,
        "dividendsPaid": 28000000
      },
      "concepts": {
        "revenue": "us-gaap:Revenues",
        "costOfRevenue": null,
        "grossProfit": "us-gaap:GrossProfit",
        "operatingIncome": "us-gaap:OperatingIncomeLoss",
        "netIncome": "us-gaap:NetIncomeLoss",
        "epsBasic": "us-gaap:EarningsPerShareBasic",
        "epsDiluted": "us-gaap:EarningsPerShareDiluted",
        "weightedAverageDilutedShares": "us-gaap:WeightedAverageNumberOfDilutedSharesOutstanding",
        "totalAssets": "us-gaap:Assets",
        "currentAssets": "us-gaap:AssetsCurrent",
        "cashAndEquivalents": "us-gaap:CashAndCashEquivalentsAtCarryingValue",
        "totalLiabilities": "us-gaap:Liabilities",
        "currentLiabilities": "us-gaap:LiabilitiesCurrent",
        "longTermDebt": "us-gaap:LongTermDebtNoncurrent",
        "stockholdersEquity": "us-gaap:StockholdersEquity",
        "sharesOutstanding": "us-gaap:CommonStockSharesOutstanding",
        "operatingCashFlow": "us-gaap:NetCashProvidedByUsedInOperatingActivities",
        "investingCashFlow": "us-gaap:NetCashProvidedByUsedInInvestingActivities",
        "financingCashFlow": "us-gaap:NetCashProvidedByUsedInFinancingActivities",
        "capitalExpenditure": "us-gaap:PaymentsToAcquirePropertyPlantAndEquipment",
        "dividendsPaid": "us-gaap:PaymentsOfDividends"
      },
      "restated": []
    }
  ],
  "source": "U.S. Securities and Exchange Commission (SEC) EDGAR filings",
  "retrievedAt": "2026-10-09T16:27:23.032Z"
}
```

Filing row example (same synthetic test data):

```json
{
  "rowType": "filing",
  "cik": "9990000101",
  "entityName": "Example Widgets Inc",
  "accessionNumber": "9990000101-24-000031",
  "form": "8-K",
  "filingDate": "2024-08-01",
  "reportDate": "2024-08-01",
  "acceptanceDateTime": "2024-08-01T16:05:00.000Z",
  "items": "2.02,9.01",
  "isXBRL": false,
  "isInlineXBRL": false,
  "description": "FORM 8-K",
  "source": "U.S. Securities and Exchange Commission (SEC) EDGAR filings",
  "retrievedAt": "2026-10-09T16:27:23.032Z"
}
```

`accessionNumbers` lists the filings the values come from. Values are as reported (whole currency units, not thousands).
Output contains no web addresses, no addresses or phone numbers, and no information about individual persons.

Every run also writes a `RUN_SUMMARY` record (counts, success rate, why the run stopped) and an `errors` dataset with one row per problem (no personal data, no stack traces).

### Data source and attribution

Data source: public filings on the EDGAR system of the U.S. Securities and Exchange Commission. The SEC states that "Information presented on \[its website] is considered public information and may be copied or further distributed by users of the web site without the SEC's permission. Please consider appropriate citation to the SEC as the source." This Actor is an independent tool and is not affiliated with or approved by the SEC.

The Actor identifies itself to the source with a declared User-Agent as the SEC requests, makes about
1 request per second (the SEC allows 10 per second), asks for compressed responses, and stops when the source
signals that it is overloaded or refuses access.

### Limitations

- Only companies that file XBRL financial data with the SEC; no data for companies that do not file it, and no data from before XBRL filing began.
- Key figures only, from a fixed list of standard tags; company-specific (custom) tags and segment details are not included.
- The tag mapping is a priority list: when a company reports two related tags (for example total revenues and contract revenues), the higher-priority tag is shown; check `concepts`.
- IFRS filers: long-term debt and shares outstanding are not mapped and are always null.
- No fourth-quarter or discrete Q2/Q3 cash-flow calculation (see above).
- Filings index: only the most recent filings block of the source (about the latest 1,000 filings or one year), only 10-K, 10-Q, 8-K and their amendments. Foreign-issuer forms (20-F, 40-F, 6-K), ownership reports (Forms 3, 4, 5), Form D and all other forms are not included; for foreign (IFRS) filers the financial figures are still normalized, but their filings index is empty.
- Not investment advice; figures are as filed by the companies and reformatted by this Actor.
- Coverage of secondary figures varies. In our live test of 16 companies (19 company rows, 76 periods, October 2026), revenue, net income, diluted EPS and total assets were filled for every period, while some figures were often empty, for example gross profit (44 of 76 periods) and long-term debt (34 of 76), partly because some companies (such as banks) do not report them and partly because a company used a tag this Actor does not map.
- Tickers are mapped with the SEC's published ticker list as it is. If that list maps a ticker to a new holding company that has not filed financial data yet (seen for XOM in October 2026), no row is returned and nothing is charged; use the CIK of the company you want.

### Support

Found a problem or need a figure? Open an issue in the **Issues** tab of this Actor. We aim to respond within 48 hours.

***

This Actor was developed with AI assistance and is covered by automated tests.

# Actor input Schema

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

Central Index Keys of the companies (1 to 10 digits, leading zeros optional, e.g. 320193 or 0000320193). Up to 100 CIKs and tickers together per run.

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

Optional: ticker symbols. They are mapped to CIKs with the company ticker list published by the U.S. Securities and Exchange Commission (one extra request per run). Tickers that are not in that list are skipped and not charged.

## `statements` (type: `array`):

Which key figures to include: income statement, balance sheet, cash flow statement.

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

Annual = fiscal years (10-K, 20-F, 40-F). Quarterly = 3-month quarters as reported (10-Q). A fourth quarter is not calculated; quarterly cash-flow figures are empty when the company reports only year-to-date totals.

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

How many of the most recent periods to return per company.

## `includeFilingsIndex` (type: `boolean`):

Also output one row per recent filing (forms 10-K, 10-Q, 8-K and their amendments only). Each filing row is a separate charged event.

## `filingForms` (type: `array`):

Forms to list in the filings index. Only these forms are supported.

## `maxFilingsPerCompany` (type: `integer`):

Newest filings first. Only the most recent filings block of the source is read.

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

Stop after this many output rows in total (company rows plus filing rows). Every row is charged, so this also caps your cost.

## Actor input object example

```json
{
  "ciks": [
    "320193"
  ],
  "statements": [
    "income",
    "balance",
    "cashflow"
  ],
  "periodType": "annual",
  "periods": 4,
  "includeFilingsIndex": false,
  "filingForms": [
    "10-K",
    "10-K/A",
    "10-Q",
    "10-Q/A",
    "8-K",
    "8-K/A"
  ],
  "maxFilingsPerCompany": 20,
  "maxItems": 100
}
```

# Actor output Schema

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

Company rows (one per charged company-financials event) and, if enabled, filing rows (one per charged filing-row event).

## `runSummary` (type: `string`):

JSON summary: counts, success rate, stop reason, billing summary, error counts.

## `errors` (type: `string`):

One record per error (taxonomy code, message, stage, URL). No stack traces.

# 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 = {
    "ciks": [
        "320193"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("aeriontsai/us-company-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 = {
    "ciks": ["320193"],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("aeriontsai/us-company-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 '{
  "ciks": [
    "320193"
  ],
  "maxItems": 100
}' |
apify call aeriontsai/us-company-financials --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,aeriontsai/us-company-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/1z2K0qpfRvFVCsQMh/builds/f6UcKafhRi5xVjkXw/openapi.json
