# YesPornPlease Downloader (`maximedupre/yespornplease-downloader`) Actor

Download public YesPornPlease video data from scene URLs. Export direct source-hosted MP4 links, quality variants, titles, descriptions, thumbnails, tags, publish dates, and source URLs.

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

## Pricing

$2.65 / 1,000 resolved 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.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

### 📥 YesPornPlease downloader for public scene URLs

YesPornPlease Downloader extracts direct source-hosted media links and video metadata from public [YesPornPlease](https://www.yespornplease.com/) scene URLs. Paste one or more scene links and get a clean Apify dataset with source URLs, video IDs, titles, descriptions, durations, thumbnails, uploader or brand names, publish dates, tags, and MP4 media variants.

Use this YesPornPlease downloader when you already have public scene URLs and need repeatable exports for content review, cataloging, media operations, research, archiving workflows, or an API pipeline. The Actor works with public, reachable YesPornPlease scene pages only. You do not need YesPornPlease cookies, a YesPornPlease account, a browser extension, local playback, or a source API key.

For a small first run, paste one public YesPornPlease scene URL and start the Actor. Once the output shape fits your workflow, add a larger URL batch, schedule the Actor, or call it through the Apify API.

### ✅ What this Actor does

- Accepts public YesPornPlease scene URLs such as `https://www.yespornplease.com/scene/123456/example-video/`.
- Saves one dataset row per successfully resolved public video.
- Returns direct source-hosted media links exposed for the scene.
- Keeps detected quality variants in `mediaVariants`, including source quality labels and dimensions when available.
- Adds video ID, source URL, title, description, duration, thumbnail URL, uploader or brand name, publish date, and tags when YesPornPlease exposes them.
- Skips invalid, unsupported, private, removed, blocked, account-only, premium-only, or no-media targets without saving failure rows.

This Actor is focused on known public YesPornPlease scenes. It does not search YesPornPlease, crawl categories, unlock private content, download files into Apify storage, create ZIP archives, transcode media, or install a browser extension.

### 📦 Data you can export

Each output row represents one public YesPornPlease video where at least one source-hosted media link was found. Core fields include:

- `videoId` - source video identifier, when available.
- `sourceUrl` - source-confirmed YesPornPlease scene URL.
- `title` - source video title, when available.
- `description` - source video description, when available.
- `durationSeconds` - video duration in seconds, when available.
- `thumbnailUrl` - source thumbnail or poster image URL, when available.
- `uploaderName` - uploader, brand, creator, or channel name, when available.
- `publishedAt` - source-published date or timestamp, when available.
- `tags` - source-backed tags or categories.
- `mediaVariants` - direct source-hosted media links with `quality`, `width`, `height`, `contentType`, `mediaUrl`, and `expiresAt`.

Some media links can be signed or time-limited. If a link expires, rerun the Actor with the same `sourceUrl` to refresh the media variants. The Actor does not invent missing titles, durations, dimensions, tags, or uploader facts; nullable fields stay empty when YesPornPlease does not expose that value.

You can open the dataset in Apify, export it as JSON, CSV, Excel, XML, RSS, or HTML, call it through the Apify API, schedule recurring runs, or connect results to webhooks and integrations.

### 🚀 How to run

1. Open the Actor input.
2. Add one or more public YesPornPlease scene URLs in **YesPornPlease scene URLs**.
3. Start the Actor.
4. Open the dataset.
5. Use `mediaVariants[].mediaUrl` for the direct source-hosted media links.

The Actor pushes successful rows during the run, so you can inspect early results before a larger batch finishes. For batch runs, add one URL per row. Duplicate URLs are processed once per normalized source scene URL.

### 🔎 Input

The public input has one field:

- **YesPornPlease scene URLs** - a list of public YesPornPlease scene URLs, such as `https://www.yespornplease.com/scene/123456/example-video/`.

The input accepts up to 100 URLs per run. Submit fewer URLs when you want a smaller test.

The Actor does not expose proxy, browser, retry, quality, cookie, account, storage, ZIP, or download-file settings. Those are not needed for the approved public-scene workflow.

Input example:

```json
{
	"videoUrls": [
		{
			"url": "https://www.yespornplease.com/scene/123456/example-video/"
		}
	]
}
````

### 📤 Output example

```json
{
	"videoId": "123456",
	"sourceUrl": "https://www.yespornplease.com/scene/123456",
	"title": "Example video title",
	"description": null,
	"durationSeconds": 612,
	"thumbnailUrl": "https://cdn.yespornplease.example/thumbs/123456/poster.jpg",
	"uploaderName": "Example uploader",
	"publishedAt": "2026-06-01T12:30:00.000Z",
	"tags": ["example", "video"],
	"mediaVariants": [
		{
			"quality": "720p",
			"width": 1280,
			"height": 720,
			"contentType": "video/mp4",
			"mediaUrl": "https://cdn.yespornplease.example/videos/123456-720p.mp4",
			"expiresAt": null
		}
	]
}
```

Rows are success-only. If a submitted URL cannot be resolved into at least one direct source-hosted media link, the Actor logs the outcome and does not create a placeholder row.

### 💳 Pricing

This Actor charges one `Resolved video` event for each public YesPornPlease video that is successfully saved to the dataset. Invalid URLs, unsupported pages, blocked pages, private or premium-only videos, no-media targets, and empty outputs are not charged as resolved videos.

### ⚠️ Limits and caveats

- Use only public YesPornPlease scene URLs that you are allowed to access and process.
- The Actor returns source-hosted media links. It does not store video files in Apify storage.
- Direct media links can change or expire, so rerun the Actor when you need fresh links.
- Private, premium-only, account-only, removed, blocked, or no-media pages are skipped without dataset rows.
- This Actor does not search YesPornPlease or discover scenes from categories.

### ❓ FAQ

#### Do I need a YesPornPlease account or cookies?

No. The Actor is built for public scene URLs and does not ask for YesPornPlease cookies, login details, browser state, or an extension.

#### Does it download the video file into Apify storage?

No. The output contains direct source-hosted media URLs. Use those links in your own authorized workflow while they are fresh.

#### Can I choose one quality before the run?

No. The Actor returns all source-visible variants it can resolve, with quality labels such as `720p` or `320p` when YesPornPlease exposes them. Choose the variant you need from the dataset.

#### What happens when a URL has no direct media link?

The Actor logs the skipped target and does not save a placeholder row. You are charged only for successfully resolved videos saved to the dataset.

### 📝 Changelog

- 0.1: Initial release.

### 🆘 Support

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

### 🔗 Other actors

- [XVideos Downloader ↗](https://apify.com/maximedupre/xvideos-downloader) - Extract direct media links and metadata from public XVideos watch pages.
- [PornTrex Downloader ↗](https://apify.com/maximedupre/porntrex-downloader) - Resolve public PornTrex video URLs into source-hosted MP4 links and metadata.
- [Upornia Downloader ↗](https://apify.com/maximedupre/upornia-downloader) - Export direct MP4 links, metadata, tags, and uploader details from public Upornia videos.
- [RedGifs Bulk Downloader ↗](https://apify.com/maximedupre/redgifs-bulk-downloader) - Collect RedGifs video links, IDs, search results, direct MP4 links, and optional hosted files.
- [Facebook Media Downloader ↗](https://apify.com/maximedupre/facebook-media-downloader) - Extract direct media links and metadata from public Facebook videos and reels.

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

# Actor input Schema

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

Paste public YesPornPlease scene URLs. Add one URL per row.

## Actor input object example

```json
{
  "videoUrls": [
    {
      "url": "https://www.yespornplease.com/scene/11492837"
    },
    {
      "url": "https://www.yespornplease.com/scene/11495279"
    },
    {
      "url": "https://www.yespornplease.com/scene/11496763"
    },
    {
      "url": "https://www.yespornplease.com/scene/11498067"
    },
    {
      "url": "https://www.yespornplease.com/scene/11498229"
    }
  ]
}
```

# Actor output Schema

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

Open the dataset with one successful public YesPornPlease video per row, including metadata and media variants.

# 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": [
        {
            "url": "https://www.yespornplease.com/scene/11492837"
        },
        {
            "url": "https://www.yespornplease.com/scene/11495279"
        },
        {
            "url": "https://www.yespornplease.com/scene/11496763"
        },
        {
            "url": "https://www.yespornplease.com/scene/11498067"
        },
        {
            "url": "https://www.yespornplease.com/scene/11498229"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/yespornplease-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": [
        { "url": "https://www.yespornplease.com/scene/11492837" },
        { "url": "https://www.yespornplease.com/scene/11495279" },
        { "url": "https://www.yespornplease.com/scene/11496763" },
        { "url": "https://www.yespornplease.com/scene/11498067" },
        { "url": "https://www.yespornplease.com/scene/11498229" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/yespornplease-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 '{
  "videoUrls": [
    {
      "url": "https://www.yespornplease.com/scene/11492837"
    },
    {
      "url": "https://www.yespornplease.com/scene/11495279"
    },
    {
      "url": "https://www.yespornplease.com/scene/11496763"
    },
    {
      "url": "https://www.yespornplease.com/scene/11498067"
    },
    {
      "url": "https://www.yespornplease.com/scene/11498229"
    }
  ]
}' |
apify call maximedupre/yespornplease-downloader --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "YesPornPlease Downloader",
        "description": "Download public YesPornPlease video data from scene URLs. Export direct source-hosted MP4 links, quality variants, titles, descriptions, thumbnails, tags, publish dates, and source URLs.",
        "version": "0.1",
        "x-build-id": "Rqy9WEdIwEXRflFbA"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/maximedupre~yespornplease-downloader/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-maximedupre-yespornplease-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~yespornplease-downloader/runs": {
            "post": {
                "operationId": "runs-sync-maximedupre-yespornplease-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~yespornplease-downloader/run-sync": {
            "post": {
                "operationId": "run-sync-maximedupre-yespornplease-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": [
                    "videoUrls"
                ],
                "properties": {
                    "videoUrls": {
                        "title": "YesPornPlease scene URLs",
                        "minItems": 1,
                        "maxItems": 100,
                        "type": "array",
                        "description": "Paste public YesPornPlease scene URLs. Add one URL per row.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
