# SEC Earnings Call Transcripts Scraper (`automation-lab/sec-8k-earnings-call-transcripts`) Actor

Monitor SEC 8-K filings and extract sectioned earnings-call transcript exhibits with speakers and source links.

- **URL**: https://apify.com/automation-lab/sec-8k-earnings-call-transcripts.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.21 / 1,000 transcript extracteds

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?

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 Earnings Call Transcripts Scraper

Extract **SEC earnings call transcripts** from official 8-K exhibits. Monitor selected public companies by ticker or CIK, or parse a known SEC filing URL, and receive filing identity, company metadata, event dates, full normalized transcript text, sections, speakers, speaker turns, and official source links.

The Actor is designed for recurring financial research, RAG ingestion, analyst workflows, and source-linked transcript archives. It reads public SEC EDGAR data directly and does not require a paid market-data API.

### What does this SEC transcript Actor do?

The Actor follows a filing-first workflow:

1. Resolve supplied stock tickers to SEC CIK identifiers.
2. Read each company's recent SEC submissions.
3. Select 8-K and 8-K/A filings inside the requested date range.
4. Inspect the filing's official exhibit list.
5. Score EX-99 exhibits for earnings-call transcript signals.
6. Parse the strongest transcript into sections and speaker turns.
7. Save one typed, source-linked dataset row per transcript.

It does not label every press release as a transcript. An exhibit must contain useful call-transcript signals, substantial text, and multiple detected speaker turns before it is returned or charged.

### Who is it for?

- **Equity researchers** monitoring prepared remarks and analyst Q\&A.
- **Portfolio analysts** maintaining transcript archives for selected companies.
- **Data engineers** feeding source-linked text into warehouses or search indexes.
- **AI and RAG teams** building retrieval corpora from official public filings.
- **Compliance teams** that need accession numbers and original SEC links beside extracted text.
- **Journalists and academics** comparing management commentary across reporting periods.

### Why use filing-first transcript extraction?

Third-party transcript pages can change, disappear, or obscure provenance. This Actor preserves the official SEC filing and exhibit URLs with every record.

The output combines:

- stable accession and CIK identity;
- filing and report dates;
- the selected exhibit type and description;
- full text instead of a short snippet;
- semantic sections such as prepared remarks and questions and answers;
- distinct speaker names and ordered speaker turns;
- timestamps and source links for auditability.

The implementation uses lightweight official JSON and static HTML rather than a browser. Requests are sequential and identify the client under SEC fair-access guidance.

### What data can I extract?

| Field | Meaning |
| --- | --- |
| `accessionNumber` | Unique SEC filing accession number |
| `filingDate` | Date the filing was accepted by EDGAR |
| `eventDate` | Filing report or event date when supplied |
| `form` | `8-K` or `8-K/A` |
| `companyName` | SEC registrant name |
| `ticker` | Requested ticker when the ticker route was used |
| `cik` | Zero-padded SEC Central Index Key |
| `filingUrl` | Official SEC filing index |
| `transcriptUrl` | Official exhibit selected as the transcript |
| `exhibitType` | Exhibit classification such as `EX-99.2` |
| `exhibitDescription` | Description from the filing index |
| `title` | Detected call title |
| `speakers` | Distinct detected speakers |
| `sections` | Section title and normalized text pairs |
| `speakerTurns` | Ordered speaker, section, and text objects |
| `transcriptText` | Complete normalized exhibit text |
| `scrapedAt` | UTC extraction timestamp |

Nullable fields remain `null` when the filing does not expose them. The original source links remain available for verification.

### How do I get started?

1. Open the Actor in Apify Console.
2. Enter one or more `tickers`, `ciks`, or `filingUrls`.
3. Add `dateFrom` and `dateTo` for a bounded monitoring window.
4. Set `maxFilingsPerCompany` to control filing inspection.
5. Set `maxItems` to cap returned transcripts.
6. Start the run.
7. Open the default dataset, then export JSON, CSV, Excel, XML, or another Apify-supported format.

