# Dailymotion Video Downloader (`khadinakbar/dailymotion-video-downloader`) Actor

Download Dailymotion videos to MP4 and extract metadata, stream URLs, subtitles, and thumbnails by video URL, channel, playlist, or search. MCP/API-ready.

- **URL**: https://apify.com/khadinakbar/dailymotion-video-downloader.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Videos, Social media, MCP servers
- **Stats:** 8 total users, 1 monthly users, 80.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 video results

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

### What is Dailymotion Video Downloader?

Dailymotion Video Downloader turns Dailymotion video URLs, a channel, a playlist or a search query into a dataset with one row per video, and can save each video as an MP4 file. Each row returns the title, description, tags, channel owner, duration, engagement counts, publish time, language, thumbnails at every size, the HLS manifest URL, per-quality stream URLs and subtitle tracks with direct `.srt` links. Media archivists, newsrooms, researchers, content teams and AI agents use it to back up videos they are authorized to keep and to feed video metadata and subtitles into downstream workflows, with no login or cookies.

### Why teams use this Dailymotion downloader

- **Four ways in.** Paste video URLs or IDs, a channel handle, a playlist, or a search query, and the Actor resolves them to videos.
- **MP4 files on request.** Turn on `downloadVideo` and each video is remuxed into a single MP4 saved to the run's key-value store, with a public `downloadedMp4Url` on the row.
- **Quality control.** `videoQuality` picks the closest rendition at or below your target, from `highest` to `lowest`.
- **Subtitles for text workflows.** `subtitles` lists each track's language, label and direct `.srt` URL, including auto-generated tracks.
- **Metadata-only mode.** Leave `downloadVideo` off for a lighter run that returns metadata, thumbnails and stream URLs.

### Best fit for this Actor

