# XVideos Scraper: Videos, Channels, Pornstars & Search Ideas (`recordsdata/xvideos-scraper`) Actor

Scrape XVideos videos, video details, channels, pornstars, tags and search suggestions with result counts: views, ratings, ranks, subscribers and upload dates. Metadata only, no login. Export CSV, Excel, JSON or XML.

- **URL**: https://apify.com/recordsdata/xvideos-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)

## 🎥 XVideos Scraper - Video, Channel, Pornstar, Tag and Search Suggestion Data - RecordsData

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

> 🚀 **Export XVideos video, channel and keyword data in seconds.** 6 record types and 43 fields. Filter by sort, upload period, length and quality, expand search suggestions, and get only what changed since your last run.

**XVideos Scraper** reads the public pages of XVideos and turns them into clean, flat rows for market research, keyword research 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. Every value XVideos withholds is marked `Not Disclosed`, so a column never silently turns empty.

### 📋 What the XVideos 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, quality, views, uploader |
| Video details | Videos plus rating, likes, dislikes, comments count, upload date, tags, performers |
| Channels | Rank, subscribers, video count, total views, profile views, country, signup date |
| Pornstars | Rank, gender, subscribers, video count, total views, country |
| Tags | Name, link and video count (about 2,000 tags) |
| Search suggestions | Keyword idea, position and number of results |

Search by keyword, paste links copied from XVideos (a search, a tag, a video, a channel or a model page), or leave both empty to read the best of the last full month.

### 🧾 XVideos Scraper input

All fields are optional. The defaults return 10 videos.

| Field | Type | Default | What it does |
|---|---|---|---|
| `mode` | string | `videos` | `videos`, `videoDetails`, `channels`, `pornstars`, `categories` or `suggestions` |
| `queries` | array | `["massage"]` prefill | Search terms, one search each; seed words in suggestions mode. Empty reads the best of the month |
| `startUrls` | array | empty | Links copied from XVideos: search, tag, video, channel, model or index page |
| `maxItems` | integer | 10 | Maximum rows across all terms (1 to 1,000,000). Free accounts are capped at 10 |
| `sortBy` | string | `relevance` | `relevance`, `newest`, `views`, `rating` or `longest` |
| `period` | string | `alltime` | `alltime`, `today`, `week`, `month`, `3months`, `6months` |
| `duration` | string | `any` | `any`, `10-20`, `over-10`, `over-20` (minutes) |
| `quality` | string | `any` | `any`, `hd` or `fullhd` |
| `enrichProfiles` | boolean | `true` | Open each channel or pornstar profile for exact totals and country |
| `expandSuggestions` | boolean | `false` | Repeat each seed word with letters a to z for more ideas |
| `includeThumbnails` | boolean | `true` | Add the thumbnail link as the first column |
| `onlyNew` | boolean | `false` | Monitor mode: skip records an earlier run of the same search returned |
| `stateKey` | string | empty | Optional monitor name for independent monitors |
| `resetSeen` | boolean | `false` | Clear the seen-records list before the run |

Minimal example input:

```json
{
  "mode": "videos",
  "queries": ["yoga"],
  "sortBy": "views",
  "period": "month",
  "maxItems": 100
}
```

### 📊 Output

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

| Record type | Field | Type | Example |
|---|---|---|---|
| video | `videoId` | string | `60648511` |
| video | `title` | string | `HD massage` |
| video | `url` | string | `https://www.xvideos.com/video.kvdpckf91ac/hd_massage` |
| video | `durationSeconds` | number | `1560` |
| video | `quality` | string | `1080p` |
| video | `views` | number | `3500000` |
| video | `uploaderName` | string | `Radical Pictures` |
| video-detail | `likes`, `dislikes` | number | `173`, `61` |
| video-detail | `ratingPercent`, `commentsCount` | number | `100`, `5` (the rating is the figure shown on the page, so 173 likes and 61 dislikes still show 100) |
| video-detail | `publishedAt` | string | `2011-10-19` |
| video-detail | `tags`, `performers` | array | `["massage"]` |
| channel | `name` | string | `Mhgf` |
| channel | `rank` | number | `1` |
| channel | `country` | string | `Peru` |
| channel | `subscribers` | number | `139169` |
| channel | `videosCount` | number | `425` |
| channel | `totalViews` | number | `109672498` |
| pornstar | `name`, `gender`, `rank` | string, number | same shape as channel rows |
| category | `name`, `url`, `videosCount` | string, number | tag name, link, count |
| keyword-suggestion | `suggestion` | string | `milf` |
| keyword-suggestion | `position` | number | `1` |
| keyword-suggestion | `resultsCount` | number | `84617` |

Real record from a run (search suggestion, seed "milf"):

