# Pornhub Scraper: Videos, Channels, Pornstars & Categories (`recordsdata/pornhub-scraper`) Actor

Scrape Pornhub videos, video details, channels, pornstars and categories by keyword, link or ranking: views, ranks, tags, subscribers and upload dates. Metadata only, no login. Export CSV, Excel, JSON or XML.

- **URL**: https://apify.com/recordsdata/pornhub-scraper.md
- **Developed by:** [RecordsData](https://apify.com/recordsdata) (community)
- **Categories:** Videos, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 video search results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

![RecordsData](https://api.apify.com/v2/key-value-stores/AAm3a1h3Z9nYfrvh9/records/banner?v=3)

## 🎬 Pornhub Scraper - Video, Channel, Pornstar and Category Data - RecordsData

> **Quick answer:** Pornhub Scraper exports public Pornhub metadata to CSV, Excel, JSON or XML. It returns five record types: videos, video details, channels, pornstars and categories. No login, cookies or API key are needed. Pricing is pay per result, from $20 per 1,000 rows ($0.02 each), and free accounts get a 10-row preview.

**Pornhub Scraper** reads the public pages of Pornhub and turns them into clean, flat rows. It is built for market research, trend tracking and competitive analysis of adult video. It returns **metadata only**: titles, counts, ranks, tags and public links. It never returns video files, streams, preview clips or comments.

Videos come with duration, views and uploader. Video details add likes, rating, tags and performers. Channels and pornstars come with ranks, subscribers and total views. Every value Pornhub withholds is marked `Not Disclosed`.

Built for market analysts, affiliate marketers, studios, BI teams and researchers.

### 📋 What the Pornhub Scraper does

Choose one **What to collect** mode per run. Each mode returns one record type.

| Mode | Each row holds |
|---|---|
| Videos | Title, link, thumbnail, duration, views, uploader, upload date |
| Video details | Videos plus quality, rating, likes, comments count, categories, tags, performers |
| Channels | Rank, subscribers, video count, total views, badges, description |
| Pornstars | Rank, weekly, monthly and yearly ranks, subscribers, videos, views, badges |
| Categories | Name, link and video count (about 105 categories) |

You can search by keyword, paste Pornhub links, or leave both empty to read the rankings.

### ⚙️ Pornhub Scraper input

| Field | Type | Default | What it does |
|---|---|---|---|
| `mode` | string | `videos` | What to collect: `videos`, `videoDetails`, `channels`, `pornstars` or `categories` |
| `queries` | array | `["massage"]` | Keywords, one search per term. In channels, pornstars and categories a term filters the list by name. Empty reads the rankings |
| `startUrls` | array | empty | Links copied from Pornhub: search, category, video, channel, model or index pages |
| `maxItems` | integer | `10` | Maximum rows across all terms. Free accounts are capped at 10 (preview), paid accounts up to 1,000,000 |
| `sortBy` | string | `relevance` | `relevance`, `newest`, `views` or `rating`. The last three work only without search terms |
| `period` | string | `alltime` | `alltime`, `today`, `week`, `month` or `year`, for the most viewed and top rated sorts |
| `duration` | string | `any` | Keep only videos of `10-20`, `over-10` or `over-20` minutes |
| `producer` | string | `any` | `professional` or `homemade`, when no search terms are given |
| `enrichProfiles` | boolean | `true` | In channels and pornstars, open each profile page for exact totals, subscribers and badges |
| `includeThumbnails` | boolean | `true` | Add the thumbnail link as the first column |
| `onlyNew` | boolean | `false` | Skip records this same search already returned, so scheduled runs return only changes |
| `stateKey` | string | empty | Label for the monitor state, to run several independent monitors with identical filters |
| `resetSeen` | boolean | `false` | Clear the seen list before the run so everything counts as new again |

Minimal example input:

```json
{
  "mode": "videos",
  "queries": [
    "massage"
  ],
  "maxItems": 100
}
```

### 📊 Output

Every row starts with `recordType` and `site`, then the thumbnail link, the identity fields, the core numbers, lists last, and ends with `scrapedAt` and `error`. Rows of one record type always carry the same keys in the same order.

| Field | Type | Example |
|---|---|---|
| `recordType` | string | `video` |
| `videoId` | string | `451918011` |
| `title` | string | `Brunette massage gun on TikTok live` |
| `url` | string | `https://www.pornhub.com/view_video.php?viewkey=6633ebb001e22` |
| `durationSeconds` | number | `127` |
| `views` | number | `2700000` |
| `uploaderName` | string | `Running Princess` |
| `publishedAt` | string (date) | `2024-05-02T00:00:00.000Z` |
| `rank` | number | `1` |
| `sortBy` | string | `relevance` |
| `name` (channel, pornstar, category) | string | `Brazzers` |
| `subscribers` | number | `8493517` |
| `videosCount` | number | `4870` |
| `totalViews` | number | `10701571872` |
| `verified`, `awardWinner` | string | `Yes` |
| `weeklyRank`, `monthlyRank`, `yearlyRank` (pornstar) | number | varies per model |
| `quality`, `ratingPercent`, `likes`, `commentsCount` (video-detail) | string or number | varies per video |
| `categories`, `tags`, `performers` (video-detail) | array | list of names |
| `scrapedAt` | string (date) | `2026-10-16T04:09:35.269Z` |
| `error` | string or null | `null` |

Real records from a run, shortened:

```json
{
  "recordType": "video",
  "site": "Pornhub",
  "videoId": "451918011",
  "title": "Brunette massage gun on TikTok live",
  "url": "https://www.pornhub.com/view_video.php?viewkey=6633ebb001e22",
  "searchQuery": "massage",
  "rank": 1,
  "sortBy": "relevance",
  "durationSeconds": 127,
  "views": 2700000,
  "uploaderName": "Running Princess",
  "publishedAt": "2024-05-02T00:00:00.000Z",
  "scrapedAt": "2026-10-16T04:09:35.269Z",
  "error": null
}
```

### 💰 How much does the Pornhub Scraper cost?

The Actor uses pay-per-event pricing: you pay for each record delivered, not for compute time. Every record type costs the same, **$0.02 per record, which is $20 per 1,000 records**. Records skipped by **Only new records**, refused search terms and failed rows are not charged.

| Event | What you pay for | Price | Per 1,000 |
|---|---|---|---|
| `video` | One video row from a search, ranking or listing | $0.02 | $20.00 |
| `video-detail` | One full video page | $0.02 | $20.00 |
| `channel` | One channel row | $0.02 | $20.00 |
| `pornstar` | One pornstar or model row | $0.02 | $20.00 |
| `category` | One category row | $0.02 | $20.00 |

Worked examples:

- 100 videos for one keyword: 100 x $0.02 = **$2.00**.
- 1,000 video details with tags and performers: 1,000 x $0.02 = **$20.00**.
- The full list of 105 categories: 105 x $0.02 = **$2.10**.
- 36 top channels, refreshed daily for 30 days: 36 x 30 x $0.02 = **$21.60**.

New Apify accounts include free monthly credit, so a first test costs nothing. Free accounts return up to 10 rows per run as a preview.

### ✨ Why choose this Actor

- **Five record types** in one consistent schema.
- **Rankings with filters:** sort, period and producer, with the applied sort stated on each row.
- **Profile enrichment** for exact subscribers, totals and badges.
- **Monitor mode:** scheduled runs return only what changed, and skipped records are free.
- **Fast and light:** plain HTTP requests, no browser, small runs finish in seconds on 256 MB.
- **Built-in content policy:** search terms that refer to minors are refused.

### 📈 Pornhub Scraper vs other Pornhub scrapers on Apify (read on 2026-10-16)

| | This Actor | jupri/pornhub | saswave/pornhub-scraper |
|---|---|---|---|
| Pricing shown on Store | $20 per 1,000 records | $5.00 per 1,000 results | From $0.90 per 1,000 results |
| Cheaper per row | No | Yes | Yes |
| Record types | Videos, video details, channels, pornstars, categories | not shown | Profiles, search results, videos, relationships |
| Rankings with sort, period, producer filters | Yes | not shown | not shown |
| Monitor mode (only new records) | Built in | not shown | not shown |
| Store users (total) | New | 530 | 266 |

Both alternatives are cheaper per row on the Store listing, so choose them if you only need basic rows at the lowest price. Choose this Actor for ranking filters, video details, categories, the `Not Disclosed` marker and change tracking. Prices come from the public Store pages and can change, so check them before you decide.

### 🚀 How to use

1. Create a free account at [console.apify.com](https://console.apify.com). New accounts include free monthly credit.
2. Open the Actor and pick **What to collect**, for example Videos.
3. Add search terms, or paste links copied from Pornhub, or leave both empty to read the Pornhub rankings.
4. Optional: set sort, period, length and producer filters.
5. Set **Max Items**. Free accounts return up to 10 rows as a preview. Paid accounts can raise the limit.
6. Press **Start**, then download the results from the **Output** tab as CSV, Excel, JSON or XML.

### 💼 Business use cases

- **Trend research:** run categories and pornstars weekly and store the ranks.
- **Keyword strategy:** search a keyword, then pull video details to see which titles and tags draw views.
- **Benchmarking:** compare channel subscribers, video counts and total views side by side.
- **Ranking history:** schedule channels and pornstars daily to build the rank history the site does not publish.

### 🔌 Automating the scraper

Schedule runs from the Apify Console, trigger them with the API, or send results to Make, Zapier, Google Sheets, Airbyte, BigQuery or webhooks.

### 🤖 Ask an AI assistant about this scraper

AI agents can call this Actor through the Apify MCP server at `https://mcp.apify.com?tools=RecordsData/pornhub-scraper`. Example prompt:

> Use the Pornhub Scraper to list the 20 most viewed videos of this week from the Pornhub ranking, then list the top 10 channels by subscribers and tell me which categories have the most videos.

### ⚖️ Is it legal to scrape Pornhub? Limits and responsible use

The Actor reads only public pages, never logs in and checks the Pornhub robots.txt, skipping what it disallows. It returns metadata, never media. The terms of use of Pornhub limit automated access, so you are responsible for using the data in line with those terms and local law. The Actor is for adults and lawful use only. This is not legal advice.

Limits to know:

- **Free accounts:** up to 10 rows per run (preview). Paid accounts can raise **Max Items** up to 1,000,000.
- **Keyword searches:** best match only, up to 10 result pages (447 videos for "massage" in tests), because robots.txt allows no other sorted search.
- **Rankings, channel and model uploads:** up to 80 pages. The channels list holds 36 channels per page and the categories list about 105 entries.
- **Content policy:** terms that refer to minors are refused, and matching records are dropped.
- **Thumbnails:** many links are signed and expire after about a day.

### ❓ Frequently Asked Questions

**❓ What does the Pornhub Scraper do?**
It exports public metadata from Pornhub as CSV, Excel, JSON or XML. It covers five record types: videos, video details, channels, pornstars and categories. Rows hold titles, links, durations, view counts, ranks, subscribers, tags and performers. It reads public pages only, needs no login, and never returns video files, streams or comments. You pick one record type per run.

**❓ How much does the Pornhub Scraper cost?**
Every record costs $0.02, which is $20 per 1,000 records, for all five record types. You pay per delivered record, not for compute time. Skipped records in monitor mode and refused search terms are not charged. For example, 100 videos cost $2.00 and 1,000 video details cost $20.00. Free accounts get a 10-row preview, and new accounts include free monthly Apify credit.

**❓ What is the cost per 1,000 Pornhub results?**
The cost is $20.00 per 1,000 results at the listed price of $0.02 per record. That figure is the same for videos, video details, channels, pornstars and categories. Other Pornhub scrapers on the Apify Store list lower per-row prices, for example $5.00 per 1,000 results, but they do not offer the same ranking filters, record types or change tracking. Prices were read on 2026-10-16.

**❓ Do I need a login, cookies or an API key?**
No. The Actor reads public Pornhub pages only, so you do not provide a Pornhub account, cookies or an API key. You only need a free Apify account to start a run, and you can use the Apify API or the Apify client for Python or JavaScript if you prefer code. The Actor uses the Apify datacenter proxy automatically when Pornhub blocks a direct request.

**❓ Does it download videos or streams?**
No. The Actor never returns video files, stream or preview links, or comments. It returns text, numbers and public page links. Thumbnail links are plain text that point to the Pornhub image servers, and many expire after about a day. You can turn the thumbnail column off with the Include thumbnails option for a leaner export.

**❓ Can I scrape Pornhub videos by keyword or sort by most viewed?**
Yes. For a keyword, choose Videos, add the term to Search terms and start. Pornhub robots.txt allows only the default search order, so keyword searches return best match for up to 10 pages. To sort by newest, most viewed or top rated, filter by period, or pick professional or homemade, leave Search terms empty and the Actor reads the Pornhub rankings instead.

**❓ How many results can I get?**
It depends on the source. A keyword search stops at 10 pages (447 videos for "massage" in tests). Rankings and the uploads of a channel or model page go up to 80 pages. The channels list is a ranking of 36 channels per page and the categories list has about 105 entries. Free accounts are capped at 10 rows per run, and paid accounts can set Max Items up to 1,000,000.

**❓ How do I get only new records on a schedule?**
Turn on **Only new records**, then schedule the run in the Apify Console. Each run returns only records that earlier runs of the same search have not returned, and skipped records are not charged. Use State key to run several independent monitors with identical filters, and Reset seen records to start again from zero. This gives you a daily change feed.

**❓ Is it legal to scrape Pornhub?**
The Actor reads publicly available pages, does not log in and respects robots.txt. The terms of use of Pornhub limit automated access, so you are responsible for using the data in line with those terms and local law. The Actor is for adults and lawful use only, returns metadata and never media, and refuses search terms that refer to minors. This is not legal advice.

**❓ How do I use it with the API or Python?**
Call the Actor with the Apify API or the Apify client for Python or JavaScript, pass the same JSON as in the input example, and read the dataset items when the run ends. You can also use curl against the Apify REST API, or connect the results to Make, Zapier or n8n. Each run exposes five dataset views plus a full-data view.

### 🔗 Recommended Actors

- [XVideos Scraper](https://apify.com/RecordsData/xvideos-scraper): the same metadata approach for XVideos, to compare titles, views and rankings across two large video sites.
- [XNXX Scraper](https://apify.com/RecordsData/xnxx-scraper): video and ranking data from XNXX, useful for broader trend tracking.
- [Chaturbate Scraper](https://apify.com/RecordsData/chaturbate-scraper): public live-cam model data, for audience research beyond recorded video.

> 💡 **Pro Tip:** browse the complete [RecordsData collection](https://apify.com/RecordsData) for more data scrapers.

**🆘 Need Help?** Open the Issues tab or write to contact.punkrecordsdata@gmail.com.

> **⚠️ Disclaimer:** this is an independent tool and is not affiliated with Pornhub. It reads only publicly available information and returns metadata, never media. The terms of use of Pornhub limit automated access, so use the data lawfully and at your own responsibility. For adults only.

Last updated: 2026-10-16

# Actor input Schema

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

The kind of record to return. Videos: search results and rankings. Video details: one full page per video (likes, tags, performers). Channels, Pornstars and Categories: the Pornhub rankings and category list.

## `queries` (type: `array`):

Keywords to search, one search per term. For the pornstars, channels and categories modes a term filters the list by name. Leave empty to read the Pornhub rankings. Terms that refer to minors are refused and skipped.

## `startUrls` (type: `array`):

Links copied from Pornhub: a search or category page, a video, a channel or a pornstar or model page. A video link returns that video. A channel or pornstar link returns its uploads in the video modes and its profile in every other mode. Listing links return their videos. Index links (channels, pornstars, categories) return that list.

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

Maximum number of rows to return across all terms. Free users are limited to 10 rows (preview). Paid users can raise it up to 1,000,000.

## `sortBy` (type: `string`):

Order of the video results. Best match keeps the site default. Newest, most viewed and top rated work when no search terms are given: the Pornhub robots.txt allows no other sorted search, so searches with terms return best match. Each row states the sort that was really applied.

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

Period for the most viewed and top rated sorts (when no search terms are given).

## `duration` (type: `string`):

Keep only videos of this length. On searches the length is checked on the rows that come back.

## `producer` (type: `string`):

Professional studios or homemade content. Works when no search terms are given.

## `enrichProfiles` (type: `boolean`):

In the channel and pornstar modes, open every profile page to add exact totals, subscribers, country, description and badges. Turn it off for a faster run that only returns the list columns.

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

Add the thumbnail image link of each record as the first column. Turn it off for leaner exports. The links point to the site image servers and some expire after a day.

## `onlyNew` (type: `boolean`):

Only new records: skip every record this same search already returned in an earlier run, so scheduled runs return just what changed and you are not charged for skipped records. Max Items then means N new records. Off by default.

## `stateKey` (type: `string`):

Optional label for the monitor state. Use a different label to run several independent monitors with identical filters. Leave empty to share state between runs of the same search.

## `resetSeen` (type: `boolean`):

Clear the stored list of already-seen records for this search (and Monitor name) before the run starts, so everything counts as new again.

## Actor input object example

```json
{
  "mode": "videos",
  "queries": [
    "massage"
  ],
  "maxItems": 10,
  "sortBy": "relevance",
  "period": "alltime",
  "duration": "any",
  "producer": "any",
  "enrichProfiles": true,
  "includeThumbnails": true,
  "onlyNew": false,
  "stateKey": "",
  "resetSeen": false
}
```

# Actor output Schema

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

One row per video: title, link, duration, views, uploader and thumbnail.

## `videoDetails` (type: `string`):

One row per video page: likes, comments, categories, tags and performers.

## `channels` (type: `string`):

One row per channel or studio: rank, subscribers, videos and total views.

## `pornstars` (type: `string`):

One row per pornstar or model: rank, audience numbers and videos.

## `categories` (type: `string`):

One row per category or tag: link and video count.

## `fullData` (type: `string`):

Complete dataset with all 45 fields of every record type

# 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 = {
    "queries": [
        "massage"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("recordsdata/pornhub-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 = {
    "queries": ["massage"],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("recordsdata/pornhub-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 '{
  "queries": [
    "massage"
  ],
  "maxItems": 10
}' |
apify call recordsdata/pornhub-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,recordsdata/pornhub-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/xfzUTXmzEuo7CEObN/builds/14ITSVBG1xccYEsZO/openapi.json
