Pornhub Video Downloader
Pricing
$0.90 / 1,000 scraped videos
Pornhub Video Downloader
Collect public Pornhub video details from direct video URLs, listing URLs, or search terms, without copying pages by hand. Each video includes its title, tags, views, likes, channel details, thumbnails, and a download link for the video file. Missing values stay empty instead of being guessed.
Pricing
$0.90 / 1,000 scraped videos
Rating
0.0
(0)
Developer
Maxime Dupré
Maintained by CommunityActor stats
0
Bookmarked
105
Total users
2
Monthly active users
12 days ago
Last modified
Categories
Share
🎬 Turn Pornhub URLs or search terms into video data
Pornhub Video Downloader helps researchers, content teams, and developers collect public Pornhub video data without copying pages by hand. Each saved row can include the video ID, title, description, duration, upload date, thumbnail, engagement, tags and categories, channel details, search or list details, a download link for the video file, and source streaming links (HLS). This gives you structured data for content review, cataloging, moderation research, media work, or an API workflow.
- Search public Pornhub listings by a topic with Pornhub Video Search.
- Read title, duration, engagement, and source links for one public video with Pornhub Video Metadata.
- Turn public video pages into structured metadata with Pornhub Metadata Scraper.
- Collect public video rows for a catalog with Pornhub Video Scraper.
- Get a download link for a public video file with Pornhub Video Downloader.
📦 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 its discovery fields null. 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, tags, categories, channel facts, thumbnails, media links, or discovery details stay empty instead of being guessed. The Actor handles public pages only. It needs no Pornhub login or account, and it does not cover private, members-only, or Premium videos.
▶️ Run exact videos or discover matching pages
- Add one direct video URL, listing URL, or search term per row in Pornhub URLs or search terms.
- Use a direct video URL when you know the exact video. Use a listing URL or search term for discovery.
- 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.
- Choose the production and duration filters for listing URLs and search terms. Direct video URLs ignore these filters.
- Start the Actor and open the default dataset.
⚙️ Input
Input fields
| Field | Type | What it does |
|---|---|---|
targets | array of strings | Required. 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. |
maxItems | integer | Sets 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. |
production | string | For discovery, keeps all videos or chooses professional or homemade. The default is all. Direct video URLs ignore this choice. |
minDuration | string | For 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. |
maxDuration | string | For 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=671bec5c59729"],"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.
Run output
| Field | Type | What it does |
|---|---|---|
results | string | Opens the default dataset overview with the saved video rows. |
Dataset row fields
| Field | Type | What it does |
|---|---|---|
viewKey | string | Gives Pornhub's source view key for the video. |
title | string | Gives the video title shown by Pornhub. |
description | string or null | Gives the source description when available. |
durationSeconds | integer or null | Gives the video length in seconds when available. |
uploadDate | date string or null | Gives the source upload date in YYYY-MM-DD form when available. |
pageUrl | string | Links to this video's page on Pornhub. |
thumbnailUrl | string or null | Links to the source thumbnail when available. |
downloadUrl | string | Links to this video's file, saved in Apify storage. The link works only as long as Apify keeps that storage. |
engagement | object | Groups the source engagement values. |
engagement.views | integer or null | Gives the view count when available. |
engagement.upvotes | integer or null | Gives the upvote count when available. |
engagement.downvotes | integer or null | Gives the dislike count when available. |
engagement.commentCount | integer or null | Gives the comment count when available. |
taxonomy | object | Groups categories, tags, performers, and production. |
taxonomy.categories | array of strings | Lists categories attached to the video. |
taxonomy.tags | array of strings | Lists tags attached to the video. |
taxonomy.performers | array of strings | Lists performers shown for the video. |
taxonomy.production | string or null | Gives the source production label when available. |
channel | object | Groups the uploader or channel facts. |
channel.name | string or null | Gives the channel or uploader name when available. |
channel.url | string or null | Links to the channel or uploader when available. |
channel.videoCount | integer or null | Gives the source channel video count when available. |
channel.subscriberCount | integer or null | Gives the source channel subscriber count when available. |
media | object | Groups source streaming links (HLS). They cannot play or download the video, so use downloadUrl instead. |
media.masterPlaylistUrl | string or null | Links to the master HLS playlist when available. |
media.variants | array of objects | Lists the source media variants that are available. |
media.variants[].quality | string or null | Gives a quality label for a media variant when available. |
media.variants[].width | integer or null | Gives the variant width in pixels when available. |
media.variants[].height | integer or null | Gives the variant height in pixels when available. |
media.variants[].contentType | string or null | Gives the media content type when known. |
media.variants[].mediaUrl | string | Links to the source media variant. |
discovery | object | Groups search or listing context for a discovered video. Its fields are null for an exact direct target. |
discovery.query | string or null | Gives the search term that produced the first saved match when applicable. |
discovery.listingUrl | string or null | Links to the listing or search page that produced the first saved match when applicable. |
discovery.rank | integer or null | Gives the rank of the first saved match in its discovery target when available. |
nextVideo | object or null | Groups the next suggested video shown on the page, when one is shown. |
nextVideo.viewKey | string | Gives the next suggested video's view key. |
nextVideo.title | string | Gives the next suggested video's title. |
nextVideo.pageUrl | string | Links to the next suggested video's page on Pornhub. |
Example video row
This row is copied from a successful run. It is a discovery row, so its discovery object shows the first saved search match. This example is shortened: the signature at the end of downloadUrl is replaced with ....
{"viewKey": "6aabddd5811b6","title": "Amateur Couple Sextape - Her Tight Creamy Pussy Rides so Good!","description": "Watch Amateur Couple Sextape - Her Tight Creamy Pussy Rides so Good! on Pornhub.com, the best hardcore porn site. Pornhub is home to the widest selection of free Big Ass sex videos full of the hottest pornstars. If you're craving blonde XXX movies you'll find them here.","durationSeconds": 774,"uploadDate": "2026-09-17","pageUrl": "https://www.pornhub.com/view_video.php?viewkey=6aabddd5811b6","thumbnailUrl": "https://pix-fl.phncdn.com/c6371/videos/202609/17/62642165/original_62642165.mov/plain/ex:1:no/bg:0:0:0/rs:fit:640:360/vts:24?hdnea=st=1792167775~exp=1792254175~hdl=-1~hmac=db7a92defca811f203f75c3302c2ab1090a17b72","downloadUrl": "https://api.apify.com/v2/key-value-stores/fzDkteIOTnoLiyc3x/records/6aabddd5811b6?signature=...","engagement": {"views": 185305,"upvotes": 451,"downvotes": 63,"commentCount": 6},"taxonomy": {"categories": ["Amateur","Babe","Big Ass","Big Dick","Blonde","Blowjob","Cumshot","Fetish","HD Porn"],"tags": ["blonde","amateur","cumshot","pov","amateur couple","riding","cowgirl","doggy style","sextape","fucking","side fuck","blowjob","homemade"],"performers": ["Mira David"],"production": "homemade"},"channel": {"name": "Amateur Mira","url": "https://www.pornhub.com/model/amateur-mira","videoCount": 129,"subscriberCount": 144000},"media": {"masterPlaylistUrl": "https://hv-h.phncdn.com/hls/c6251/videos/202609/17/62642165/1080P_4000K_62642165.mp4/master.m3u8?h=3Px8zAJfZcT3MtPgRZq%2BMdQyESY%3D&e=1792171375&f=1","variants": [{"quality": "1080p","width": 1920,"height": 1080,"contentType": "application/vnd.apple.mpegurl","mediaUrl": "https://hv-h.phncdn.com/hls/c6251/videos/202609/17/62642165/1080P_4000K_62642165.mp4/master.m3u8?h=3Px8zAJfZcT3MtPgRZq%2BMdQyESY%3D&e=1792171375&f=1"},{"quality": "1080p","width": 1920,"height": 1080,"contentType": "mp4","mediaUrl": "https://www.pornhub.com/video/get_media?s=eyJrIjoiNTM5YWVhOWY3MDcyOWIzZjM0ZDU5NmFiNGYwZjIwNTc5MDdmZDFjZmYyOWUxZjhhODhhODQyMDM1OGU3OGRkMyIsInQiOjE3OTIxNjc3NzV9&v=6aabddd5811b6&e=0&t=p"},{"quality": "720p","width": 1280,"height": 720,"contentType": "application/vnd.apple.mpegurl","mediaUrl": "https://hv-h.phncdn.com/hls/c6251/videos/202609/17/62642165/720P_4000K_62642165.mp4/master.m3u8?h=w587MjuPt06JsHCF8KjggFr%2F1io%3D&e=1792171375&f=1"},{"quality": "480p","width": 852,"height": 480,"contentType": "application/vnd.apple.mpegurl","mediaUrl": "https://hv-h.phncdn.com/hls/c6251/videos/202609/17/62642165/480P_2000K_62642165.mp4/master.m3u8?h=IEUQLgeV4B7LfzWCwPqHQuH0uK0%3D&e=1792171375&f=1"},{"quality": "240p","width": 426,"height": 240,"contentType": "application/vnd.apple.mpegurl","mediaUrl": "https://hv-h.phncdn.com/hls/c6251/videos/202609/17/62642165/240P_1000K_62642165.mp4/master.m3u8?h=qxKgzf1XI5VhD5o8c%2FgTu%2Fb1AQ4%3D&e=1792171375&f=1"}]},"discovery": {"query": "documentary","listingUrl": "https://www.pornhub.com/video/search?search=documentary","rank": 1},"nextVideo": {"viewKey": "6a9190f63beb2","title": "He Treated Me Like a Princess. Fucked Me Like a Slut","pageUrl": "https://www.pornhub.com/view_video.php?viewkey=6a9190f63beb2"}}
Links can stop working over time. The downloadUrl link works only as long as Apify keeps the saved file. The source streaming links can expire, so rerun the Actor when you need fresh links.
💳 Pricing
Charged event
This Actor uses pay-per-event pricing. The Scraped video event is charged for each accepted public video saved to your dataset. The price for each event is shown on this Actor's Apify page.
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 null discovery fields.
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 search or list details describe only the first saved match.
Which fields can be empty?
Pornhub may not show every value on every page. Descriptions, engagement values, tags, categories, performers, channel facts, thumbnails, media links, and search or list details can be empty when unavailable.
Does this Actor save video files?
Yes. The Actor saves each accepted video's file in Apify storage and returns a downloadUrl link to it. The media links are source streaming links (HLS), which cannot be used to play or download the video. The downloadUrl link works only as long as Apify keeps that storage.
Do I need permission to save these videos?
Check first. This Actor does not give legal advice. Before you save, use, or share a video file, make sure you have the right to do so and that you follow Pornhub's terms.
Does it need a Pornhub login or account?
No. The Actor reads public video pages and needs no Pornhub login or account. It does not cover private, members-only, or Premium videos.
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
v2.0 (16-10-2026)
- Saves each accepted video's file in Apify storage and adds a
downloadUrllink to each row, so you can get the file from the same run. The link works only as long as Apify keeps the saved file. - A video whose file cannot be saved is now left out of the dataset, so every row has a download link.
- Removes
engagement.likePercent, the source like percentage, from each row. Update any code that reads this field. - Adds the video page link (
pageUrl) to each row. - Adds the next suggested video (
nextVideo) to each row when Pornhub shows one. - Adds dislike and comment counts (
engagement.downvotesandengagement.commentCount) to each row. - Sets the default memory from your input. Runs default to 1024 MB when Maximum discovery videos is empty or set to 1. They also default to 1024 MB when Production type or Minimum duration is changed, or when Maximum duration is 30 minutes. Other runs default to 512 MB. This applies to direct video URL runs too, even though they ignore the discovery limit and filters.
- Lets you choose as little as 512 MB of memory for a run.
- For listing URLs and search terms, leaves out videos whose length Pornhub does not show when Minimum duration or Maximum duration is set.
- Keeps reading a listing or search until it saves the number of videos set in Maximum discovery videos, or the results run out.
- Marks the run as failed, with a clear message, when Pornhub pages or video files fail to load or save and no videos are saved.
- Lowers the price for each saved video to $0.90 per 1,000 videos, from $4.45 per 1,000.
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 🫡
🔗 Related Actors
- XNXX Video Downloader - Resolve known public XNXX video URLs or IDs into source media links and metadata.
- RedTube Video Downloader - Get source-hosted media links and details for public RedTube video pages or video IDs.
- XVideos Video Downloader - Turn known public XVideos watch-page URLs into MP4 or HLS links, titles, uploader names, and thumbnails.
- SpankBang Video Downloader - Turn public SpankBang watch URLs into one row per video with direct media links and source details.
- TNAFlix Video Downloader - Turn known public TNAFlix video URLs or IDs into dataset rows with source metadata and direct MP4 links.
Made with ❤️ by Maxime Dupré