# SEC 10-K Strategy Signal Extractor (`truenorth/sec-10k-strategy-signal-extractor`) Actor

Extract source-cited SEC 10-K Item 1, Item 1A, and Item 7, compare annual filings, and detect deterministic strategy and risk signals.

- **URL**: https://apify.com/truenorth/sec-10k-strategy-signal-extractor.md
- **Developed by:** [TrueNorth](https://apify.com/truenorth) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 successful sec 10-k section records

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## SEC 10-K Strategy Signal Extractor

Turn public U.S. Securities and Exchange Commission (SEC) 10-K annual reports
into source-cited sections and repeatable change data. Extract Item 1 (Business),
Item 1A (Risk Factors), and Item 7 (Management's Discussion and Analysis, or
MD\&A), compare adjacent filings, and identify lexical strategy and risk signals.

This Actor uses only public SEC endpoints. It does not log in, bypass access
controls, use proxies, or fall back to fixtures after live-source failures.

### Why use this Actor?

- Trace every extracted section to its SEC filing URL, document hash, heading,
  and normalized citation offsets.
- Compare adjacent 10-K filings with bounded unified diffs and stable hashes.
- Find rule-based changes across market, product, customer, competition,
  operations, risk, regulation, technology, geography, and capital allocation.
- Request a bounded subset of SEC eXtensible Business Reporting Language (XBRL)
  Company Facts when source facts are useful beside narrative changes.
- Receive explicit error rows for missing or ambiguous sections instead of
  silently accepting uncertain extraction.

This is not a generic SEC filing scraper or filing downloader. It is designed
as an SEC 10-K extractor for deterministic, source-cited Item 1, Item 1A, and
Item 7 extraction and adjacent annual-report change analysis.

### Use cases

- Monitor changes in company strategy, operations, competition, and risk
  disclosures.
- Build auditable 10-K research datasets for analysts and due-diligence teams.
- Compare risk factors and MD\&A language across adjacent annual reports.
- Feed cited filing sections, diffs, and lexical signals into downstream review
  workflows.

### Input

Required:

- `companies`: one to ten tickers or numeric CIKs, such as `AAPL`, `BRK-B`, or
  `0000320193`.

Optional:

- `filingSelection`: `latest`, `latestPair` (default), or `fiscalYears`.
- `fiscalYears`: one to five years when `filingSelection` is `fiscalYears`.
- `sections`: any of `item1`, `item1a`, and `item7`; all three by default.
- `includeCompanyFacts`: attach bounded SEC Company Facts; default `false`.
- `companyFactConcepts`: one to eight `us-gaap:Tag` or `dei:Tag` concepts.
- `maxFactPeriods`: periods per concept, from 1 to 10; default `3`.
- `maxDiffChars`: emitted unified-diff bound, from 1,000 to 200,000; default
  `50,000`.

Example:

```json
{
  "companies": ["AAPL", "0000789019"],
  "filingSelection": "latestPair",
  "sections": ["item1", "item1a", "item7"],
  "includeCompanyFacts": false
}
```

### Output

One dataset item represents one company, selected current filing, and requested
section. Successful rows include:

- issuer and filing identity;
- normalized section text and SHA-256 hashes;
- SEC document URL plus normalized citation offsets;
- baseline comparison and bounded unified diff when requested;
- deterministic lexical signals for market, product, customer, competition,
  operations, risk, regulation, technology, geography, and capital allocation;
- optional bounded Company Facts;
- explicit warnings or structured errors.

`OUTPUT` in default key-value store contains dataset ID and counts by status.
Missing or ambiguous sections produce explicit error rows. Actor fails when no
section succeeds.

Example dataset item, shortened to show core fields:

```json
{
  "schemaVersion": "1.0",
  "recordType": "section",
  "status": "ok",
  "requestedIdentifier": "AAPL",
  "company": {
    "cik": "0000320193",
    "ticker": "AAPL",
    "name": "Apple Inc."
  },
  "filing": {
    "accessionNumber": "0000320193-24-000123",
    "form": "10-K",
    "fiscalYear": 2024,
    "documentUrl": "https://www.sec.gov/Archives/edgar/data/320193/000032019324000123/aapl-20240928.htm"
  },
  "section": {
    "id": "item1",
    "title": "Business",
    "headingText": "ITEM 1. BUSINESS",
    "charCount": 2188,
    "citation": {
      "documentUrl": "https://www.sec.gov/Archives/edgar/data/320193/000032019324000123/aapl-20240928.htm",
      "startOffset": 17,
      "endOffset": 2205
    }
  },
  "comparison": null,
  "signals": [],
  "companyFacts": [],
  "warnings": [],
  "error": null
}
```

The full item also contains required filing identity, section text and SHA-256
hashes, complete citation fields, and every other field defined by the dataset
schema.

### Pricing

This Actor uses Pay Per Event pricing at `$2.00 per 1,000 successfully persisted
section records` (`$0.002` per record). Each persisted `section` record with
`status: "ok"` or `status: "partial"` charges one
`per-1000-section-records` event at an `eventPriceUsd` of `$0.002`.

`company_error` records and `section` records with `status: "error"` are not
charged. Records are charged only after dataset persistence succeeds, so a
failed dataset write does not incur an event charge. Apify platform usage costs
remain separate.

### SEC fair-access identity

Live runs require `SEC_USER_AGENT` in deployment environment. Value must name
application and monitored contact, for example:

```sh
export SEC_USER_AGENT="SEC 10-K Strategy Signal Extractor ops@example.com"
```

Identity is configuration, not public Actor input. Runtime restricts requests to
`data.sec.gov`, SEC's canonical ticker mapping, and SEC Archives; limits request
rate and concurrency; bounds responses and retries; honors `Retry-After`; and
stops issuer work after repeated access blocking.

### Local development

Requires Node.js 22+, pnpm 10.30.0, and Apify CLI.

```sh
corepack enable
pnpm install --frozen-lockfile
pnpm test
pnpm test:coverage
pnpm format
pnpm lint
pnpm typecheck
pnpm build
pnpm validate:schemas
apify validate-schema
```

Deterministic network-free Actor run:

```sh
LOCAL_FIXTURE_MODE=1 apify run --purge --input \
  '{"companies":["AAPL"],"filingSelection":"latest","sections":["item1"],"includeCompanyFacts":false}'
```

Fixture mode reads synthetic files under `tests/fixtures`, is never an automatic
fallback, and is rejected when `APIFY_IS_AT_HOME=1`.

### Scope and disclaimer

Signals come from versioned lexical rules applied to changed filing sentences.
They summarize source-text changes; they do not predict performance, determine
materiality, or constitute legal, accounting, or investment advice. Verify
important conclusions against linked SEC filings. Filing HTML varies by issuer
and year; missing or ambiguous headings can produce error rows. The Actor
processes 10-K filings, excludes 10-K/A amendments from filing selection in
version 1, and limits each run to the documented input bounds.

# Actor input Schema

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

One to ten SEC tickers or numeric CIKs. Examples: AAPL, BRK-B, 0000320193.

## `filingSelection` (type: `string`):

Choose newest 10-K, newest compared with prior 10-K, or requested fiscal years compared with their prior filings.

## `fiscalYears` (type: `array`):

Required only for specific fiscal years; 1994 or later.

## `sections` (type: `array`):

Item 1 Business, Item 1A Risk Factors, and/or Item 7 MD\&A.

## `includeCompanyFacts` (type: `boolean`):

Attach bounded annual facts from SEC Company Facts.

## `companyFactConcepts` (type: `array`):

Optional us-gaap or dei taxonomy:tag values; allowed only when Company Facts are enabled.

## `maxFactPeriods` (type: `integer`):

Maximum annual periods emitted per requested concept.

## `maxDiffChars` (type: `integer`):

Maximum emitted unified-diff characters; counts and hashes still cover full sections.

## Actor input object example

```json
{
  "companies": [
    "AAPL"
  ],
  "filingSelection": "latestPair",
  "fiscalYears": [],
  "sections": [
    "item1",
    "item1a",
    "item7"
  ],
  "includeCompanyFacts": false,
  "maxFactPeriods": 3,
  "maxDiffChars": 50000
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "companies": [
        "AAPL"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("truenorth/sec-10k-strategy-signal-extractor").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"] }

# Run the Actor and wait for it to finish
run = client.actor("truenorth/sec-10k-strategy-signal-extractor").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"
  ]
}' |
apify call truenorth/sec-10k-strategy-signal-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,truenorth/sec-10k-strategy-signal-extractor"
        }
    }
}

```

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/urURxW367mYvaSSQr/builds/NfXvLCFTzncv6Ilt8/openapi.json