```json
{"recordType": "keyword-suggestion", "site": "XVideos", "suggestion": "milf", "seedKeyword": "milf", "position": 1, "resultsCount": 84617, "scrapedAt": "2026-10-16T14:52:32.825Z", "error": null}
```

Export the dataset as CSV, Excel, JSON, XML or HTML from the Storage tab, or read it through the Apify API.

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

The XVideos Scraper uses pay per event pricing: **$20 per 1,000 records**, whatever the mode. Apify platform usage is not billed on top. Failed rows, rows skipped by **Only new records** and empty runs are not charged.

| Event | Charged for | Price |
|---|---|---|
| `video` | One video row from a search, ranking or listing | $0.02 |
| `video-detail` | One full video page | $0.02 |
| `channel` | One channel row | $0.02 |
| `pornstar` | One pornstar or model row | $0.02 |
| `category` | One tag row | $0.02 |
| `keyword-suggestion` | One search suggestion | $0.02 |

| Example run | Cost |
|---|---|
| 100 videos for one keyword | 100 x $0.02 = $2.00 |
| Top 1,000 channels | 1,000 x $0.02 = $20.00 |

Free Apify accounts include monthly credit and a preview of up to 10 rows per run, so you can test the output before paying. Set a maximum cost per run in the Apify Console to cap spending.

### ✨ Why choose this Actor

- **Six record types** in one consistent schema, with `Not Disclosed` instead of empty cells.
- **Real filters:** sort, upload period, length and HD or Full HD.
- **Monitor mode:** scheduled runs return just what changed, and skipped records are free.

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

Prices come from each Actor's public Store page on 2026-10-16.

| | This Actor | scrapers_lat XVideos Video Metadata & Search Scraper | hello.datawizards Xvideos Scraper Bulk Scraper Pro | hello.datawizards Xvideos Scraper |
|---|---|---|---|---|
| Price | $20 per 1,000 records | from $6.15 per 1,000 results (cheaper) | $2.00 per 1,000 results (cheaper) | from $0.005 per start, other events not shown |
| Record types | 6 | Videos, optional details | Videos only | Videos only |
| Search suggestions | Yes | Not shown | Not shown | Not shown |
| Channel and pornstar rankings | Yes | Not shown | Not shown | Not shown |
| Monitor mode | Yes | Not shown | Not shown | Not shown |

For a cheap list of videos for a keyword, the cheaper Actors fit. This one costs more per record and adds channel, pornstar, tag and keyword data.

### 🚀 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 XVideos links, or leave both empty.
4. Optional: set sort, period, length and quality filters.
5. Set **Max Items**. Free accounts return up to 10 rows as a preview.
6. Press **Start**, then download the results from the **Output** tab.

Python with the Apify client:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("RecordsData/xvideos-scraper").call(run_input={"mode": "videos", "queries": ["yoga"], "maxItems": 100})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["views"])
```

### 💼 Business use cases

- **Trend research:** run tags and pornstars weekly and store the ranks.
- **Keyword strategy:** take suggestions for a seed word, then videos sorted by views.
- **Competitive benchmarking:** compare subscribers and total views of studios.
- **Ranking history:** schedule channels daily to build a rank history.

### 🔌 Automating the scraper

- **Make, Zapier and n8n:** start a run on a timer and push each new row to a spreadsheet, database or Slack.
- **Sheets, Airbyte, BigQuery, webhooks:** export or load every run.
- **API with curl:** `POST https://api.apify.com/v2/acts/RecordsData~xvideos-scraper/runs` with the input JSON and your token.

Pair scheduled runs with **Only new records** for a daily change feed.

### 🤖 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/xvideos-scraper`. Example prompt:

> Use the XVideos Scraper to list the 20 most viewed videos for "yoga" this month, then get the keyword suggestions for "yoga" with their result counts, and tell me which ideas have the most results.

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

The Actor reads only public pages, never logs in and never bypasses a paywall. It checks the robots.txt of XVideos and skips every disallowed path. The terms of use of XVideos limit automated access, so you are responsible for following those terms and the law where you live. This is not legal advice. The Actor is for adults and lawful use only: search terms that refer to minors are refused, and matching records are dropped. No video files, streams, comments, real names or contact data are returned.

| Limit | Value |
|---|---|
| Free account | Up to 10 rows per run (preview) |
| Max Items | 1 to 1,000,000 on paid accounts |
| Pages per search or listing | Up to 80 result pages |
| Tags | About 2,000 in total |
| Thumbnail links | Can expire after about a day |

### ❓ Frequently Asked Questions

**❓ What does the XVideos Scraper do?**
It exports public metadata from XVideos as CSV, Excel, JSON or XML. It covers six record types: videos, video details, channels, pornstars, tags and keyword suggestions. Each run returns one record type, chosen with the What to collect field. It returns text, numbers and public links only, never video files, and needs no login, cookies or API key.

