# Earnings Call Scraper — Transcripts, Speakers & Q\&A (`codingfrontend/earnings-call-scraper`) Actor

Extracts public earnings-call transcript metadata, speaker segments, Q\&A text, dates, tickers, and financial evidence from accessible transcript pages.

- **URL**: https://apify.com/codingfrontend/earnings-call-scraper.md
- **Developed by:** [Coding Frontned](https://apify.com/codingfrontend) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.99 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## Earnings Call Scraper

Collect publicly readable Motley Fool earnings-call transcripts by ticker or supplied transcript URL. Each row includes the full conference-call text, actual call date, reporting quarter, speaker turns and source links when available.

### Start a run

Open the Input tab, enter ticker symbols and choose the transcript limit. Click Start and download results from the Dataset tab as JSON, CSV or Excel. The default looks up AAPL and saves at most one transcript.

Example input:

```json
{
  "tickers": [
    "AAPL",
    "MSFT"
  ],
  "maxTranscriptsPerCompany": 2,
  "maxItems": 4,
  "includeFullText": true,
  "splitBySpeaker": true,
  "extractMetrics": true,
  "extractForwardLooking": true
}
```

To use only supplied URLs, set tickers to an empty list and add public Motley Fool URLs to startUrls. Otherwise the default AAPL lookup also runs.

### What you receive

This genuine Apple row came from a verified run. The fullText below is a 12-word excerpt for readability; the dataset retains the complete call. Speaker sections, metric sentences and outlook sentences are omitted from this short example.

```json
{
  "recordType": "transcript",
  "ticker": "AAPL",
  "companyName": "Apple",
  "quarter": "Q3",
  "fiscalYear": 2026,
  "callDate": "2026-07-30T21:00:00.000Z",
  "callDateText": "Thursday, July 30, 2026 at 5:00 p.m. ET",
  "publishedAt": "2026-08-08T01:10:18.000Z",
  "author": "Motley Fool Transcribing",
  "title": "Apple (AAPL) Q3 2026 Earnings Call Transcript",
  "url": "https://www.fool.com/earnings/call-transcripts/2026/08/07/apple-aapl-q3-2026-earnings-call-transcript/",
  "transcript": {
    "fullText": "Suhasini Chandramouli: Good afternoon, welcome to the Apple Q3 fiscal year 2026",
    "wordCount": 8293
  },
  "participants": [
    {
      "name": "Suhasini Chandramouli",
      "title": "Director of Investor Relations"
    },
    {
      "name": "Tim Cook",
      "title": "Chief Executive Officer"
    },
    {
      "name": "Kevan Parekh",
      "title": "Chief Financial Officer"
    },
    {
      "name": "John Ternus",
      "title": "Incoming Chief Executive Officer"
    }
  ],
  "source": "motley_fool",
  "sourceUrl": "https://www.fool.com/quote/nasdaq/aapl/",
  "scrapedAt": "2026-10-06T11:55:29.084Z"
}
```

| Field | Meaning |
|---|---|
| ticker, companyName, cik | Source company identity; caller-provided names or CIK numbers can be fallback annotations. |
| quarter, fiscalYear | Reporting period stated in the transcript title. |
| callDate, callDateText | Actual call date, distinct from when the article was published. |
| publishedAt, author | Publisher timestamp and credited author. |
| transcript.fullText, wordCount | Complete published conference call and word count. |
| transcript.sections | Prepared remarks and questionsAndAnswers, separated by published section headings or an explicit moderator questions transition. |
| participants | Published participant names/titles, plus named speakers; missing roles are omitted. |
| metrics | Full sentences matching revenue, EPS, margin or guidance terms, derived from the call. |
| forwardLookingStatements | Full sentences matching expectation/outlook language, derived from the call. |
| title, url, sourceUrl, scrapedAt | Transcript identity, discovery page and collection timestamp. |

### Coverage and controls

The Actor reads HTTPS Motley Fool quote, transcript and article pages through direct public HTTP. It supports the transcript links exposed by the supplied public pages; it does not promise a complete archive. Date filters use the actual call date. Records without a known call date are excluded when a date filter is set.

The original per-company and global limits remain upper bounds. Turn off full text, speaker splitting, metric extraction or outlook extraction independently. Timeout, delay, response-size and bounded retry controls are available. Compatibility aliases include start_urls, urls, maxTranscripts, limit, timeoutSecs, retries and delayMs. Nondefault conflicting aliases are rejected.

A time is converted to UTC only when the source states a supported timezone. Date-only values remain date-only. If no published questions heading or explicit questions transition is found, speaker turns remain under preparedRemarks rather than guessing a boundary. Metric and outlook fields are matched sentences, not normalized financial facts or investment advice.

Access-denied, login, subscriber and challenge pages are skipped. Rate limits are not retried. If at least one real row was confirmed saved, the run succeeds and the summary reports partial coverage when a source or storage write fails. With no useful saved rows, the run fails. No placeholder rows are emitted. The Output tab links to the dataset and run summary.

### Cost and support

Usage depends on requested pages, transcript sizes and platform limits. Check the displayed Apify run estimate and usage for the current cost. For support, provide the run URL, requested tickers and the source URL in the Issues tab.

Only use sources you are entitled to access, following the publisher terms and applicable requirements.

# Actor input Schema

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

Public-company ticker symbols used to build transcript index URLs.

## `companyNames` (type: `array`):

Optional names used as fallback labels for direct URLs.

## `cikNumbers` (type: `array`):

Optional public CIK identifiers for direct transcript URLs.

## `startUrls` (type: `array`):

Optional public transcript index or detail pages.

## `start_urls` (type: `array`):

Snake-case alias for startUrls; conflicting aliases are rejected at runtime.

## `urls` (type: `array`):

URL alias for startUrls; runtime also accepts string entries.

## `maxTranscriptsPerCompany` (type: `integer`):

Upper bound per ticker or direct URL group.

## `maxTranscripts` (type: `integer`):

Alias for maxTranscriptsPerCompany.

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

Global upper bound for the run.

## `limit` (type: `integer`):

Alias for maxItems.

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

Optional inclusive ISO date lower bound.

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

Optional inclusive ISO date upper bound.

## `includeFullText` (type: `boolean`):

Include visible transcript text when true.

## `splitBySpeaker` (type: `boolean`):

Extract simple speaker segments from labeled transcript paragraphs.

## `extractMetrics` (type: `boolean`):

Extract visible revenue, EPS, margin, and guidance snippets.

## `extractForwardLooking` (type: `boolean`):

Collect visible statements containing guidance or expectation language.

## `timeoutMs` (type: `integer`):

Maximum wait for each public request.

## `timeoutSecs` (type: `integer`):

Alias for timeoutMs expressed in seconds.

## `maxRetries` (type: `integer`):

Retries for transient requests.

## `retries` (type: `integer`):

Alias for maxRetries.

## `requestDelayMs` (type: `integer`):

Delay before each request.

## `delayMs` (type: `integer`):

Alias for requestDelayMs.

## `maxResponseBytes` (type: `integer`):

Maximum response size retained in memory.

## `userAgent` (type: `string`):

Optional transparent HTTP user-agent string.

## Actor input object example

```json
{
  "tickers": [
    "AAPL"
  ],
  "companyNames": [],
  "cikNumbers": [],
  "startUrls": [],
  "maxTranscriptsPerCompany": 1,
  "maxItems": 20,
  "includeFullText": true,
  "splitBySpeaker": true,
  "extractMetrics": true,
  "extractForwardLooking": true,
  "timeoutMs": 30000,
  "maxRetries": 1,
  "requestDelayMs": 0,
  "maxResponseBytes": 5000000
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("codingfrontend/earnings-call-scraper").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("codingfrontend/earnings-call-scraper").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 '{}' |
apify call codingfrontend/earnings-call-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,codingfrontend/earnings-call-scraper"
        }
    }
}
```

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/yd8TkJOjXOD3jMMS4/builds/8zioARI2pcXOe1Eoo/openapi.json
