# CNN Video Scraper (`hgservices/cnn-video-scraper`) Actor

Scrape CNN video pages for direct downloadable MP4 URLs and metadata (title, thumbnail, duration, publish date).

- **URL**: https://apify.com/hgservices/cnn-video-scraper.md
- **Developed by:** [Harish Garg](https://apify.com/hgservices) (community)
- **Categories:** Videos, News, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## CNN Video Scraper

**Scrape [CNN](https://www.cnn.com/videos) videos to get direct, downloadable MP4 URLs and clean metadata** - title, description, thumbnail, duration, and publish dates. Point it at individual CNN video pages or at a listing/section page and it returns a structured dataset you can export as JSON, CSV, or Excel, or pull via the Apify API.

You get a **direct, progressive MP4 link** for each video - a plain file you can download over standard HTTP. Runs are **fast and inexpensive**, and the Actor is built to keep working reliably as CNN evolves its site, so you don't depend on a generic downloader that breaks with every player update.

### What does CNN Video Scraper do?

- Extracts the **direct MP4 URL** for each CNN video (progressive download, resumable via HTTP range requests).
- Collects **metadata**: title, description, thumbnail image, duration, upload date, and last-modified date.
- Accepts either **direct video URLs** or **listing/section pages** (e.g. `https://www.cnn.com/videos`), discovering the video pages linked from them.
- Runs on the Apify platform with **scheduling, API access, integrations, proxy rotation, and monitoring** built in.

### Why use CNN Video Scraper?

- **Media monitoring & archiving** - capture CNN video coverage of a topic with direct download links.
- **Research & journalism** - build datasets of CNN video metadata for analysis.
- **Content pipelines** - feed video URLs and metadata into your own tooling.
- **Stability** - built to keep working across CNN player and site changes that break generic downloaders.

### How to use CNN Video Scraper

1. Open the Actor in Apify Console.
2. In the **Input** tab, add one or more **Start URLs** - either CNN video pages or a listing page such as `https://www.cnn.com/videos`.
3. Optionally set **Max videos** to cap how many items are scraped.
4. Click **Start**.
5. When the run finishes, open the **Output/Dataset** tab and export as JSON, CSV, HTML, or Excel.

### Input

| Field | Type | Description |
|---|---|---|
| `startUrls` | array | CNN video pages or listing/section pages to scrape. Required. |
| `maxItems` | integer | Maximum number of videos to scrape (`0` = unlimited). Default `50`. |
| `crawlListingPages` | boolean | Follow video links found on listing pages. Default `true`. Turn off to scrape only the exact URLs you provide. |
| `proxyConfiguration` | object | Proxy settings. Apify Proxy is optional but helps with rate limiting on large runs. |

A **start URL** is either a **listing/section page** (scanned for the video links it contains) or an **individual video page** (scraped directly).

#### Example inputs

**Default - scrape the main video feed:**

```json
{
  "startUrls": [{ "url": "https://www.cnn.com/videos" }],
  "maxItems": 25,
  "crawlListingPages": true,
  "proxyConfiguration": { "useApifyProxy": true }
}
````

**Scrape specific topic/section pages:** section landing pages embed video links, so they work like `/videos`. Supported sections include `/business`, `/politics`, `/world`, `/us`, `/health`, `/entertainment`, `/style`, `/travel`, `/sport`, `/science`, `/climate`.

```json
{
  "startUrls": [
    { "url": "https://www.cnn.com/business" },
    { "url": "https://www.cnn.com/politics" },
    { "url": "https://www.cnn.com/world" }
  ],
  "maxItems": 100
}
```

**Scrape specific video pages only:** when you already have exact video URLs, turn off listing discovery so only those pages are scraped.

```json
{
  "startUrls": [
    { "url": "https://www.cnn.com/2026/07/13/us/video/some-clip-digvid" },
    { "url": "https://www.cnn.com/2026/07/12/business/video/another-clip-cnnbusiness" }
  ],
  "crawlListingPages": false
}
```

**Unlimited run over a whole section:**

```json
{
  "startUrls": [{ "url": "https://www.cnn.com/world" }],
  "maxItems": 0,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

### Output

Each dataset item represents one CNN video:

```json
{
  "url": "https://www.cnn.com/2026/07/13/us/video/bison-tosses-man-into-the-air-at-yellowstone-digvid",
  "title": "Bison tosses man into the air at Yellowstone",
  "description": "A bison tossed a man into the air at Yellowstone National Park...",
  "videoUrl": "https://clips-media-aka.warnermediacdn.com/cnn/clips/2026-07/2312189-.../mp4/...-1920x1080_8000k.mp4",
  "thumbnailUrl": "https://media.cnn.com/api/v1/images/stellar/prod/....jpg?c=original",
  "durationIso": "PT00H01M00S",
  "durationSeconds": 60,
  "uploadDate": "2026-07-13T14:29:15.432Z",
  "dateModified": "2026-07-13T14:30:59.991Z",
  "embedUrl": "https://fave.api.cnn.io/v1/fav/?video=...",
  "section": "us",
  "clipId": "2312189"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Data table

| Field | Description |
|---|---|
| `url` | The CNN video page URL. |
| `title` | Video headline. |
| `description` | Short description / synopsis. |
| `videoUrl` | **Direct MP4 download URL** (WarnerMedia CDN). |
| `thumbnailUrl` | Poster / still image URL. |
| `durationIso` | Duration in ISO-8601 (e.g. `PT00H01M00S`). |
| `durationSeconds` | Duration in whole seconds. |
| `uploadDate` | When the video was published. |
| `dateModified` | When the video record was last modified. |
| `embedUrl` | CNN's embeddable player URL. |
| `section` | CNN section the video belongs to (e.g. `us`, `politics`, `world`). |
| `clipId` | CNN's internal numeric clip id. |

### How much does it cost to scrape CNN videos?

The Actor is lightweight, so runs are fast and cheap - typically a fraction of a compute unit for dozens of videos. To control cost on large jobs, set **Max videos** and consider running on a schedule for incremental captures. Apify's free tier is enough to try it and to run small jobs.

### Tips & advanced options

- **Scrape a whole section**: pass a section listing page as a start URL and leave `crawlListingPages` on.
- **Scrape exact videos only**: paste the specific video URLs and set `crawlListingPages` to `false`.
- **Cap cost**: use `maxItems`.
- **Downloading the MP4**: `videoUrl` supports HTTP range requests, so downloads are resumable.

### FAQ, disclaimers & support

**Which CNN videos are supported?** CNN's free digital clips (the video pages that make up most of the `/videos` feed). A listing page may surface only a portion of its videos; for exhaustive coverage, provide specific video or section URLs.

**Are TV-authenticated or cable-login segments supported?** No. Content behind a TV-provider login or DRM protection is not available for direct download and is out of scope.

**Is scraping CNN legal?** This Actor collects publicly available metadata and media URLs that CNN publishes in standard web markup. You are responsible for complying with CNN's Terms of Service and applicable copyright law, and for how you use any downloaded content. Do not redistribute copyrighted video without permission.

**Found a bug or need a custom solution?** Open an issue in the Actor's **Issues** tab.

# Actor input Schema

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

CNN URLs to scrape. These can be individual video pages (e.g. https://www.cnn.com/2026/07/13/us/video/some-clip-digvid) or listing/section pages such as https://www.cnn.com/videos - listing pages are crawled to discover the video pages linked from them.

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

Maximum number of video items to scrape (0 = unlimited). Useful to cap cost when crawling large listing pages.

## `crawlListingPages` (type: `boolean`):

When a start URL is a listing/section page (not a direct /video/ page), follow the video links found on it. Turn off to scrape only the exact URLs you provide.

## `downloadVideos` (type: `boolean`):

Download each MP4 file into the Actor's key-value store and add an Apify-hosted download link (videoFileUrl) to the output. Off by default: the dataset always includes the direct CNN CDN link (videoUrl). Turn on to keep permanent copies on Apify. Note: video files are large (often 60-200 MB each), so this increases storage cost and run time.

## `proxyConfiguration` (type: `object`):

Proxy settings. CNN pages are served without aggressive bot protection, so a proxy is optional, but Apify Proxy can help with rate limiting on large runs.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.cnn.com/videos"
    }
  ],
  "maxItems": 50,
  "crawlListingPages": true,
  "downloadVideos": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.cnn.com/videos"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("hgservices/cnn-video-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 = { "startUrls": [{ "url": "https://www.cnn.com/videos" }] }

# Run the Actor and wait for it to finish
run = client.actor("hgservices/cnn-video-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.cnn.com/videos"
    }
  ]
}' |
apify call hgservices/cnn-video-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=hgservices/cnn-video-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "CNN Video Scraper",
        "description": "Scrape CNN video pages for direct downloadable MP4 URLs and metadata (title, thumbnail, duration, publish date).",
        "version": "0.1",
        "x-build-id": "CbBhZaEIdU5KYeWzN"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/hgservices~cnn-video-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-hgservices-cnn-video-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/hgservices~cnn-video-scraper/runs": {
            "post": {
                "operationId": "runs-sync-hgservices-cnn-video-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/hgservices~cnn-video-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-hgservices-cnn-video-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "CNN URLs to scrape. These can be individual video pages (e.g. https://www.cnn.com/2026/07/13/us/video/some-clip-digvid) or listing/section pages such as https://www.cnn.com/videos - listing pages are crawled to discover the video pages linked from them.",
                        "default": [
                            {
                                "url": "https://www.cnn.com/videos"
                            }
                        ],
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxItems": {
                        "title": "Max videos",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of video items to scrape (0 = unlimited). Useful to cap cost when crawling large listing pages.",
                        "default": 50
                    },
                    "crawlListingPages": {
                        "title": "Discover videos on listing pages",
                        "type": "boolean",
                        "description": "When a start URL is a listing/section page (not a direct /video/ page), follow the video links found on it. Turn off to scrape only the exact URLs you provide.",
                        "default": true
                    },
                    "downloadVideos": {
                        "title": "Download videos to key-value store",
                        "type": "boolean",
                        "description": "Download each MP4 file into the Actor's key-value store and add an Apify-hosted download link (videoFileUrl) to the output. Off by default: the dataset always includes the direct CNN CDN link (videoUrl). Turn on to keep permanent copies on Apify. Note: video files are large (often 60-200 MB each), so this increases storage cost and run time.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. CNN pages are served without aggressive bot protection, so a proxy is optional, but Apify Proxy can help with rate limiting on large runs.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
