Ultrathots Video Downloader
Pricing
$8.00 / 1,000 video file saveds
Ultrathots Video Downloader
ultrathots.com: Saves the video file itself (.mp4) into the run's Key-Value Store. The row is short (files first) unless `extractDetails` is true.
Pricing
$8.00 / 1,000 video file saveds
Rating
0.0
(0)
Developer
DataWatcher
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
an hour ago
Last modified
Categories
Features
Share
Scrape ultrathots.com video data and save the video files in one run, then read the results as a table or through the Apify API. Build a searchable catalogue for media discovery, uploader research and trend analysis.
- Reads search results, member pages, tag and category pages, the latest-updates page and single video pages.
- Saves the full-quality .mp4 or the smaller preview copy in the run's Key-Value Store.
- Returns title, creator, views, duration and tags for each video.
⭐ Why this one
1️⃣ One schema across video sites. All our video actors share one output schema and one input schema. Build your pipeline once: our other video actors (Erome Video Scraper, Redgifs Video Scraper, Ultrathots Video Scraper, XFree Video Scraper, Erome Video Downloader, RedGIFs Video Downloader, XFree Video Downloader) take the same input and return the same fields, so adding a site means changing the actor name, not your code.
- Files and data in one run. Each row holds the video details and a link to the saved file.
- You choose the quality. Save the full-quality .mp4 or the smaller preview copy.
- Size limits you control. Set a limit per file and a limit for the whole run.
- You pay only for saved files. Skipped and failed files are free, and the row alone is free.
- One ZIP if you want it. Switch on
createZipto get all saved files invideos.zip.
🔎 What it extracts
Paste a link from ultrathots.com into startUrls, or use the dedicated inputs. The kind of page is found from the URL.
| Page type | Example URL | Input to use |
|---|---|---|
| Latest updates | https://ultrathots.com/latest-updates/ | startUrls |
| Search | https://ultrathots.com/search/your-term/ | startUrls or searchQueries |
| Member page | https://ultrathots.com/members/123456/ | startUrls or usernames |
| Tag or category | https://ultrathots.com/tags/your-tag/ | startUrls or tags |
| One video | https://ultrathots.com/videos/12345/video-name/ | startUrls or videoUrls |
- The site has no usernames. For a member, use the numeric member id or the member URL.
- Albums are skipped. Only videos become rows.
maxResultsis shared fairly over all your inputs.
🚀 How to scrape Ultrathots videos and save the files
- Open the actor on Apify and click Try for free.
- Add one or more Ultrathots links to
startUrls, or fillsearchQueries,usernames,tagsorvideoUrls. SetmaxResultsand pick the video quality. - Click Start.
- Open the Output tab for the rows. Open the run's Key-Value Store for the saved files.
Example inputs:
Latest videos with full rows, saving the smaller preview copies:
{"startUrls": ["https://ultrathots.com/latest-updates/"],"maxResults": 10,"extractDetails": true,"videoQuality": "preview","maxTotalDownloadMb": 200}
A search:
{"searchQueries": [{"query": "your search term"}],"maxResults": 20,"extractDetails": true}
One video page, full quality:
{"videoUrls": ["https://ultrathots.com/videos/12345/video-name/"],"extractDetails": true,"videoQuality": "best"}
🔌 Run it your way
- Schedule it with Apify schedules.
- Call it from the Apify API and its clients (Python, JavaScript).
- Connect it to Make, n8n, Zapier, webhooks or Google Sheets.
💾 Where the files are
Each saved file goes into the run's Key-Value Store. The file is named creatorname_video-12345.mp4: the creator, then _video- and the video id. The creator is the username, or the display name when the site has no username, for example Ultrathots_Team_video-12345.mp4. An image is named creatorname_image-12345.jpg. The name starts with unknown only when there is no creator at all.
Each row has a storedFile object with the key, the public link, the size in bytes, the content type and the quality. Its status is saved, skipped or failed, and error says why a file was skipped or failed.
A file is skipped when it is bigger than maxFileSizeMb, when the run reached maxTotalDownloadMb, or when the video has no file link. The row is still written.
With createZip on, all saved files are also put into one videos.zip in the Key-Value Store.
⚖️ Rights
The videos belong to their creators and to the site. Saving a file does not give you the right to reuse it. Check the rights and the site's terms before you publish, resell or re-upload anything.
🎬 Quality
videoQuality picks the file to save. best is the full-quality .mp4 from videoFileUrl. preview is the smaller copy from previewVideoUrl. The default is best. The row reports the saved copy in storedFile.quality.
⚙️ Input
| Input | Type | Default | Range | Meaning |
|---|---|---|---|---|
startUrls | list of text | empty | Ultrathots links: search, member, tag, category, latest updates or video page. | |
searchQueries | list | empty | Searches, each {"query": "...", "filter": "all"}. A plain text line is read as a search with filter all. | |
usernames | list of text | empty | Numeric member ids or member URLs. | |
tags | list of text | empty | Tag names as the site writes them, or tag page URLs. | |
tagSort | choice | empty | latest, popular | Ignored. Tag pages come in the site's own order, newest first. |
videoUrls | list of text | empty | Video page URLs. One row per video. | |
maxResults | number | 100 | 1 to 1,000 | Maximum number of videos returned in total, shared fairly over the inputs. |
maxRequests | number | 200 | 1 to 1,000 | Maximum number of page requests in total. |
maxPagesPerSource | number | 100 | 1 to 100 | Maximum listing pages read for one search, member or tag. |
maxScrollsPerPage | number | 100 | 1 to 100 | Maximum load-more steps on one listing page. |
maxRequestRetries | number | 2 | 0 to 5 | Retries after a network or server error. A block is not retried. |
requestTimeoutSecs | number | 30 | 5 to 120 | Time limit of one page request, in seconds. |
proxyConfiguration | proxy | no proxy | Proxy settings. | |
extractDetails | yes/no | no | No gives a short row with the file first. Yes gives the full row: views, likes, tags, tagged accounts and links, plus storedFile. | |
videoQuality | choice | best | best, preview | Which copy to save. |
maxFileSizeMb | number | 250 | 1 to 2,000 | A video bigger than this is not saved. Its row is still written. |
maxTotalDownloadMb | number | 1,024 | 1 to 20,000 | Stops saving files when the files of the run reach this size. |
createZip | yes/no | no | Also saves all files as videos.zip. |
Set extractDetails to yes to get views, tags and the other full fields. In searchQueries, the filter post gives the same result as all, because the search lists videos only. The filter tag opens the tag page. tagSort is ignored. On the free plan a run returns at most 1,000 videos, whatever maxResults says.
📦 Output: Ultrathots video data
One row per video. Missing values are null.
| Field | Type | Meaning |
|---|---|---|
recordType | text | The row kind: video. |
schemaVersion | text | The version of the output format. |
source | text | The site the row comes from. |
id | text | The site's own id of the video. |
url | text | The video page on the site. |
mediaType | text | video or image. |
sourceType | text | What found the video: search, profile, tag or direct_video. |
sourceUrl | text | The search, member, tag or video URL that found the video. |
title | text | The video's title. |
creator | object | The account that posted the video: displayName, profileUrl, username, onlyfansUrl. |
taggedAccounts | list | Performers tagged in the video, with name and profileUrl. |
views | number | Views of the video. |
likes | number | Likes of the video. |
durationSeconds | number | The video's length in seconds. |
width | number | File width in pixels. |
height | number | File height in pixels. |
hasAudio | yes/no | Whether the file has sound. |
thumbnailUrl | text | The preview image. |
posterUrl | text | The larger poster image. |
tags | list | The video's tags, in the site's order. |
videoFileUrl | text | Direct link to the full-quality .mp4. |
previewVideoUrl | text | Direct link to the smaller copy. |
imageUrl | text | Direct link to the image when mediaType is image. |
storedFile | object | The saved file: key, url, sizeBytes, mimeType, quality, status, error. |
dates | object | posted (when the video was posted) and scraped (when the run read it). |
In the approved sample, width, height, hasAudio, imageUrl and creator.username were empty, and so was creator.onlyfansUrl. The site gave no value.
Example: a row
A row from a member page with extractDetails on and videoQuality set to preview. Long lists are shortened.
{"recordType": "video","schemaVersion": "4.4.1","source": "ultrathots","id": "94094","url": "https://ultrathots.com/videos/94094/bonnie-blue-orgy-with-blowjobs-doggystyle-and-facials/","mediaType": "video","sourceType": "profile","sourceUrl": "https://ultrathots.com/members/341877/","title": "Bonnie Blue Orgy With Blowjobs, Doggystyle and Facials","creator": {"displayName": "Ultrathots Team","profileUrl": "https://ultrathots.com/members/341877/"},"views": 3100,"likes": 0,"durationSeconds": 3055.0,"thumbnailUrl": "https://ultrathots.com/contents/videos_screenshots/94000/94094/506x285/6.jpg","posterUrl": "https://ultrathots.com/contents/videos_screenshots/94000/94094/preview.jpg","tags": ["OnlyFans", "Sextape", "Blowjob", "Blonde"],"previewVideoUrl": "https://ultrathots.com/get_file/3/3c5f5f2fb7e404a64805c68c374a7a7c/94000/94094/94094_preview.mp4/","storedFile": {"key": "Ultrathots_Team_video-94094.mp4","url": "https://api.apify.com/v2/key-value-stores/default/records/Ultrathots_Team_video-94094.mp4","sizeBytes": 446267,"mimeType": "video/mp4","quality": "preview","status": "saved"},"dates": {"posted": "2026-11-12T01:49:36Z","scraped": "2026-11-13T23:58:10Z"}}
📊 Run stats
The approved sample had 4 cases: a list page, a search, a member page and one video page. Together they gave 10 rows.
💰 Pricing
You pay per saved file. The row alone is free.
| Event | Price | When it is charged |
|---|---|---|
video-file-saved (Video file saved) | $8.00 per 1,000 events | One file (.mp4 video or image) is saved in the run's Key-Value Store. |
- Skipped and failed files are free.
- There is no start fee.
- Free plan: each run returns up to 1,000 results.
🎯 Use cases
- Media discovery. Build a searchable catalogue of publicly listed videos.
- Uploader research. See what a creator account posts and how many views it gets.
- Trend analysis. Compare tags, views and durations over time.
- Archiving. Keep the files you have the right to keep, with their titles and tags.
🩺 If a run fails
The run health (the RUN_HEALTH record, RUN_SUMMARY and the last line of the log) names the cause, for example site down: list request answered 500 x3. Find that start of the message in the table.
| Error in the log / run health | What it means | What you do |
|---|---|---|
site down: <request> answered 500, 502-504, 520-526 | The site is offline or has a fault. The actor waits longer between tries, then stops the run. | Try again later. |
blocked: <request> answered 401, 403, 1020 or a captcha page | The site refused the request or showed a captcha page. | The actor already retries once through the Apify proxy. If it still fails, turn on the Apify proxy in the input (use the RESIDENTIAL group if it is already on). |
rate limited: <request> answered 429 | The site asks for fewer requests. The actor waits and slows down by itself. | Try again later. |
gone: <request> answered 404, 410 | The page or offer was removed. The actor skips it and it is not charged. | Nothing; this is normal. |
network error: <request> failed with timeout (or connection error, DNS error) | A timeout or a broken connection. The actor retries with a pause. | Try again later. |
wrong answer: <request> returned HTML instead of JSON (or an empty body) | The site answered with a page that is not data (HTML instead of JSON, an empty body). The site has probably changed. | Report it in the Issues tab; we fix it. |
❓ FAQ
How do I scrape many Ultrathots videos at once?
Add several links or terms to the inputs and set maxResults. The limit is shared fairly over the inputs. The free plan returns up to 1,000 videos per run.
Can I call the Ultrathots video downloader from the API?
Yes. Start the actor with the Apify API or its Python and JavaScript clients, then read the rows from the run's dataset and the files from its Key-Value Store.
How much does it cost to save the files?
It costs $8.00 per 1,000 saved files. Skipped and failed files are free, and so is the row alone.
Which inputs are ignored?
tagSort is ignored, because tag pages have no plain sort link. The search filter post gives the same result as all.
How do I export Ultrathots videos to Excel or CSV?
Run the actor, open the Output tab and pick Excel or CSV in the export options. JSON, XML and HTML are there too, and the Apify API returns the same data.
Data notice
This actor returns only what the site shows publicly at run time. We don't store or keep that data and are not its controller — you decide how you use it.
🔗 Other video scrapers (same schema)
Ultrathots (this site)
- Ultrathots Video Scraper: links and data
Erome
- Erome Video Scraper: links and data
- Erome Video Downloader: saves the video files (.mp4)
RedGIFs
- Redgifs Video Scraper: links and data
- RedGIFs Video Downloader: saves the video files (.mp4)
XFree
- XFree Video Scraper: links and data
- XFree Video Downloader: saves the video files (.mp4)
💬 Feedback and custom work
Need another portal, a field or a custom feed? Open an issue on the Issues tab.