# XVideos Scraper - Video Metadata, Tags & Views (`scrapers_lat/xvideos-scraper`) Actor

XVideos scraper for public video metadata with no API key. Export title, exact views, rating, up/down votes, comments, duration, tags, pornstars, upload date, HD quality and direct video URLs by search, tag/category or channel. Sort and paginate. Clean JSON, CSV or Excel.

- **URL**: https://apify.com/scrapers_lat/xvideos-scraper.md
- **Developed by:** [Scrapers Lat](https://apify.com/scrapers_lat) (community)
- **Categories:** Other, Automation, Developer tools
- **Stats:** 28 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.15 / 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

[![XVideos Video Metadata & Search Scraper](https://scrapers.lat/banners/xvideos-scraper.png)](https://console.apify.com/actors/9RyhEA86IcAc2xVsa/input)

## XVideos Scraper - Video Metadata, Tags, Views & Ratings

The most complete **XVideos scraper** for public **video metadata**, with **no API key** required. Export title, exact view count, rating percent, up and down votes, comment count, duration, tags, credited pornstars, upload date, HD quality flag and direct video and preview URLs, by search keyword, tag/category or channel/pornstar profile. Results come back as clean JSON, CSV or Excel for content analytics, trend research and catalog building.

Here is one representative real result, with every field the actor returns when `withDetails` is on:

```json
{
  "videoId": "opmvtmk282b",
  "videoIdNumeric": 90673267,
  "title": "Yoga Whore Needs Big Cock To Stretch And Open Her Cunt",
  "url": "https://www.xvideos.com/video.opmvtmk282b/yoga_whore_needs_big_cock_to_stretch_and_open_her_cunt",
  "durationSeconds": 1044,
  "views": 543200,
  "ratingPercent": 100,
  "votes": 2208,
  "votesUp": 1800,
  "votesDown": 407,
  "commentsCount": 7,
  "isHD": true,
  "maxQuality": "1440p",
  "hasClosedCaptions": true,
  "uploadedAt": "2026-07-07T22:00:00+00:00",
  "uploader": "POVD",
  "uploaderUrl": "https://www.xvideos.com/povd",
  "uploaderType": "channel",
  "pornstars": ["David Lee Xxx", "Thea Summers"],
  "pornstarUrls": [
    "https://www.xvideos.com/models/david_lee_xxx-model",
    "https://www.xvideos.com/models/thea-summers-model1"
  ],
  "tags": ["blonde", "sexy", "petite", "blowjob", "riding", "yoga", "POV", "small-tits"],
  "description": "Yoga Whore Needs Big Cock To Stretch And Open Her Cunt",
  "thumbnail": "https://thumb-cdn77.xvideos-cdn.com/c30fc53d-3ac8-4d9c-bd16-d8af36905037/5/xv_10_t.jpg",
  "previewVideoUrl": "https://thumb-cdn77.xvideos-cdn.com/c30fc53d-3ac8-4d9c-bd16-d8af36905037/5/preview.mp4",
  "videoFileUrl": "https://mp4-cdn77.xvideos-cdn.com/c30fc53d-3ac8-4d9c-bd16-d8af36905037/5/mp4_sd.mp4?secure=...",
  "observedAt": "2026-09-04T14:03:05.759Z",
  "error": null
}
```

**📥 [Input](https://apify.com/scrapers_lat/xvideos-scraper/input-schema) · 📤 [Output](https://apify.com/scrapers_lat/xvideos-scraper/output-schema) · 💰 [Pricing](https://apify.com/scrapers_lat/xvideos-scraper/pricing) · ▶️ [Examples](https://apify.com/scrapers_lat/xvideos-scraper/examples)**

![Apify](https://img.shields.io/badge/Platform-Apify-1CE1CE?logo=apify\&logoColor=white)
![Coverage](https://img.shields.io/badge/Coverage-Global-blue)
![Output](https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20Excel-orange)
![Billing](https://img.shields.io/badge/Billing-Pay%20per%20result-brightgreen)

### Table of contents

- [What it does](#what-it-does)
- [Why this scraper](#why-this-scraper)
- [Quickstart](#quickstart)
- [Input reference](#input-reference)
- [Output reference](#output-reference)
- [Comparison with other XVideos actors](#comparison-with-other-xvideos-actors)
- [Use cases](#use-cases)
- [Run via API and CLI](#run-via-api-and-cli)
- [Fetch results](#fetch-results)
- [Billing and limits](#billing-and-limits)
- [FAQ and troubleshooting](#faq-and-troubleshooting)

### What it does

This **XVideos data scraper** loads a public search, tag/category or channel/pornstar listing, paginates through it, and writes one normalized record per video to the run dataset. When `withDetails` is on, it also opens each video page to add the exact view count, rating percent, up and down votes, comment count, upload date, description, direct preview and video-file URLs, and the structured `pornstars` and `tags` lists.

Every record is deduplicated across pages, dates are normalized to ISO 8601, and missing source values are returned as `null`, never invented. This is an adult site, so only public listing and video-page metadata is collected. No login, no official API and no API key are used.

### Why this scraper

- **Widest field coverage.** View count, rating percent, up/down votes, comment count, tags, credited pornstars with profile URLs, HD quality, closed-caption flag, upload date and direct media URLs, not just the six listing fields other actors stop at.
- **Three source types.** Search keyword, tag/category, or channel/studio/model/pornstar profile, with sort by relevance, newest, rating, views or longest.
- **No API key, no browser.** Fast HTTP collection with rotating proxy support and pay-per-result billing.
- **Analyst-ready output.** Stable columns in every row (honest `null` when a value is absent), export to JSON, CSV or Excel.

### Quickstart

Open the actor, paste this into the input, and press Run. It searches for `yoga` and fetches video details.

```json
{
  "searchQuery": "yoga",
  "maxVideos": 25,
  "withDetails": true
}
```

Pick exactly one source: `searchQuery`, `tag`, or `channel`. If more than one is filled, the first non-empty in that order is used.

### Input reference

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `searchQuery` | string | no | (empty) | Keyword to search public videos, for example `yoga`, `cars`. |
| `tag` | string | no | (empty) | Public tag/category slug, for example `milf` from `/tags/milf`. Ignored when a search query is set. |
| `channel` | string | no | (empty) | Channel, studio, model or pornstar profile slug, for example `brazzers` from `/channels/brazzers`. Ignored when a higher-priority source is set. |
| `sort` | enum | no | `relevance` | `relevance`, `uploadDate`, `rating`, `views`, or `longest`. Applies to search and channel sources. |
| `maxVideos` | integer | no | `10` | Maximum number of videos to collect. Free Apify plans are capped at 10 per run. |
| `withDetails` | boolean | no | `true` | When on, each video page is opened to add exact views, rating, votes, comments, upload date, description, tags, pornstars and media URLs. Off returns listing-level fields only (faster). |
| `proxy` | object | no | Apify proxy | Standard Apify proxy configuration. XVideos rate limits per IP, so a rotating residential proxy is recommended for large runs. |

Provide exactly one source. Sources do not combine.

### Output reference

One dataset item per video. Every row carries every field below (listing-level fields are always populated; detail fields are filled when `withDetails` is on, otherwise `null`). Types: `string`, `integer`, `boolean`, `string[]`, or `null` when the source value is absent.

| Field | Type | Description |
|---|---|---|
| `videoId` | string | XVideos short video ID (from the video URL). |
| `videoIdNumeric` | integer | Numeric internal video ID (stable join key). |
| `title` | string | Video title. |
| `url` | string | Video page URL. |
| `durationSeconds` | integer | Duration in seconds. |
| `views` | integer | View count (exact when detail is on). |
| `ratingPercent` | integer | Positive-rating percentage (detail only). |
| `votes` | integer | Total vote count (detail only). |
| `votesUp` | integer | Positive votes (detail only). |
| `votesDown` | integer | Negative votes (detail only). |
| `commentsCount` | integer | Number of public comments (detail only). |
| `isHD` | boolean | Whether the video carries an HD quality badge. |
| `maxQuality` | string | Highest advertised quality, for example `1080p`, `1440p` (listing sources). |
| `hasClosedCaptions` | boolean | Whether closed captions are available (listing sources). |
| `uploadedAt` | string | Upload date/time in ISO 8601 (detail only). |
| `uploader` | string | Uploader, channel or studio name. |
| `uploaderUrl` | string | Uploader profile URL. |
| `uploaderType` | string | Uploader type, for example `channel`, `model`, `pornstar`, `profile`. |
| `pornstars` | string\[] | Credited pornstars/models (detail only). |
| `pornstarUrls` | string\[] | Profile URLs of the credited pornstars/models, aligned by index (detail only). |
| `tags` | string\[] | Tags/keywords for the video (detail only). |
| `description` | string | Video description (detail only). |
| `thumbnail` | string | Thumbnail image URL. |
| `previewVideoUrl` | string | Animated preview clip URL. |
| `videoFileUrl` | string | Direct MP4 file URL from the video page (detail only). |
| `observedAt` | string | ISO 8601 timestamp of when the record was collected. |
| `error` | string | `null` on success. If a single video's detail page fails, the listing-level record is still returned with a short `error` note. |

### Comparison with other XVideos actors

| Capability | This actor | Typical "xvideos scraper" (keyword only) | XVideos downloader actors |
|---|---|---|---|
| Search keyword | Yes | Yes | Sometimes |
| Tag / category source | Yes | No | No |
| Channel / studio / pornstar source | Yes | No | No |
| Sort (relevance, newest, rating, views, longest) | Yes | No | No |
| Title, URL, duration, thumbnail, uploader, views | Yes | Yes | Partial |
| Exact views, rating percent, votes up/down | Yes | No | No |
| Comment count | Yes | No | No |
| Tags and credited pornstars (with profile URLs) | Yes | No | No |
| Upload date | Yes | No | No |
| HD flag, max quality, closed-caption flag | Yes | No | Partial |
| Direct video-file and preview URLs | Yes | No | Yes |
| Cross-page deduplication | Yes | Varies | n/a |
| Pay per result, no API key | Yes | Yes | Yes |

Named keyword-only actors return only title, video URL, duration, thumbnail, uploader and views from search results and do not open video pages. This actor accepts all of their inputs and returns all of their outputs, plus the detail-page and quality fields above.

### Use cases

- **Content and trend analytics.** Track views, ratings, votes and comment counts across tags or channels over time.
- **Catalog and recommendation building.** Pull structured metadata, tags and pornstar credits into a database.
- **Market and competitor research.** Compare studios/channels by output volume, engagement and HD share.
- **Dataset creation.** Build labeled adult-content metadata datasets with stable, typed columns.

### Run via API and CLI

Start a run and wait for it to finish, then read the dataset. Replace `<TOKEN>` with your Apify API token.

Run synchronously and get dataset items in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~xvideos-scraper/run-sync-get-dataset-items?token=<TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"searchQuery":"yoga","maxVideos":25,"withDetails":true}'
```

Start a run asynchronously:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~xvideos-scraper/runs?token=<TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"tag":"amateur","sort":"views","maxVideos":100}'
```

Apify CLI:

```bash
apify call scrapers_lat/xvideos-scraper \
  --input '{"channel":"brazzers","maxVideos":50}'
```

### Fetch results

Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing `format`:

```bash
## JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"

## CSV
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"

## Paginate large datasets
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
```

`<DATASET_ID>` is returned as `defaultDatasetId` in the run object. Use `offset` and `limit` to page through large result sets. `clean=true` drops empty and internal fields.

### Billing and limits

- **Pay per result.** You are charged per video record returned (`result` event). When `withDetails` is on and a detail page is fetched successfully, an additive `details` event is also charged. See the [pricing tab](https://apify.com/scrapers_lat/xvideos-scraper/pricing) for current prices.
- **No charge on failure.** If a run errors, the actor writes an item with a populated `error` field and does not charge for it. Empty runs cost nothing.
- **Spend cap respected.** Set `maxTotalChargeUsd` on the run; once reached, the actor stops emitting and charging further billable results.
- **Free Apify plans** are capped at 10 records per run and return listing-level fields only. Upgrade for higher `maxVideos` and detail-page enrichment.
- **Rate limits.** XVideos rate limits per IP. Keep a rotating (residential) proxy on for large runs.

### FAQ and troubleshooting

**Do I need an API key or login?**
No. The actor reads only public listing and video pages. There is no XVideos API key and no login.

**A run returned 0 records. Why?**
The search, tag or channel matched nothing, or the source rate-limited the run. Keep the proxy on, lower `maxVideos`, or try a different keyword. Zero-result runs are not charged.

**Some records have an `error` note but still have data. Why?**
When a single video's detail page fails to load, the listing-level record is still returned with a short `error` note so you keep the row. The base listing fields are always present, and the `details` add-on is not charged for that row.

**Can I get the direct video file URL?**
Yes. With `withDetails` on, each record carries `videoFileUrl` and `previewVideoUrl` parsed from the video page. These are time-signed CDN URLs and expire.

**Which sources can I combine?**
None; pick exactly one of `searchQuery`, `tag`, or `channel`. If more than one is set, the first non-empty in that order is used.

**Is this an official XVideos tool?**
No. This actor is independent and has no affiliation with XVideos. It reads only publicly available listing and video-page metadata.

### Related scrapers

- [xHamster Video Metadata & Search Scraper](https://apify.com/scrapers_lat/xhamster-scraper): search and video metadata from xHamster.

### More scrapers at scrapers.lat

Built and maintained by [scrapers.lat](https://scrapers.lat), where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at [scrapers.lat](https://scrapers.lat).

***

> Independent tool, not affiliated with XVideos. Accesses only publicly available data.

# Actor input Schema

## `maxVideos` (type: `integer`):

Maximum number of videos to collect. Optional.

## `withDetails` (type: `boolean`):

When enabled, the scraper opens each video page to add exact views, rating percent, vote count, upload date, description and tags. When disabled, only the listing level fields are returned (faster).

## `searchQuery` (type: `string`):

Keyword to search public videos for, for example "yoga" or "cars". Leave empty to use a tag/category or a channel/profile instead.

## `tag` (type: `string`):

Public tag or category slug from the URL, for example "milf" or "amateur" from xvideos.com/tags/milf. Ignored when a search query is set.

## `channel` (type: `string`):

Public channel, studio, model or pornstar profile slug from the URL, for example "brazzers" from xvideos.com/channels/brazzers or xvideos.com/profiles/brazzers. Ignored when a higher priority source is set.

## `sort` (type: `string`):

Order of the listing results. Applies to search and channel sources.

## `proxy` (type: `object`):

Optional. XVideos rate limits per IP, so a rotating proxy helps on large runs. Leave the default to use Apify proxy.

## Actor input object example

```json
{
  "maxVideos": 10,
  "withDetails": true,
  "searchQuery": "cars",
  "sort": "relevance",
  "proxy": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "maxVideos": 10,
    "searchQuery": "cars",
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers_lat/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 = {
    "maxVideos": 10,
    "searchQuery": "cars",
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapers_lat/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 '{
  "maxVideos": 10,
  "searchQuery": "cars",
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call scrapers_lat/xvideos-scraper --silent --output-dataset

```

## MCP server setup

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