Pornhub Video Downloader avatar

Pornhub Video Downloader

Pricing

$0.90 / 1,000 scraped videos

Go to Apify Store
Pornhub Video Downloader

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é

Maxime Dupré

Maintained by Community

Actor stats

0

Bookmarked

105

Total users

2

Monthly active users

12 days ago

Last modified

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.

📦 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

  1. Add one direct video URL, listing URL, or search term per row in Pornhub URLs or search terms.
  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 listing URLs and search terms. 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=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

FieldTypeWhat it does
resultsstringOpens the default dataset overview with the saved video rows.

Dataset row fields

FieldTypeWhat it does
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.
pageUrlstringLinks to this video's page on Pornhub.
thumbnailUrlstring or nullLinks to the source thumbnail when available.
downloadUrlstringLinks to this video's file, saved in Apify storage. The link works only as long as Apify keeps that storage.
engagementobjectGroups the source engagement values.
engagement.viewsinteger or nullGives the view count when available.
engagement.upvotesinteger or nullGives the upvote count when available.
engagement.downvotesinteger or nullGives the dislike count when available.
engagement.commentCountinteger or nullGives the comment count 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 streaming links (HLS). They cannot play or download the video, so use downloadUrl instead.
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. Its fields are null 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.
nextVideoobject or nullGroups the next suggested video shown on the page, when one is shown.
nextVideo.viewKeystringGives the next suggested video's view key.
nextVideo.titlestringGives the next suggested video's title.
nextVideo.pageUrlstringLinks 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 downloadUrl link 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.downvotes and engagement.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 🫡

  • 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é