Pornhub Video Data Downloader avatar

Pornhub Video Data Downloader

Pricing

$4.45 / 1,000 scraped videos

Go to Apify Store
Pornhub Video Data Downloader

Pornhub Video Data Downloader

Collect public Pornhub video data from direct video URLs, listing URLs, or search terms. Export metadata, engagement, taxonomy, channel details, thumbnails, and source-visible HLS links.

Pricing

$4.45 / 1,000 scraped videos

Rating

0.0

(0)

Developer

Maxime Dupré

Maxime Dupré

Maintained by Community

Actor stats

0

Bookmarked

70

Total users

1

Monthly active users

9 hours ago

Last modified

Share

🎬 Turn Pornhub targets into video data

Pornhub Downloader helps researchers, content teams, and developers collect public Pornhub video data without copying pages by hand. Each accepted row can include the source view key, title, description, duration, upload date, thumbnail, engagement, taxonomy, channel details, discovery context, and source-visible media links. This gives you structured data for content review, cataloging, moderation research, media work, or an API workflow.

📦 Pornhub video rows at a glance

Each saved row represents one accepted public video. A direct video URL asks for that exact video and leaves discovery empty. A listing URL or search term adds the first saved match's query, listing URL, and rank when available. If the same source video appears again from another target, the Actor keeps the first eligible row and does not merge later matches into it.

Public source data

The Actor keeps values that Pornhub shows on the page. Missing descriptions, counts, taxonomy, channel facts, thumbnails, media links, or discovery details stay empty instead of being guessed. The Actor handles public pages only. It does not use a Pornhub account, cookies, Premium access, private content, or a browser extension.

▶️ Run exact videos or discover matching pages

  1. Add one direct video URL, listing URL, or search term per row in Pornhub targets.
  2. Use a direct video URL when you know the exact video. Use a listing URL or search term for discovery.
  3. Set Maximum discovery videos to limit videos found by listing URLs and search terms. Leave it empty to return all available results until the source is exhausted.
  4. Choose the production and duration filters for discovery targets. Direct video URLs ignore these filters.
  5. Start the Actor and open the default dataset.

⚙️ Input

Input fields

FieldTypeWhat it does
targetsarray of stringsRequired. Adds 1 to 500 non-empty direct video URLs, listing URLs, or search terms, with one target per row. Direct video URLs request one exact video. Listing URLs and search terms start discovery.
maxItemsintegerSets an optional positive limit for videos found by listing URLs and search terms. Leave it empty to return all available results until the source is exhausted. Direct video URLs do not use this limit.
productionstringFor discovery, keeps all videos or chooses professional or homemade. The default is all. Direct video URLs ignore this choice.
minDurationstringFor discovery, keeps videos at or above the selected length. Choose none, 10, 20, or 30 minutes. The default is none. Direct video URLs ignore this filter.
maxDurationstringFor discovery, keeps videos at or below the selected length. Choose none, 10, 20, or 30 minutes. The default is none. Direct video URLs ignore this filter.

Example input

The example below is the public input from a successful default-input run.

{
"targets": [
"music video",
"https://www.pornhub.com/video/search?search=music+video",
"https://www.pornhub.com/view_video.php?viewkey=ph5f1b2c3d4e5f6"
],
"maxItems": 1,
"production": "all",
"minDuration": "none",
"maxDuration": "none"
}

🧾 Output

The results link opens the default dataset. Each saved dataset row has the same public shape.

Output fields

