# SEC EDGAR Filings & Financials (`grit-77/sec-edgar-filings-financials`) Actor

SEC EDGAR scraper for filing and financial-data research. Export filing records and normalized financial period rows as JSON with company identifiers and source references.

- **URL**: https://apify.com/grit-77/sec-edgar-filings-financials.md
- **Developed by:** [Grit](https://apify.com/grit-77) (community)
- **Categories:** Business, AI
- **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.

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 Filings & Financials

SEC EDGAR scraper returns public filing records and normalized financial period rows. SEC EDGAR API results include company identifiers, filing links, reported metrics, and source references where available.

### Input example

```json
{
  "userAgentEmail": "you@yourcompany.com",
  "mode": "filings",
  "companies": [
    "AAPL"
  ],
  "forms": [
    "10-K"
  ],
  "maxItems": 20
}
```

The input keys and allowed values follow [input_schema.json](.actor/input_schema.json).

### Output fields

| Field | Type | Example or excerpt from sample |
|---|---|---|
| `record_type` | string | `"filing"` |
| `ticker` | string | `"AAPL"` |
| `cik` | string | `"0000320193"` |
| `company_name` | string | `"Apple Inc."` |
| `form` | string | `"8-K"` |
| `filing_date` | string | `"2026-07-30"` |
| `report_date` | string | `"2026-07-30"` |
| `accepted_at` | string | `"2026-07-30T20:30:28.000Z"` |
| `accession_number` | string | `"0000320193-26-000018"` |
| `primary_document` | string | `"aapl-20260730.htm"` |
| `primary_doc_url` | string | `"https://www.sec.gov/Archives/edgar/data/320193/000032019326000018/aapl-20260730.htm"` |
| `filing_index_url` | string | `"https://www.sec.gov/Archives/edgar/data/320193/000032019326000018/0000320193-26-0000…` |
| `description` | string | `"8-K"` |
| `items` | array | `["2.02", "9.01"]` |
| `item_descriptions` | array | `["Results of Operations and Financial Condition", "Financial Statements and Exhibits"]` |
| `size_bytes` | integer | `417360` |
| `is_xbrl` | boolean | `true` |
| `is_inline_xbrl` | boolean | `true` |
| `file_number` | string | `"001-36743"` |
| `sic` | string | `"3571"` |
| `sic_description` | string | `"Electronic Computers"` |
| `source` | string | `"submissions"` |
| `period_type` | string | `"annual"` |
| `fiscal_year` | integer | `2025` |
| `fiscal_period` | string | `"FY"` |
| `period_start` | string | `"2024-09-29"` |
| `period_end` | string | `"2025-09-27"` |
| `currency` | string | `"USD"` |
| `filed_date` | string | `"2025-10-31"` |
| `revenue` | integer | `416161000000` |
| `gross_profit` | integer | `195201000000` |
| `operating_income` | integer | `133050000000` |
| `net_income` | integer | `112010000000` |
| `eps_basic` | number | `7.49` |
| `eps_diluted` | number | `7.46` |
| `operating_cash_flow` | integer | `111482000000` |
| `total_assets` | integer | `359241000000` |
| `total_liabilities` | integer | `285508000000` |
| `stockholders_equity` | integer | `73733000000` |
| `cash` | integer | `35934000000` |
| `shares_outstanding` | integer | `14773260000` |
| `extra` | object | `{}` |
| `derived_metrics` | array | `[]` |
| `xbrl_tags` | object | `{"revenue": "RevenueFromContractWithCustomerExcludingAssessedTax", "gross_profit": "G…` |
| `source_url` | string | `"https://data.sec.gov/api/xbrl/companyfacts/CIK0000320193.json"` |

### Output example

Trimmed from [sample_output.json](sample_output.json); omitted fields remain available in the dataset.

```json
{
  "record_type": "filing",
  "ticker": "AAPL",
  "cik": "0000320193",
  "company_name": "Apple Inc.",
  "form": "8-K",
  "filing_date": "2026-07-30",
  "report_date": "2026-07-30"
}
```

### Contact email for SEC fair access

The SEC requires every automated client to identify itself with a contact in the `User-Agent` header and caps traffic at 10 requests per second. This actor sends `"<name> <email>"` as its User-Agent using **your** `userAgentEmail` input (there is deliberately no default, so SEC can reach the person who runs the job) and paces itself to about 5 requests per second across the whole run, with retries and backoff on 403/429/5xx. Use a real address you control. The email is only sent to the SEC and is not written to the results.

### Limits

- Data is exactly what the SEC publishes; this actor does not interpret or audit it. Financial rows exist only for filers with XBRL data; filings without it are listed but produce no `fact` rows.
- Financial metrics are read in US dollars (and USD per share, shares). Filers that report in another currency return `null` for those metrics.
- Full-text search is the endpoint behind the sec.gov search page. The SEC does not publish documentation or a service-level promise for it, so treat it as best effort. It returns at most 10,000 hits per query (narrow with dates, forms or companies) and does not return highlighted snippets.
- Form 4 `primary_doc_url` points to the SEC rendered view (`xslF345X..`) of the XML.
- Only public SEC data is accessed. The actor does not log in, solve CAPTCHAs or use proxies.

### Disclaimer

Not affiliated with the U.S. Securities and Exchange Commission. Data is provided as published by the SEC and is not investment advice.

### FAQ

**What are the output limits?** `maxItems` caps output; XBRL financial rows exist only where the filer reports usable data. Full-text search is best effort.

**Do I need a proxy or login?** Public SEC endpoints need no login or proxy. Supply a real `userAgentEmail` for the SEC User-Agent; replace the placeholder in the example.

**How is this priced?** Proposed pay per event: $0.0003 per `filing` row and $0.0006 per `fact` financial-period row. Error rows are uncharged. These are proposals in [PRICING.md](PRICING.md); the owner must configure Store billing.

**How are rate limits handled?** The code shares a limiter across requests at about 5 requests per second and backs off on SEC errors and `Retry-After`.

**How fresh is the data?** SEC records can be amended after a run. Use filing dates and source links to verify current data. This actor is not affiliated with the SEC and does not provide investment advice.

### Use with AI agents / MCP

After the actor is published, connect your agent to the [Apify MCP server](https://docs.apify.com/integrations/mcp) with an Apify API token. Use `call-actor` with the published actor identifier and the JSON input shown above. Read the returned dataset with `get-dataset-items`; the run response itself contains status and storage IDs, not the result rows. Alternatively, use the [Apify API](https://docs.apify.com/api/v2) to start a run and read its default dataset. Keep the actor input bounded with `maxItems`, and inspect source links and any error fields before using results in an answer.

# Actor input Schema

## `userAgentEmail` (type: `string`):

Added to the User-Agent sent to the SEC, as its fair-access policy recommends. Leave empty to use the actor's own identifier. Not stored in the results.

## `userAgentName` (type: `string`):

Shown before the email in the User-Agent, for example your company name.

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

filings = filing list; financials = XBRL key figures per fiscal period; filings_and_financials = both; fulltext = EDGAR full-text search.

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

Tickers (AAPL, BRK-B) or CIK numbers (320193). Required for the first three modes; in full-text mode it restricts the search to these companies.

## `forms` (type: `array`):

Filings and full-text mode. Examples: 10-K, 10-Q, 8-K, S-1, 4, 13F (matches 13F-HR and 13F-NT), DEF 14A. A trailing \* matches a prefix (S-\*). Empty = all forms.

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

Also return amended versions of the requested forms.

## `startDate` (type: `string`):

YYYY-MM-DD. Filings and full-text mode.

## `endDate` (type: `string`):

YYYY-MM-DD. Filings and full-text mode.

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

Newest first.

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

Annual (10-K), quarterly (Q1-Q4, Q4 derived from the full year), or both.

## `maxPeriods` (type: `integer`):

Newest periods first.

## `customConcepts` (type: `array`):

Optional extra XBRL tags, for example ResearchAndDevelopmentExpense or LongTermDebt. Returned in the extra field of each period row.

## `searchQuery` (type: `string`):

Full-text mode only. Searches filing text since 2001 (EDGAR full-text search). Use quotes for an exact phrase, for example "going concern".

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

Hard cap on filing plus financial-period rows (the rows you pay for).

## `maxConcurrency` (type: `integer`):

Requests are always paced to about 5 per second, below the SEC limit of 10.

## Actor input object example

```json
{
  "userAgentName": "ApifyActor",
  "mode": "filings",
  "companies": [
    "AAPL",
    "MSFT"
  ],
  "forms": [
    "10-K",
    "10-Q",
    "8-K"
  ],
  "includeAmendments": false,
  "maxFilingsPerCompany": 50,
  "periodType": "annual",
  "maxPeriods": 8,
  "maxItems": 100,
  "maxConcurrency": 3
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset with all filing, financial-period and error rows

# 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"
    ],
    "forms": [
        "10-K",
        "10-Q",
        "8-K"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("grit-77/sec-edgar-filings-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",
    ],
    "forms": [
        "10-K",
        "10-Q",
        "8-K",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("grit-77/sec-edgar-filings-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"
  ],
  "forms": [
    "10-K",
    "10-Q",
    "8-K"
  ]
}' |
apify call grit-77/sec-edgar-filings-financials --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,grit-77/sec-edgar-filings-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/FodDIZ2fy1wm0TDQM/builds/tUAtpKSetGSMmzdZq/openapi.json
