# Pornhub and RedTube Scraper: Videos and Trends (`parselab/pornhub-redtube-catalog-scraper`) Actor

Scrape the Pornhub and RedTube video catalogs from their webmaster feeds. Get titles, views, ratings, duration, tags, categories, performers and embed links, plus trend tables by tag, category or performer. No video files are downloaded. Filter by period, views or rating. Export to CSV or Excel.

- **URL**: https://apify.com/parselab/pornhub-redtube-catalog-scraper.md
- **Developed by:** [ParseLab](https://apify.com/parselab) (community)
- **Categories:** Videos, Other
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $12.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Pornhub and RedTube Scraper: Video Catalog, Trends and Performer Directory

This Pornhub and RedTube scraper reads the video catalogs of the two sites through their official webmaster feeds and gives you clean rows: title, views, rating, duration, publication date, tags, categories, performers and an embed link for each video. It is built for adults who work with the data of the adult video industry: marketers, affiliate sites, market researchers, studios and analysts.

The Actor collects catalog information only. It does not download videos or images, and it does not return links to the video files. The link in each row opens the video page or the official embed player of the site, which sends the audience back to the source.

Beyond single videos, the trends mode answers the question that most users have: what is popular right now. It reads the most viewed videos of the week, the month or all time and counts which tags, categories and performers show up, with the share of videos, the share of views, the average views, the average rating and the top video of each group.

### What can you do with this scraper?

- Search the catalogs by word, category, tag or performer
- List the newest, most viewed or best rated videos of a period
- Keep only videos above a number of views, a rating, a length or a publication date
- Count which tags and categories lead the most viewed videos of the week
- Follow a performer through the number of videos in the directory
- Build a table of categories and their ids for both sites
- Get embed links to show videos in your own page with the official player
- Compare the two sites for the same search
- Export to CSV or Excel, or send new videos to your own tools

### What data can you extract?

| Mode | One row is | Highlights |
|---|---|---|
| Video catalog | One video | Site, video id, title, page link, embed link, ready to paste player code, duration in seconds and minutes, views, rating and number of ratings, publication date, age in days, views per day, tags, number of tags, categories, performers, search term that found it, optional thumbnail link |
| Trends | One tag, category or performer | Videos in the sample, share of videos, total views, average views, share of views, average rating, average duration, sites, top video, size of the sample, ordering and period |
| Performer directory | One performer | Site, name, gender, number of videos, profile link, optional thumbnail link |
| Category list | One category | Site, name, category id, section, search link |

### How to scrape the catalogs

1. Choose **Video catalog**, **Trends**, **Performer directory** or **Category list**.
2. Pick the sites, one or both.
3. For videos and trends, add search words, categories, tags or performers, and choose the order and the period.
4. Set the number of pages per search and **Max Items**, then click **Start**.
5. Export the dataset as CSV, Excel or from the Apify console.

### Input example

```json
{
  "mode": "trends",
  "sources": ["pornhub"],
  "groupBy": "categories",
  "ordering": "mostviewed",
  "period": "weekly",
  "pagesPerQuery": 3,
  "maxItems": 50
}
```

### Trends output example

```json
{
  "group": "categories",
  "name": "pov",
  "videosInSample": 5,
  "shareOfVideosPct": 5,
  "totalViews": 1352782,
  "averageViews": 270556,
  "shareOfViewsPct": 5.1,
  "averageRating": 88.7,
  "averageDurationMinutes": 16.7,
  "sampleSize": 100,
  "ordering": "mostviewed",
  "period": "weekly"
}
```

### Video output example

```json
{
  "source": "pornhub",
  "videoId": "6ac80442163d6",
  "durationMinutes": 19.6,
  "views": 33556,
  "rating": 90.7,
  "publishedDate": "2026-10-08",
  "ageDays": 7,
  "viewsPerDay": 4794,
  "embedUrl": "https://www.pornhub.com/embed/6ac80442163d6"
}
```

### How much does it cost to scrape the catalogs?

You pay per result: $16 per 1,000 rows plus a tiny start fee. The free plan returns up to 10 rows per run. A trends table is one row per tag, category or performer, so a weekly report costs a few cents.

### Tips for better results

- Availability: the Pornhub feed only answers some networks and regions and sends other addresses to its home page. Its requests use the connection settings of the Actor, so some runs read both sites and some only RedTube. When Pornhub redirects, the Actor shows a warning and continues with RedTube, so a run never stops because of one site. You can try again or change the country in the connection settings. RedTube is read directly and works every time.
- Pornhub gives 30 videos per page and RedTube 20. The Actor stops a search when a page has nothing new, so asking for many pages never repeats rows.
- The weekly and best rated lists of Pornhub need a search word. Without one the Actor uses the very broad word a and says so in the log.
- RedTube only ranks videos by views or rating when you give a search word, a category, a tag or a performer. Without one it returns the newest videos with almost no counts, and the Actor skips it for ranked lists with a warning.
- Views and ratings change every day. For a trend report, schedule the Actor weekly and keep each run.
- The trend table is based on a sample of the top videos. A bigger sample (more pages) gives steadier numbers. The sample size is in every row.
- Tags are written by uploaders and can repeat the same idea with different words. Categories are fixed lists and are better for comparing weeks.
- Thumbnail links are off by default because the images are explicit. Turn them on only if you need them.
- Performer names must match the directory to be used as a filter. Search the directory first.
- Rows keep the title exactly as the site shows it, so titles can contain adult words.

### Who uses this data?

- **Affiliate and tube site owners** pick what to feature and how to tag it.
- **Studios and producers** see which categories and lengths perform.
- **Market researchers** measure the size and the mix of the catalog.
- **Analysts and journalists** report on trends of the industry.

### Automate and connect

Schedule the Actor every week and send the trend table to Google Sheets, Slack, Zapier, Make or n8n, or trigger a webhook when a run ends.

### FAQ

**Does it download videos?**
No. It only reads catalog information and returns links to the video page and to the official embed player.

**Is it for adults only?**
Yes. The catalogs contain adult material. Use the Actor only if you are an adult and the law of your country allows it.

**Why do I only get RedTube rows?**
The feed of Pornhub redirected the address used in that run. The log says so. Run again, or set another country in the connection settings. The rows of RedTube are complete either way.

**Do I need an account or a login?**
No. The Actor works without any login.

**Can I search by performer?**
Yes. Use the performer directory to find the exact name, then use it as a filter in the video catalog.

**Why are some RedTube views zero?**
Very new videos have no views yet. Ranked lists use a search word or a category and show the real counts.

**How current is the data?**
The Actor reads the feeds when you run it, so the counts are current to the minute.

### Legal note

This Actor collects information that the two sites publish through their public webmaster feeds. The terms of use of the feeds were not reviewed for this Actor: check them and your local rules before you use the data commercially. For adults only. The Actor does not collect or download media files.

### Support

Missing a field or found a bug? Open an issue from the Actor page.

# Actor input Schema

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

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000.

## `mode` (type: `string`):

Videos returns the catalog entries that match your search. Trends counts which tags, categories or performers appear in the most viewed videos of a period. Performers returns the performer directory. Categories returns the category list.

## `sources` (type: `array`):

Which catalogs to read. Leave both to read both. The Pornhub feed answers only some networks and regions, so its requests use the connection settings below. If it still redirects, the Actor shows a warning and continues with RedTube.

## `proxyConfiguration` (type: `object`):

Network used to read the Pornhub feed. Pornhub answers some countries and exit addresses and redirects others, so you may need to try another country or group. RedTube does not use it.

## `searchTerms` (type: `array`):

Words searched in the video titles and tags. Each term is a separate search.

## `categories` (type: `array`):

Category names as shown in the category list, for example amateur or hd.

## `tags` (type: `array`):

Tags that the video must have.

## `performers` (type: `array`):

Performer names exactly as in the performer directory.

## `ordering` (type: `string`):

Newest videos, most viewed, best rated or featured. Featured is only available for the first site.

## `period` (type: `string`):

Only used with the most viewed and best rated order.

## `pagesPerQuery` (type: `integer`):

How many pages to read for each search and site. Pornhub gives 30 videos per page and RedTube 20.

## `minViews` (type: `integer`):

Keep videos with at least this many views.

## `minRating` (type: `integer`):

Keep videos rated at least this percent, from 0 to 100.

## `minDurationMinutes` (type: `integer`):

Keep videos at least this long.

## `maxDurationMinutes` (type: `integer`):

Keep videos at most this long.

## `publishedAfter` (type: `string`):

Keep videos published on or after this date, in the form 2026-09-30.

## `includeThumbnails` (type: `boolean`):

Adds the link of the preview image of each video or performer. The images are explicit, so this is off by default.

## `groupBy` (type: `string`):

Trends mode. Count tags, categories or performers.

## `performerGender` (type: `string`):

Performers mode. For example female, male or transgender. Leave empty for all.

## `minVideoCount` (type: `integer`):

Performers mode: performers with at least this many videos. Trends mode: groups that appear in at least this many videos of the sample.

## `nameContains` (type: `string`):

Performers mode. Part of a performer name.

## Actor input object example

```json
{
  "maxItems": 10,
  "mode": "videos",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  },
  "searchTerms": [
    "compilation"
  ],
  "ordering": "newest",
  "period": "alltime",
  "pagesPerQuery": 3,
  "includeThumbnails": false,
  "groupBy": "tags"
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "DE"
    },
    "searchTerms": [
        "compilation"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("parselab/pornhub-redtube-catalog-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "DE",
    },
    "searchTerms": ["compilation"],
}

# Run the Actor and wait for it to finish
run = client.actor("parselab/pornhub-redtube-catalog-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  },
  "searchTerms": [
    "compilation"
  ]
}' |
apify call parselab/pornhub-redtube-catalog-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parselab/pornhub-redtube-catalog-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/0wsBrv71AW1JKg3Kz/builds/iXgRsRNVWkK2TwQhk/openapi.json