FieldTypeWhat it does
resultsstringOpens the default dataset overview with the saved video rows.
viewKeystringGives Pornhub's source view key for the video.
titlestringGives the video title shown by Pornhub.
descriptionstring or nullGives the source description when available.
durationSecondsinteger or nullGives the video length in seconds when available.
uploadDatedate string or nullGives the source upload date in YYYY-MM-DD form when available.
thumbnailUrlstring or nullLinks to the source thumbnail when available.
engagementobjectGroups the source engagement values.
engagement.viewsinteger or nullGives the view count when available.
engagement.upvotesinteger or nullGives the upvote count when available.
engagement.likePercentnumber or nullGives the source like percentage when available.
taxonomyobjectGroups categories, tags, performers, and production.
taxonomy.categoriesarray of stringsLists categories attached to the video.
taxonomy.tagsarray of stringsLists tags attached to the video.
taxonomy.performersarray of stringsLists performers shown for the video.
taxonomy.productionstring or nullGives the source production label when available.
channelobjectGroups the uploader or channel facts.
channel.namestring or nullGives the channel or uploader name when available.
channel.urlstring or nullLinks to the channel or uploader when available.
channel.videoCountinteger or nullGives the source channel video count when available.
channel.subscriberCountinteger or nullGives the source channel subscriber count when available.
mediaobjectGroups source-visible HLS media links.
media.masterPlaylistUrlstring or nullLinks to the master HLS playlist when available.
media.variantsarray of objectsLists the source media variants that are available.
media.variants[].qualitystring or nullGives a quality label for a media variant when available.
media.variants[].widthinteger or nullGives the variant width in pixels when available.
media.variants[].heightinteger or nullGives the variant height in pixels when available.
media.variants[].contentTypestring or nullGives the media content type when known.
media.variants[].mediaUrlstringLinks to the source media variant.
discoveryobjectGroups search or listing context for a discovered video. It is empty for an exact direct target.
discovery.querystring or nullGives the search term that produced the first saved match when applicable.
discovery.listingUrlstring or nullLinks to the listing or search page that produced the first saved match when applicable.
discovery.rankinteger or nullGives the rank of the first saved match in its discovery target when available.

Example video row

This complete row is copied from a successful run. It is a discovery row, so its discovery object shows the first saved search match.

{
"viewKey": "66ca880f9e624",
"title": "LEO WILD GIVES ME THE BEST EROTIC MASSAGE OF MY LIFE",
"description": "Watch LEO WILD GIVES ME THE BEST EROTIC MASSAGE OF MY LIFE in Spanish on Pornhub.com, the best hardcore porn site. Pornhub is home to the widest selection of Porn in Spanish.",
"durationSeconds": 2810,
"uploadDate": "2024-08-25",
"thumbnailUrl": "https://ei.phncdn.com/videos/202408/25/456911691/original/(m=q8V1NTZbeaAaGwObaaaa)(mh=BUuShCb8q0p-tkQw)0.jpg",
"engagement": {
"views": 494685,
"upvotes": 1344,
"likePercent": 100
},
"taxonomy": {
"categories": [
"Big Ass",
"Big Dick",
"Brunette",
"HD Porn",
"Hardcore",
"Latina",
"MILF",
"Massage",
"Small Tits",
"Verified Models"
],
"tags": [
"massage rooms",
"thai massage",
"hot milf",
"latina milf",
"mature milf",
"big cockk",
"big cock",
"cum in mouth",
"pussy eating",
"prone bone",
"doggystyle",
"spread eagle",
"pussy rubbing",
"moaning"
],
"performers": [],
"production": "homemade"
},
"channel": {
"name": "Kathy Lee69",
"url": "https://www.pornhub.com/pornstar/kathy-lee69",
"videoCount": 157,
"subscriberCount": 221000
},
"media": {
"masterPlaylistUrl": "https://ev-h.phncdn.com/hls/videos/202408/25/456911691/1080P_4000K_456911691.mp4/master.m3u8?validfrom=1789028962&validto=1789036162&ipa=1&hdl=-1&hash=D1%2BmBcJhdmrZY6g5D6qQiSKh4n4%3D",
"variants": [
{
"quality": "1080p",
"width": 1920,
"height": 1080,
"contentType": "application/vnd.apple.mpegurl",
"mediaUrl": "https://ev-h.phncdn.com/hls/videos/202408/25/456911691/1080P_4000K_456911691.mp4/master.m3u8?validfrom=1789028962&validto=1789036162&ipa=1&hdl=-1&hash=D1%2BmBcJhdmrZY6g5D6qQiSKh4n4%3D"
},
{
"quality": "1080p",
"width": 1920,
"height": 1080,
"contentType": "mp4",
"mediaUrl": "https://www.pornhub.com/video/get_media?s=eyJrIjoiNjdiZTE1Y2FjOWQyMDQxZGNjYTRlNDAyYTM4YjM2Nzk2NTg0YWZhNWI3ZDJkOWIxNDk4ZTJhODk2YjdiNmIyYyIsInQiOjE3ODkwMzI1NjJ9&v=66ca880f9e624&e=0&t=p"
},
{
"quality": "720p",
"width": 1280,
"height": 720,
"contentType": "application/vnd.apple.mpegurl",
"mediaUrl": "https://ev-h.phncdn.com/hls/videos/202408/25/456911691/720P_4000K_456911691.mp4/master.m3u8?validfrom=1789028962&validto=1789036162&ipa=1&hdl=-1&hash=yGDumeTOIV6kg58WwLvzY%2F0AZXk%3D"
},
{
"quality": "480p",
"width": 854,
"height": 480,
"contentType": "application/vnd.apple.mpegurl",
"mediaUrl": "https://ev-h.phncdn.com/hls/videos/202408/25/456911691/480P_2000K_456911691.mp4/master.m3u8?validfrom=1789028962&validto=1789036162&ipa=1&hdl=-1&hash=ooxmFvoqvYugC3hXX4AKBe8Wulc%3D"
},
{
"quality": "240p",
"width": 426,
"height": 240,
"contentType": "application/vnd.apple.mpegurl",
"mediaUrl": "https://ev-h.phncdn.com/hls/videos/202408/25/456911691/240P_1000K_456911691.mp4/master.m3u8?validfrom=1789028962&validto=1789036162&ipa=1&hdl=-1&hash=F3XF6l1U09WBv3bPkR1Gk10MXkk%3D"
}
]
},
"discovery": {
"query": "music video",
"listingUrl": "https://www.pornhub.com/video/search?search=music+video",
"rank": 1
}
}