A useful first test is ticker `TRAK` with dates from `2025-09-01` through `2025-10-15`.

### Input parameters

#### `tickers`

A list of US public-company ticker symbols. The Actor resolves each symbol with the official SEC ticker map. Unknown tickers fail closed rather than silently producing misleading empty data.

#### `ciks`

A list of numeric SEC CIKs. Leading zeroes are optional. Use CIKs for stable scheduled workflows that should not depend on ticker changes.

#### `filingUrls`

Official `sec.gov/Archives/edgar/data/...` filing index or exhibit URLs. The Actor identifies the parent filing and applies the same transcript selection rules used in company monitoring.

#### `dateFrom` and `dateTo`

Optional inclusive filing-date boundaries in `YYYY-MM-DD` format. They apply to ticker and CIK discovery. Keep a moving recent window in scheduled Tasks.

#### `maxFilingsPerCompany`

The maximum recent 8-K/8-K-A filings inspected for each ticker or CIK. Default: `30`. Maximum: `200`.

#### `maxItems`

The maximum transcript records written to the dataset. Default: `10`. Maximum: `1000`.

#### `secUserAgent`

Optional organization and contact email sent in the request User-Agent. The default identifies Automation Lab. Organizations with their own SEC request identity can replace it.

### Example input: monitor by ticker

```json
{
  "tickers": ["TRAK"],
  "dateFrom": "2025-09-01",
  "dateTo": "2025-10-15",
  "maxFilingsPerCompany": 10,
  "maxItems": 1
}
```

### Example input: parse a known SEC filing

```json
{
  "filingUrls": [
    {
      "url": "https://www.sec.gov/Archives/edgar/data/50471/000143774925030128/0001437749-25-030128-index.html"
    }
  ],
  "maxItems": 1
}
```

### Example output

This abbreviated example reflects the Actor's real output shape:

```json
{
  "accessionNumber": "0001437749-25-030128",
  "filingDate": "2025-09-30",
  "eventDate": "2025-09-29",
  "form": "8-K",
  "companyName": "ReposiTrak, Inc.",
  "ticker": "TRAK",
  "cik": "0000050471",
  "filingUrl": "https://www.sec.gov/Archives/edgar/data/50471/000143774925030128/0001437749-25-030128-index.html",
  "transcriptUrl": "https://www.sec.gov/Archives/edgar/data/50471/000143774925030128/ex_865468.htm",
  "exhibitType": "EX-99.2",
  "title": "Fiscal Fourth Quarter and Full-Year 2025 Earnings Call",
  "speakers": ["Operator", "Jeff Stanlis", "John Merrill", "Randy Fields", "Thomas Forte"],
  "sections": [{"title": "Prepared remarks", "text": "Operator\nGreetings, and welcome..."}],
  "speakerTurns": [{"speaker": "Operator", "section": "Prepared remarks", "text": "Greetings, and welcome..."}],
  "transcriptText": "Fiscal Fourth Quarter and Full-Year 2025 Earnings Call...",
  "scrapedAt": "2026-09-06T20:00:00.000Z"
}
```

The complete record includes the full sections and all detected turns.

### How much does it cost to extract SEC earnings call transcripts?

Pricing is pay per event:

- a **$0.0001 start event** is charged once per run;
- each useful transcript is charged at the active plan tier;
- the BRONZE transcript price is **$0.0003561 per transcript**;
- filings that do not contain a qualifying transcript are not charged as transcripts.

At the BRONZE tier, a one-transcript run contains one start event and one transcript event. A ten-transcript run contains one start event and ten transcript events; a hundred-transcript run contains one start event and one hundred transcript events. Multiply the active per-transcript tier by useful records and add the single start event to estimate the run charge.

Apify may separately account for platform usage according to your plan. Check the Actor pricing panel for the current tier applicable to your account.

### How transcript selection works

8-K filings often contain several EX-99 exhibits. The transcript is not always EX-99.1. The Actor inspects up to eight candidate exhibits and scores signals including:

