# SEC Company Financials API: income, balance sheet, cash flow (`bosco_labs/sec-company-financials`) Actor

US company financials from SEC XBRL: revenue, profit, EPS, balance sheet, cash flow, free cash flow and margins per fiscal year or quarter, 2009 to today. By ticker or CIK, 10-K/10-Q and 20-F filers. Each value cites its XBRL tag and SEC filing. Q4 derived where not reported.

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

## Pricing

from $5.00 / 1,000 company 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 Company Financials API: income, balance sheet, cash flow

Get **clean financial statements of any US-listed company from the SEC's own XBRL data**:
revenue, profit, EPS, balance sheet, cash flow, free cash flow and margins, per fiscal year or
per quarter, by ticker or CIK. For analysts, finance apps and AI agents that need a company's
numbers over 5-20 years without parsing filings. Every value cites **the XBRL tag and the SEC
filing it came from**.

**Pricing (pay per event):** $0.005 per company-period row ($5 per 1,000). Five years of
Apple's annual figures cost $0.025; eight quarters $0.04. Empty or failed lookups are free, and
the Actor stops at your max charge limit.

Data comes straight from the SEC's companyfacts API (`data.sec.gov/api/xbrl/companyfacts`):
every 10-K, 10-Q, 20-F, 40-F and 6-K filed with XBRL since 2009-2011. No scraping, no logins,
no third-party data.

### What you get

One row per company per fiscal year (`period: "annual"`) or fiscal quarter (`"quarterly"`).
Real output for Apple's fiscal 2025 (shortened; `sources` lists every metric):

```json
{
  "ticker": "AAPL",
  "cik": "0000320193",
  "company_name": "Apple Inc.",
  "fiscal_year": 2025,
  "fiscal_period": "FY",
  "period_start": "2024-09-29",
  "period_end": "2025-09-27",
  "form": "10-K",
  "filed": "2025-10-31",
  "accession_number": "0000320193-25-000079",
  "source_url": "https://www.sec.gov/Archives/edgar/data/320193/000032019325000079/0000320193-25-000079-index.htm",
  "currency": "USD",
  "revenue": 416161000000,
  "gross_profit": 195201000000,
  "operating_profit": 133050000000,
  "net_income": 112010000000,
  "eps_diluted": 7.46,
  "total_assets": 359241000000,
  "cash_and_equivalents": 35934000000,
  "long_term_debt": 78328000000,
  "total_equity": 73733000000,
  "operating_cash_flow": 111482000000,
  "capex": 12715000000,
  "free_cash_flow": 98767000000,
  "gross_margin": 0.4691,
  "operating_margin": 0.3197,
  "net_margin": 0.2692,
  "revenue_growth": 0.0643,
  "metrics_found": 29,
  "sources": {
    "revenue": {
      "tag": "us-gaap:RevenueFromContractWithCustomerExcludingAssessedTax",
      "accession": "0000320193-25-000079"
    },
    "...": "one entry per reported metric"
  },
  "filings": {
    "0000320193-25-000079": {
      "form": "10-K",
      "filed": "2025-10-31",
      "url": "https://www.sec.gov/Archives/edgar/data/320193/000032019325000079/0000320193-25-000079-index.htm"
    }
  },
  "warnings": [],
  "schema_version": "1",
  "retrieved_at": "2026-11-05T21:38:54+00:00"
}
```

All money values are in full units of `currency` (not thousands), EPS is per share, ratios are
fractions (0.25 = 25%). `null` means the company didn't report it; nothing is guessed and
unknown is never `0`. Checked against the printed statements of Apple's fiscal 2025 10-K and
JPMorgan's 2024 10-K: every value matched.

**Reported fields:** `revenue`, `cost_of_revenue`, `gross_profit`, `research_and_development`,
`selling_general_and_administrative`, `operating_profit`, `profit_before_tax`, `net_income`,
`net_income_attributable_to_parent`, `eps_basic`, `eps_diluted`,
`weighted_average_shares_basic`, `weighted_average_shares_diluted`, `depreciation_amortisation`,
`total_assets`, `current_assets`, `cash_and_equivalents`, `total_liabilities`,
`current_liabilities`, `noncurrent_liabilities`, `long_term_debt`, `total_equity`,
`equity_attributable_to_parent`, `shares_outstanding`, `operating_cash_flow`,
`investing_cash_flow`, `financing_cash_flow`, `capex`, `dividends_paid`.

**Derived fields** (computed only when every input is there): `free_cash_flow`
(operating cash flow - capex), `ebitda` (operating profit + D\&A), `gross_margin`,
`operating_margin`, `net_margin`, `return_on_equity` (fiscal years only), `equity_ratio`,
`revenue_growth` (versus the same period a year earlier), plus `gross_profit` and
`total_liabilities` when the company doesn't tag them (marked `derived` in `sources`).

