Vjav Video Downloader
Pricing
from $0.50 / 1,000 results
Vjav Video Downloader
Download videos from VJAV.com with support for multiple URLs, concurrent downloads, and automatic file management
This Apify actor allows you to efficiently download videos from vjav.com, with support for concurrent downloads, multiple URLs, and automatic file management.
AGE RESTRICTION NOTICE
This tool interacts with an adult content platform that contains explicit material. By using this actor, you confirm that:
- You are at least 18 years of age (or the legal age of majority in your jurisdiction)
- You are legally permitted to access adult content in your location
- You understand and accept the nature of the content being processed This actor is intended for legitimate research, analysis, and content management purposes only. Please ensure compliance with all applicable laws and regulations in your jurisdiction.
Features
- Multi-threaded downloads: Process up to 10 URLs concurrently
- Batch processing: Submit multiple URLs in a single run (up to 10)
- Smart URL detection: Automatically finds the highest quality download links
- Progress tracking: Visual progress bars with download speed and ETA
- Efficient storage: Automatically cleans up local files after upload to Apify storage
- Proxy support: Optional proxy configuration
- Detailed logging: Comprehensive logs for tracking download progress and issues
- Structured output: JSON response with download URLs and video information
Input Parameters
| Parameter | Type | Description |
|---|---|---|
urls | Array | List of VJAV video URLs to process (maximum 10) |
maxConcurrent | Integer | Maximum number of concurrent downloads (1-10, default: 3) |
proxy | String | Optional proxy URL in format host:port or user:pass@host:port |
downloadFolder | String | Folder to temporarily store downloaded videos (default: ./downloaded-videos) |
resumeFromRunId | String | Skip URLs already downloaded successfully by a previous run/dataset. See Resume & recurring updates. |
incrementalMode | Boolean | Track each video across runs and tag rows NEW/UPDATED/UNCHANGED/REAPPEARED. Default false. |
stateKey | String | Optional name for an isolated incremental-mode watchlist. |
emitUnchanged | Boolean | Push UNCHANGED rows too instead of suppressing them. Default false. |
emitExpired | Boolean | Present for consistency with Apify's other incremental-mode actors; has no effect on this actor. See Resume & recurring updates. |
Example Input
{"urls": ["https://vjav.com/videos/890393/amazing-xxx-video-youve-seen/","https://vjav.com/videos/890713/two-studs-enjoy-a-fellatio-from-horny-teenager-18-in-an-uncensored-xxx-jav-with-maomi-nagasawa-and-nagasawa-maomi/"],"maxConcurrent": 3,"proxy": "103.214.9.13:3128"}
Output
The actor produces a structured JSON output with information about each processed video and direct download links to the files in Apify's key-value store.
Example Output
{"processedUrls": 3,"successfulDownloads": 2,"videos": [{"videoId": "888399","title": "Incredible XXXX Video Red Head XXXXX Ever Seen","downloadUrl": "https://api.apify.com/v2/key-value-stores/abcd1234/records/888399-incredible-xxxx-video-red-head-xxxx-ever-seen.mp4","success": true},{"videoId": "889000","title": "XXXX Seduces Older Man For XXXX XXXX","downloadUrl": "https://api.apify.com/v2/key-value-stores/abcd1234/records/889000-xxxxx-seduces-older-man-for-xxxx-xxxx.mp4","success": true},{"videoId": "890000","title": "Amateur Couple Homemade Video","error": "Failed to download file: HTTP 404","success": false}]}
Resume & recurring updates
This actor is URL-in, file-out: the only thing that determines what gets processed is the urls list you paste in. That shape makes two of Apify's usual recurring-monitoring features meaningful, and one of them fundamentally not.
resumeFromRunId -- paste a previous run ID or dataset ID and this run skips any URL whose video was already downloaded successfully, so continuing a batch (or re-running after a partial failure) doesn't re-download and re-charge for videos you already have. Works whether or not Incremental mode is on.
incrementalMode -- when on, the actor remembers every video it has processed (by video ID, not by which URLs happened to be pasted alongside it) and tags each dataset row changeType: NEW (first time seen), UPDATED (title or download link changed since last time), UNCHANGED (nothing changed -- suppressed from the dataset unless emitUnchanged is on, so a stable video costs zero dataset items on a repeat run), or REAPPEARED. Leave stateKey blank to track every video you've ever checked in one shared watchlist across runs, regardless of what other URLs are in any given run's urls -- this is deliberate: urls is an ad hoc per-run selection here, not a saved search, so it is not part of the tracking key. Set stateKey to your own text if you want a separate, isolated watchlist (e.g. one per project).
emitExpired has no effect on this actor. EXPIRED means "this item was tracked before and the site no longer has it" -- and that can only be inferred from a run that provably scanned an entire site-side listing to its natural end. This actor has no listing or search surface; its only input is whatever URLs you paste into one run. A video absent from this run's urls was not necessarily removed from vjav.com -- you simply may not have pasted it this time. Marking it EXPIRED would fabricate a row and incorrectly bill you for it, so this actor's EXPIRED gate always refuses, unconditionally, regardless of this toggle. The field is kept only so this actor's input shape matches Apify's other incremental-mode actors.
Default behavior is unchanged. With incrementalMode off (the default), the actor pushes exactly one dataset item per run -- the same summary object shown in Example Output -- with no changeType field anywhere. Turning incrementalMode on switches the dataset to one row per video (matching the fields in Results and Data Export below) so each video's change status can be reported individually.
What counts as "changed"
Measured live by fetching the same video's page twice, ~20-26s apart (see probes/probe_volatility_2026_07_30.py): the title stayed identical every time, but the signed download URL vjav.com issues (/get_file/.../<id>_hq.mp4/?d=...&br=...&ti=...) contains a token and a ti= timestamp that change on every single fetch, even when the video itself hasn't changed. This actor normalizes that token/timestamp away before comparing, so re-checking the same unmodified video never falsely reports UPDATED. A genuine change to the title or to the video file/quality is still reported.
Only two things are tracked per video: its title and its resolved download link (selectedUrl, shown in each incremental row so the field driving changedFields is one you can actually inspect). Other candidate links the actor may come across alongside the real download target are deliberately not tracked: they can vary for reasons unrelated to the video itself rather than anything changing on vjav.com -- so including them in change detection previously caused a video to be falsely reported as UPDATED on a re-check where nothing had actually changed. Re-measured across 3 different videos, 2 checks each (see probes/probe_videourls_membership_2026_07_30.py): title stayed identical for all 3, and the resolved download link was stable across checks.
Results and Data Export
During the run, the actor stores results into a dataset. With incrementalMode off (default), the actor pushes one summary item per run, shaped as in Example Output. With incrementalMode on, each processed video becomes a separate dataset item instead, additionally tagged with changeType, changedFields, firstSeenAt, lastSeenAt, and selectedUrl (the resolved vjav.com download link this run found -- the field that drives changedFields: ["selectedUrl"] when it changes).
You can access and export these results in several ways:
Dataset Access
The actor's dataset contains detailed information about each processed video, including:
- Video metadata (ID, title)
- Download status and errors (if any)
- URLs for the downloaded files
- Processing statistics
Apify API Integration
You can manage the results in any language (Python, PHP, Node JS/NPM). See the Apify API reference to learn more about getting results from this VJAV Video Downloader actor.
Exporting Data
You can also export the dataset in various formats:
-
Via Apify Console:
- Go to the Storage → Datasets section
- Find your dataset and click on it
- Use the Export button to download as JSON, CSV, Excel, etc.
-
Via API:
https://api.apify.com/v2/datasets/{DATASET_ID}/items?token={YOUR_API_TOKEN}&format=json
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape — the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record — not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Proxy Configuration
For reliable access to vjav.com, consider using a proxy:
- You can use your own proxy in the input parameters
- Or subscribe to Apify Proxy for access to residential and datacenter proxies
Storage and Retention
- Downloaded videos are stored in Apify's key-value store
- By default, files in unnamed key-value stores will expire after 7 days
- To retain files longer, name your key-value store when you start the actor run