- “earnings call” or “conference call”;
- operator dialogue;
- participant lists;
- prepared remarks or presentation headings;
- question-and-answer headings;
- substantial document length.

The strongest candidate must pass a minimum score and produce multiple speaker turns. This avoids returning ordinary earnings releases as if they were transcripts.

### Monitoring workflow

Create an Apify Task with stable CIKs and a recent date window. Schedule it daily or weekly. Downstream automation can deduplicate on `accessionNumber`.

A typical pipeline is:

1. scheduled Task runs;
2. Actor scans recent filings;
3. dataset webhook starts your integration;
4. pipeline upserts by accession number;
5. new transcript text is chunked for search or RAG;
6. analysts receive a source-linked update.

The Actor itself does not send alerts or compare prior datasets. Apify schedules, webhooks, Make, Zapier, or your own integration can provide that orchestration.

### Export and integration ideas

- Export speaker turns to a warehouse for longitudinal analysis.
- Index `transcriptText` in a vector database.
- Separate prepared remarks from Q\&A using `sections`.
- Filter management and analyst turns by `speaker`.
- Join records to market data using ticker, CIK, and event date.
- Retain `filingUrl` and `transcriptUrl` as provenance in generated research.
- Trigger a webhook only when a new accession appears.

### Run through the Apify API with cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~sec-8k-earnings-call-transcripts/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"tickers":["TRAK"],"dateFrom":"2025-09-01","dateTo":"2025-10-15","maxItems":1}'
```

To wait for completion and receive dataset items, use the synchronous dataset-items endpoint documented by Apify.

### JavaScript API example

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/sec-8k-earnings-call-transcripts').call({
  ciks: ['50471'],
  dateFrom: '2025-09-01',
  dateTo: '2025-10-15',
  maxItems: 5,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Python API example

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/sec-8k-earnings-call-transcripts').call(run_input={
    'filingUrls': [{
        'url': 'https://www.sec.gov/Archives/edgar/data/50471/000143774925030128/0001437749-25-030128-index.html'
    }],
    'maxItems': 1,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use with MCP and AI agents

Add the Apify MCP server to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/sec-8k-earnings-call-transcripts"
```

#### Claude Desktop

