# Upornia Downloader (`maximedupre/upornia-downloader`) Actor

Download public Upornia video data from known video URLs. Export direct source-hosted MP4 links, titles, durations, thumbnails, tags, uploader names, and URL expiry times to an Apify dataset.

- **URL**: https://apify.com/maximedupre/upornia-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

$9.00 / 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

### 📥 Upornia downloader for public video URLs

Upornia Downloader extracts direct source-hosted MP4 links and metadata from public [Upornia](https://www.upornia.com/) video pages. Paste one or more Upornia video URLs and get a clean Apify dataset with video IDs, source URLs, titles, descriptions, durations, thumbnails, uploader names, tags, media URL expiry times, and direct MP4 links.

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

For a small first run, keep the prefilled sample URL and start the Actor. Once the output shape fits your workflow, paste your own list of public Upornia video URLs, run a larger batch, schedule the Actor, or call it through the Apify API.

### ✅ What this Actor does

- Accepts public Upornia video page URLs.
- Deduplicates repeated URLs by source video ID.
- Saves one dataset row per successfully resolved public video.
- Returns direct source-hosted MP4 links exposed for the video.
- Adds title, description, duration, thumbnail URL, uploader name, publish date, and tags when Upornia exposes them.
- Parses media URL expiry timestamps when the signed source URL exposes one.
- Skips invalid, duplicate, private, removed, blocked, unresolved, or no-media targets without saving paid failure rows.

This Actor is focused on known public Upornia videos. It does not search Upornia, crawl categories, process profiles, bypass private access, download files into Apify storage, create ZIP archives, or install a browser extension.

### 📦 Data you can export

Each output row represents one public Upornia video where a direct MP4 link was found. Core fields include:

- `videoId` - stable Upornia video ID for dedupe and reruns.
- `sourceUrl` - source-confirmed Upornia video page 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 name shown by Upornia, when available.
- `publishedAt` - source-published timestamp, when available.
- `tags` - source-backed tags and categories.
- `availableFormats` - direct MP4 formats with `quality`, `width`, `height`, `contentType`, `mediaUrl`, and `expiresAt`.

Direct media links can be signed and time-limited. Use `availableFormats[].expiresAt` to decide when to refresh results. The Actor does not invent missing quality labels, dimensions, or metadata; nullable fields stay empty when Upornia does not expose them.

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 Upornia video page URLs in **Upornia video URLs**.
3. Start the Actor.
4. Open the dataset.
5. Use `availableFormats` to choose the MP4 link that fits your workflow.

The Actor pushes successful rows during the run, so you can inspect early results before a larger batch finishes.

### 🧾 Input

| Field | What to enter |
| ----- | ------------- |
| `videoUrls` | One or more public Upornia video page URLs. |

Input example:

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

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

### 📤 Output example

```json
{
	"videoId": "123456",
	"sourceUrl": "https://www.upornia.com/videos/123456/example-video/",
	"title": "Example video title",
	"description": null,
	"durationSeconds": 612,
	"thumbnailUrl": "https://tn.upornia.com/contents/videos_screenshots/123000/123456/360x240/1.jpg",
	"uploaderName": "Example uploader",
	"publishedAt": "2026-06-01T12:30:00.000Z",
	"tags": ["HD", "example"],
	"availableFormats": [
		{
			"quality": "242kbps",
			"width": null,
			"height": null,
			"contentType": "video/mp4",
			"mediaUrl": "https://cdn.upornia.com/videos/123456/example.mp4",
			"expiresAt": "2026-06-02T12:30:00.000Z"
		}
	]
}
```

Failed targets are reported in logs and status messages, not as dataset rows. This keeps exports focused on successfully resolved videos.

### 💳 Pricing

This Actor uses pay-per-event pricing. You are charged one `Resolved video` event only for each public Upornia video saved to the dataset with at least one direct MP4 link.

Failed, invalid, duplicate, private, removed, blocked, unresolved, or no-media targets do not create paid video events.

### ⚠️ Limits and access

This Actor works with public Upornia video pages that can be reached without logging in. It does not use your Upornia account, cookies, browser session, browser extension, or source API keys.

Some media URLs can expire after they are fetched. If a direct link stops working later, rerun the Actor for the same source URL to get fresh source links.

Use the Actor only for content you have the right to access, process, or download. The Actor returns source-hosted links; it does not copy videos into Apify storage.

### ❓ FAQ

#### 💾 Does this Upornia downloader save MP4 files?

No. The Actor returns direct source-hosted MP4 links and metadata in the dataset. It does not mirror files, create ZIP archives, or store video copies.

#### 🔐 Does it need Upornia cookies or an account?

No. It is built for public, reachable Upornia video pages and does not ask for cookies, account sessions, source API keys, or extension accounts.

#### 🚧 Why are some URLs skipped?

URLs can be skipped when they are invalid, duplicate, private, removed, blocked by the source, unresolved, or have no source-exposed MP4 link. Skipped targets are reported in logs instead of being saved as failure rows.

#### 🔌 Can I use the results through an API?

Yes. The output is an Apify dataset, so you can fetch it through the Apify API, export it in common formats, schedule runs, or connect it to downstream workflows.

### 📝 Changelog

- 0.1: Initial release.

### 🆘 Support

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

### 🔗 Other actors

- [XVideos Downloader ↗](https://apify.com/maximedupre/xvideos-downloader) - Resolve public XVideos watch-page URLs into direct MP4/HLS links and metadata.
- [Pornhub Downloader ↗](https://apify.com/maximedupre/pornhub-downloader) - Export public Pornhub video metadata, thumbnails, engagement, tags, and source-visible HLS links.
- [AShemaleTube Downloader ↗](https://apify.com/maximedupre/ashemaletube-downloader) - Extract public AShemaleTube video media links, durations, thumbnails, and tags.
- [TNAFlix Downloader ↗](https://apify.com/maximedupre/tnaflix-downloader) - Resolve public TNAFlix video URLs or IDs into direct MP4 links and metadata.
- [RedGifs Bulk Downloader ↗](https://apify.com/maximedupre/redgifs-bulk-downloader) - Collect public RedGifs video links, metadata, thumbnails, tags, and optional hosted files.

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

# Actor input Schema

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

Paste public Upornia video page URLs. Add one video URL per row.

## Actor input object example

```json
{
  "videoUrls": [
    {
      "url": "https://www.upornia.com/videos/6292023/shameless-whore-mind-blowing-porn/"
    },
    {
      "url": "https://www.upornia.com/videos/6292658/sucia-latina-coge-de-mi-pene/"
    },
    {
      "url": "https://www.upornia.com/videos/6293247/hottest-sex-video-teen-18-check-watch-show/"
    },
    {
      "url": "https://www.upornia.com/videos/6292458/carla-boom-sara-retali-and-sergio-lagos-in-rough-and-depraved-threesome-of-two-horny-milfs-with-a-big-cock/"
    },
    {
      "url": "https://www.upornia.com/videos/6293209/fabulous-adult-movie-interracial-watch-unique/"
    }
  ]
}
```

# Actor output Schema

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

Open the dataset with one reachable public Upornia video per row.

# 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.upornia.com/videos/6292023/shameless-whore-mind-blowing-porn/"
        },
        {
            "url": "https://www.upornia.com/videos/6292658/sucia-latina-coge-de-mi-pene/"
        },
        {
            "url": "https://www.upornia.com/videos/6293247/hottest-sex-video-teen-18-check-watch-show/"
        },
        {
            "url": "https://www.upornia.com/videos/6292458/carla-boom-sara-retali-and-sergio-lagos-in-rough-and-depraved-threesome-of-two-horny-milfs-with-a-big-cock/"
        },
        {
            "url": "https://www.upornia.com/videos/6293209/fabulous-adult-movie-interracial-watch-unique/"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/upornia-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.upornia.com/videos/6292023/shameless-whore-mind-blowing-porn/" },
        { "url": "https://www.upornia.com/videos/6292658/sucia-latina-coge-de-mi-pene/" },
        { "url": "https://www.upornia.com/videos/6293247/hottest-sex-video-teen-18-check-watch-show/" },
        { "url": "https://www.upornia.com/videos/6292458/carla-boom-sara-retali-and-sergio-lagos-in-rough-and-depraved-threesome-of-two-horny-milfs-with-a-big-cock/" },
        { "url": "https://www.upornia.com/videos/6293209/fabulous-adult-movie-interracial-watch-unique/" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/upornia-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.upornia.com/videos/6292023/shameless-whore-mind-blowing-porn/"
    },
    {
      "url": "https://www.upornia.com/videos/6292658/sucia-latina-coge-de-mi-pene/"
    },
    {
      "url": "https://www.upornia.com/videos/6293247/hottest-sex-video-teen-18-check-watch-show/"
    },
    {
      "url": "https://www.upornia.com/videos/6292458/carla-boom-sara-retali-and-sergio-lagos-in-rough-and-depraved-threesome-of-two-horny-milfs-with-a-big-cock/"
    },
    {
      "url": "https://www.upornia.com/videos/6293209/fabulous-adult-movie-interracial-watch-unique/"
    }
  ]
}' |
apify call maximedupre/upornia-downloader --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Upornia Downloader",
        "description": "Download public Upornia video data from known video URLs. Export direct source-hosted MP4 links, titles, durations, thumbnails, tags, uploader names, and URL expiry times to an Apify dataset.",
        "version": "0.1",
        "x-build-id": "P38LEhpGziAeZHXsO"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/maximedupre~upornia-downloader/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-maximedupre-upornia-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~upornia-downloader/runs": {
            "post": {
                "operationId": "runs-sync-maximedupre-upornia-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~upornia-downloader/run-sync": {
            "post": {
                "operationId": "run-sync-maximedupre-upornia-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": "Upornia video URLs",
                        "minItems": 1,
                        "maxItems": 100,
                        "type": "array",
                        "description": "Paste public Upornia video page URLs. Add one video 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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