- Designed for public Dailymotion videos that you own or are authorized to download and archive.
- Use it when you need video metadata, direct stream URLs or subtitle files in bulk from a channel, playlist or search.
- When your links come from Vimeo instead, continue with [Vimeo Video Downloader](https://apify.com/khadinakbar/vimeo-video-downloader) for the same kind of MP4 and metadata output.
- For a mixed list of links from many platforms, then pass them to [Media Downloader - All-in-One Video, Audio and Metadata](https://apify.com/khadinakbar/all-in-one-media-downloader).

### Example workflow: from a news channel to a searchable archive

A newsroom researcher starts with a public news channel they cover. They set `username` to `france24`, `maxResults` to 20 and keep `includeSubtitles` on. The dataset returns each video's `title`, `createdTime`, `durationSeconds`, `tags` and `subtitles`. They download the French subtitle files, feed them into a search index, then run a second pass with `videoUrls` and `downloadVideo` on for the clips they are cleared to keep. A daily schedule with the same channel input adds new uploads to the archive.

### Input

Provide one source. When several are filled, the Actor uses them in this order: `videoUrls`, `searchQuery`, `username`, `playlistUrl`.

| Field | Type | What it controls |
|---|---|---|
| `videoUrls` | array | Video URLs, `dai.ly` short links, embed URLs or bare IDs such as `x9l66l8`. |
| `searchQuery` | string | Free-text Dailymotion search, for example `space launch`. |
| `username` | string | Channel handle, `@handle` or profile URL. |
| `playlistUrl` | string | Playlist URL or bare playlist ID. |
| `maxResults` | integer | Videos to process for channel, playlist or search. Default 25. |
| `downloadVideo` | boolean | Save each video as an MP4 in the key-value store. Default `false`. |
| `videoQuality` | string | `highest`, `1080`, `720`, `480`, `380`, `240` or `lowest`. |
| `maxDownloadDurationSec` | integer | Longer videos keep metadata and skip the MP4 step. Default 1200. |
| `includeSubtitles` | boolean | Include subtitle tracks on each row. Default `true`. |

```json
{
  "videoUrls": ["https://www.dailymotion.com/video/x9l66l8"],
  "downloadVideo": true,
  "videoQuality": "720",
  "includeSubtitles": true
}
```

### Output

One row per video.

| Field | What it contains |
|---|---|
| `id`, `pageUrl`, `embedUrl` | Video ID, watch page and embed player URL |
| `title`, `description`, `tags` | Text metadata |
| `ownerId`, `ownerUsername`, `ownerScreenname`, `ownerUrl` | Channel owner |
| `channel`, `language` | Dailymotion category and language |
| `durationSeconds`, `durationFormatted` | Length |
| `viewsTotal`, `likesTotal`, `commentsTotal` | Engagement counts |
| `createdTime`, `updatedTime` | Publish and update times (ISO 8601) |
| `aspectRatio`, `isExplicit`, `isPrivate`, `isLive` | Format and status flags |
| `thumbnailUrl`, `thumbnails` | Poster image and sizes from 60 to 1080 |
| `hlsManifestUrl` | Master HLS (`.m3u8`) manifest |
| `availableQualities`, `videoStreams` | Renditions with label, width, height, bandwidth, codecs and URL |
| `audioStreams` | Separate audio renditions when a video publishes them |
| `subtitles` | Language, label and direct subtitle URL per track |
| `downloadedMp4Url`, `downloadedQuality`, `fileSizeBytes` | Saved MP4 details when `downloadVideo` is on |
| `_downloadNote` | Short note when a video has metadata and no downloadable stream |
| `scrapedAt` | Collection time |

```json
{
  "id": "xa3xhrg",
  "title": "Ukraine, nucléaire, réarmement : où est passé le pacifisme des Écologistes ?",
  "pageUrl": "https://www.dailymotion.com/video/xa3xhrg",
  "embedUrl": "https://geo.dailymotion.com/player.html?video=xa3xhrg",
  "durationSeconds": 402,
  "durationFormatted": "6:42",
  "channel": "news",
  "ownerId": "x12f2o",
  "ownerUsername": "france24",
  "ownerScreenname": "FRANCE 24",
  "ownerUrl": "https://www.dailymotion.com/france24",
  "viewsTotal": 1308,
  "likesTotal": 0,
  "commentsTotal": 0,
  "createdTime": "2026-04-01T07:02:50.000Z",
  "updatedTime": "2026-04-02T04:37:59.000Z",
  "language": "fr",
  "tags": ["écologistes", "pacifisme", "Ukraine"],
  "aspectRatio": 1.77778,
  "isExplicit": false,
  "isPrivate": false,
  "isLive": false,
  "thumbnailUrl": "https://s1.dmcdn.net/v/aRoCi1gLgaDFoANqf",
  "thumbnails": {
    "240": "https://s2.dmcdn.net/v/aRoCi1gLgaDcmvZd_/x240",
    "720": "https://s2.dmcdn.net/v/aRoCi1gLgaDiH25M7/x720"
  },
  "hlsManifestUrl": "https://cdndirector.dailymotion.com/cdn/manifest/video/xa3xhrg.m3u8?sec=...",
  "availableQualities": ["480", "380"],
  "videoStreams": [
    {
      "label": "480",
      "width": 848,
      "height": 480,
      "bandwidth": 836280,
      "codecs": "mp4a.40.2,avc1.64001f",
      "audioGroup": null,
      "url": "https://vod3.cf.dmcdn.net/sec2(...)/video/fmp4/611263276/h264_aac_hq/2/manifest.m3u8"
    }
  ],
  "audioStreams": [],
  "subtitles": [
    {
      "language": "fr-auto",
      "label": "Français (autogenerated)",
      "url": "https://static2.dmcdn.net/sec2(...)/static/video/672/362/611263276_subtitle_fr-auto.srt"
    }
  ],
  "downloadedMp4Url": "https://api.apify.com/v2/key-value-stores/UyGHoHmkQnBa7WJDs/records/video-xa3xhrg.mp4",
  "downloadedQuality": "480",
  "fileSizeBytes": 41731436,
  "scrapedAt": "2026-10-02T17:10:43.380Z"
}
```

Stream and subtitle URLs are signed and short-lived, so download or process them soon after the run. The MP4 link in `downloadedMp4Url` stays in your key-value store for its retention period.

### Pricing

This Actor uses Pay per event with Apify platform usage included in the event price. You pay one **Video result** event per video row with metadata, streams and subtitles, one **Video downloaded to MP4** event per MP4 file saved, and one **Actor Start** event per run. The live Pricing tab on this page shows the current event prices.

Worked example: a channel run with `maxResults` set to 20 and `downloadVideo` off costs 20 video-result events plus one start event. The same run with `downloadVideo` on adds one download event for each MP4 that is saved.

### API example

```bash
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~dailymotion-video-downloader/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"videoUrls": ["https://www.dailymotion.com/video/x9l66l8"], "downloadVideo": false}'
```

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("khadinakbar/dailymotion-video-downloader").call(run_input={
    "username": "france24",
    "maxResults": 10,
    "downloadVideo": True,
    "videoQuality": "720",
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item.get("downloadedMp4Url"))
```

### Use with AI agents (MCP)

Connect the Actor to Claude, ChatGPT, Cursor or any MCP client through [Apify MCP](https://mcp.apify.com), then ask:

> Get the 10 latest videos from the Dailymotion channel france24 with title, publish time, duration and the French subtitle URL for each.

The agent calls the Actor with `username` and `maxResults`, reads the rows with `get-dataset-items`, and uses `pageUrl` and `scrapedAt` for provenance. Keep `downloadVideo` off when the agent only needs metadata or subtitles; it keeps cost to one result event per video.

### Best results

| Starting situation | Helpful action | Expected outcome |
|---|---|---|
| A handful of known videos | Use `videoUrls` with URLs or bare IDs | Exactly those videos |
| A whole channel or playlist | Use `username` or `playlistUrl` with `maxResults` | Recent uploads up to your cap |
| Text analysis or captions | Keep `includeSubtitles` on and read `subtitles` | Direct subtitle files per language |
| Long programmes | Raise `maxDownloadDurationSec` | MP4 files for longer videos |
| Smaller files | Set `videoQuality` to `480` or `720` | Smaller MP4 files |
| Metadata for a catalog | Leave `downloadVideo` off | Faster, lighter runs |

### Builder's note

I designed this to separate metadata from downloading, because most teams catalog many videos and download only a few, so the MP4 step is opt-in and billed on its own. I learned that Dailymotion serves separate renditions over HLS, so the Actor lists every stream and then remuxes the chosen one into a single MP4 that plays anywhere. The duration cap keeps a long broadcast from dominating a channel run while still returning its metadata.

### FAQ

#### Where is the MP4 file saved?

In the run's default key-value store. The row's `downloadedMp4Url` links to it.

#### Can I get only the subtitles?

Yes. Leave `downloadVideo` off and read the `subtitles` array for direct subtitle URLs.

#### Which videos does it work with?

Public Dailymotion videos. Private, password-locked and protected videos stay outside its scope; when a video has no downloadable stream, its row still returns metadata and a `_downloadNote`.

### Responsible use

Download only content you own or are authorized to save, and follow Dailymotion's terms and applicable copyright law. The Actor reads publicly available data and leaves authentication and content protection untouched. Dailymotion is a trademark of its owner; this independent Actor is not affiliated with or endorsed by Dailymotion. For questions or bugs, open a ticket in the Issues tab.

# Changelog

This Actor's version history is a separate document: https://apify.com/khadinakbar/dailymotion-video-downloader/changelog.md

# Actor input Schema

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

Dailymotion video pages to process. Accepts full URLs (https://www.dailymotion.com/video/x8m1234), short dai.ly links, embed URLs, or bare video IDs (x8m1234). This is the primary input — leave the channel/playlist/search fields empty when using it. NOT a channel or playlist URL; use the dedicated fields for those.

## `searchQuery` (type: `string`):

Free-text Dailymotion search; returns matching videos newest-relevant first (e.g. 'space launch'). Used only when Video URLs is empty. Pair with Max results to bound how many are returned. NOT a URL — for a specific video use Video URLs.

## `username` (type: `string`):

Scrape recent videos from one Dailymotion channel by handle (euronews), @handle, or profile URL (https://www.dailymotion.com/euronews). Used only when Video URLs and Search query are empty. Combine with Max results to limit how many videos are pulled. NOT a video URL.

## `playlistUrl` (type: `string`):

Scrape every video in a Dailymotion playlist by URL (https://www.dailymotion.com/playlist/x5abcd) or bare playlist ID (x5abcd). Used only when the higher-priority inputs are empty. Bounded by Max results. NOT a single-video URL.

## `maxResults` (type: `integer`):

Maximum number of videos to process for channel, playlist, or search inputs (Video URLs is capped by the list you supply). Defaults to 25. Range 1–1000. Higher values increase run time and cost.

## `downloadVideo` (type: `boolean`):

When enabled, the actor downloads each video's HLS stream, remuxes it to a single MP4 with ffmpeg, and saves it to the run's key-value store; the public file URL is added to each record as downloadedMp4Url. When disabled (default), only metadata and direct stream URLs are returned (faster and cheaper). Videos longer than Max download duration are skipped. Adds a per-download charge.

## `videoQuality` (type: `string`):

Target resolution for the MP4 download; the closest available rendition at or below the target is chosen. Only applies when Download MP4 is enabled. 'highest' picks the best available; 'lowest' the smallest. Does not affect the stream URLs returned in metadata (those always list every quality).

## `maxDownloadDurationSec` (type: `integer`):

Videos longer than this are skipped for MP4 download (their metadata and stream URLs are still returned). Protects run time, memory, and cost on full-length content. Defaults to 1200 (20 minutes). Only applies when Download MP4 is enabled.

## `includeSubtitles` (type: `boolean`):

When enabled (default), each record includes available subtitle tracks with language, label, and direct .srt/.vtt URL. Disable to omit the subtitles array from output. Does not download subtitle files, only links them.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.dailymotion.com/video/x9l66l8",
    "https://www.dailymotion.com/video/x9l661a"
  ],
  "searchQuery": "official trailer",
  "username": "euronews",
  "playlistUrl": "x5abcd",
  "maxResults": 25,
  "downloadVideo": false,
  "videoQuality": "highest",
  "maxDownloadDurationSec": 1200,
  "includeSubtitles": true
}
```

# Actor output Schema

## `videos` (type: `string`):

Extracted Dailymotion videos with metadata, stream URLs, subtitles, and optional MP4 links.

## `files` (type: `string`):

Downloaded MP4 files stored in the run's key-value store.

# 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 = {
    "videoUrls": [
        "https://www.dailymotion.com/video/x9l66l8",
        "https://www.dailymotion.com/video/x9l661a"
    ],
    "maxResults": 25,
    "maxDownloadDurationSec": 1200
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/dailymotion-video-downloader").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 = {
    "videoUrls": [
        "https://www.dailymotion.com/video/x9l66l8",
        "https://www.dailymotion.com/video/x9l661a",
    ],
    "maxResults": 25,
    "maxDownloadDurationSec": 1200,
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/dailymotion-video-downloader").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 '{
  "videoUrls": [
    "https://www.dailymotion.com/video/x9l66l8",
    "https://www.dailymotion.com/video/x9l661a"
  ],
  "maxResults": 25,
  "maxDownloadDurationSec": 1200
}' |
apify call khadinakbar/dailymotion-video-downloader --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,khadinakbar/dailymotion-video-downloader"
        }
    }
}
```

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/AYIOHxIgcWg7hmnKi/builds/EhVxgKNEVoc57HppR/openapi.json
