# CNBC Scraper (`publicmoney/cnbc-scraper`) Actor

Extract CNBC quotes and newsroom feeds: price, change, open, both ranges, volume, market cap, PE, EPS, dividend yield, beta and the extended-hours price, plus top news, earnings and economy. Export data, run via API, schedule and monitor runs, or integrate with other tools.

- **URL**: https://apify.com/publicmoney/cnbc-scraper.md
- **Developed by:** [Public Money](https://apify.com/publicmoney) (Apify)
- **Categories:** Business
- **Stats:** 4 total users, 3 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.00 / 1,000 records

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

CNBC is one of the few places that publishes a full quote and a newsroom feed for the same market, and neither has an API. This Actor does both: quote mode returns one structured record per symbol with the price block, both ranges, market cap, PE, EPS, dividend yield, beta and the extended-hours price, and news mode returns CNBC's top news, finance, earnings and economy feeds as structured records.

### What it does

- Returns **one record per requested symbol** in quote mode, in order. A symbol CNBC does not carry comes back with `status: "failed"` and a reason.
- Carries the **extended-hours price** next to the regular-session close, so a pre-market or after-hours move is visible.
- Reads **four newsroom feeds** in news mode: top news, finance, earnings and economy. Pick any combination.
- Gives you **quotes and financial news from one source**, so a headline and the price it moved can be joined on the same run.
- Reports **beta and dividend yield** alongside PE and EPS, which many quote sources leave out.
- Stamps every record with `validFrom`, CNBC's own market time for that quote.

### Use cases

| You need to | How this Actor does it |
| --- | --- |
| Join a headline to a price move | Run quote mode and news mode on the same schedule and match on the symbol |
| Watch the pre-market | Read the extended-hours price before the open |
| Track the earnings feed | Set the news feeds to `earnings` and schedule the run |
| Follow macro coverage | Set the news feeds to `economy` |
| Feed a finance agent | Call the Actor over MCP and let the model ask for the symbol it needs |
| Screen on more than PE | Read `beta` and `dividendYieldPercent` in the same record |

### Quick start

1. Click **Try for free**.
2. For quotes, add your symbols one per line: `AAPL`, `MSFT`, `NVDA`, and leave **Mode** on `quote`.
3. For news, switch **Mode** to `news` and pick the **Feeds** you want: `topNews`, `finance`, `earnings`, `economy`.
4. Set **Articles per feed** to control how many stories each feed returns.
5. Click **Start**. Rows appear within seconds.
6. Export as JSON, CSV, Excel or XML, or read the dataset over the API.

### Input

| Field | Type | Default | What it controls |
| --- | --- | --- | --- |
| `symbols` | array | `AAPL` | Symbols to read in quote mode |
| `mode` | string | `quote` | `quote` returns a record per symbol, `news` a record per story |
| `feeds` | array | all four | Which CNBC newsroom feeds to read in news mode |
| `articlesPerFeed` | integer | `50` | Stories per feed in news mode |
| `maxItems` | integer | `0` | Caps how many records are written. `0` writes them all |

```json
{
    "symbols": [
        "AAPL",
        "MSFT",
        "NVDA"
    ],
    "mode": "quote",
    "maxItems": 0
}
```

### Output

One dataset item per symbol in quote mode, one per story in news mode. Fields CNBC does not publish for an instrument are dropped rather than returned as `null`.

| Field group | Fields |
| --- | --- |
| Identity | `status`, `tickerSymbol`, `name`, `exchange`, `currency`, `url` |
| Price | `value`, `change`, `changePercent`, `open`, `previousClose` |
| Extended hours | `extendedHoursPrice`, `extendedHoursChange`, `extendedHoursChangePercent` |
| Ranges and volume | `dayLow`, `dayHigh`, `fiftyTwoWeekLow`, `fiftyTwoWeekHigh`, `volume` |
| Fundamentals | `marketCap`, `peRatio`, `eps`, `beta`, `dividendYieldPercent` |
| News mode | `headline`, `publisher`, `datePublished`, `feed`, `url` |
| Timing | `validFrom`, `scrapedAt` |

```json
{
    "status": "ok",
    "tickerSymbol": "AAPL",
    "name": "Apple Inc",
    "exchange": "NASDAQ",
    "currency": "USD",
    "value": 319.97,
    "change": -8.24,
    "changePercent": -2.51,
    "open": 327.1,
    "previousClose": 328.21,
    "extendedHoursPrice": 320.44,
    "dayLow": 317.86,
    "dayHigh": 328.93,
    "fiftyTwoWeekHigh": 344.57,
    "volume": 38272821,
    "marketCap": 4670000000000,
    "peRatio": 36.65,
    "eps": 8.73,
    "beta": 1.09,
    "dividendYieldPercent": 0.33,
    "validFrom": "2026-09-04T20:00:01.000Z",
    "url": "https://www.cnbc.com/quotes/AAPL"
}
```

#### What does news mode return?

`mode: "news"` reads CNBC's newsroom feeds rather than a per-symbol page, so it returns the market-wide story flow: `headline`, `publisher`, `datePublished`, `url` and the `feed` each story came from. Pick any combination of `topNews`, `finance`, `earnings` and `economy`, and set **Articles per feed** for the depth. News is charged as news items rather than as quotes.

### Integrations

Run it over the API and get the rows back in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/publicmoney~cnbc-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"symbols": ["AAPL", "MSFT", "NVDA"], "mode": "quote", "maxItems": 0}'
```

From Python:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("publicmoney/cnbc-scraper").call(run_input={"symbols": ["AAPL", "MSFT", "NVDA"], "mode": "quote", "maxItems": 0})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["tickerSymbol"], item["name"], item["value"])
```

