# Rumble Scraper (`maximedupre/rumble-scraper`) Actor

Collect public Rumble videos, channel profiles, and playlists from searches or links. Get available comments, captions, subtitle files, and video downloads for research and content review.

- **URL**: https://apify.com/maximedupre/rumble-scraper.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Social media, Videos, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.35 / 1,000 videos

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

### 🎬 Collect Rumble videos, channels, and playlists

Rumble Scraper helps researchers, content teams, and developers collect public Rumble data in a dataset. Search by keyword or submit links to get video details, channel profiles, or playlists. Video rows can include comments, media download links, and existing captions with subtitle files, so you can review content and use the data in your own work.

- Find videos about a topic with **[Rumble video search](https://apify.com/maximedupre/rumble-scraper/examples/rumble-video-search)**.
- Find creators by keyword with **[Rumble channel search](https://apify.com/maximedupre/rumble-scraper/examples/rumble-channel-search)**.
- Check public creator details with a **[Rumble channel profile scraper](https://apify.com/maximedupre/rumble-scraper/examples/rumble-channel-profile-scraper)**.
- Build a video list from a creator page with a **[Rumble channel videos scraper](https://apify.com/maximedupre/rumble-scraper/examples/rumble-channel-videos-scraper)**.
- List a creator's playlists with a **[Rumble channel playlists scraper](https://apify.com/maximedupre/rumble-scraper/examples/rumble-channel-playlists-scraper)**.
- Review **[Rumble trending videos](https://apify.com/maximedupre/rumble-scraper/examples/rumble-trending-videos)** for content research.
- Collect **[Rumble editor picks](https://apify.com/maximedupre/rumble-scraper/examples/rumble-editor-picks)** for a list of selected videos.

#### 📦 Public Rumble data you can collect

Each run returns one type of row: video, channel, or playlist. Video discovery supports keyword searches, video links, channel links, playlist links, trending videos, and editor picks. Channel discovery supports keywords and channel or user links. Playlist discovery supports channel links and playlist links.

Video rows can include titles, descriptions, dates, publishers, tags, categories, counts, comments and replies, reported revenue, media files, and captions. Channel rows can include images, counts, verification state, join date, social links, and public email addresses. Playlist rows include available playlist details and video totals.

Optional details depend on what Rumble provides. Missing details can be absent or empty. A video can be saved even when it has no captions or download links. The Actor reads public content without a customer login. It does not open private or paid-only content, create captions from audio, translate text, or keep a history of changes.

#### 🚀 Start a Rumble collection

1. Choose Videos, Channels, or Playlists.
2. Choose how to find that content.
3. Enter keywords or links if that choice needs them.
4. Set a result limit and, for videos, choose caption languages.
5. Start the Actor and open the dataset. Export it as JSON or CSV, or read it through the Apify API.

Only the fields for the selected choices are used. Other form fields remain visible but are ignored. One run can use several keywords or links with the same settings. Repeated submitted values are processed once. A Rumble object is saved once per run by its ID; later matches do not merge more details into the saved row. Unavailable inputs are left out while other inputs can still be processed.

#### ⚙️ Input

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `maxItems` | integer | Run-wide row limit, not a limit per keyword or link. Omit it or use `0` for no row cap. Must be a whole number of 0 or more. The form prefills `6`; this is not a schema default. |
| `resultType` | string | Required: `videos`, `channels`, or `playlists`. The form prefills `videos`; there is no schema default. |
| `videoSource` | string | Required for Videos: `search`, `video`, `channel`, `playlist`, `trending`, or `editorPicks`. The form prefills `search`; there is no schema default. Other row types ignore it. |
| `searchOrder` | string | Video keyword search order: `relevance`, `views`, `reactions`, or `uploadDate`. Defaults to `relevance`. Ignored for other choices. |
| `videoUrls` | array | Public Rumble video, Short, or embed links for Videos with `videoSource: "video"`. Accepts URL strings or objects with a `url` field. Omission means an empty list. |
| `captionLanguageChoice` | string | For Videos, `all` gets all available caption tracks. `preferred` gets only exact codes in `captionLanguages`. Defaults to `all`. Ignored for other row types. |
| `captionLanguages` | array of strings | Exact caption codes used with `preferred`. Omission means an empty list and no selected tracks. Codes such as `en` and `en-auto` are distinct. Missing codes are not replaced with another language. |
| `channelSource` | string | Required for Channels: `search` or `channel`. No default. Other row types ignore it. |
| `playlistSource` | string | Required for Playlists: `channel` or `playlist`. No default. Other row types ignore it. |
| `keywords` | array of strings | Search phrases for Videos or Channels with `search` selected. Each entry is one phrase. Omission means an empty list. The form prefills `["science"]`; there is no schema default. |
| `channelUrls` | array | Public Rumble `/c/` or `/user/` links for `channel` discovery. Returns videos, profiles, or playlists based on `resultType`. Accepts URL strings or objects with a `url` field. Omission means an empty list. |
| `playlistUrls` | array | Public Rumble `/playlists/` links for `playlist` discovery. Returns videos or playlist details based on `resultType`. Accepts URL strings or objects with a `url` field. Omission means an empty list. |

Except for trending and editor picks, the selected discovery choice needs at least one keyword or link. The result limit does not promise that many matches. Runs can also stop at the charge limit or when the available content ends.

This input comes from the successful default-input run:

```json
{
  "maxItems": 6,
  "resultType": "videos",
  "videoSource": "search",
  "searchOrder": "relevance",
  "captionLanguageChoice": "all",
  "keywords": [
    "science"
  ]
}
```

#### 🧾 Output

**Output fields**

Each table describes one dataset row shape. Nested paths use `[]` for array members. Counts, dates, and other optional details appear only when available. An empty array means no entries were returned for that field.

**Video rows**

| Field | Type | What it does |
| --- | --- | --- |
| `rowType` | string | `video`. |
| `id` | string | Rumble video ID. |
| `url` | string | Public video link. |
| `title` | string | Video title. |
| `description` | string | Public video description. |
| `thumbnailUrl` | string | Thumbnail image link. |
| `durationSeconds` | number | Video length in seconds. |
| `publishedAt` | string | Publication date stated by Rumble. |
| `publisher` | object | Channel or user that published the video. |
| `publisher.id` | string | Publisher ID. |
| `publisher.name` | string | Publisher name. |
| `publisher.url` | string | Publisher profile link. |
| `tags` | array of strings | Video tags. |
| `categories` | array of strings | Video categories. |
| `views` | integer | View total. |
| `upvotes` | integer | Upvote total. |
| `downvotes` | integer | Downvote total. |
| `commentCount` | integer | Full comment total stated by Rumble; it can exceed the returned comments. |
| `videoFormat` | string | Video format stated by Rumble. |
| `liveState` | string | Live-stream state stated by Rumble. |
| `comments` | array of objects | Available public comments. |
| `comments[].id` | string | Comment ID. |
| `comments[].text` | string | Comment text. |
| `comments[].author` | object | Public comment author. |
| `comments[].author.name` | string | Author name. |
| `comments[].author.url` | string | Author profile link. |
| `comments[].publishedAt` | string | Comment publication date. |
| `comments[].replies` | array of objects | Available replies to the comment. |
| `comments[].replies[].id` | string | Reply ID. |
| `comments[].replies[].text` | string | Reply text. |
| `comments[].replies[].author` | object | Public reply author. |
| `comments[].replies[].author.name` | string | Reply author name. |
| `comments[].replies[].author.url` | string | Reply author profile link. |
| `comments[].replies[].publishedAt` | string | Reply publication date. |
| `revenue` | array of objects | Revenue amounts reported by Rumble, when available. |
| `revenue[].value` | number | Reported amount. |
| `revenue[].unit` | string | Reported currency or other unit. |
| `downloads` | array of objects | Available video files. |
| `downloads[].url` | string | Video download link. |
| `downloads[].quality` | string | Media quality. |
| `downloads[].format` | string | Media format. |
| `captionLanguages` | array of strings | All offered caption codes, including tracks not selected for extraction. |
| `captions` | array of objects | Existing caption tracks that were extracted. |
| `captions[].language` | string | Caption code. |
| `captions[].text` | string | Full caption text. |
| `captions[].segments` | array of objects | Caption text with video timing. |
| `captions[].segments[].startSeconds` | number | Segment start in seconds from the video start. |
| `captions[].segments[].endSeconds` | number | Segment end in seconds from the video start. |
| `captions[].segments[].text` | string | Segment text. |
| `captions[].srtUrl` | string | SRT subtitle file link. |
| `captions[].vttUrl` | string | VTT subtitle file link. |

This genuine video row is shortened. The string `"..."` marks omitted text, comments, and timed segments.

```json
{
  "rowType": "video",
  "id": "448572544",
  "url": "https://rumble.com/v7h8tpy-table-of-titans-racket-science.html",
  "title": "Table of Titans: Racket Science",
  "description": "...",
  "thumbnailUrl": "https://hugh.cdn.rumble.cloud/video/fwe2/1a/s8/1/2/v/h/9/2vh9A.qR4e-small-Table-of-Titans-Racket-Scie..jpg",
  "durationSeconds": 11852,
  "publishedAt": "2026-10-22T19:04:30+00:00",
  "publisher": {
    "id": "35333795",
    "name": "Hulkanator",
    "url": "https://rumble.com/user/Hulkanator"
  },
  "tags": [],
  "liveState": "not_live",
  "revenue": [],
  "downloads": [],
  "categories": [
    "News",
    "Politics"
  ],
  "views": 4953,
  "upvotes": 187,
  "downvotes": 1,
  "captionLanguages": [
    "en-auto"
  ],
  "comments": "...",
  "commentCount": 6,
  "captions": [
    {
      "language": "en-auto",
      "text": "...",
      "segments": "...",
      "srtUrl": "https://api.apify.com/v2/key-value-stores/Gjz5cn4lYOXduTJGN/records/caption-448572544-656e2d6175746f.srt?signature=YCy8lnwQyfGmKbM508TK",
      "vttUrl": "https://api.apify.com/v2/key-value-stores/Gjz5cn4lYOXduTJGN/records/caption-448572544-656e2d6175746f.vtt?signature=1v1hPfyvTWB3MvmeAzGQx"
    }
  ]
}
```

**Channel rows**

| Field | Type | What it does |
| --- | --- | --- |
| `rowType` | string | `channel`. |
| `id` | string | Rumble channel or user ID. |
| `url` | string | Public profile link. |
| `title` | string | Profile name. |
| `description` | string | Public profile description. |
| `thumbnailUrl` | string | Profile image link. |
| `bannerUrl` | string | Banner image link. |
| `followers` | integer | Follower total. |
| `subscribers` | integer | Subscriber total. |
| `videoCount` | integer | Full video total stated by Rumble. |
| `views` | integer | Channel view total. |
| `isVerified` | boolean | Whether Rumble marks the profile as verified. |
| `accountType` | string | Account type stated by Rumble. |
| `joinedAt` | string | Profile join date. |
| `socialLinks` | array of strings | Public social links stated in the profile. |
| `emails` | array of strings | Public email addresses stated in the profile. |

This is a complete channel row from a successful run:

```json
{
  "rowType": "channel",
  "id": "53626741",
  "url": "https://rumble.com/user/DIYSassySkinLAB",
  "title": "DIYSassySkinLAB",
  "description": "Hello friends!\nI started my DIY and self-love journey at 53. My outer appearance didn't reflect what I felt inside. I felt so young at heart - still filled with laughter and playfulness. However, the woman in the mirror was no longer recognizable. I didn't see me. I saw a sad and aging woman.\nI started researching and found the beautiful, DiY community.\nIt took a few months of watching many encouraging influencers, listening to knowledgeable doctors, and studying anatomy and aesthetic medicine before I was comfortable enough to begin my own process of aging backwards. I never expected the results I began seeing. More shocking still were the changes I began feeling about myself and life. It was as if my inner glow was shining outwards. I had discovered me again!\nI want each man and woman to feel the empowerment that comes with our ability to make the changes we desire. Thank you all for following my journey and allowing me to follow yours. Much love Stacy Let's AGE Backwards! L.A.B.",
  "thumbnailUrl": "https://hugh.cdn.rumble.cloud/video/z0/1/D/K/m/1DKmd.asF.4-vxenp-r4ut56.jpeg",
  "bannerUrl": "https://hugh.cdn.rumble.cloud/video/z15/1/D/K/m/1DKmd.baa.2.jpeg",
  "followers": 3502,
  "subscribers": 0,
  "videoCount": 439,
  "views": 396444,
  "isVerified": false,
  "accountType": "user",
  "joinedAt": "2021-12-28",
  "socialLinks": [
    "https://facebook.com/share/nTLRQP3qiXr913FZ/"
  ],
  "emails": []
}
```

**Playlist rows**

| Field | Type | What it does |
| --- | --- | --- |
| `rowType` | string | `playlist`. |
| `id` | string | Rumble playlist ID. |
| `url` | string | Public playlist link. |
| `title` | string | Playlist title. |
| `description` | string | Public playlist description. |
| `thumbnailUrl` | string | Playlist image link. |
| `publishedAt` | string | Playlist creation date. |
| `updatedAt` | string | Playlist update date. |
| `publisher` | object | Channel or user that owns the playlist. |
| `publisher.id` | string | Publisher ID. |
| `publisher.name` | string | Publisher name. |
| `publisher.url` | string | Publisher profile link. |
| `videoCount` | integer | Full video total stated by Rumble. |

This is a complete playlist row from a successful run:

```json
{
  "rowType": "playlist",
  "id": "bnbrvSZWYQw",
  "url": "https://rumble.com/playlists/bnbrvSZWYQw",
  "title": "WimpoleFillers Product Demos",
  "description": "",
  "thumbnailUrl": "https://hugh.cdn.rumble.cloud/video/fww1/3a/s8/1/W/H/F/7/WHF7A.oq1b-small-Correcting-My-Cheek-and-Ant..jpg",
  "publishedAt": "2026-08-02T02:49:16+00:00",
  "updatedAt": "2026-10-17T19:01:30+00:00",
  "publisher": {
    "id": "53626741",
    "name": "DIYSassySkinLAB",
    "url": "https://rumble.com/user/DIYSassySkinLAB"
  },
  "videoCount": 6
}
```

#### 💳 Pricing

The configured charge is **$0.00135 per saved video, channel profile, or playlist**, or **$1.35 per 1,000**. Each run returns and charges for its selected row type. Available details, comments, downloads, and captions are part of the video charge; there is no separate event for them.

There is no Actor-owned setup charge or charge for a lookup that saves no row. Duplicate matches skipped within a run do not add a row charge. Apify platform usage costs may also apply. Check the Pricing tab for the current hosted price and set a charge limit before a large run.

#### 🔌 Integrations

Use the Apify API to start runs and read dataset rows from your own code. Use Apify schedules for repeat runs and webhooks to notify your workflow when a run finishes. JSON exports keep nested comments and captions together; CSV can be useful for flat fields such as names, links, and counts.

https://www.youtube.com/watch?v=bNACk1_S_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Why is a caption language missing from the extracted tracks?

With `preferred`, only exact codes in `captionLanguages` are selected. Run with `all` first, then copy codes from the returned `captionLanguages`. For example, `en` does not select `en-auto`. The Actor does not replace missing selections or create captions from audio.

##### Can a video have no captions or download links?

Yes. These depend on what is available for that public video. A valid video row can still contain its title, link, publisher, and other available details. Subtitle files are made from existing captions.

##### How do I get the videos in a playlist?

Choose `resultType: "videos"` and `videoSource: "playlist"`, then supply `playlistUrls`. Choose Playlists instead when you want playlist details rather than its video rows.

##### Can I get all three row types in one run?

No. Each run returns only its selected `resultType`. Start separate runs for videos, channels, and playlists.

##### Will the Actor return every comment and every optional field?

It returns available public details. The comment total can be larger than the comments returned. Missing fields do not prove that a value is zero. The Actor does not guarantee access to every object or complete coverage of optional details.

##### Is this a Rumble API or a transcript generator?

You can call this Actor through the Apify API. It is not an official Rumble API. It reads public Rumble data and existing captions; it does not generate transcripts, summaries, or translations.

### 📝 Changelog

**v0.0** (27-10-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~rumble-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Rumble Video Downloader](https://apify.com/maximedupre/rumble-video-downloader) returns playable media links for known Rumble video, Short, or embed URLs.
- [YouTube Channel Search Scraper](https://apify.com/maximedupre/youtube-channel-search-scraper) finds public YouTube channels by keyword.
- [YouTube Channel Statistics Scraper](https://apify.com/maximedupre/youtube-channel-statistics-scraper) collects channel counts for creator research on YouTube.
- [YouTube Channel Scraper](https://apify.com/maximedupre/youtube-channel-scraper) collects public YouTube channel details for a creator list.
- [YouTube Transcript API](https://apify.com/maximedupre/youtube-transcript-api) extracts existing captions from known YouTube videos.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

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

Stop after this many rows across the run. Leave blank or use 0 to get all available results. This limit applies to Videos, Channels, and Playlists.

## `resultType` (type: `string`):

Choose one row type. Each run returns only that type.

## `videoSource` (type: `string`):

For Videos, choose where to find videos. Only the fields for this choice are used.

## `searchOrder` (type: `string`):

For Videos found by Search keywords, use this Rumble search order.

## `videoUrls` (type: `array`):

For Videos found by Video links, add complete public Rumble video or embed URLs. Each link names a video to read.

## `captionLanguageChoice` (type: `string`):

For Videos, get existing captions in all available languages or only the languages you list. Captions include text, timed segments, and SRT and VTT files when available.

## `captionLanguages` (type: `array`):

For Videos with Preferred languages selected, enter one exact Rumble caption code per entry. To find codes, first run with All available languages. Read the returned captionLanguages values, then copy those exact codes into Preferred caption languages. Keep suffixes such as -auto: en and en-auto are different codes. Available codes vary by video. Only listed languages are collected; unavailable selections are not replaced.

## `channelSource` (type: `string`):

For Channels, choose Search keywords to find channels and users, or Channel links to read their profiles. Other submitted values are ignored.

## `playlistSource` (type: `string`):

For Playlists, choose Channel links to find a channel's playlists, or Playlist links to read playlist details. Other submitted values are ignored.

## `keywords` (type: `array`):

For Videos or Channels found by Search keywords, add one search phrase per entry. Each phrase is a separate search with the same run settings. Keep a phrase together in one entry.

## `channelUrls` (type: `array`):

Add complete public Rumble channel or user URLs. Used by Channel links: Videos returns their videos, Channels returns their profiles, and Playlists returns their playlists.

## `playlistUrls` (type: `array`):

Add complete public Rumble playlist URLs. Used by Playlist links: Videos returns the videos in each playlist, and Playlists returns playlist details.

## Actor input object example

```json
{
  "maxItems": 6,
  "resultType": "videos",
  "videoSource": "search",
  "searchOrder": "relevance",
  "captionLanguageChoice": "all",
  "keywords": [
    "science"
  ]
}
```

# Actor output Schema

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

Open the saved Rumble videos, channels, or playlists. Each run returns the selected result type.

# 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 = {
    "maxItems": 6,
    "resultType": "videos",
    "videoSource": "search",
    "keywords": [
        "science"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/rumble-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 = {
    "maxItems": 6,
    "resultType": "videos",
    "videoSource": "search",
    "keywords": ["science"],
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/rumble-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 '{
  "maxItems": 6,
  "resultType": "videos",
  "videoSource": "search",
  "keywords": [
    "science"
  ]
}' |
apify call maximedupre/rumble-scraper --silent --output-dataset

```

## MCP server setup

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