xHamster Video Metadata & Search Scraper
Pricing
from $6.15 / 1,000 results
xHamster Video Metadata & Search Scraper
Scrape public xHamster video metadata from search, category, tag, pornstar and channel pages. Export title, views, duration, rating, tags and uploader to JSON, CSV or Excel.
Pricing
from $6.15 / 1,000 results
Rating
0.0
(0)
Developer
Scrapers Lat
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
0
Monthly active users
20 hours ago
Last modified
Categories
Share
xHamster Video Metadata & Search Scraper
Here is one real result, with every field the actor returns when withDetails is on:
{"imageUrl": "https://ic-vt-nss.xhcdn.com/a/NWU2NmNjNzZiNmEyZmI3MmUyODRiMWEwMzdjZWRjNmE/s(w:1280,h:720),webp/029/970/365/v2/2560x1440.284.webp","title": "The Happy Ending is a Blowjob !","url": "https://xhamster.com/videos/the-happy-ending-is-a-blowjob-xh1q8XV","id": 29970365,"views": 111816,"durationSeconds": 2080,"uploadDate": "2026-06-25T09:01:01.000Z","isHd": true,"isFhd": true,"isUhd": false,"maxResolution": "1080p","ratingPercent": 95,"likes": 349,"dislikes": 19,"commentsCount": 7,"trailerUrl": "https://thumb-v5.xhcdn.com/a/S6zBEmCqL21Ut-q2f8uGTQ/029/970/365/526x298.94.3.4.t.mp4","videoType": "video","hasProducerBadge": false,"description": "I am a professional masseuse that can be turn on by a beautiful cock. It gets hard for me not sucking it. Client was surprised, happily surprised I guess. Best happy ending, isn't it?","uploaderType": "person","uploaderName": "happyvids33","uploaderUrl": "https://xhamster.com/creators/happyvids33","uploaderVerified": false,"uploaderSubscribers": 6488,"categories": ["French", "Amateur", "Blowjob", "Cumshot", "HD Videos", "Happy Ending", "MILF", "Massage", "Naughty"],"tags": ["Massage with Happy Ending", "Happy Ending Massage Real", "Happy Ending Massage", "Massage Parlor Happy Ending", "Xtapes To"],"pornstars": ["happyvids33"],"channels": [],"categoryLinks": ["https://xhamster.com/categories/french", "https://xhamster.com/categories/amateur", "https://xhamster.com/categories/blowjob", "https://xhamster.com/categories/cumshot", "https://xhamster.com/hd", "https://xhamster.com/categories/happy-ending", "https://xhamster.com/categories/milf", "https://xhamster.com/categories/massage", "https://xhamster.com/categories/naughty"],"tagLinks": ["https://xhamster.com/tags/massage-with-happy-ending", "https://xhamster.com/tags/happy-ending-massage-real", "https://xhamster.com/tags/happy-ending-massage", "https://xhamster.com/tags/massage-parlor-happy-ending", "https://xhamster.com/tags/xtapes-to"],"pornstarLinks": ["https://xhamster.com/creators/happyvids33"],"channelLinks": [],"thumbnailUrl": "https://ic-vt-nss.xhcdn.com/a/MzVhMDI5YmIxZjUxZmRlZmEyNjM3MDZmMzQwNWE3YTg/s(w:526,h:298),webp/029/970/365/v2/526x298.284.webp","previewUrl": "https://thumb-nss.xhcdn.com/a/9c2oXP6SW3kx-9D60Q1k8w/029/970/365/v2/16x9.284.webp","observedAt": "2026-08-15T13:59:59.986Z","error": null}
The most complete xHamster scraper available. It returns every field the xHamster listing exposes for each video, plus detail-page fields (rating, likes, dislikes, comments, HD/FHD/UHD flags, max resolution, description, trailer) and structured categories, tags, pornstars and channels with absolute profile links, and lets you scrape by search, category, tag, pornstar or channel.
📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples
Table of contents
- What it does
- Quickstart
- Input reference
- Output reference
- Example output record
- Run via API and CLI
- Fetch results
- Billing and limits
- FAQ and troubleshooting
What it does
The actor loads an xHamster search, category, tag, pornstar or channel listing, paginates through it, and writes one normalized record per video to the run's dataset. When withDetails is on, it also opens each video page to add rating, likes, dislikes, comment count, HD/FHD/UHD flags, max resolution, description, trailer URL, uploader verification and subscriber count, plus structured categories, tags, pornstars and channels with absolute profile/listing links.
Dates are normalized to ISO 8601 and missing source values are returned as null, never invented. This is an adult site; only public listing and video-page metadata is collected.
Quickstart
Open the actor, paste this into the input, and press Run. It searches for massage and fetches video details.
{"searchQuery": "massage","maxVideos": 10,"withDetails": true}
Fill exactly one of searchQuery, category, tag, pornstar or channel. If more than one is set, priority is search, then category, then tag, then pornstar, then channel.
Input reference
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
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 rating, likes, dislikes, categories, tags, description and HD flags. Off collects listing-level fields only (faster). |
searchQuery | string | no | (empty) | Keyword to search, for example massage, amateur, pov. |
category | string | no | (empty) | Category slug from a category URL, for example massage from /categories/massage. |
tag | string | no | (empty) | Tag slug from a tag URL, for example homemade from /tags/homemade. |
pornstar | string | no | (empty) | Pornstar/creator slug, for example riley-reid from /pornstars/riley-reid. |
channel | string | no | (empty) | Channel slug, for example brazzers from /channels/brazzers. |
sort | enum | no | relevance | relevance, newest, or best. Newest/best apply to category, tag, pornstar and channel listings; search always uses relevance. |
Provide exactly one target. Filters do not combine.
Output reference
One dataset item per video. Listing-level fields are always present; the rest are added when withDetails is on. Types: string, integer, boolean, string[], or null when the source value is absent.
| Field | Type | Description |
|---|---|---|
imageUrl | string | Large preview image. |
title | string | Video title. |
url | string | Video page URL. |
id | integer | xHamster video ID. |
views | integer | View count. |
durationSeconds | integer | Duration in seconds. |
uploadDate | string | Upload date/time in ISO 8601. |
isHd | boolean | true when max resolution is 720p or higher. |
isFhd | boolean | true when max resolution is 1080p or higher (detail only). |
isUhd | boolean | true when max resolution is 2160p or higher. |
maxResolution | string | Highest available resolution, for example 1080p (detail only). |
ratingPercent | integer | Positive-rating percentage (detail only). |
likes | integer | Like count (detail only). |
dislikes | integer | Dislike count (detail only). |
commentsCount | integer | Comment count (detail only). |
trailerUrl | string | Trailer/preview clip URL (detail only). |
videoType | string | Item type, for example video. |
hasProducerBadge | boolean | true when the video carries a verified-producer badge. |
description | string | Video description (detail only). |
uploaderType | string | Uploader type, for example channel, person. |
uploaderName | string | Uploader name. |
uploaderUrl | string | Uploader profile URL. |
uploaderVerified | boolean | Whether the uploader is verified (detail only), or null. |
uploaderSubscribers | integer | Uploader subscriber count when published, else null. |
categories | string[] | Category names (detail only). |
tags | string[] | Tag names (detail only). |
pornstars | string[] | Tagged pornstars/creators (detail only). |
channels | string[] | Tagged channels (detail only). |
categoryLinks | string[] | Absolute category listing URLs (detail only). |
tagLinks | string[] | Absolute tag listing URLs (detail only). |
pornstarLinks | string[] | Absolute pornstar/creator profile URLs (detail only). |
channelLinks | string[] | Absolute channel profile URLs (detail only). |
thumbnailUrl | string | Small thumbnail image. |
previewUrl | string | Animated preview URL. |
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. |
Example output record
Real record from a live run (input {"searchQuery":"massage","maxVideos":8,"withDetails":true}):
{"imageUrl": "https://ic-vt-nss.xhcdn.com/a/YmVhNDYzOGEwMTYwMDM5Y2M0ODdiZGQ5NWRjY2RlMzU/s(w:1280,h:720),webp/030/462/438/v2/2560x1440.204.webp","title": "An innocent massage turns suddenly into a hot fuck","url": "https://xhamster.com/videos/an-innocent-massage-turns-suddenly-into-a-hot-fuck-xhVm6XG","id": 30462438,"views": 29898,"durationSeconds": 1515,"uploadDate": "2026-08-13T04:22:30.000Z","isHd": true,"isFhd": true,"isUhd": false,"maxResolution": "1080p","ratingPercent": 93,"likes": 70,"dislikes": 6,"commentsCount": 0,"trailerUrl": "https://thumb-v8.xhcdn.com/a/fXnj-0uAbfP32xHC2NVWVA/030/462/438/526x298.94.3.3.t.mp4","videoType": "video","hasProducerBadge": false,"description": "An innocent massage of a teenager with an oiled perfect body turns suddenly into a hot fuck and she's banged hard from behind!","uploaderType": "channel","uploaderName": "Young sinner","uploaderUrl": "https://xhamster.com/channels/young-sinner","uploaderVerified": false,"uploaderSubscribers": 21040,"categories": ["18 Year Old", "Cum in Mouth", "Cute", "HD Videos", "Happy Ending", "In Russian", "Massage", "Oiled", "Perfect Body", "Teen"],"tags": ["Sex", "Hottest", "Hot", "Hard", "Lovemaking", "Massages", "Intercourse", "Making Love"],"pornstars": ["Tony Art"],"channels": ["Young sinner"],"categoryLinks": ["https://xhamster.com/categories/massage", "https://xhamster.com/categories/oiled", "https://xhamster.com/categories/teen"],"tagLinks": ["https://xhamster.com/tags/rubdown", "https://xhamster.com/tags/body-rub"],"pornstarLinks": ["https://xhamster.com/pornstars/tony-art"],"channelLinks": ["https://xhamster.com/channels/young-sinner"],"thumbnailUrl": "https://ic-vt-nss.xhcdn.com/a/ZmQyYThhYzJhZjZiN2UzZWQ5NzY3ZDcxNjM3NDEwNGI/s(w:526,h:298),webp/030/462/438/v2/526x298.204.webp","previewUrl": "https://thumb-nss.xhcdn.com/a/AGR0_Pujv_y3gmxCPSPq3A/030/462/438/v2/16x9.204.webp","observedAt": "2026-08-15T13:59:59.986Z","error": null}
Note: this example record's tags, categoryLinks and tagLinks are trimmed for readability; the actor returns the full lists (this video had 22 tags).
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:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~xhamster-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"searchQuery":"massage","maxVideos":25,"withDetails":true}'
Start a run asynchronously:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~xhamster-scraper/runs?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"category":"massage","sort":"newest","maxVideos":100}'
Apify CLI:
apify call scrapers_lat/xhamster-scraper \--input '{"channel":"brazzers","maxVideos":50}'
Fetch results
Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:
# JSONcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"# CSVcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"# Paginate large datasetscurl "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 (
resultevent). WhenwithDetailsis on and a detail page is fetched successfully, an additivedetailsevent is also charged. See the pricing tab for current prices. - No charge on failure. If a run errors, the actor writes an item with a populated
errorfield and does not charge for it. Empty runs cost nothing. - Spend cap respected. Set
maxTotalChargeUsdon the run; once reached, the actor stops emitting and charging further billable results. - Free Apify plans are capped at 10 records per run. Upgrade for higher
maxVideos.
FAQ and troubleshooting
A run returned an error record. Why?
If no target is provided the actor returns a single record explaining that you must set one of searchQuery, category, tag, pornstar or channel. Provide exactly one.
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.
Does sort work with search?
Search always uses relevance order. newest and best apply to category, tag, pornstar and channel listings.
Can I get pornstar and channel links?
Yes. With withDetails on, each record carries pornstarLinks and channelLinks with absolute profile URLs, plus categoryLinks and tagLinks.
Is this an official xHamster tool? No. This actor is independent and has no affiliation with xHamster. It reads only publicly available listing and video-page metadata.
Related scrapers
- xVideos Video Metadata & Search Scraper: search and video metadata from xVideos.
More scrapers at scrapers.lat
Built and maintained by 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.
Independent tool, not affiliated with xHamster. Accesses only publicly available data.
