# XNXX Scraper: Videos, Pornstars, Tags & Search Suggestions (`recordsdata/xnxx-scraper`) Actor

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

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

## 🏷️ XNXX Scraper - Video, Pornstar, Tag and Search Suggestion Data - RecordsData

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

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

Coverage: **6 record types**, **36 output fields**, **7 dataset views**. Every value XNXX withholds is marked `Not Disclosed`, so a column never silently turns empty.

### 📋 What the XNXX Scraper does

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

| Mode | Record type | Each row holds |
|---|---|---|
| Videos | video | Title, link, thumbnail, duration, quality, views, rating, uploader |
| Video details | video-detail | Video fields plus likes, dislikes, comments count, upload date, tags |
| Makers (from a pasted maker link) | channel (maker) | Name, link, thumbnail and video count, from a pasted maker link |
| Pornstars and models | pornstar | Rank, video count and total views |
| Tags (tag list with video counts) | category (tag) | Name, link and video count |
| Search suggestions | keyword-suggestion | Keyword idea, position and number of results |

You can search by keyword, paste links copied from XNXX (a search, a tag, a video, a maker or a pornstar page), or leave both empty to read the best of the last full month. XNXX publishes no list of makers, so the Makers mode works from pasted maker links.

### ⚙️ XNXX Scraper input

| Field | Type | Default | What it does |
|---|---|---|---|
| `mode` | string | `videos` | Record type to return: `videos`, `videoDetails`, `channels`, `pornstars`, `categories` or `suggestions`. |
| `queries` | array of strings | empty | Search terms, one search each. In suggestions mode each term is the seed word. In pornstars and tags modes a term filters the list by name. |
| `startUrls` | array of links | empty | Links copied from XNXX: a search, tag, video, maker or pornstar page. |
| `maxItems` | integer | 10 | Maximum rows across all terms. Free accounts are limited to 10 rows (preview). Paid accounts can raise it up to 1,000,000. |
| `sortBy` | string | `relevance` | `relevance` (best match) or `views` (most viewed). |
| `period` | string | `alltime` | `alltime`, `month` or `year`. |
| `duration` | string | `any` | `any`, `10-20`, `over-10` or `over-20` minutes. |
| `quality` | string | `any` | `any`, `hd` or `fullhd`. |
| `enrichProfiles` | boolean | true | In pornstar and maker modes, open each profile page for exact totals. Off is faster. |
| `expandSuggestions` | boolean | false | Repeat each seed word followed by letters a to z. One extra request per letter. |
| `includeThumbnails` | boolean | true | Add the thumbnail link as the first column. |
| `onlyNew` | boolean | false | Monitor mode: skip records already returned by an earlier run of the same search, and do not charge for them. |
| `stateKey` | string | empty | Optional monitor name, to run several independent monitors with the same filters. |
| `resetSeen` | boolean | false | Clear the stored seen records for this search before the run. |

Minimal example input:

```json
{
  "mode": "videos",
  "queries": [
    "office"
  ],
  "sortBy": "views",
  "period": "month",
  "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.

| Record type | Field | Type | Example |
|---|---|---|---|
| 🎞️ video | `videoId` | string | `44371719` |
| 🎞️ video | `title` | string | `Giggly Girl Massage` |
| 🎞️ video | `url` | string | `https://www.xnxx.com/video-qf1fr6f/giggly_girl_massage` |
| 🎞️ video | `durationSeconds` | integer | `1380` |
| 🎞️ video | `quality` | string | `360p` |
| 🎞️ video | `views`, `viewsText` | integer, string | `7100000`, `7.1M` |
| 🎞️ video | `ratingPercent` | integer | `98` |
| 🔍 video-detail | video fields plus `likes`, `dislikes`, `commentsCount` | integer | `Not Disclosed` if withheld |
| 🔍 video-detail | `publishedAt`, `tags` | string, array | ISO 8601 date, list of tags |
| 📺 channel (maker) | `name`, `slug`, `url`, `type` | string | `linamigurtt` |
| 📺 channel (maker) | `videosCount` | integer | `37` |
| 📺 channel (maker) | `imageUrl` | string | profile picture link, signed, expires about 3 hours after the scrape |
| ⭐ pornstar | `name`, `slug`, `url` | string | `Alex Adams` |
| ⭐ pornstar | `rank`, `videosCount`, `totalViews` | integer | `1`, `1942`, `9150661554` |
| 🏷️ category (tag) | `name`, `slug`, `url`, `videosCount` | string, integer | tag name and its video count |
| 💡 keyword-suggestion | `suggestion`, `seedKeyword` | string | `hot milf`, `milf` |
| 💡 keyword-suggestion | `position`, `resultsCount` | integer | `1`, `171148` |
| all | `scrapedAt`, `error` | string | `2026-10-16T14:52:19.352Z`, `null` |