Claude Desktop can use this Actor-specific MCP server configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/sec-8k-earnings-call-transcripts"
    }
  }
}
```

#### Cursor

In Cursor, open **Settings → Tools & MCP → New MCP Server** and use the same Actor-specific URL.

#### VS Code

In VS Code with MCP support enabled, add an HTTP MCP server named `apify` and use the same Actor-specific URL.

Example prompts:

- “Find the ReposiTrak SEC earnings call transcript filed in September 2025 and summarize the prepared remarks.”
- “Extract this SEC 8-K transcript and list each analyst question with the attributed speaker.”
- “Monitor CIK 50471 in this date window and return accession numbers and official exhibit links.”

Always verify generated financial conclusions against the included SEC source links.

### Reliability and fair-access behavior

The Actor uses official SEC endpoints, a descriptive User-Agent, sequential requests, and bounded retries. Transient timeouts, HTTP 429, and temporary 5xx responses are retried up to three times with backoff. Stable malformed-input and deterministic 4xx failures are not retried blindly.

If every filing request fails, the run fails non-zero instead of reporting a false valid empty result. If filing requests succeed but no qualifying transcript exists, a successful zero-item result is valid.

### Limitations

- Only transcript exhibits publicly attached to SEC 8-K or 8-K/A filings are in scope.
- Many companies publish only earnings releases, slide decks, or webcast links in 8-K exhibits.
- Historical filings outside the recent company-submissions block may not appear in ticker/CIK discovery.
- PDF-only, image-only, or unusually formatted exhibits may not parse.
- Speaker detection is rule-based and can miss stylized names or include a heading that resembles a name.
- The Actor does not provide investment advice, sentiment scores, audio transcription, alerts, or non-SEC transcript sources.
- SEC availability and fair-access controls can affect run time.

For older known filings, pass the official filing URL directly.

### Responsible use and legality

SEC filings are public records, but users remain responsible for their use, storage, redistribution, and downstream conclusions. Respect SEC fair-access guidance and avoid aggressive schedules or overlapping runs. Do not imply that normalized text is an SEC endorsement or a perfect legal reproduction.

Transcripts may contain third-party transcription notices and forward-looking statements. Preserve the original exhibit link and review the source before making financial, legal, or compliance decisions.

### Troubleshooting

#### Why did the run return zero transcripts?

The selected company or date window may contain 8-K filings but no complete call transcript exhibit. Expand the date range, raise `maxFilingsPerCompany`, or verify a known filing URL.

#### Why did an unknown ticker fail?

The Actor validates tickers against the current SEC mapping. Use the company's CIK if its ticker recently changed or is absent from the mapping.

#### Why is a speaker missing?

Some exhibits do not visually separate names from dialogue. Use `transcriptText` and `sections` when precise speaker attribution is not available.

#### Why did every filing request fail?

Check the error log for SEC throttling or temporary availability. Avoid concurrent overlapping schedules and retry later with a bounded window.

### Frequently asked questions

#### Does this scrape every transcript website?

No. It intentionally focuses on official SEC 8-K exhibits.

#### Does it download call audio?

No. It parses transcript text already filed as an exhibit.

#### Can I monitor several companies?

Yes. Supply multiple tickers or CIKs and schedule the Task. Use `maxItems` and `maxFilingsPerCompany` to bound work.

#### Can I deduplicate recurring runs?

Yes. Use `accessionNumber` as the stable filing key and `transcriptUrl` as the source-document key.

#### Are non-transcript filings charged per transcript?

No. The transcript event is charged only when a useful transcript row passes validation and is saved.

### Related Automation Lab Actors

- [SEC EDGAR Filings Scraper](https://apify.com/automation-lab/sec-edgar-filings-scraper) for broader filing retrieval when you need forms beyond transcript-bearing 8-K exhibits.

Use this Actor when the buyer job is specifically to identify, structure, and monitor earnings-call transcripts filed with SEC EDGAR.

# Actor input Schema

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

US public-company ticker symbols to monitor in SEC EDGAR, for example TRAK or NGS.

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

Optional SEC Central Index Keys. Leading zeroes are optional.

## `filingUrls` (type: `array`):

Optional sec.gov EDGAR filing index or exhibit URLs. The Actor identifies and checks the complete filing.

## `dateFrom` (type: `string`):

Optional inclusive filing-date boundary in YYYY-MM-DD format.

## `dateTo` (type: `string`):

Optional inclusive filing-date boundary in YYYY-MM-DD format.

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

Maximum recent 8-K filings inspected for each ticker or CIK.

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

Stop after this many transcript records are saved.

## `secUserAgent` (type: `string`):

Optional organization and contact email sent in the User-Agent header under SEC fair-access guidance.

## Actor input object example

```json
{
  "tickers": [
    "TRAK"
  ],
  "dateFrom": "2025-09-01",
  "dateTo": "2025-10-15",
  "maxFilingsPerCompany": 30,
  "maxItems": 10,
  "secUserAgent": "Automation Lab SEC transcript monitor contact@automation-lab.com"
}
```

# Actor output Schema

## `overview` (type: `string`):

Open the overview of extracted SEC earnings-call transcripts.

# 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": [
        "TRAK"
    ],
    "dateFrom": "2025-09-01",
    "dateTo": "2025-10-15"
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/sec-8k-earnings-call-transcripts").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": ["TRAK"],
    "dateFrom": "2025-09-01",
    "dateTo": "2025-10-15",
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/sec-8k-earnings-call-transcripts").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": [
    "TRAK"
  ],
  "dateFrom": "2025-09-01",
  "dateTo": "2025-10-15"
}' |
apify call automation-lab/sec-8k-earnings-call-transcripts --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/sec-8k-earnings-call-transcripts"
        }
    }
}

```

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/1h69M5J6hhQHAXmc4/builds/Ap3sUtGycoBltMTnj/openapi.json
