# CNBC All-in-One API (`romy/cnbc-all-in-one-api`) Actor

Unofficial always-on REST API for live CNBC data: news feed, trending, breaking news, special reports, article body text, video with direct stream URL, TV schedule, market ticker banner, and real-time stock/bond/crypto quotes with symbol search. No account needed.

- **URL**: https://apify.com/romy/cnbc-all-in-one-api.md
- **Developed by:** [Romy](https://apify.com/romy) (community)
- **Categories:** News
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event + usage

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

### What does CNBC All-in-One API do?

**CNBC All-in-One API** is a REST endpoint for CNBC's live data — news feed, trending news & videos, breaking news, special reports, most-popular articles, article detail, video with a direct playable stream URL, today's live TV schedule, and a market index ticker banner — plus real-time quotes for stocks, indexes, bonds, crypto, and commodities with symbol search, per-symbol news, and fundamentals. All from a single always-on API powered by [Apify Standby](https://docs.apify.com/platform/actors/development/programming-interface/standby).

It talks directly to the same internal API the official [CNBC](https://www.cnbc.com/) Android app uses (`webql.cnbcfm.com`, `quote.cnbc.com`, `marketdata.cnbc.com`), reverse-engineered by live MITM capture against a real device — every endpoint below is a real persisted GraphQL query or REST call the app itself sends (captured live, never guessed). No CNBC account, no API key, no scraping setup — call the endpoint, get JSON back. Every endpoint works fully anonymously (confirmed by inspecting real request headers — no Authorization header, no cookie, no session token needed).

### Why use CNBC All-in-One API?

- **Full article body text, no account needed** — `/article` returns real structured body content (paragraphs, links) for the large majority of CNBC's articles anonymously; only `premium: true` (Investing Club/Pro) pieces are gated
- **Real-time quotes for anything CNBC covers** — stocks, indexes, bonds, crypto, commodities, futures, forex — one endpoint, no auth
- **Video with a direct stream URL** — `/video` returns a `playbackURL` you can hand straight to any HLS player, no scraping the video player page
- **Live TV schedule** — what's on CNBC right now and what's coming up next
- **Market ticker banner** — the DJIA/S\&P 500/NASDAQ-style summary the app itself shows on its home screen
- **Symbol search → fundamentals pipeline** — search a company name, get its internal id, pull 52-week/5-year/10-year highs and lows and period returns
- **Always-on** — Standby mode means no cold start, responds in milliseconds
- **No account needed** — every endpoint works fully anonymously
- **Use cases:** financial dashboards, market monitoring bots, news aggregation, quote widgets, video/media pipelines

### Endpoints

| Method | Path               | Description                                                          |
| ------ | ------------------ | -------------------------------------------------------------------- |
| `GET`  | `/news`            | Content feed for one or more section ids                             |
| `GET`  | `/trending`        | Trending news articles or trending videos                            |
| `GET`  | `/breaking-news`   | Current breaking news alert / watch-live banner                      |
| `GET`  | `/special-reports` | Special reports feed                                                 |
| `GET`  | `/most-popular`    | "Most popular" articles rail, scoped to an article                   |
| `GET`  | `/article`         | Article detail, full body text included for non-premium articles     |
| `GET`  | `/video`           | Video detail with a direct playable stream URL                       |
| `GET`  | `/tv-schedule`     | Today's live TV schedule                                             |
| `GET`  | `/markets`         | Market index ticker banner (DJIA/S\&P 500/NASDAQ)                     |
| `GET`  | `/quote`           | Real-time quote for any symbol (stocks, indexes, bonds, crypto, ...) |
| `GET`  | `/quote-search`    | Search for a symbol by company name or ticker                        |
| `GET`  | `/quote-news`      | News related to a specific symbol                                    |
| `GET`  | `/fundamentals`    | 52-week/5-year/10-year highs and lows, period returns                |

### How to use CNBC All-in-One API

1. Open this Actor's Standby API URL (shown on the Actor's page, under the API tab) — `https://romy--cnbc-all-in-one-api.apify.actor`.
2. Call any endpoint — for example:
   ```bash
   curl "https://romy--cnbc-all-in-one-api.apify.actor/news?ids=105230142&count=10"
   curl "https://romy--cnbc-all-in-one-api.apify.actor/trending?type=news"
   curl "https://romy--cnbc-all-in-one-api.apify.actor/quote?symbols=AAPL,.DJI,US10Y"
   curl "https://romy--cnbc-all-in-one-api.apify.actor/quote-search?symbol=TESLA"
   curl "https://romy--cnbc-all-in-one-api.apify.actor/video?vcp_id=7000422401"
   curl "https://romy--cnbc-all-in-one-api.apify.actor/tv-schedule"
   curl "https://romy--cnbc-all-in-one-api.apify.actor/markets"
   ```
   Every call needs your Apify API token, either as `Authorization: Bearer <token>` or `?token=<token>` — the Actor's page API tab has a ready-to-copy version with your token filled in.
3. Read the JSON response — no setup required.

### Parameters

**`GET /news`** — `ids` required.

| Param   | Type            | Example     | Meaning                                                                                           |
| ------- | --------------- | ----------- | ------------------------------------------------------------------------------------------------- |
| `ids`   | int\[], repeat   | `105230142` | One or more section ids (repeat `ids=` for multiple). `105230142` is the app's default Home feed. |
| `count` | int, default 30 | `30`        | Assets per section                                                                                |

**`GET /trending`** — `type` required.

| Param          | Type                              | Example           | Meaning                                                                            |
| -------------- | --------------------------------- | ----------------- | ---------------------------------------------------------------------------------- |
| `type`         | enum                              | `news`            | `news` | `videos`                                                                 |
| `count`        | int, default 13                   | `13`              | Items to return — `type=news` only                                                 |
| `start_period` | string, default `2h`              | `2h`              | Trending time window — `type=videos` only. App's own default, not a confirmed enum |
| `sort_by`      | string, default `engaged_minutes` | `engaged_minutes` | Ranking metric — `type=videos` only. Same caveat as `start_period`                 |

**`GET /breaking-news`**

| Param     | Type, default | Example | Meaning                                     |
| --------- | ------------- | ------- | ------------------------------------------- |
| `product` | string, `web` | `web`   | Product surface — only `web` confirmed live |

**`GET /special-reports`**

| Param       | Type, default | Example | Meaning           |
| ----------- | ------------- | ------- | ----------------- |
| `page_size` | int, `30`     | `30`    | Reports to return |

**`GET /most-popular`** — `id` required.

| Param | Type | Example     | Meaning                                        |
| ----- | ---- | ----------- | ---------------------------------------------- |
| `id`  | int  | `108352201` | Article id to scope the "most popular" rail to |

**`GET /article`** — `id` required.

| Param | Type | Example     | Meaning                                                                           |
| ----- | ---- | ----------- | --------------------------------------------------------------------------------- |
| `id`  | int  | `108351154` | Article id. Full body text unless the article is `premium: true` (see Data notes) |

**`GET /video`** — `vcp_id` required.

| Param    | Type | Example      | Meaning                   |
| -------- | ---- | ------------ | ------------------------- |
| `vcp_id` | int  | `7000422401` | The video's numeric vcpID |

**`GET /tv-schedule`** — no parameters.

**`GET /markets`**

| Param            | Type, default    | Example     | Meaning                                                      |
| ---------------- | ---------------- | ----------- | ------------------------------------------------------------ |
| `id`             | int, `100769431` | `100769431` | Banner preset — default is the app's "US" home-screen banner |
| `security_count` | int, `3`         | `3`         | Securities to include                                        |

**`GET /quote`** — `symbols` required.

| Param     | Type   | Example                   | Meaning                                                                                                                                                               |
| --------- | ------ | ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `symbols` | string | `AAPL,.DJI,US10Y,BTC.CM=` | Comma-separated symbols. Real formats: plain ticker (`AAPL`), index with leading dot (`.DJI`), bond (`US10Y`), crypto suffixed `.CM=`, futures prefixed `@` (`@CL.1`) |

**`GET /quote-search`** — `symbol` required.

| Param    | Type   | Example | Meaning                        |
| -------- | ------ | ------- | ------------------------------ |
| `symbol` | string | `TESLA` | Company name or partial ticker |

**`GET /quote-news`** — `symbol` required.

| Param     | Type   | Example     | Meaning                                                                          |
| --------- | ------ | ----------- | -------------------------------------------------------------------------------- |
| `symbol`  | string | `.DJI`      | Symbol to fetch news for                                                         |
| `section` | string | `106983828` | Optional section id — confirmed real param, exact effect not fully characterized |

**`GET /fundamentals`** — `wsod_issue` required.

| Param        | Type, default     | Example   | Meaning                                                                                         |
| ------------ | ----------------- | --------- | ----------------------------------------------------------------------------------------------- |
| `wsod_issue` | string            | `599362`  | CNBC's internal security id (NOT the ticker) — get it from `/quote-search`/`/quote`'s `issueId` |
| `section`    | string, `returns` | `returns` | Only `returns` confirmed live; other values may exist but aren't validated                      |

### Output

Every response is returned directly over HTTP — this Actor does not write to an Apify dataset. Responses pass through CNBC's own real (deeply nested) GraphQL/REST data. Real responses (trimmed to the most relevant fields for readability):

`GET /quote?symbols=AAPL`:

```json
{
    "success": true,
    "quote": {
        "FormattedQuoteResult": {
            "FormattedQuote": [
                {
                    "symbol": "AAPL",
                    "name": "Apple Inc.",
                    "last": "313.36",
                    "changetype": "DOWN",
                    "change": "-3.47",
                    "change_pct": "-1.10%",
                    "exchange": "NASDAQ"
                }
            ]
        }
    }
}
```

`GET /article?id=108351154` (a regular, `premium: false` article — full body text, no auth):

```json
{
    "success": true,
    "article": {
        "id": 108351154,
        "premium": false,
        "body": {
            "isAuthenticated": false,
            "content": [
                {
                    "tagName": "div",
                    "children": [
                        {
                            "tagName": "p",
                            "children": [
                                "Americans love ",
                                {
                                    "tagName": "a",
                                    "attributes": { "href": "https://www.cnbc.com/sport/" },
                                    "children": ["sports"]
                                },
                                " — so much so that many are spending hundreds or thousands of dollars a year to show their fandom."
                            ]
                        }
                    ]
                }
            ]
        }
    }
}
```

`GET /video?vcp_id=7000422401`:

```json
{
    "success": true,
    "video": {
        "headline": "Watch CNBC's full interview with Treasury Secretary Scott Bessent",
        "duration": 1148,
        "playbackURL": "//cnbcawsmpvod.akamaized.net/out/v1/6629fb.../master.m3u8",
        "section": { "shortestHeadline": "Squawk on the Street" }
    }
}
```

`GET /tv-schedule`:

```json
{
    "success": true,
    "schedule": {
        "currDate": "2026-08-20",
        "live": { "shortTitle": "Closing Bell", "startTimeFormatted": "03:00 pm", "endTimeFormatted": "04:00 pm" }
    }
}
```

`GET /fundamentals?wsod_issue=599362`:

```json
{
    "success": true,
    "fundamentals": {
        "599362": {
            "Ranges": [{ "Name": "52-Wk Hi/Lo", "HighValue": "53289.30", "LowValue": "43340.68" }],
            "Values": [{ "Name": "FiveDayReturn", "Value": "0.23%" }]
        }
    }
}
```

### Data notes

- **Two separate GraphQL backends are involved**: `webql.cnbcfm.com` (the native app's own backend, powers `/news`, `/trending`, `/breaking-news`, `/special-reports`, `/video`, `/tv-schedule`, `/markets`, `/quote-search`, `/quote-news`) and `webql-redesign.cnbcfm.com` (the website's backend, powers `/article` and `/most-popular` — reachable from inside the app's in-app article browser). Both use Apollo-style persisted queries (fixed sha256 hashes) with no auth.
- **`/article` returns full body text for regular articles, no auth needed.** Only `premium: true` articles (Investing Club / CNBC Pro pieces) come back with an empty `body.content` array when unauthenticated — that paywall is server-enforced, not a client-side UI restriction. Confirmed live across an 11-article sample: 9 of 11 (`premium: false`) returned full structured body text; the 2 `premium: true` ones were empty. Check the response's `premium` field to know which case you got.
- **`/quote`'s symbol formats are real, not guessed**: confirmed live across stocks (`AAPL`), indexes with a leading dot (`.DJI`, `.SPX`), bonds (`US10Y`, `US30Y`), crypto suffixed `.CM=` (`BTC.CM=`), and futures/commodities prefixed `@` (`@CL.1` for crude oil) — the same endpoint handles all of them.
- **`/video`'s `playbackURL`** is a direct Akamai HLS master playlist, confirmed playable with no signature or expiring token in the URL.
- **`/trending`'s `start_period`/`sort_by`** (videos only) are the app's own fixed defaults — no in-app control to change them was found, so only one real value is confirmed for each; they're passed through as-is rather than validated against a guessed enum.
- **The app has no separate article/content search** — its single search icon (present on every News tab, including Home) always opens the same stock/symbol search (`quoteSearch`), confirmed live. `/quote-search` covers 100% of the app's search feature; there's no `/search` endpoint here because there's nothing further to wrap.
- **No pagination exists for `/news`, `/trending`, or `/special-reports`.** Confirmed by scrolling all the way to the bottom of the app's Home feed, Trending Now, and Special Reports screens repeatedly — `sections`/`trendingNews`/`specialReports` are always called with the exact same `count`/`pageSize`, never an offset or cursor. These are fixed-size bounded lists in the app itself, not infinite-scroll feeds — `count`/`page_size` on those endpoints is the only real control, not a partial implementation.
- **The CNBC app's production build ignores Android's system-wide HTTP proxy setting** and only trusts the OS + user certificate store — unlike some apps in this series, capturing its traffic needed extra work beyond the usual TLS-validation bypass used elsewhere across this developer's actors.

### Pricing

Pay-per-event, billed on each successful call. See the Actor's Pricing tab for current rates.

### Known limitations

- **`/article` only withholds body text for `premium: true` articles** (Investing Club / CNBC Pro) — that paywall is enforced server-side even for anonymous requests, and this Actor does not support logging into a CNBC account to get around it. Regular articles are unaffected — full body text either way.
- **`/fundamentals`'s upstream (`marketdata.cnbc.com`) showed intermittent `503`s during development**, unrelated to request format — a `502` from this endpoint may just reflect a transient issue on CNBC's side, worth retrying.
- **`/fundamentals`'s `section` parameter** is only confirmed with the value `returns`; other section values common on similar financial APIs (profile, estimates, financials) may be real but weren't captured live, so aren't documented as guaranteed to work.
- This is an unofficial, reverse-engineered integration, not affiliated with or endorsed by CNBC or NBCUniversal. Behavior may change if CNBC changes its API.

Found a bug or have a feature request? Use the Issues tab on this Actor's page.

# Actor input Schema

## Actor input object example

```json
{}
```

# Actor output Schema

## `api` (type: `string`):

This Actor doesn't write to a dataset — every response is returned directly over HTTP by its Standby web server. See the README / web server OpenAPI schema (webServerSchema) for the full endpoint list and response shapes (GET /news).

# 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("romy/cnbc-all-in-one-api").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("romy/cnbc-all-in-one-api").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 romy/cnbc-all-in-one-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,romy/cnbc-all-in-one-api"
        }
    }
}

```

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/F4oru2WD2E7hjyCye/builds/PJth8hweKEfTO8H9N/openapi.json