The field names are the same as in our
[EU Annual Reports (ESEF) Actor](https://apify.com/bosco_labs/esef-annual-reports), so US and
European companies come out in one vocabulary.

### Input

```json
{ "tickers": ["AAPL", "MSFT"], "period": "quarterly", "years": 2, "metrics": ["revenue", "net_income", "free_cash_flow"] }
```

| Field | Meaning |
|---|---|
| `tickers` | US tickers, e.g. `["AAPL"]`; share classes `BRK-B` or `BRK.B`. Foreign filers too, e.g. `NVO` |
| `ciks` | SEC CIKs, e.g. `["320193"]`, for delisted companies or filers without a ticker |
| `period` | `annual` (default) or `quarterly` |
| `years` | Latest fiscal years per company, default 5, max 20 (`quarterly` + 2 = 8 quarters) |
| `metrics` | Only these fields. Empty = all |
| `includeSources` | Per-value tag and filing (default `true`); `false` makes rows about 3x smaller |

### How the numbers are cleaned

- **One metric, many tags.** Companies tag the same line differently, and change tags over the
  years (Apple's revenue was `SalesRevenueNet` until 2018, then
  `RevenueFromContractWithCustomerExcludingAssessedTax`). Each metric has an ordered list of
  candidate tags; the first one with a value for that exact period wins, and `sources` names it.
- **Duplicates and restatements.** The same figure appears in every later filing that shows it
  as a comparative. The Actor keeps the **latest filed value** (restatements and 10-K/A
  amendments win) and cites the first filing that reported that value. When a value was
  restated, `warnings` says so with the old value. Only periodic reports count (10-K, 10-Q,
  20-F, 40-F, 6-K, 10-KT, 10-QT and amendments): proxy statements repeat rounded figures (JPM's
  2026 proxy shows 2024 net income as 58.5bn; the 10-K says 58,471m) and are ignored.
- **Fiscal years** are found from the period dates, not from the filings' own labels, and named
  the way the company names them (Apple's year ending September 2025 is 2025, Target's year
  ending January 2026 is 2025, Walmart's is 2026).
- **Quarters are discrete 3-month periods.** Companies don't report Q4 separately, and most
  report cash flows only year-to-date in their 10-Qs. For **flow items** (income statement and
  cash flow), the Actor derives Q4 as fiscal year minus the 9-month YTD, and Q2/Q3 as YTD minus
  the previous YTD when no 3-month figure exists. `sources.<metric>.derived` and `warnings` say
  so. **Balance-sheet values are never derived** (Q4 = the year-end balance sheet), and **EPS
  and share counts are never derived** (they don't add up), so they are `null` for Q4 unless
  reported.

#### Tag mapping

First tag with a value for the period wins (us-gaap first, then ifrs-full for IFRS filers).

| Field | Candidate tags, in order |
|---|---|
| `revenue` | Revenues, RevenueFromContractWithCustomerExcludingAssessedTax, RevenueFromContractWithCustomerIncludingAssessedTax, SalesRevenueNet, SalesRevenueGoodsNet, RevenuesNetOfInterestExpense; ifrs Revenue, RevenueFromContractsWithCustomers |
| `cost_of_revenue` | CostOfRevenue, CostOfGoodsAndServicesSold, CostOfGoodsSold, CostOfServices; ifrs CostOfSales |
| `gross_profit` | GrossProfit; ifrs GrossProfit (else revenue - cost_of_revenue) |
| `research_and_development` | ResearchAndDevelopmentExpense, ResearchAndDevelopmentExpenseExcludingAcquiredInProcessCost; ifrs ResearchAndDevelopmentExpense |
| `selling_general_and_administrative` | SellingGeneralAndAdministrativeExpense; ifrs SellingGeneralAndAdministrativeExpense |
| `operating_profit` | OperatingIncomeLoss; ifrs ProfitLossFromOperatingActivities |
| `profit_before_tax` | IncomeLossFromContinuingOperationsBeforeIncomeTaxesExtraordinaryItemsNoncontrollingInterest, IncomeLossFromContinuingOperationsBeforeIncomeTaxesMinorityInterestAndIncomeLossFromEquityMethodInvestments; ifrs ProfitLossBeforeTax |
| `net_income` | ProfitLoss, NetIncomeLoss; ifrs ProfitLoss |
| `net_income_attributable_to_parent` | NetIncomeLoss; ifrs ProfitLossAttributableToOwnersOfParent |
| `eps_basic` | EarningsPerShareBasic, EarningsPerShareBasicAndDiluted; ifrs BasicEarningsLossPerShare |
| `eps_diluted` | EarningsPerShareDiluted, EarningsPerShareBasicAndDiluted; ifrs DilutedEarningsLossPerShare |
| `weighted_average_shares_basic` | WeightedAverageNumberOfSharesOutstandingBasic; ifrs WeightedAverageShares |
| `weighted_average_shares_diluted` | WeightedAverageNumberOfDilutedSharesOutstanding; ifrs AdjustedWeightedAverageShares |
| `depreciation_amortisation` | DepreciationDepletionAndAmortization, DepreciationAndAmortization, DepreciationAmortizationAndAccretionNet; ifrs DepreciationAndAmortisationExpense, AdjustmentsForDepreciationAndAmortisationExpense |
| `total_assets` | Assets; ifrs Assets |
| `current_assets` | AssetsCurrent; ifrs CurrentAssets |
| `cash_and_equivalents` | CashAndCashEquivalentsAtCarryingValue, Cash, CashAndDueFromBanks; ifrs CashAndCashEquivalents |
| `total_liabilities` | Liabilities; ifrs Liabilities (else total_assets - total_equity) |
| `current_liabilities` | LiabilitiesCurrent; ifrs CurrentLiabilities |
| `noncurrent_liabilities` | LiabilitiesNoncurrent; ifrs NoncurrentLiabilities |
| `long_term_debt` | LongTermDebtNoncurrent, LongTermDebtAndCapitalLeaseObligations, LongTermDebt; ifrs NoncurrentPortionOfNoncurrentBorrowings, LongtermBorrowings |
| `total_equity` | StockholdersEquityIncludingPortionAttributableToNoncontrollingInterest, StockholdersEquity; ifrs Equity |
| `equity_attributable_to_parent` | StockholdersEquity; ifrs EquityAttributableToOwnersOfParent |
| `shares_outstanding` | CommonStockSharesOutstanding; ifrs NumberOfSharesOutstanding |
| `operating_cash_flow` | NetCashProvidedByUsedInOperatingActivities, ...ContinuingOperations; ifrs CashFlowsFromUsedInOperatingActivities |
| `investing_cash_flow` | NetCashProvidedByUsedInInvestingActivities, ...ContinuingOperations; ifrs CashFlowsFromUsedInInvestingActivities |
| `financing_cash_flow` | NetCashProvidedByUsedInFinancingActivities, ...ContinuingOperations; ifrs CashFlowsFromUsedInFinancingActivities |
| `capex` | PaymentsToAcquirePropertyPlantAndEquipment, PaymentsToAcquireProductiveAssets; ifrs PurchaseOfPropertyPlantAndEquipmentClassifiedAsInvestingActivities, PurchaseOfPropertyPlantAndEquipment |
| `dividends_paid` | PaymentsOfDividends, PaymentsOfDividendsCommonStock; ifrs DividendsPaidClassifiedAsFinancingActivities, DividendsPaid |

### Use cases

- **Fundamental research:** revenue, margins and cash flow of a company over 5-20 years, or
  quarter by quarter, in one call.
- **Peer comparison:** the same fields for a list of tickers, ready for a spreadsheet.
- **Valuation inputs:** free cash flow, EBITDA, net debt components, shares, EPS.
- **Due diligence and credit checks:** balance sheet and equity trend of a supplier or
  counterparty, with the SEC filing behind each number.
- **AI agents:** small, typed JSON with a source for every value, so the agent doesn't invent
  numbers.

### Use from an AI agent (MCP)

Agents can call this Actor as a tool through the
[Apify MCP server](https://github.com/apify/apify-mcp-server). Add this server URL to your MCP
client (Claude, Cursor, VS Code, ...):

```text
https://mcp.apify.com?tools=bosco_labs/sec-company-financials
```

It loads this Actor as a tool, plus the tools that read its results (`get-actor-run`,
`get-dataset-items`). The hosted server signs you in with OAuth, or accepts your Apify token as
`Authorization: Bearer <APIFY_TOKEN>`. On the default server (`https://mcp.apify.com`), agents
can also find this Actor with `search-actors` and run it with `call-actor`.

Example prompts this Actor answers:

- *"How did Microsoft's revenue, net income and free cash flow develop over the last 8 quarters?"*
- *"Compare Nvidia, AMD and Intel on operating margin for the last 5 fiscal years."*
- *"What was JPMorgan's net income in 2024, and which filing is it from?"*

For the first one, the agent passes:

```json
{"tickers": ["MSFT"], "period": "quarterly", "years": 2, "metrics": ["revenue", "net_income", "free_cash_flow"]}
```

**Output for agents:** stable, typed JSON, one row per company and period, newest first. Every
row has `schema_version`, a `source_url` (the EDGAR filing most values come from), and with
`includeSources` the tag and accession number of each value, so the agent can cite its source.
Derived quarter values and restatements are explained in `warnings`. A typical answer is
20-40 KB with sources, 2-6 KB without. An unknown ticker fails in seconds with suggestions
("APPLE (did you mean AAPL?)"); a company without XBRL data gets a status message saying so.

**Cost:** $0.005 per company-period row, billed to the Apify account the MCP server is signed in
with.

### FAQ

**Which companies?** Every SEC filer with XBRL financial statements: US companies filing 10-K
and 10-Q (large companies since 2009, all since 2011) and foreign companies filing 20-F or 40-F
(IFRS, mostly since 2018). Foreign filers report in their own
currency (e.g. Novo Nordisk in DKK, see `currency`), and most of them report annually only:
asking them for quarters returns fiscal years with a warning.

**How fresh?** The SEC updates companyfacts within minutes of a filing, so a 10-Q is in the next
run after it is filed.

**Are the values as reported?** Yes: as tagged in the filings (latest restated value), not
adjusted, not normalized for one-offs, not converted between currencies. No forecasts.

**Banks and insurers?** Their statements have no gross profit, operating income, current assets,
current liabilities or (usually) capex, so those fields, and the margins and free cash flow
built on them, are `null`. Revenue for banks is total net revenue (JPMorgan: 177,556m for 2024);
`profit_before_tax`, `net_income`, EPS, assets, liabilities and equity are there.
`cash_and_equivalents` for banks is usually cash and due from banks.

**Why is a field empty for some companies?** Companies tag differently. Some use their own
company-specific tags instead of the standard ones (Microsoft reports sales & marketing and G\&A
separately, so `selling_general_and_administrative` is `null`); those stay `null` rather than
being guessed. `metrics_found` tells you how complete a row is.

**What is not included?** Market data (share prices, market cap, valuation multiples), segment
and geographic breakdowns, guidance, non-GAAP figures, and anything before a company's first
XBRL filing (2009-2011).

**Legal basis?** SEC filings are US government public records. See LEGAL.md.

# Actor input Schema

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

US tickers as listed by the SEC, e.g. \["AAPL", "MSFT"]; share classes with a dash or dot, e.g. "BRK-B". Foreign companies filing 20-F/40-F work too, e.g. "NVO". Mapped to the CIK with the SEC's company_tickers.json; an unknown ticker is skipped with suggestions in the status message. Empty = use `ciks`.

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

SEC Central Index Keys as digits, leading zeros optional, e.g. \["320193"] for Apple. Use for delisted companies and filers without a ticker. Empty = use `tickers`; at least one of the two is required.

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

"annual" = one row per fiscal year (FY). "quarterly" = one row per fiscal quarter, Q1-Q4, each a discrete 3-month period (Q4 and year-to-date-only cash flows are derived, see `warnings`). Companies without quarterly XBRL data (most 20-F filers) return fiscal years instead. Default "annual".

## `years` (type: `integer`):

How many of the latest fiscal years to return per company, e.g. 5 (5 rows annual, up to 20 rows quarterly; 2 with quarterly = the last 8 quarters). XBRL data starts in 2009-2011. Default 5, max 20.

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

Only these output fields, e.g. \["revenue", "net_income", "free_cash_flow", "operating_margin"]. Valid: revenue, cost_of_revenue, gross_profit, research_and_development, selling_general_and_administrative, operating_profit, profit_before_tax, net_income, net_income_attributable_to_parent, eps_basic, eps_diluted, weighted_average_shares_basic, weighted_average_shares_diluted, depreciation_amortisation, total_assets, current_assets, cash_and_equivalents, total_liabilities, current_liabilities, noncurrent_liabilities, long_term_debt, total_equity, equity_attributable_to_parent, shares_outstanding, operating_cash_flow, investing_cash_flow, financing_cash_flow, capex, dividends_paid, free_cash_flow, ebitda, gross_margin, operating_margin, net_margin, return_on_equity, equity_ratio, revenue_growth. Empty = all of them.

## `includeSources` (type: `boolean`):

true = each row has `sources` (per value: the XBRL tag and the SEC accession number it came from, plus how it was derived) and `filings` (form, filing date and URL of each filing cited). false = values only, about 3x smaller rows. Default true.

## Actor input object example

```json
{
  "tickers": [
    "AAPL"
  ],
  "period": "annual",
  "years": 3,
  "includeSources": true
}
```

# Actor output Schema

## `results` (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 = {
    "tickers": [
        "AAPL"
    ],
    "years": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("bosco_labs/sec-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 = {
    "tickers": ["AAPL"],
    "years": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("bosco_labs/sec-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 '{
  "tickers": [
    "AAPL"
  ],
  "years": 3
}' |
apify call bosco_labs/sec-company-financials --silent --output-dataset

```

## MCP server setup

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