Real records from a run (shortened where marked):

**Video (search "massage")**

```json
{
  "recordType": "video",
  "site": "XNXX",
  "videoId": "44371719",
  "title": "Giggly Girl Massage",
  "url": "https://www.xnxx.com/video-qf1fr6f/giggly_girl_massage",
  "rank": 24,
  "sortBy": "relevance",
  "durationSeconds": 1380,
  "quality": "360p",
  "views": 7100000,
  "ratingPercent": 98,
  "uploaderName": "Gogouncensored",
  "uploaderType": "channel",
  "scrapedAt": "2026-10-16T14:51:37.899Z",
  "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 XNXX Scraper cost?

The Actor uses pay per event pricing. You pay only for rows delivered, and every record type costs the same.

| Event | Price per event | Price per 1,000 |
|---|---|---|
| video | $0.02 | $20.00 |
| video-detail | $0.02 | $20.00 |
| channel (maker) | $0.02 | $20.00 |
| pornstar | $0.02 | $20.00 |
| category (tag) | $0.02 | $20.00 |
| keyword-suggestion | $0.02 | $20.00 |

Worked examples:

- 100 videos: 100 x $0.02 = **$2.00**.
- 1,000 pornstar rows: 1,000 x $0.02 = **$20.00**.
- 50 video details plus 200 keyword suggestions: 250 x $0.02 = **$5.00**.

Every Apify account includes free monthly credit, and free accounts return up to 10 rows per run as a preview. With **Only new records** on, rows skipped as already seen are not charged.

### ✨ Why choose this Actor

- **Six record types.** Videos, video details, makers, pornstars, tags and keyword suggestions in one consistent schema.
- **Honest columns.** `Not Disclosed` means XNXX withheld the value for that record. No literal `null`, no silent gaps.
- **Monitor mode.** Scheduled runs return just what changed since the last run.
- **Built-in content policy.** Search terms that refer to minors are refused, and records that mention them are dropped before delivery.

### 📈 How it compares: vs other XNXX scrapers on Apify (read on 2026-10-16)

| Actor | What it returns | Price shown on its Store page |
|---|---|---|
| This Actor (RecordsData) | 6 record types of metadata, search suggestions, monitor mode | $0.02 per row ($20 per 1,000) |
| [solidcode/xnxx-scraper](https://apify.com/solidcode/xnxx-scraper) | XNXX scraper | $0.003 per result on Free tier ($3 per 1,000), plus $0.005 per start |
| [easyapi/xnxx-video-downloader](https://apify.com/easyapi/xnxx-video-downloader) | Video metadata plus direct download links | $0.00299 per result, plus $0.09 per start |
| [maximedupre/xnxx-video-downloader](https://apify.com/maximedupre/xnxx-video-downloader) | Saved video with source media links | $0.00265 per video on Free tier |

The three other actors are clearly cheaper per row. The two downloaders return media links, which this Actor never does. Choose this Actor when you need pornstar and tag rankings, keyword suggestions with result counts, or change tracking, and not media files. Details of what solidcode returns are not shown here.

### 🚀 How to use and business use cases

1. Open the Actor, pick **What to collect**, add search terms or links (or leave both empty), set **Max Items** and press **Start**.
2. Download the results from the Output tab as CSV, Excel, JSON or XML.

Typical use cases:

- **Trend and market research:** store tag and pornstar ranks weekly and compare movement over months.
- **Content and keyword strategy:** read suggestions for a seed word, then the most viewed videos.

### 🔌 Automating the scraper

Schedule runs from the Apify Console, trigger them with the API, and send results to the tools you already use:

- **Make and Zapier:** start a run on a timer and push each new row to a spreadsheet, a database or Slack.
- **Sheets, warehouses and webhooks:** export to Google Sheets, load BigQuery or Snowflake, or call your own endpoint when a run ends.

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

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

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

The Actor reads only public pages. It does not log in, does not use accounts or cookies, and does not bypass any paywall. It reads the robots.txt of XNXX and skips every URL that file disallows. The terms of use of XNXX limit automated access, so you are responsible for using the data in line with those terms and with local law. The Actor is for adults and lawful use only.

Limits to know:

- Free accounts return up to 10 rows per run (preview). Paid accounts can set up to 1,000,000.
- The Actor reads up to 80 result pages per search or per maker and pornstar upload list.
- It returns metadata only: no video files, streams, preview clips or comments.

This is general information and not legal advice.

### ❓ Frequently Asked Questions

**❓ What does the XNXX Scraper do?**
The XNXX Scraper exports public metadata from XNXX as CSV, Excel, JSON or XML. It covers six record types: videos, video details, makers (channels), pornstars, tags and keyword suggestions. It returns titles, links, counts, ranks, ratings and tags, never video files, streams or comments. You pick one record type per run.

**❓ How much does the XNXX Scraper cost per 1,000 results?**
It costs $20 per 1,000 results, because every record type is billed at $0.02 per event. For example, 100 videos cost $2.00 and 1,000 pornstar rows cost $20.00. Free accounts return up to 10 rows per run as a preview, and every Apify account has free monthly credit. Some other XNXX actors are cheaper per row.

**❓ Do I need a login, cookies or an API key?**
No. The Actor reads public XNXX pages only, so it needs no XNXX login, no cookies and no site API key. You only need a free Apify account to start a run. An Apify API token is needed just if you start runs from code, for example with the Apify client or curl.

**❓ Does it download videos or streams?**
No. The Actor never returns video files, stream links, preview clips or comments. It returns text, numbers and public page links. Thumbnail links are plain text that point to the XNXX image servers, and you can switch them off with Include thumbnail links. The dataset stays limited to metadata.

**❓ How many results can I get?**
It depends on the search term. The Actor reads up to 80 result pages per search, and in tests the search "massage" returned 2,841 unique videos at that cap. Maker and pornstar upload lists use the same 80-page limit. Free accounts are capped at 10 rows per run, paid accounts can set Max Items up to 1,000,000.

**❓ Does XNXX have a list of makers?**
No, XNXX publishes no index of makers, so the Makers mode works from links. Paste an XNXX porn-maker link into Start URLs and the Makers mode returns its profile row with name, link and exact video count. To read that maker's uploads, use a video mode with the same link.

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

**❓ Why are some fields marked Not Disclosed or N/A?**
`Not Disclosed` means XNXX offers the field but withheld it for that record, for example a video with no public uploader. `N/A` means the field does not apply to the run, for example Search Query when you read a ranking. Markers instead of blank cells let you tell missing data from data that does not apply.

**❓ 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 did not return, so you get a change feed instead of a full export, and skipped records are not charged. Use Monitor name to keep several monitors apart, and Reset seen to start over.

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

**❓ How do I use it with the API, Python, n8n or Make?**
Call the Actor with the Apify API or the Apify client for JavaScript or Python (`apify-client`), pass the same JSON as in the example input, and read the dataset items when the run ends. You can also start it with curl, or from n8n, Make or Zapier using the Apify integration, and call a webhook when the run finishes.

### 🔗 Recommended Actors

- [XVideos Scraper](https://apify.com/RecordsData/xvideos-scraper): the same metadata approach for XVideos, useful to compare tags and rankings across the two sites.
- [Pornhub Scraper](https://apify.com/RecordsData/pornhub-scraper): videos, pornstars and keyword data from Pornhub, for a wider market view.
- [Chaturbate Scraper](https://apify.com/RecordsData/chaturbate-scraper): public live-room metadata, for tracking audience trends outside tube sites.

> 💡 **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 XNXX. It reads only publicly available information and returns metadata, never media. The terms of use of XNXX 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). Pornstars: the XNXX pornstar ranking. Tags: the XNXX tag list with video counts. Makers: a maker profile from a pasted maker link (XNXX has no maker 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 and tags modes a term filters the list by name. Leave empty to read the XNXX best of the month. Terms that refer to minors are refused and skipped.

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

Links copied from XNXX: a search or tag page, a video, a porn-maker page or a pornstar page. A video link returns that video. A maker or pornstar link returns its uploads in the video modes and its profile in every other mode. Listing links return their videos. Index links (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. XNXX supports best match (default) and most viewed. Each row states the sort that was really applied.

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

Period filter for searches. XNXX supports this month and this year.

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

Keep only videos of this length.

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

Keep only HD or Full HD videos.

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

In the pornstar and maker modes, open every profile page to add exact totals and details. 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 and tags.

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

One row per maker profile: videos and details.

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

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

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

One row per 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 37 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/xnxx-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/xnxx-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/xnxx-scraper --silent --output-dataset

```

## MCP server setup

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