# EroThots Video Downloader (`maximedupre/erothots-media-downloader`) Actor

Get direct MP4 links from public EroThots video URLs or IDs. Choose a source quality and export video details, tags, thumbnails, and available MP4 options.

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

## Pricing

$9.00 / 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/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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

### 📥 Get direct MP4 links from public EroThots videos

EroThots Video Downloader is for people who have public EroThots video URLs or IDs. It returns a direct MP4 link, the chosen quality, other MP4 options, and source details in a clean Apify dataset.

- **[EroThots Downloader](https://apify.com/maximedupre/erothots-media-downloader/examples/erothots-downloader)** — turn a known public video URL or ID into a direct MP4 link.
- **[EroThots Video Downloader](https://apify.com/maximedupre/erothots-media-downloader/examples/erothots-video-downloader)** — choose the best available quality or a source quality label.
- **[Download EroThots Videos](https://apify.com/maximedupre/erothots-media-downloader/examples/download-erothots-videos)** — get links for a list of public videos in one run.
- **[EroThots Bulk Downloader](https://apify.com/maximedupre/erothots-media-downloader/examples/erothots-bulk-downloader)** — remove repeat URLs and IDs while handling a large input list.
- **[EroThots MP4 Downloader](https://apify.com/maximedupre/erothots-media-downloader/examples/erothots-mp4-downloader)** — export the selected MP4 link and all MP4 quality options found.
- **[EroThots Video Metadata](https://apify.com/maximedupre/erothots-media-downloader/examples/erothots-video-metadata)** — collect titles, descriptions, duration, dimensions, tags, and thumbnails when shown by the source.

#### 📦 Returned data

Each saved row is one public video with a direct MP4 link. It can include:

- `videoId` and the main `pageUrl`
- `title` and `description`
- `requestedQuality` and `selectedQuality`
- `format` and direct `downloadUrl`
- `durationSeconds`, `width`, and `height`
- `tags` and `thumbnailUrl`
- `availableOptions` with each MP4 quality and its dimensions when found

The Actor leaves the file at the source. It does not copy files to Apify storage, make ZIP files, search EroThots, or unlock private or missing videos.

#### 🚀 Running the Actor

1. Add public EroThots video page URLs or video IDs.
2. Pick **Best available** or enter a source quality label.
3. Start the Actor.
4. Open the dataset and use `downloadUrl` for the selected MP4.

Bad, repeated, missing, or unsupported targets are shown in the run log. They do not create fake video rows.

#### 🔧 Input

| Field | What to enter |
| --- | --- |
| `videoTargets` | One public EroThots video page URL or video ID per line. Up to 1,000 entries. |
| `quality` | `best`, a listed quality such as `720p`, or another exact source quality label. |

```json
{
  "videoTargets": [
    "https://erothots.co/video/abc123/example-video/",
    "def456"
  ],
  "quality": "720p"
}
````

#### 📤 Output

A successful video is saved to the default dataset. You can open the dataset in Apify or export it as JSON or CSV.

```json
{
  "videoId": "abc123",
  "pageUrl": "https://erothots.co/video/abc123/example-video",
  "title": "Example video",
  "requestedQuality": "720p",
  "selectedQuality": "720p",
  "format": "mp4",
  "downloadUrl": "https://cdn.example.com/videos/abc123-720p.mp4",
  "durationSeconds": 184,
  "width": 1280,
  "height": 720,
  "tags": ["example"],
  "thumbnailUrl": "https://cdn.example.com/thumbs/abc123.jpg",
  "availableOptions": [
    {
      "quality": "720p",
      "format": "mp4",
      "width": 1280,
      "height": 720
    }
  ]
}
```

Optional fields are left out when EroThots does not show them.

#### 💳 Pricing

This Actor uses pay-per-event pricing. You are charged for each video saved with a direct MP4 link. Invalid, repeated, unavailable, failed, and no-link targets are not saved as videos and are not charged as video events. Apify platform usage may also apply.

#### 🔌 Integrations

Use Apify datasets, the Apify API, schedules, webhooks, or built-in integrations to send output into your workflow.

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

#### ❓ FAQ

##### Can I use an EroThots video ID instead of a URL?

Yes. Add the ID to `videoTargets`. The Actor finds the matching public page before it reads the video.

##### What happens if my chosen quality is not available?

That target is skipped and the run log explains why. Use `best` to choose the highest source option found.

##### Does this Actor save the MP4 file in Apify storage?

No. It returns the direct source MP4 link. Your next step can open or download that link.

##### Can it access private, removed, or account-only videos?

No. It works only with videos reachable on public EroThots pages without a login.

##### Can one bad target stop the whole list?

Invalid, repeated, unavailable, and no-link targets are skipped. A source-wide access problem can stop the run after retries, while videos already saved stay in the dataset.

##### Can it search profiles, tags, or all of EroThots?

No. Add known video page URLs or video IDs. The Actor does not discover videos from profiles, search pages, or site archives.

### 📝 Changelog

- 0.1: Initial release.

### 🆘 Support

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

### 🔗 Related Actors

- [XNXX Video Downloader](https://apify.com/maximedupre/xnxx-video-downloader) — get direct MP4 and HLS links from known public XNXX videos.
- [TNAFlix Downloader](https://apify.com/maximedupre/tnaflix-downloader) — export direct MP4 options from public TNAFlix URLs or IDs.
- [LuxureTV Downloader](https://apify.com/maximedupre/luxuretv-downloader) — resolve public LuxureTV pages into source media links and video details.
- [ManyVids Video Downloader](https://apify.com/maximedupre/manyvids-video-downloader) — get source media links and details from known ManyVids video pages.
- [RedGifs Bulk Downloader](https://apify.com/maximedupre/redgifs-bulk-downloader) — collect public RedGifs MP4 links by URL, ID, or search.

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

# Actor input Schema

## `videoTargets` (type: `array`):

Add one public EroThots video page URL or video ID per line. You can add up to 1,000 entries.

## `quality` (type: `string`):

Pick the MP4 quality for the direct link. Choose Best available for the highest quality, or enter an exact source quality label.

## Actor input object example

```json
{
  "videoTargets": [
    "https://erothots.co/video/abc123/example-video/",
    "abc123"
  ],
  "quality": "best"
}
```

# Actor output Schema

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

Open the video results in the default dataset.

## `csv` (type: `string`):

Download the video results as a CSV file.

# 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 = {
    "videoTargets": [
        "https://erothots.co/video/ahhuucgillf/hanacutiee/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/erothots-media-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 = { "videoTargets": ["https://erothots.co/video/ahhuucgillf/hanacutiee/"] }

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/erothots-media-downloader").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 '{
  "videoTargets": [
    "https://erothots.co/video/ahhuucgillf/hanacutiee/"
  ]
}' |
apify call maximedupre/erothots-media-downloader --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=maximedupre/erothots-media-downloader",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "EroThots Video Downloader",
        "description": "Get direct MP4 links from public EroThots video URLs or IDs. Choose a source quality and export video details, tags, thumbnails, and available MP4 options.",
        "version": "0.1",
        "x-build-id": "v5SNEiQR89fsiS1dN"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/maximedupre~erothots-media-downloader/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-maximedupre-erothots-media-downloader",
                "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/maximedupre~erothots-media-downloader/runs": {
            "post": {
                "operationId": "runs-sync-maximedupre-erothots-media-downloader",
                "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/maximedupre~erothots-media-downloader/run-sync": {
            "post": {
                "operationId": "run-sync-maximedupre-erothots-media-downloader",
                "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": [
                    "videoTargets"
                ],
                "properties": {
                    "videoTargets": {
                        "title": "Video URLs or IDs",
                        "minItems": 1,
                        "maxItems": 1000,
                        "uniqueItems": false,
                        "type": "array",
                        "description": "Add one public EroThots video page URL or video ID per line. You can add up to 1,000 entries.",
                        "items": {
                            "type": "string",
                            "minLength": 1
                        }
                    },
                    "quality": {
                        "title": "Video quality",
                        "type": "string",
                        "description": "Pick the MP4 quality for the direct link. Choose Best available for the highest quality, or enter an exact source quality label.",
                        "default": "best"
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