Give an AI agent the Actor over MCP:

```json
{
    "mcpServers": {
        "apify": {
            "url": "https://mcp.apify.com/?actors=publicmoney/cnbc-scraper"
        }
    }
}
```

Schedules run it on any cron, webhooks fire when a run finishes, and platform integrations push the
dataset to Google Sheets, Slack, Airtable, Zapier or your own endpoint.

### Cost

Pay per event, so you pay for records rather than compute time.

| Event | Free tier | Top volume tier |
| --- | --- | --- |
| Record with data | $0.002 | $0.0007 |
| News article | $0.001 | $0.00035 |
| Actor start | $0.00005 per GB | Same |

A record that returned no data is published as a failure row and is **never charged**. Six volume tiers apply, so the per-record price falls with monthly volume.

### Troubleshooting

| Issue | Solution |
| --- | --- |
| A symbol returns `failed` | CNBC does not carry a quote page for it. Non-US listings and thinly traded tickers are the usual cases. |
| News mode ignores my symbols | By design. CNBC's news is organised into newsroom feeds rather than per symbol, so news mode reads the feeds you picked. Use the Yahoo, Nasdaq or Finviz Actor for per-symbol news. |
| `extendedHoursPrice` is missing | The regular session is open, so there is no extended-hours print to report. |
| `beta` is missing | CNBC publishes beta only for instruments with enough history. Recent listings carry none. |
| I want both quotes and news in one run | Run the Actor twice on the same schedule, once per mode, and join on the symbol. One run is one mode. |

### FAQ

#### Does CNBC have an API?

No. CNBC publishes no documented public API for this data. The endpoints that libraries reach for are internal and unsupported, and they change without notice. This Actor reads the public quote and newsroom pages, which is why it keeps working.

#### Can I get financial news with a symbol attached?

CNBC organises news by newsroom feed rather than by symbol, so news mode returns the feed and not a ticker. For per-symbol news use the Yahoo Finance, Nasdaq or Finviz Actor in this fleet.

#### What are the four feeds?

`topNews` is the front page, `finance` is markets coverage, `earnings` follows company results and `economy` covers macro. Pick any combination.

#### Does it return historical prices?

No. Each record is the current snapshot as the source publishes it. To build a series, schedule the Actor and let the dataset accumulate a row per input per run. Each row carries `validFrom`, so the series is correctly timestamped.

#### Can I read quotes and news in the same run?

No, one run is one mode. Schedule two runs on the same cron and join the datasets on the symbol if you need both.