**❓ Do I need a login, cookies or an API key?**
No. The XVideos Scraper reads public pages only, so you do not need an XVideos account, session cookies or a site API key. You only need a free Apify account to start a run. The Actor handles request pacing and robots.txt rules on its own during every run, so there is nothing else to configure.

**❓ Does it download videos or streams?**
No. The Actor never returns video files, stream links, preview clips or comments. Each row holds titles, counts, ranks, tags, dates and public page links. Thumbnail links are plain text that point to the XVideos image servers and are never rendered or downloaded. Every export stays metadata only.

**❓ How much does the XVideos Scraper cost per 1,000 results?**
It costs $20 per 1,000 records, which is $0.02 per record, for every record type. A run of 100 videos costs $2.00 and 1,000 channels cost $20.00. Apify platform usage is not billed on top. Failed rows, skipped repeats in monitor mode and empty runs are free, and free accounts can preview 10 rows.

**❓ Can I scrape XVideos by keyword?**
Yes. Choose Videos, add your keyword to Search terms and press Start. You can sort by newest, most viewed, top rated or longest, and filter by upload period, video length and HD or Full HD quality. Each result row states the sort that was really applied. Several keywords run as separate searches in one run.

**❓ How many results can I get?**
It depends on the search term. The Actor reads up to 80 result pages per search: in tests "yoga" returned 1,984 videos at the 80-page cap. XVideos thins out later pages for some terms, and "massage" ended at 56 videos. For deep coverage use several specific terms. Channel and model uploads follow the same 80-page limit.

**❓ Can I get search suggestions and keyword ideas?**
Yes. Choose Search suggestions and give a seed word. Each idea comes back with its position and the number of results behind it, which helps you rank topics by demand. Turn on Expand suggestions to also try the seed word followed by each letter from a to z, at one extra request per letter.

**❓ Why are some fields marked Not Disclosed or N/A?**
`Not Disclosed` means XVideos offers the field but withheld it for that record, for example a channel with no public video count. `N/A` means the field does not apply to the run, for example Search Query when you read a ranking.
**❓ 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 delivered, and skipped repeats are not charged. Max Items then counts new records. Use the Monitor name field for independent monitors and Reset seen records to start over.

**❓ Is it legal to scrape XVideos?**
The Actor reads public pages, does not log in and follows the robots.txt rules of the site. The terms of use of XVideos limit automated access, so you are responsible for using the data in line with those terms and with the law where you live. It is meant for adults and lawful use only. This is not legal advice.

**❓ How do I use it with the API or Python?**
Call the Actor with the Apify API, curl, or the Apify client for Python or JavaScript. Send the same JSON input shown in the example above, wait for the run to finish, then read the default dataset items. The Python snippet in the How to use section shows the full flow.

### 🔗 Recommended Actors

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

- [XNXX Scraper](https://apify.com/RecordsData/xnxx-scraper): same metadata approach for XNXX, to compare keyword demand across two tube sites.
- [Pornhub Scraper](https://apify.com/RecordsData/pornhub-scraper): videos, channels and performer data from Pornhub, to cross-check rankings.
- [Chaturbate Scraper](https://apify.com/RecordsData/chaturbate-scraper): live cam room and performer metadata, for the live side of adult audience research.

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

> **⚠️ Disclaimer:** this is an independent tool and is not affiliated with XVideos. It reads only publicly available information and returns metadata, never media. The terms of use of XVideos 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 listings. Video details: one full page per video (likes, tags, performers). Channels, Pornstars and Categories: the XVideos rankings and tag list. Search suggestions: keyword ideas for a seed word.

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

Keywords to search, one search per term. In the suggestion mode each term is the seed word. For the pornstars, channels and categories modes a term filters the list by name. Leave empty to read the XVideos best of the month. Terms that refer to minors are refused and skipped.

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

Links copied from XVideos: a search or tag page, a video, a channel or a pornstar 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, tags) 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. Each row states the sort that was really applied.

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

Upload date filter for searches (today, week, month, 3 months, 6 months).

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

Keep only videos of this length.

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

Keep only HD or Full HD videos.

## `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.

## `expandSuggestions` (type: `boolean`):

In the suggestion mode, repeat each seed word followed by every letter from a to z to collect many more keyword ideas. One extra request per letter.

## `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",
  "quality": "any",
  "enrichProfiles": true,
  "expandSuggestions": false,
  "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, dislikes, comments, 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.

## `suggestions` (type: `string`):

One row per keyword idea with its position and result count.

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

Complete dataset with all 43 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/xvideos-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/xvideos-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/xvideos-scraper --silent --output-dataset

```

## MCP server setup

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