Source-visible media links can expire or change. Use them while available, or rerun the Actor when you need fresh links.

💳 Pricing

Charged event

This Actor uses pay-per-event pricing. The Scraped video event costs $0.00445 for one accepted public video saved with its available metadata and source-visible media links.

Control discovery work

Use Maximum discovery videos for a smaller test or to limit discovery work. Leave it empty to return all available results until the source is exhausted. A target that produces no accepted video does not create this video event.

🔌 Integrations

Ways to use the data

Open the dataset in Apify, export it as JSON, CSV, Excel, XML, RSS, or HTML, or read it through the Apify API. You can schedule repeat runs and use webhooks in an Apify workflow.

❓ FAQ

What happens when I give a direct regional video URL?

Direct video URLs, including regional Pornhub hostnames, are treated as exact targets. The Actor returns that video only when it is available. It does not turn an unavailable direct URL into search results, and a direct row has empty discovery context.

Can I mix direct URLs, listing URLs, and search terms?

Yes. Add each target as a separate row. Direct URLs request one exact video. Listing URLs and search terms discover matching public videos.

How does the discovery limit work?

maxItems limits videos found by listing URLs and search terms. Leave it empty to return all available results until the source is exhausted. It does not limit direct video URLs.

What happens when the same video matches two targets?

The Actor saves the first eligible occurrence and ignores later matches of that source video. It does not merge later submitted targets or discovery matches into the saved row. Its discovery context describes only the first saved match.

Which fields can be empty?

Pornhub may not show every value on every page. Descriptions, engagement values, taxonomy values, channel facts, thumbnails, media links, and discovery details can be empty when unavailable.

Does this Actor save video files?

No. It returns public video metadata and source-visible HLS media links. It does not copy video files into Apify storage or create ZIP archives.

Does it need a login, cookies, or a source API key?

No. It reads public pages and does not use a Pornhub account, cookies, Premium access, a browser extension, or a source API key.

How can I use the saved data in another app?

Read the dataset through the Apify API or export it in a format supported by your workflow.

📝 Changelog

v1.0

  • Treats regional Pornhub video URLs as exact targets and leaves discovery context empty.
  • Keeps only genuine per-video categories, tags, and performers while leaving unavailable values empty.

v0.1

  • Initial release.

🆘 Support

For issues, questions, or feature requests, file a ticket and I'll fix or implement it in less than 24h 🫡

Made with ❤️ by Maxime Dupré