#### Do I need a CNBC API key?

No. You need an Apify token to call the Actor over the API. No CNBC credential is involved anywhere.

#### Can I get this data in Python?

Yes, with the `apify-client` package as shown above. It returns parsed JSON, so there is no HTML or response handling on your side.

#### Can I get the data into Excel or Google Sheets?

Yes. Export the dataset as XLSX or CSV, or connect the Google Sheets integration so each run appends to a sheet.

#### Can an AI agent call this Actor?

Yes. Add it to an MCP client with the config above and the model can request what it needs on its own. Every record is flat JSON with named fields, so no post-processing is needed.

#### Is it legal to scrape CNBC?

This Actor reads public CNBC data that needs no login and collects no personal data. Scraping public data is generally lawful, and how you store, redistribute or act on market data is governed by your own agreements and local rules. Take your own legal advice for your use case.

### Changelog

- **0.0.2** Added news mode across the four newsroom feeds and extended-hours pricing.
- **0.0.1** First release. Quote mode for any symbol CNBC carries.

### Feedback

Found a field CNBC publishes that this Actor misses, or an input it rejects? Open an issue on the Issues tab with the input and what you expected. A daily test runs every Actor in the fleet against live sources, so parser fixes ship fast.

# Actor input Schema

## `symbols` (type: `array`):

Symbols to read in quote mode, one per line. CNBC carries quote pages for US-listed symbols; thinly traded and non-US listings may not resolve. Ignored in news mode, because CNBC organises news by newsroom feed rather than by symbol. Examples: 'AAPL', 'MSFT', 'NVDA'. Default is 'AAPL'.

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

What each record represents. Quote returns one record per symbol with the price block, both ranges, market cap, PE, EPS, beta and the extended-hours price. News returns one record per story from the newsroom feeds you picked. Examples: 'quote', 'news'. Default is 'quote'.

## `feeds` (type: `array`):

Which CNBC newsroom feeds to read in news mode. Top news is the front page, finance is markets coverage, earnings follows company results and economy covers macro. Ignored in quote mode. Examples: 'topNews', 'finance', 'earnings', 'economy'. Default is 'topNews', 'finance', 'earnings', 'economy'.

## `articlesPerFeed` (type: `integer`):

How many stories to return per feed, newest first. The feed carries a rolling window, so a value above what it holds returns everything available. Examples: 10, 50, 100. Default is 50.

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

Maximum number of symbols to read, counted from the top of the list. Use it to cap spend on a long list without editing the list itself. Examples: 10, 50, 200. Default is 0, which reads every symbol given.

## Actor input object example

```json
{
  "symbols": [
    "AAPL",
    "MSFT"
  ],
  "mode": "quote",
  "feeds": [
    "topNews",
    "finance",
    "earnings",
    "economy"
  ],
  "articlesPerFeed": 50,
  "maxItems": 0
}
```

# Actor output Schema

## `results` (type: `string`):

One item per requested input, in the default dataset.

# 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 = {
    "symbols": [
        "AAPL",
        "MSFT"
    ],
    "mode": "quote",
    "feeds": [
        "topNews",
        "finance",
        "earnings",
        "economy"
    ],
    "articlesPerFeed": 50,
    "maxItems": 0
};

// Run the Actor and wait for it to finish
const run = await client.actor("publicmoney/cnbc-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 = {
    "symbols": [
        "AAPL",
        "MSFT",
    ],
    "mode": "quote",
    "feeds": [
        "topNews",
        "finance",
        "earnings",
        "economy",
    ],
    "articlesPerFeed": 50,
    "maxItems": 0,
}

# Run the Actor and wait for it to finish
run = client.actor("publicmoney/cnbc-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 '{
  "symbols": [
    "AAPL",
    "MSFT"
  ],
  "mode": "quote",
  "feeds": [
    "topNews",
    "finance",
    "earnings",
    "economy"
  ],
  "articlesPerFeed": 50,
  "maxItems": 0
}' |
apify call publicmoney/cnbc-scraper --silent --output-dataset

```

## MCP server setup

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